Czytam książkę Statystyka (Freeman, Pisani, Purves) i próbuję odtworzyć przykład, w którym rzuca się monetą, powiedzmy 50 razy, liczbę głów liczoną i to się powtarza powiedzmy 1000 razy.
Po pierwsze, utrzymałem liczbę rzutów (wielkość próbki) na poziomie 1000 i zwiększyłem liczbę powtórzeń. Im więcej powtórzeń, tym lepiej dane pasują do normalnej krzywej.
Następnie próbowałem utrzymać stałą liczbę powtórzeń na 1000 i zwiększyć wielkość próbki. Im większy rozmiar próbki, tym gorsze wydawało się, że normalne zakrzywione pasują do danych. Wydaje się to sprzeczne z przykładem książki, który lepiej przybliża krzywą normalną wraz ze wzrostem wielkości próby.
Chciałem zobaczyć, co by się stało, gdybym zwiększył rozmiar próbki, ale przy większej liczbie powtórzeń, które zostały ustalone na 10 000. Wydaje się to również przeczyć książce.
Jakieś pomysły, co robię źle?
Kod i wykresy poniżej.
%matplotlib inline
def plot_hist(num_repetitions, num_tosses):
tosses = np.random.randint(0, 2, size=[num_repetitions, num_tosses])
sums = np.apply_along_axis(lambda a: np.sum(a == 1), 1, tosses)
xmin, xmax = min(sums), max(sums)
lnspc = np.linspace(xmin, xmax, len(sums))
m, s = stats.norm.fit(sums) # get mean and standard deviation
pdf_g = stats.norm.pdf(lnspc, m, s) # now get theoretical values in our interval
bins = np.arange(xmin, xmax) - 0.5
step = int((xmax - xmin)/5)
fig, ax = plt.subplots()
_ = ax.hist(sums, bins, edgecolor='black', linewidth=1.2, density=True)
_ = ax.plot(lnspc, pdf_g, label="Norm", color='red')
_ = ax.set_xticks(bins[::step] + 0.5)
_ = ax.set_title('{:,} tosses - {:,} repetitions'.format(num_tosses, num_repetitions))
1. Eksperymentuj z rosnącą liczbą powtórzeń (stała wielkość próby 1000)
plot_hist(1000, 1000)
plot_hist(10000, 1000)
plot_hist(100000, 1000)
2. Eksperymentuj ze zwiększaniem wielkości próbki (ustalona na 1000 powtórzeń)
plot_hist(1000, 100)
plot_hist(1000, 1000)
plot_hist(1000, 10000)
3. Eksperymentuj ze zwiększaniem wielkości próbki (ustalona na 10 000 powtórzeń)
plot_hist(10000, 100)
plot_hist(10000, 1000)
plot_hist(10000, 10000)
plot_hist(10000, 100000)