当ページではPythonを用いて、カイ二乗検定を行う方法を解説していきます。
カイ二乗検定とは、帰無仮説が正しいと仮定した時に、検定統計量がカイ二乗分布に従う統計学的仮説検定のことで、適合度検定や独立性の検定などがあります。
カイ二乗分布については「カイ二乗分布とは何か?」のページで詳しく解説しています。統計学的仮説検定やカイ二乗検定の詳しい説明は「統計学の基礎」の中で解説しています。
【目次】
Pythonによる適合度検定
Pythonによる独立性の検定
適合度検定
適合度検定では観測された度数分布が理論上の確率分布に適合するかどうかを検定します。
まずは、適合度検定に必要なPythonライブラリをインポートします。
# Gooness of fit test 適合度検定に使うライブラリ from scipy.stats import chisquare
適合度検定では得られたデータが理論上の分布に適合するかどうかを検定します。
例えば、あるサイコロがあって、このサイコロが歪んでいなければ、このサイコロを振ってそれぞれの目が出る確率は1/6づつになりますね。
つまり、「理論上の分布」以下のようになります。
出る目 | 確率 |
1 | 1/6 |
2 | 1/6 |
3 | 1/6 |
4 | 1/6 |
5 | 1/6 |
6 | 1/6 |
それでは仮にこのサイコロを60回振って、各目のでた回数が以下のようになったとします。
出た目 | 回数 |
1 | 8 |
2 | 12 |
3 | 8 |
4 | 12 |
5 | 8 |
6 | 12 |
適合度検定では、この得られたデータが理論上の分布に適合するか?適合しないか?を検定します。仮説は以下のようになります。
さて、Pythonでは以下のコードで適合度検定ができます。
# Pythonを利用して適合度検定 chisquare([8, 12, 8, 12, 8, 12], f_exp=[10, 10, 10, 10, 10, 10])
一つ目のベクトルの[8, 12, 8, 12, 8, 12]は実際に得られたデータです。二つ目のベクトルのf_exp=[10, 10, 10, 10, 10, 10]は理論上のデータです。
すべての目が1/6の確率で出ると仮定して、60回このサイコロを振ると、理論上はそれぞれの目が10回づつでるからです。
結果は以下のようにでます。
>>> chisquare([8, 12, 8, 12, 8, 12], f_exp=[10, 10, 10, 10, 10, 10])
>>>Power_divergenceResult(statistic=2.3999999999999999, pvalue=0.79147412059432465)
P値が約0.79ですので、帰無仮説は棄却できません。つまり、得られたデータが理論上の分布に適合しないと結論づけることはできません。
独立性の検定
Pythonで独立性の検定を行うには上で利用したものとは別のライブラリを使います。
# Test for independence 独立性の検定に利用するライブラリ from scipy.stats import chi2_contingency
例えば、喫煙と発ガンに関連性があるか?それとも二つの変数(喫煙、発ガン)は独立しているか?をカイ二乗検定してみましょう。
仮説は以下の通りです。
「独立していない」とは「なんらかの関連がある」ということです。つまり、ここでは、喫煙する人としない人で発ガン率に差があるかを検定したいことになります。
(※注意:仮に独立性の検定で帰無仮説が棄却されて、「喫煙と発ガンは独立していない」と結論づけることができたとしても、それは必ずしも喫煙と発ガンに因果関係があるとは言えません。)
さて、喫煙群と非喫煙群から100人づつをサンプリングして、発ガンした人の数を数えたところ、以下のようなデータが得られたとします。
クロス集計表
発ガン人数 | 非発ガン人数 | |
喫煙群 | 30 | 70 |
非喫煙群 | 20 | 80 |
これだけ見ると、なんとなく喫煙群の方が発ガン率が高く、喫煙と発ガンには何らかしらの関連があるようにも見えますが、統計学的にこの二つの変数が独立していないことを結論づけられるかどうか、カイ二乗検定をしてみましょう。
# 独立性の検定 chi2_contingency(np.array([[30,70],[20,80]]))
np.array([[30,70],[20,80]])は上記のクロス集計表を行列(配列)の形で表したものです。
検定結果は以下のようにでました。
>>> chi2_contingency(np.array([[30,70],[20,80]]))
>>> (2.1600000000000001, 0.14164469029513255, 1, array([[ 25., 75.], [ 25., 75.]]))
P値が約0.14ですので、帰無仮説は棄却されません。つまり、喫煙と発ガンの2つの変数は独立していないとは結論付けられません。
※この記事書くのに以下のページを参考にしました。
– scipy.stats.chisquare
https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.chisquare.html
– scipy.stats.chi2_contingency¶
https://docs.scipy.org/doc/scipy-0.15.1/reference/generated/scipy.stats.chi2_contingency.html