カイ2乗検定
分割表の分析
分割表(クロス表)の分析において、分布の違いの検定(岡本安晴「データ分析のための統計学入門」2009、おうふう;pp.88−93)と、独立性の検定(岡本安晴「データ分析のための統計学入門」2009、おうふう;93−97)は統計量の計算は式の形の上では同じであるので、共通のプログラムで分析できる。分割表の例として、3つのサイコロA、B、Cをそれぞれ100回投げたときの各目の出た度数を表1としてシミュレーションで作成した。
表1 サイコロA,B,Cの各目の出た頻度分布 |
||||||
|
目の数 |
|||||
サイコロ |
1 |
2 |
3 |
4 |
5 |
6 |
A |
10 |
27 |
11 |
19 |
13 |
20 |
B |
20 |
12 |
15 |
14 |
27 |
12 |
C |
16 |
13 |
15 |
19 |
20 |
17 |
この分割表のカイ2乗検定を行うためのプログラムを以下のように作成した。
=============== chi2_test_XTblPrg.py =================
from calc_chi2_XTblCls
import Ccalc_chi2_XTbl as Cchi2
data = [[10, 27, 11,
19, 13, 20],
[20,
12, 15, 14, 27, 12],
[16,
13, 15, 19, 20, 17]]
calc_chi2 =
Cchi2(data)
chi2, df, p = calc_chi2.calc()
print("chi2 =
{0:0.5f}, df = {1},
p = {2:0.5f}".format(chi2, df, (1.0 -
p)))
============================================
表1のデータをリストdataに設定している。データの設定されたリストdataを実パラメータとしてクラス型Cchi2のオブジェクトcalc_chi2を作成して。メソッドcalc_chi2.calc()を呼び出してカイ2乗の値chi2、自由度df、p値pを求めている。クラス型Cchi2すなわちCcalc_chi2_XTblは以下のように宣言されている。
============================================
from Calc_p_from_chi2
import calc_p
class Ccalc_chi2_XTbl:
def
__init__(self, data):
self.data
= data
def
calc(self):
R = len(self.data)
C = len(self.data[0])
N =
R * C
Rsum = []
for
v in self.data:
sum = 0
for x in v:
sum += x
Rsum.append(sum)
Total = 0
Csum = []
for i in range(0, C):
sum = 0
for j in range(0, R):
sum += self.data[j][i]
Csum.append(sum)
Total += sum
E =
[]
for i in range(0, R):
E.append([])
for j in range(0, C):
E[i].append(Rsum[i] * Csum[j] / float(Total))
print("\nObs./E =")
for i in range(0, R):
for j in range(0, C):
print("{0:7d}/{1:<7.2f}".format(self.data[i][j], E[i][j]), end =
" ")
print(" ")
print(" ")
chi2
= 0.0
for i in range(0, R):
for j in range(0, C):
chi2 += ((self.data[i][j]
- E[i][j]) ** 2.0) / E[i][j]
df = (R - 1) * (C - 1)
p = calc_p(chi2, df)
return chi2, df, p
=================================================
上のプログラムを実行すると、図1の結果を得る。
図1
プログラムは圧縮ファイルchi2_test_XTblPrg.zipにまとめた。ファイル名chi2_test_XTblPrg.zipをクリックしてダウンロードすることができる。