このレクチャーでは、カイ二乗の値について説明します。
100回コインを投げると、50回表が出て、50回裏がでます。もちろん、いつもちょうど50回ずつになるわけではないので、実際に観測された値が、ありえるズレなのか、どうかを統計的に検討できると便利です。
こんなときに使われるのが、カイ二乗分布です。カイは、ギリシャ文字のχです。
Event | Event 1 | Event 2 | Event 3 | ... | Event k |
---|---|---|---|---|---|
観測値(Observed Frequency) | $$o_1$$ | $$o_2$$ | $$o_3$$ | ... | $$o_k$$ |
予測される値(Expected Frequency) | $$e_1$$ | $$e_2$$ | $$e_3$$ | ... | $$e_k$$ |
例えば、あとで出てくる例では、2つのサイコロの目合計値が考えられます。合計値が2になるのは、1/36なので、72回サイコロを投げれば、2回くらいというのが、予測される値という分けです。
カイ二乗値は、観測と予測のズレを足し合わせたイメージです。 $$ \chi ^2 = \frac{(o_1 - e_1)^2}{e_1}+\frac{(o_2 - e_2)^2}{e_2}+...+\frac{(o_k - e_k)^2}{e_k} $$ 書き方の問題ですが: $$\chi ^2 = \sum^{k}_{j=1} \frac{(o_j - e_j)^2}{e_j} $$
url='https://upload.wikimedia.org/wikipedia/commons/thumb/2/21/Chi-square_distributionPDF.png/1280px-Chi-square_distributionPDF.png'
from IPython.display import Image
Image(url)
この分布を使ってできる検定が、カイ二乗検定です。
計算はscipyがやってくれますので、まずは次のような例題を考えてみましょう。
あなたは、カジノで使われているサイコロが、いかさまではないか?と疑っています。これを、カイ二乗検定で確かめてみましょう。
500回のサイコロの2つの合計値を記録したものが、次の表です。
合計値 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
観測された回数 | 8 | 32 | 48 | 59 | 67 | 84 | 76 | 57 | 34 | 28 | 7 |
理想的なサイコロの合計値の頻度は次のようになるでしょう。
合計値 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
予想される頻度 | 1/36 | 2/36 | 3/36 | 4/36 | 5/36 | 6/36 | 5/36 | 4/36 | 3/36 | 2/36 | 1/36 |
500回という回数をかければ、よそうされる回数を計算できます。
observed = [8,32,48,59,67,84,76,57,34,28,7]
roll_sum = sum(observed)
roll_sum
# 予想される頻度です。
freq = [1,2,3,4,5,6,5,4,3,2,1]
# Python2では、1.0としてください。
possible_rolls = 1/36
freq = [possible_rolls*dice for dice in freq]
freq
全体が500回なので、かけ算します。
expected = [roll_sum*f for f in freq]
expected
Scipyのカイ二乗検定を使えます。Chi Square Test
from scipy import stats
chisq,p = stats.chisquare(observed,expected)
print('カイ二乗統計量= {:0.2f}'.format(chisq))
print('P値 = {:0.2f}'.format(p))
stats.chisquareは、統計量とP値を同時に返してくれます。
P値がだいぶ高いので、サイコロはいかさまではなさそうです。