正規分布で遊ぶ
大雑把に言えば、確率変数の和は正規分布に近付くという性質がある(中心極限定理:岡本安晴「データを使いこなすための統計入門」22世紀アート、付録 確率;E.3 正規分布)。
一様分布を使った例と2項分布(ベルヌーイ試行)を使った例を用意してみた。
一様分布に従う確率変数の和は、平均が0、標準偏差が1であるように調整しておくと、和を構成する独立な確率変数の個数が増えると標準正規分布に近付く。これを確認するプログラムをリスト1のように作成した。
リスト1 一様分布の和
import numpy as np
import scipy.stats as ss
import matplotlib.pyplot as plt
import seaborn as sb
n_simu = 100000
for N in [1, 2, 5, 10]:
print('N =', N)
samples = np.empty(n_simu,
dtype = 'float')
for i in range(n_simu):
s =
ss.uniform.rvs(0, 1, size = N)
S_N
= s.sum()
Z_N
= (S_N - N * 0.5) / (N / 12)**0.5
samples[i] = Z_N
sb.kdeplot(samples, label =
f'N = {N}')
x_coord = np.linspace(-4, 4, 100)
y_coord = ss.norm.pdf(x_coord, 0, 1)
plt.plot(x_coord, y_coord, label =
'normal')
plt.legend()
plt.show()
独立なN個の一様分布の平均値は、分散はであることに注意。
リスト1のスクリプトを実行すると、しばらく計算が行われた後、図1のグラフが表示される。平均が0,標準偏差が1に調整された一様分布の和の分布と標準正規分布が描かれている。
図1
N=1のグラフは、一様分布する確率変数が1個の場合であるので、一様分布のグラフである。サンプリングに基づいてKDEによる密度関数が描かれているので、中央の部分のグラフが凸凹している。また、分布の両端もKDEによる描画のため、少しなだらかである。N=1の場合のグラフは、平均0,標準偏差1に調整された一様分布のグラフであることに注意。
N=10のグラフは、正規分布に極めて近いと言える。
2項分布はベルヌーイ試行の和と見做せるので、ベルヌーイ試行の試行数Nが大きくなると正規分布に近付くことが予想される。これを確かめるためリスト2のプログラムを作成した。
リスト2 2項分布と正規分布
import numpy as np
import scipy.stats as ss
import matplotlib.pyplot as plt
N = int(input('N = '))
p = float(input('p = '))
mu = N * p
sgm = (N * p * (1 - p))**0.5
x_coord = np.arange(0, N + 0.1, 1)
y_coord = ss.binom.pmf(x_coord, N, p)
zx_coord = (x_coord - mu) / sgm
zy_coord = y_coord * sgm
plt.plot(zx_coord, zy_coord, label =
'binomial')
x_norm = np.linspace(-4, 4, 100)
y_norm = ss.norm.pdf(x_norm, 0, 1)
plt.plot(x_norm, y_norm, label =
'normal')
plt.legend()
plt.title(f'p = {p}, N = {N}')
plt.show()
リスト2のスクリプトを実行すると2項分布におけるベルヌーイ試行の試行数Nとベルヌーイ試行における確率pの入力が求められる。
N = 20
p = 0.7
確率pの設定後、2項分布のグラフが図2のように表示される。
図2
2項分布のグラフは、平均0,標準偏差1に調整されたグラフが表示される。標準正規分布のグラフも表示されるので、2項分布と正規分布の比較が容易である。