2018.03.09

カイ二乗検定について卒論生にたまに聞かれたので忘備録

お疲れ様です。Hitomiです。
今日はあんまり書くことがないのと、最近ただの日記ばっかりだったので、今年度学生によく聞かれた質問とその答えをまとめて書いておきたいと思います。
先生方や一般の方々にはあまり面白くない記事かもしれませんが、もしかしたら間違っていたりするかもしれませんので、気づいた点があればぜひご指摘ください。
あまりにつまらない、読む気も起こらないと思う方用にジョ〇ョネタを数個入れておきましたので何個あるか自由にお探しください。最後が近づいてきたので大放出です。

質問はこちら。
Q:「カイ二乗検定で有意になった時って、どことどこに差があるんですか?」
→なるほど、t検定を習った後で、カイ二乗検定を習うと混乱するのもしれませんね。カイ二乗検定は期待値と実測値の差の検定です。例をみてみましょう。

  介入有り 介入無し 計
良   ●    ●   60
悪   ●    ●   40
計    50    50

上の表で、仮に介入の有り・無しで体調の良し悪しに差がなかったら、●の値はどうなると思いますか?●に入る値を入れてみてください。

  介入有り 介入無し 計
良   30    30  60
悪   20    20  40
計   50    50

もちろんこうなりますよね。誰だってそーする、おれもそーする。
計が50:50なので、介入有りでも介入無しでも同数になるはずです。
こんな風に「もし差が無かったら、こうなるだろう」という値が期待値です。
実際にデータを取って集計したところ、以下のような結果だったとします。

  介入有り 介入無し  計
良   40    20  60
悪   10    30  40
計   50    50

カイ二乗値は、次の方法で算出します。
・期待値と実測値のズレを2乗したものを期待値の値で割る
・上の値をすべてのセルで算出する
・この値を足す
な…何を言っているのかわからねー…と思うが、私でも分かるのでゆっくり理解してください。

つまり、有意だったとしたら、「期待値との間にズレがある。ということはどこかのセルで度数に偏りがある」という解釈になります。カイ二乗値が有意だったとしても、特定のセルの間の差を示しているわけではありませんので気を付けてくださいね。

ちなみにさっきのデータでSPSSでカイ二乗検定をしてみるとこんな結果が出力されました。

カイ二乗値=16.67,p<.001で有意ですね。
今回は度数が十分なので問題ないですが、度数の小さいデータの場合、イェーツの連続性補正をするべきと言われていますので、その場合は1行下の「連続修正」の部分を見てください。

ちなみに、どのセルで期待値と実測値の間に偏りがあったのかを検討するのは「残差分析」が適しています。SPSSの場合、クロス集計表のボックスのところで「セル」のボタンを押して「調整済み標準化」にチェックを入れれば、ちゃんと残差分析の結果も出してくれるので確認してみてください。


…と、まぁ、説明してきましたが、学生がこんなきれいなデータを持って相談に来ることはほぼありません。持って来るのは以下のようなデータです。やれやれだぜ。(適当に作ったサンプルデータです)

    介入有り 介入無し 
体調良   10    2  
体調中    6     0   
体調悪    4     6  

データ少ない…、しかもゼロがある…。
「先生、これカイ二乗検定でいいんでしょうか…?」
双方不安を感じつつ、とりあえずSPSSで分析すると以下のような結果になります。 


「やった、結果出たッ!分析完!」と言いたいところですが、この場合、下に出ている『4 セル (66.7%) は期待度数が 5 未満です。』は重要な警告です。
このように期待値が5未満のセルが全体の20%を上回る場合、カイ二乗検定は間違った結果を出してしまう可能性が非常に高いです。そんな時はカイ二乗検定ではなくFisherの正確性確率検定をすることが推奨されています。(Cochranのルール)

2×2の表だったらSPSSの「Fisherの直接法」の部分を見れば大丈夫なんですが、例に出した2×3の表のように、セルが多い場合、SPSSではFisherの正確性確率検定はしてくれません。(正確に言うとアドインを追加しないとできないらしいです)

ダメだ、詰んだ…現実は非情である…と、絶望感に浸りたくなりますが、今回はRでできるという情報を見つけました。というわけでRでやってみたいと思います。

Rというのは無料の統計用フリーソフトです。
使い方は長くなってしまうので書きませんが、色んな本が出ていますし、各地で研修会がさかんに行われていますので、ぜひ探して参加してみてください。文系出身、プログラミング経験皆無の私でも1年くらいでなんとなく使えるようになったので大丈夫です。たぶん。Fight!

ということで詳細は省きますが、今、クロス集計表に「dat」という名前を付けた状態だと思ってください。
> dat
   b
a    1  2
  1 10  2
  2  6  0
  3  4  6

以下のように入力して実行すれば、これだけでOKです。
> fisher.test(dat)

ただ、Fisherの正確性確率検定は計算が大変なので時々エラーが出るそうです。エラーが出た場合は以下のようにメモリの容量が大きくなるように指定してもう一度リトライしてみてください。
> fisher.test(dat, alternative = "two.sided", workspace=10000000)
ちなみにalternative = "two.sided"というのは、両側検定をしてね、という意味です。

走らせてみました。出ました!さすがR!SPSSに出来ないことをやってのけるッ!

==============
> fisher.test(dat)
Fisher's Exact Test for Count Data

data:  dat
p-value = 0.02295
alternative hypothesis: two.sided
=======

p値は、p = 0.02295ですね。5%水準で有意です。

ちなみにchisq.test(dat)でカイ二乗検定も出来るらしいのでRでもやってみました。

=======
> chisq.test(dat)

Pearson's Chi-squared test

data:  dat
X-squared = 8.0733, df = 2, p-value = 0.01766

Warning message:
In chisq.test(dat) :  カイ自乗近似は不正確かもしれません
=======

ちゃんとSPSSと一緒の結果になっていますが、警告が出ています。やっぱり今回のデータはカイ二乗検定には向いていませんね。

一見、ほとんど変わらないようにも見えますが、間違った検定をしてしまうと研究の信頼性も下がってしまいますので注意してください。「結果」だけを求めていると、人は近道をしたがるものだ・・・・・・近道をした時、真実を見失うかもしれない。やる気もしだいに失せていく。大切なのは『真実に向かおうとする意志』だと思っている。

ということで、以上カイ二乗検定をする時の注意点でした。ドゥーユーアンダスタン?

まぁ、私もまだまだ勉強中です…。
もうちょっとRを使いこなせるようになりたいなぁ。
ちなみにネタは8個でした!それではまた来週!

Hitomi