はじめに
ある試行を複数回くりかえしたとき、特定の事象が何回起こるのかを分布として示したものを二項分布という。ここで、試行回数が十分に大きい場合を考える。二項分布において、サンプルの平均が1より十分大きい場合は正規分布(連続的ではあるが)に漸近する。一方で特定の事象が確率的にレアであるときの二項分布は、ポアソン分布に漸近する。そこで、Pythonを用いた数値計算により、二項分布が正規分布やポアソン分布に漸近することを視覚的に調査することを目的とする。
以下、計算結果の概略を示す。
1.正規分布に漸近する二項分布のイメージ
2.ポアソン分布に漸近する二項分布のイメージ
二項分布について
導入
コインのモデルで考える。表が出る確率を$p$とすると、裏の出る確率は$(1-p)$となる。したがって、$n$回の試行のうち$m$回だけ表が出る確率は、反復試行の確率$P_m$は以下のように表すことができる。
P_m={}_n C_m p^m(1-p)^{n-m}
ただし、二項定理より$\Sigma^{n}_{m=0}P_m=1$となる(全事象の確率の和は1)。
ここで、プログラムを作成しやすいようにコンビネーションを以下のように階乗で表す。
{}_n C_m =\frac{n!}{m!(n-m)!}
プログラム
コンビネーションを上記載のように階乗で定義して計算する。ちなみに階乗は再帰のアルゴリズムではなくて、計算量の少ない反復forを用いた。
import numpy as np
import matplotlib.pyplot as plt
import japanize_matplotlib
import math
#全試行回数
n=100
#1回の事象の発生確率
p=0.01
#表が出る回数の合計
m=np.arange(0,n+1,1)
#階乗計算
def factorial(num):
num2=1
for i in range(1,num+1):
num2=num2*i
return num2
P_ary=[]
for k in range(len(m)):
#コンビネーションの計算
combi=factorial(n)/(factorial(m[k])*factorial(n-m[k]))
#反復試行の確率
P=combi*(p**(m[k])*(1-p)**(n-m[k]))
P_ary.append(P)
plt.plot(m,P_ary)
plt.title("二項分布"+str(n)+"回の反復試行")
plt.xlabel("表の出る回数")
plt.ylabel("反復試行の確率")
plt.savefig("二項分布反復試行回数"+str(n)+".png")
plt.show()
これを実行すると以下のようなグラフが出力される。
正規分布
$np>>1$例えば、$n=100,p=0.5$のときは、$P_m$は概ね正規分布にしたがう。これは、スターリングの公式により極限計算をすると求められる。
解析結果
$p=0.5$のもとで、$n=5,10,20,100$の場合の$P_m$の分布について以下に示す。
このように、試行回数を増やしていけば釣鐘型のガウス関数に漸近する。
ポアソン分布
$p<<1$例えば、$p=0.01$というレア事象が$m$回生じるときの確率$P_m$は概ねポアソン分布にしたがう。
解析結果
$p=0.01$のもとで、$n=5,10,20,30,100$の場合の$P_m$の分布について以下に示す。
このように、試行回数が増加するほど指数減衰関数のようなほぼ単調減少する関数に漸近する。これは、レアな事象が立て続けに起きるのはまれだという直感にも一致する。
まとめ
今回は、コンピュータの計算能力を利用することで、二項分布を延長していくと、正規分布やポアソン分布に漸近するということを視覚的に明らかにした。数学的つまり厳密に考える場合、はさみうちの定理を用いた極限計算を行う必要性があるが、その場合は階乗計算においてスターリングの近似式を用いる。