September 23, 2022

Нормальная аппроксимация биномиального распределения¶

Математический факт, что биномиальное распределение хорошо аппроксимируется нормальным распределением при больших n. Это удобно использовать для расчетов (попробуйте посчитать по формуле). Рассмотрим утверждение на примерах.

Сначала зададим количество испытаний n=10 и сравним распределения:

import pandas as pd
import numpy as np
from scipy.stats import norm, binom
import matplotlib.pyplot as plt
import seaborn as sns


n = 10
p = 0.3

bin_distr = binom(n=n,p=p)

plt.figure(figsize=(15,5))
sns.barplot(x=list(range(n+1)), y=[bin_distr.pmf(k) for k in range(n+1)])

Посчитаем математическое ожидание и стандартное отклонение распределения и зададим нормальный "аналог":

bin_distr.expect(), bin_distr.std()
norm_distr = norm(loc=bin_distr.expect(), scale=bin_distr.std())

plt.figure(figsize=(15,5))
sns.lineplot(x=np.arange(0,n,1) , y = norm_distr.pdf(np.arange(0,n,1)))

Видим, что распределения похожи. А теперь для наглядности сравним распределения для разных n:

n_l = [10,30,50]
fig, axes = plt.subplots(len(n_l), 1, figsize=(15,6))

for i, n in enumerate(n_l):
    binom_distr = binom(n,p)
    norm_distr = norm(binom_distr.expect(), binom_distr.std())
    x = np.arange(n+1)
    sns.barplot(x = x, y = [binom_distr.pmf(it) for it in x], ax = axes[i])
    sns.lineplot(x = x, y = [norm_distr.pdf(it) for it in x], ax = axes[i])
    

Видим, что чем больше n тем лучше аппроксимация.