社会人が統計学の基礎を学び、実務で活かす

Pythonでカイ二乗検定(適合度検定・独立性の検定)を行う方法 (Pythonによる統計学入門)

スポンサーサーチ

当ページでは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

適合度検定では、この得られたデータが理論上の分布に適合するか?適合しないか?を検定します。仮説は以下のようになります。

H_0: 得られたデータは理論上の分布に適合する。

H_A: 得られたデータは理論上の分布に適合しない。

さて、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 

例えば、喫煙と発ガンに関連性があるか?それとも二つの変数(喫煙、発ガン)は独立しているか?をカイ二乗検定してみましょう。

仮説は以下の通りです。

H_0: 喫煙と発ガンは独立している。

H_A: 喫煙と発ガンは独立していない。

「独立していない」とは「なんらかの関連がある」ということです。つまり、ここでは、喫煙する人としない人で発ガン率に差があるかを検定したいことになります。

(※注意:仮に独立性の検定で帰無仮説が棄却されて、「喫煙と発ガンは独立していない」と結論づけることができたとしても、それは必ずしも喫煙と発ガンに因果関係があるとは言えません。)

さて、喫煙群と非喫煙群から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


プログラミングとソフトウェア

スポンサー募集中。

統計ドットリンクでは広告出稿をご希望のスポンサー様を募集しております。ページビューなどは、「お問い合わせ」からご連絡ください。

更新・勉強会などの情報を受け取る。

以下からFacebookページをフォローもしくは、メールマガジンへの登録をすると、更新情報、勉強会、講習会、交流会の案内など各種情報を受け取ることができます。

↑こちらからFacebookページをフォロー。
 

メルマガ登録はこちら

理系の就職・職業訓練

統計ドットリンクでは、理系の大学生、大学院生、第二新卒の就職や転職を応援しています。職業訓練、求人やエージェントなどの必要な情報を選別し、紹介しています。 就職、職業訓練の情報を確認する。
PAGETOP
Powered by WordPress & BizVektor Theme by Vektor,Inc. technology.