目次
カイ二乗検定とは何かが発生する頻度(度数)について偏りがあるかどうかを調べる手法。
理論的に予想されるデータの分布と実際に観測されたデータの分布がほぼ同じかどうかを検証する。
「予想通りの結果なのか?」あるいは「出来事に関連があるのか?」という2種類の検定がある。
観測されたデータが予測される確率(割合)の通りになっているかどうかを調べる 適合度の検定 。
2つの出来事について、独立かどうか(関連性があるかどうか)を調べる 独立性の検定 。
両者は形式的には全く同じであるが,データの採取法により両者は区別される。例えば,「男女の 2 群で食物嗜好の回答の分布が異なるか」を知りたいときに,まえもって m 人の男子と n 人の女子を対象として調査することを決めてからデータを集めた場合には男女で分布が異なるかどうかの検定になる。これに対して,N 人の対象者について調査し,得られたデータを性別と回答別に集計した場合には,性別と食物嗜好が独立であるかどうかの検定になる。
—引用 http://aoki2.si.gunma-u.ac.jp/lecture/Cross/warning.html
ややこしい話はさておき、カイ二乗検定の結果から p値 というのを求めることができる。
p値とは 実際に観測された分布が理論的に予想される分布にどれだけ近づいているかを表す確率 のこと。
p値が大きければ 、実際に観測された分布は 理論的に予想される分布に近い ことを示し、 p値が小さければ 、実際に観測された分布は 理論的に予想される分布から離れている ことを示す。
一般にこの値が5%未満(p < 0.05)の場合にデータには「統計学的に有意な差がある」とされるため、 p値が 0.05 未満だと、実際に観測されたデータの分布は 理論的に予想されるデータの分布から離れている と解釈する。
p値 | 解釈 |
---|---|
p > 0.05 | 分布に偏りあるいは関連があるとは言えない |
p < 0.05 | 分布に偏りあるいは関連があると言えそう |
ナンバーズの予想にカイ二乗検定をどのように使うのか?
それは 数字の出現回数の偏りについて調査する ために使える。
数字の出現回数が理論的に予想されるようになっているのか、それとも理論的な予想から外れるのかを調べる。
「理論的な出現回数(これを「期待度数」という)と実際の出現回数(これを「観測度数」という)の数値は一致する」というのを前提にp値を解釈する。
つまり「数字の出現回数に偏りなんてない!」という前提で、
位ごとに0から9の数字の出現回数に偏りがあるのかを検定する。
ナンバーズ3の第1回から第4170回の抽せん数字で、まずは100の位で出現した数字の分布(出現回数)は以下のとおりである。
python のプログラムは 前準備 で用意したデータフレームを使っています。
df['place100'].value_counts().sort_index()
出現回数 | |
---|---|
抽せん数字 | |
0 | 389 |
1 | 420 |
2 | 423 |
3 | 410 |
4 | 412 |
5 | 390 |
6 | 429 |
7 | 402 |
8 | 446 |
9 | 449 |
scipy を使ってカイ二乗値とp値を計算する。
obs = df['place100'].value_counts() # obs とは observation frequency で観測度数の意味
scipy.stats.chisquare(obs)
# 結果 タプルの左がカイ二乗値、右がp値
Power_divergenceResult(statistic=9.270983213429256, pvalue=0.4126455446395875)
p値は有意水準 5% より大きい( 0.05 < 0.41 ) ので、 理論的に予想される分布と実際に観測された分布が ほぼ同じである という結果となり 出現回数に偏りがあるとは言えない。
同様に第1回から第4170回の抽せん数字で、10の位と1の位の分布について検定した結果は下記のようになった。
10の位の場合
print(df['place10'].value_counts().sort_index()) # 10の位の度数を確認
scipy.stats.chisquare(df['place10'].value_counts())
# 結果 タプルの左がカイ二乗値、右がp値
Power_divergenceResult(statistic=5.438848920863309, pvalue=0.7944989057864521)
p値は有意水準 5% より大きい( 0.05 < 0.79 )ので出現回数に偏りがあるとは言えない。
1の位の場合
print(df['place1'].value_counts().sort_index()) # 1の位の度数を確認
scipy.stats.chisquare(df['place1'].value_counts())
# 結果 タプルの左がカイ二乗値、右がp値
Power_divergenceResult(statistic=7.309352517985612, pvalue=0.6049455625505693)
p値は有意水準 5% より大きい( 0.05 < 0.60 )ので出現回数に偏りがあるとは言えない。
ナンバーズ3は毎回3つの数字が選ばれるので100,10,1の位の度数分布から 抽せん数字と位に関連があるか を検定する。
100の位 | 10の位 | 1の位 | |
---|---|---|---|
抽せん数字 | |||
0 | 389 | 420 | 405 |
1 | 420 | 421 | 407 |
2 | 423 | 426 | 433 |
3 | 410 | 438 | 401 |
4 | 412 | 401 | 417 |
5 | 390 | 415 | 412 |
6 | 429 | 401 | 393 |
7 | 402 | 417 | 416 |
8 | 446 | 391 | 456 |
9 | 449 | 440 | 430 |
obs = df[['place100', 'place10', 'place1']].apply(pd.Series.value_counts).values
chi2,p,dof,ex = scipy.stats.chi2_contingency(obs)
# p値 print(p)
0.8016546212362078
p値は有意水準 5% より大きい( 0.05 < 0.80 )ので3つの数字をまとめて検定しても出現回数に偏りがあるとは言えない。 つまり、理論的に予想される分布とほぼ同じような分布であると言える。
検定の前に仮説を立てる。仮説には「 帰無仮説 」と「 対立仮説 」がある。
適合度の検定
独立性の検定
観測度数とは「実際に観測された数値」で期待度数とは「確率的に予測される数値」のこと。
ナンバーズは位ごとに0から9の数字が選ばれる。 抽せん数字に偏りがないのであれば位ごとに10分の1の確率でそれぞれの数値が出てくるはずなので この10分の1の確率をもとに期待度数を計算できる。
例えば、第1回から第4000回まで抽せん数字を用いて100の位の数字だけを集計したとき、それぞれの数値が出現すると期待される回数は400回になる。 第1回から第4136回までの抽せん数字だと、期待度数は 413.6 になる。
最終更新日: 2020年01月09日(木)