データ分析系プログラマーのブログ

主にPythonを使ったデータ分析や機械学習をやっています。

Pythonを使った二項分布の検定統計量の求め方

検定には、母平均、母比率、母分散を用いた検定の他に、二項分布、ポアソン分布、適合度、独立性の検定があります。このうち、二項分布を用いた検定は、コインやサイコロなどのようにある値が出るか出ないかと言った二項分布からコインやサイコロなどの確率に歪みがないかどうかを判定することができます。この記事では、Pythonを使って、二項分布の統計検定量の求め方と検定の行い方について紹介しています。

二項分布の検定

二項分布の検定の場合、次の式から得られる統計量zは標準正規分布に従います。


z=\frac{X-np}{\sqrt{np(1-p)}}

例えば、あるサイコロを10,000回投げたときに1が出た回数が1,500回で有意水準を0.05とした場合、このサイコロはどの目も等しく出る歪みのないサイコロといえるかどうかは以下のようになります。


np=10000/6=1666.67

z=\frac{X-np}{\sqrt{np(1-p)}}=\frac{1500-1666.67}{\sqrt{1666.67(1-\frac{1}{6})}}=\frac{-166.67}{37.2678}=-4.472

Z_0.025=1.96

よって、帰無仮説を棄却し、対立仮説を採択するという結果になり、このサイコロの1が出る確率は1/6ではなく、このサイコロは1の出やすさに関して歪んでいると結論づけられます。

Pythonを使った二項分布の検定統計量の求め方

pythonを使って二項分布の統計検定量を求める場合は以下のようになります。与えられた設問より、1が出た回数、サンプル数、サイコロの確率をそれぞれ用意します。次に、二項分布における統計検定量zを求める式を使って検定量zの値を求めます。次に、有意水準を使い、statsのnorm.ppfを使用して、z値を求めて、if文で検定することができます。

import math

x = 1500 #1が出た回数
n = 10000 #サンプル数
p = 1/6 #サイコロの確率

z = (x - n*p)/math.sqrt(n*p*(1 - p))
print("二項分布の統計検定量 = ", z)

二項分布の統計検定量 = -4.472135954999576

from scipy import stats
alpha = 0.05 #有意水準

z_value = stats.norm.ppf(1-alpha/2)

if -z_value < z < z_value:
    print("z値は", z_value, "なので、帰無仮説を採択し、対立仮説を棄却するという結果になり、",
          "このサイコロの1が出る確率は1/6ではないとは言えず、このサイコロは1の出やすさに関して歪んでいるとは言えないと結論づけられます。")
    
else:
    print("z値は", z_value, "なので、帰無仮説を棄却し、対立仮説を採択するという結果になり、",
          "このサイコロの1が出る確率は1/6ではなく、このサイコロは1の出やすさに関して歪んでいると結論づけられます。")

z値は 1.959963984540054 なので、帰無仮説を棄却し、対立仮説を採択するという結果になり、 このサイコロの1が出る確率は1/6ではなく、このサイコロは1の出やすさに関して歪んでいると結論づけられます。

参考

統計学の時間 | 統計WEB