LoginSignup
2
2

More than 1 year has passed since last update.

二項分布の正規分布による近似を Python で確かめる

Last updated at Posted at 2022-02-28

本記事の目的

二項分布は $n$ が大きい場合に正規分布によって近似できます.
これを Python で確かめるのが本記事の目的です.

二項分布の正規近似について少し具体的に述べます.
まず,二項分布 $\mathrm{Bin}(n,p)$ に従う確率変数 $X$ を考えます.
$n$ を大きくすると,近似的に $X$ は正規分布 $\mathrm{N}(np, np(1-p))$ に従うというものです.
※ $\mathrm{Bin}(n,p)$ に従う確率変数の平均は $np$, 分散は $np(1-p)$.
これは中心極限定理の特殊な場合とみなせます(詳しくは https://hsugaku.com/18-20 がわかりやすかったです).

本当に二項分布が正規分布に近づくか確かめる

二項分布で $n$ を変えて分布のヒストグラムを描き,正規分布に近づくか確かめます.
$n$ は変えますが,$p$ は0.5で固定しています.

stats.binomrvs() という関数を使うことで,二項分布からのサンプリングを行います.
その結果を用いて,二項分布のヒストグラムを描画します.
このヒストグラムを,正規分布 $\mathrm{N}(np, np(1-p))$ の確率密度関数と重ねて描画し,見比べます.

以下にコードを示します(Jupyter Lab 上で動かしました).
まず必要なライブラリをインポートします.

ライブラリのインポート
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
import seaborn as sns
sns.set()
from scipy import stats

次にプロット用のコードです.
二項分布 $\mathrm{Bin}(n,p)$ から 100000 回サンプリングを行い,その結果をヒストグラムで描画します.
また,正規分布 $\mathrm{N}(np, np(1-p))$ の確率密度関数を描画して,比較します.
これを各 $n$ について繰り返し,最後にまとめてプロットします.

コードに関する説明

  • 二項分布のヒストグラムは plt.hist() を使って描画します.このとき density=True を渡すことで度数の合計が1になるように正規化します.これにより,正規分布の確率密度関数と見比べることができます.
  • 正規分布の確率密度関数を描画するためには横軸の値(正規分布に従う確率変数の実現値)を与える必要があります.これらの値として,$x \in [np-2.58np(1-p),~~np+2.58np(1-p)]$ を満たす $x$ を 0.001 の間隔で生成しました(np.arange() を使用).2.58という数字は正規分布の両側99%点からきています.
fig = plt.figure(figsize=(20, 12), dpi=200)
n_list = [1, 5, 10, 50, 100, 1000, 5000, 10000]
p = 0.5

for i, n in enumerate(n_list):
    ax = fig.add_subplot(2, 4, i+1)
    plt.title(f'$n={n}$, $p={p}$')
    # 二項分布からサンプリング
    binom_vals = stats.binom.rvs(n=n, p=p, size=100000)
    # 二項分布の平均と分散
    mu = n*p
    var = n*p*(1-p)
    # 二項分布のヒストグラムを描画
    plt.hist(binom_vals, bins=30, label='binom', alpha=0.4, density=True)
    # 正規分布のpdfを描画
    x = np.arange(mu-2.58*var**0.5, mu+2.58*var**0.5, 0.001) # 99%点まで描画する
    norm_vals = stats.norm.pdf(x, loc=mu, scale=var**0.5) # pdfの値
    plt.plot(x, norm_vals, label='norm')
    plt.legend()
# 余白を調整して保存
plt.subplots_adjust(left=0.05, right=0.95, bottom=0.05, top=0.95)
plt.savefig('binom_norm.png')

上のコードで保存される binom_norm.png は以下のような画像になりました.
青色が二項分布,オレンジ色が正規分布です.

binom_norm.png

$n=1, 5, 10$ あたりでは正規分布になっている感じはありませんが,$n=50$ あたりからだいぶ正規分布に近づいているのがわかります.
$n$が 1000 以上になると二項分布と正規分布のヒストグラムはほぼ一致しているのがわかります.

2
2
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2