Rachunek prawdopodobieństwa i statystyka
Wprowadzenie
Dorota Celińska-Kopczyńska
Uniwersytet Warszawski
Zajęcia 2 22 października 2021
Problem 1b
Zaimplementuj funkcję, która wybiera losowe daty z przedziału 1,. . . , d póki nie natrafi na powtórkę. Funkcja powinna zwracać numer losowania, w którym pojawiła się powtórka. Wywołaj funkcję N = 100000 razy (zapisz zwracane wyniki).
I Narysuj histogram zwróconych wyników
I Jaka wartość wydaje się najbardziej prawdopodobna (najczęściej się pojawia)?
I Ile wynosi średnia arytmetyczna z uzyskanych wartości?
I Czy jest jakaś zależność między uzyskanymi wartościami a liczbą 23?
Co tu tak naprawdę robimy?
I Zajmujemy się weryfikacją paradoksu urodzinowego.
I (Gdyby nie RODO) moglibyśmy wszyscy podać daty urodzin w naszej grupie. Sprawdzilibyśmy, czy zdarzyła się powtórka.
Wynik jednak mógłby być przypadkowy.
I Moglibyśmy rozszerzyć eksperyment na pozostałe grupy laboratoryjne, ćwiczeniowe, przedmiotowe... porobić sztuczne grupy z członków różnych grup...
I Im więcej grup, tym mniej przypadkowe wartości zaczynamy uzyskiwać, jesteśmy w stanie agregować informacje
I Napisana przez nas funkcja pozwala zasymulować tworzenie takich grup
Co tu tak naprawdę robimy?
I Gdy funkcja zostaje wywołana, zaczynamy losować po jednej liczbie (symbolizującej dzień w roku), zapisujemy ją do zbioru.
I Taka liczba symuluje nam członka grupy
I Wiemy, że sprawdzamy, jaka wielkość grupy jest potrzebna, żeby się powtórzyła data urodzenia
I Losujemy daty (dodajemy osoby do grupy) póki się nie pojawi powtórka
I Skoro się powtórka pojawiła, to zwracamy rozmiar grupy, w którym to się stało
Po co to robimy?
I W badaniach ilościowych swoje przypuszczenia (teoria) chcemy sprawdzać, czy są w zgodzie z danymi (empiria) I W wielu życiowych sytuacjach nie mamy łatwego dostępu do
dostatecznie dużej liczby zbiorów danych, które pozwoliłyby nam na weryfikację naszych przypuszczeń
I W takich sytuacjach możemy wygenerować sztuczne dane, które będą podstawą naszej symulacji
I Naśladujemy w kodzie mechanizmy, które zauważamy w rzeczywistości
I Generujemy dane tak, żeby jak najbardziej przypominały dane rzeczywiste
Jak to będziemy robić?
1. Potrzebujemy generatora liczb losowych (random.randint) 2. Tworzymy zbiór, w którym zapiszemy kolejne losowane liczby 3. Będziemy losować wartości (ze zbioru 1,d) i dodawać je do
zbioru dopóki nie pojawi się powtórka
4. W sytuacji powtórki zwracamy rozmiar zbioru zwiększony o jeden
Histogram
1. Histogram jest takim typem wykresu, który umożliwia nam zaprezentowanie, jak często pojawiają się uporządkowane wartości
2. Dla każdej wartości x rysujemy słupek, którego wysokość odpowiada częstotliwości jej wystąpienia (może być w wartościach absolutnych lub względnych)
3. W python skorzystamy z funkcji plt.hist
plt.hist() – ciekawsze argumenty
1. https://matplotlib.org/3.3.2/api/_as_gen/matplotlib.pyplot.hist.html?highlight=hist#
matplotlib.pyplot.hist
2. x – tablica z wartościami, z których histogram chcemy narysować
3. bins – jeśli integer to liczba słupków, które mają zostać narysowane (domyślnie 10), jeśli sekwencja, to wartości, które są krawędziami słupków
4. cumulative – pozwala uzyskać histogram wartości skumulowanych (wysokość każdego słupka powiększona o wysokość poprzedniego, uwzględnia przez to wszystkie poprzednie wartości)
Przykładowy rezulat
Problem 1c
W pliku us births 69 88.csv umieszczono liczby urodzeń w danym dniu roku, zebrane pomiędzy 1969 a 1988 rokiem.
I Wczytaj plik. Czy dostrzegasz coś zaskakującego w jego zawartości?
I Narysuj mapę cieplną. Czy dostrzegasz odstępstwa od założenia o takiej samej częstotliwości urodzeń danego dnia?
I Sugestia: ewidentne błędy powinno się usunąć, ale dziś możemy to pominąć
I Zastosuj dane z pliku w zadaniu 1b
Co tu tak naprawdę robimy?
I W poprzednim zadaniu zwróciłam Państwu uwagę, że chcemy, żeby mechanizm tworzący nasze sztuczne dane jak najlepiej odzwierciedlał (był taki sam) jak ten z rzeczywistości I Przyjęliśmy jednak pewne założenie: wystąpienie każdej daty
było tak samo prawdopodobne (tak losuje random.randint()) I W rzeczywistości nie musiałoby tak być. Przyjmijmy, że
dostarczony plik poza “specjalnie” doklejonymi zmyślonymi datami zawiera rzeczywiste dane
I Sprawdźmy, czy założenie o takim samym
prawdopodobieństwie pojawienia się którejkolwiek daty jest zasadne
Co tu tak naprawdę robimy?
I Jeśli okaże się, że przyjęte założenie nie jest spełnione, zmienimy sposób w jaki generowane są daty w 1b
I Dzięki temu uzyskamy dane sztuczne, które będą bardziej podobne do rzeczywistych
Po co to robimy?
I Rzeczywistość jest zbyt skomplikowana, żeby ją idealnie odwzorować
I Tworząc dane symulowane z reguły potrzebujemy przyjąć pewne założenia lub uproszczenia
I W zależności od potrzeby te założenia mogą mniej lub bardziej wpływać na końcowy wynik
I Dobrze jest, jeśli możemy wykorzystać część rzeczywistych danych, ale może się okazać, że nie jest to konieczne
Jak to będziemy robić?
1. Wczytamy plik
2. Stworzymy mapę cieplną (heatmap)
3. Edytujemy funkcję symulującą wielkości grup – sposób, w jaki losujemy datę
CSV
I Comma Separated Values
I Standard wśród badań ilościowych...
I Kluczowe: delimiter (separator), cudzysłów (wartości z kontekstem), kodowanie
I Plusy i minusy
CSV
I Każdy wiersz opisuje jeden obiekt, każda kolumna jedna cechę tego obiektu
I Delimiter (separator) oddziela od siebie kolumny (np.
przecinek, średnik, tabulacja...)
I Każdy wiersz zawiera taką samą liczbę kolumn
I Pierwszy wiersz może być nagłówkiem i zawierać nazwy kolumn
CSV
I Cudzysłów (quotation) pozwala potraktować dane w
kontekście: jeśli wartość w danej kolumnie zawiera delimiter, będzie on traktowany jak zwykły znak, do wystąpienia kolejnego cudzysłowu
I Jeśli wartości w danej kolumnie również zawierają cudzysłów I spotyka się użycie ”” (podwójnego cudzysłowu) wewnątrz pola I można rozważyć zmianę znaku/sekwencji znaków, która
pozwala na potraktowanie danych w kontekście
I można zastosować znaki ucieczki lub sekwencje ucieczek (może nie być wszędzie wspierane)
Przykład
wiek; kolorOczu ; motto
23 ; brązowe ; "say twice, say twice"
40 ; niebieskie; "be ""nice"""
Jak wczytać plik?
Skorzystamy z biblioteki numpy, funkcji loadtxt()
import numpy as np
stats = np.loadtxt(nazwapliku, skiprows = 1, delimiter=’,’, dtype=int)
# skiprows -- pozwala sie pozbyc naglowka (pierwszy rzad z nazwami cech)
# stats[3][2] -- wartosc w trzecim wierszu, 2 kolumnie
# stats.shape -- informacja o wymiarach tablicy numpy
Tworzenie mapy cieplnej
I plt.pcolor(dni, miesiace, liczebnosc) I Im bardziej jaskrawy kolor, tym większa częstotliwość
występowania
I dni – tablica zawierająca uporządkowane wartości I miesiace – tablica zawierająca uporządkowane wartości I liczebność – tablica dwuwymiarowa, wymiary w kolejnosci:
miesiac, dzien (wartość: liczba urodzin w danym dniu)
Przykładowy rezulat
Ulepszanie generatora
I Skorzystamy z sum prefiksowych i wyszukiwania binarnego I Intuicja: losujemy liczbę, np. 1000 i sprawdzamy, której dacie
odpowiada 1000 urodzenie