カイ2乗検定
分布の適合度の検定
表1のような度数分布のデータに対して、その度数分布が所与の確率分布に合うかどうかの検定を行うカイ2乗検定(岡本安晴「データ分析のための統計学入門」2009、おうふう、pp.85−88)のプログラムを作成した。
表1は、サイコロを100回投げたときの出た目の数の度数を数えたものである(シミュレーションで作成)。比率は、各目の出る確率を相対比率で表したものである。全て1で等しいので、各目の出る確率はである。
表1 サイコロの目の出る確率の比率と頻度 |
||||||
目の数 |
1 |
2 |
3 |
4 |
5 |
6 |
比率 |
1 |
1 |
1 |
1 |
1 |
1 |
頻度 |
19 |
14 |
17 |
13 |
21 |
16 |
偶数の目の方が、奇数の目より2倍出易いという確率を表すときは、偶数の目には2、奇数の目には1を割り当てればよい。
表1のデータに対して、カイ2乗検定を行うプログラムを次のように作成した。
============== chi2_test_distri.py =====================
from
calc_chi2 import Ccalc_chi2
prop
= [1, 1, 1, 1, 1, 1]
obs = [19, 14, 17, 13, 21, 16]
calc_chi2
= Ccalc_chi2(prop, obs)
chi2,
p, df = calc_chi2.calc()
print("chi^2
= %f df
= %d"%(chi2, df))
print("p
= %f"%(1.0 - p))
=============================================
比率をリストpropに、頻度データをリストobsに設定して、クラス型Ccalc_chiのオブジェクトcalc_chi2をpropとobsを実引数として生成している。カイ2乗の値とp値および自由度は、calc_chi2のメソッドcalc_chi2.calc()を呼び出して得ている。クラス型Ccalc_chi2は以下のように宣言されている。
================ calc_chi2.py ====================
from Calc_p_from_chi2
import calc_p
class Ccalc_chi2:
def
__init__(self, prop, obs):
self.prop = prop
self.obs = obs
def
calc(self):
sump
= 0.0
for
v in self.prop:
sump += v
prob = []
for
v in self.prop:
prob.append(v / sump)
N =
0
for
v in self.obs:
N += v
c = len(self.obs)
df = c - 1
E =
[]
for i in range(0, c):
E.append( prob[i] * N )
print(" ")
print("%10s"%"Obs.", "%10s"%"E")
for i in range(0, c):
print("%10d"%self.obs[i],
"%10.2f"%E[i])
print("
")
chi2
= 0.0
for i in range(0, c):
chi2 += ((self.obs[i]
- E[i]) ** 2.0) / E[i]
p = calc_p(chi2, df)
return chi2, p, df
============================================
表1のデータに対する上のプログラムを実行すると図1のような結果を得る。
図1
表示されている結果は
であり、有意水準5%で判定すると、p値0.743058は有意水準5%=0.05より大きい。したがって、設定された確率、目の出る確率はすべて1/6、と頻度データとの有意差は認められない。
プログラムは圧縮ファイルchi2_test_distriPrg.zipにまとめた。ファイル名chi2_test_distriPrg.zipをクリックしてダウンロードすることができる。