Фундаментальным понятием теории вероятностей, на котором базируются многие прикладные решения является Центральная предельная теорема. Она гласит, что для n независимых одинаково распределенных случайных величин Zi с математическим ожиданием m и дисперсией var их среднее (сумма, деленная на количество) при больших n имеет нормальное распределение (опираясь на предыдущую статью, можно добавить, что с математическим ожиданием m и дисперсией var/n). Нормальное распределение имеет следующую колоколообразную форму и показывает плотность вероятности значений случайной величины, то есть в нашем случае основная доля сосредоточена вокруг 6, а затем вероятности остальных интервалов убывают по мере удаления от него:
Проверим истинность этого утверждения на примере. Допустим мы проводим опыты по подбрасыванию симметричной монеты, случайной величиной будем считать объект, принимающий значения 0 (выпала решка) и 1 (выпал орел) с вероятностями 0.5 и 0.5 (подробнее читай). График распределения вероятности будет иметь следующий вид:
Отметим, что в теории вероятностей доказывается, что математическое ожидание одного опыта по подбрасыванию симметричной монеты равно p (0.5), а дисперсия p*(1-p). Теперь проверим, какой вид будет иметь распределение вероятностей доли выпадений орла при 400 подбрасываниях (сумма случайных величин/их количество):
Таким образом, посредством визуализации результатов, можно убедиться, что доля выпадений орла при большом количестве подбрасываний имеет нормальное распределение (со средним p и дисперсией var/n, как отмечено в предыдущей статье).
Код на Python для генерации распределения случайной величины при одном подбрасывании монеты:
import scipy.stats as stats
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
sns.set()
SMALL_SIZE = 12
MEDIUM_SIZE = 14
BIGGER_SIZE = 18
plt.rc('font', size=MEDIUM_SIZE) # controls default text sizes
plt.rc('axes', titlesize=SMALL_SIZE) # fontsize of the axes title
plt.rc('axes', labelsize=MEDIUM_SIZE) # fontsize of the x and y labels
plt.rc('xtick', labelsize=SMALL_SIZE) # fontsize of the tick labels
plt.rc('ytick', labelsize=SMALL_SIZE) # fontsize of the tick labels
plt.rc('legend', fontsize=SMALL_SIZE) # legend fontsize
plt.rc('figure', titlesize=BIGGER_SIZE) # fontsize of the figure title
if __name__=='__main__':
distr = stats.bernoulli(0.5)
x = np.linspace(-1,2,100)
plt.vlines(x,0, distr.pmf(x))
plt.xlabel('значения случайной величины')
plt.ylabel('вероятности значений случайной величины')
Код для имитации и отображения распределения средней доли выпадений орла:
import scipy.stats as stats
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
sns.set()
SMALL_SIZE = 12
MEDIUM_SIZE = 14
BIGGER_SIZE = 18
plt.rc('font', size=MEDIUM_SIZE) # controls default text sizes
plt.rc('axes', titlesize=SMALL_SIZE) # fontsize of the axes title
plt.rc('axes', labelsize=MEDIUM_SIZE) # fontsize of the x and y labels
plt.rc('xtick', labelsize=SMALL_SIZE) # fontsize of the tick labels
plt.rc('ytick', labelsize=SMALL_SIZE) # fontsize of the tick labels
plt.rc('legend', fontsize=SMALL_SIZE) # legend fontsize
plt.rc('figure', titlesize=BIGGER_SIZE) # fontsize of the figure title
if __name__=='__main__':
distr = stats.bernoulli(0.5)
n_distr = 400
n_point_new = 1000
distr_whole = [[distr.rvs() for _ in range(n_point_new)] for _ in range(n_distr)]
df = pd.DataFrame(distr_whole)
means = df.mean(axis=0)
sns.kdeplot(means,label = 'плотность вероятности для средней доли выпадений орла \n при 400 подбрасываниях симметричной монеты')