Up

カイ2乗検定

分割表の分析

 

分割表(クロス表)の分析において、分布の違いの検定(岡本安晴「データ分析のための統計学入門」2009、おうふうpp8893)と、独立性の検定(岡本安晴「データ分析のための統計学入門」2009、おうふう9397)は統計量の計算は式の形の上では同じであるので、共通のプログラムで分析できる。分割表の例として、3つのサイコロABCをそれぞれ100回投げたときの各目の出た度数を表1としてシミュレーションで作成した。

 

表1 サイコロA,B,Cの各目の出た頻度分布

 

目の数

サイコロ

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をクリックしてダウンロードすることができる。

 

 

Up