唯物是真 @Scaled_Wurm

プログラミング(主にPython2.7)とか機械学習とか

5分でわからない統計的検定

社内でABテストとか統計的仮説検定の話題が出ていたので、統計的検定を知らない人向けに「5分でわかる統計的検定」というLTをしようかと思ったけど、まったく5分で終わる気がしなかったのでとりあえずブログにまとめてみる

ちなみに社内では統計的検定は数名の人が個人的に趣味で使っている程度
個人的には統計的検定をやることをそんな重要視してないけど(PVとかユーザー数多ければだいたい有意差出るし、数値を見て明らかに差があるような変更でないとあまり意味がないような気がする)
自分は統計やABテストなどにあまり詳しいわけではないので注意
間違いはコメントやTwitterなどで教えていただけると嬉しいです

統計的検定とは

雑にいうと、得られた結果が偶然得られたものどうかを確かめる方法(特定の仮定のもとで)
ABテストでは別々のものをユーザーに見せた結果が偶然の差ではなく統計的に意味のある差(有意)が得られているかどうかを確認したいときに使う

帰無仮説と呼ばれる仮定をした時に、得られた結果以上に極端な(確率の小さな)結果が起こる確率を計算してその値の大小によって判断を行う。この確率のことをp値と呼ぶ
例えばコインを6回投げた時に5回表が出た結果を検定したいなら、それ以上に極端な結果「5回表」「5回裏」「6回表」「6回裏」の確率の合計を計算したものがp値になる(コインの表と裏が出る確率が等しいという帰無仮説のもとで)

帰無仮説では導きたい結論と逆の仮説を立てる
例えばいくつかの違う手法を試したそれぞれのグループの結果に差がないといった仮定(本当は差が出て欲しい)

慣習的にp値が0.05や0.01などの適当な基準値以下のときに、結果は偶然でないと判断される(帰無仮説が正しい場合にこの結果以上に極端な結果が得られる確率が十分に低いという判断)
この基準値は有意水準と呼ばれ、p値が有意水準より小さい時に帰無仮説が正しくないと判断することを、帰無仮説は棄却された、結果は統計的に有意であるなどと言われる

注意点として、p値が有意水準より大きい時に、帰無仮説が正しいという結論を導くのはよくある間違いとして知られている

例1: コイン投げ

コインを6回投げて5回表が出た時、この結果はコインの表と裏が等しい確率とした時に偶然得られたものかどうかを考えたい
コインの表裏が出る確率は\(\frac{1}{2}\)と仮定する(帰無仮説)
「5回表が出る」こと以上に極端な結果は「5回表」「5回裏」「6回表」「6回裏」なので
$$ 6 \times \frac{1}{2^6} + 6 \times \frac{1}{2^6} + \frac{1}{2^6} + \frac{1}{2^6} = \frac{7}{32} \approx 0.22 $$となりp値はおよそ0.22となる
有意水準0.05としたときこの結果は統計的に有意ではなく、この場合コインの表裏が出る確率に差があるとは言い切れないと判断される

次に6回すべて表が出た場合を考えると、p値は0.05以下となるので偶然この結果が得られる可能性は低く、コインの表裏が出る確率は1/2ではなくゆがんだコインになっている可能性が高いと判断される

今回は0.05を有意水準としたが有意水準の値は分野ごとに違う慣習的な値である
有意水準0.05という値を使うと、仮に帰無仮説が正しい場合に20回に1回誤って帰無仮説を棄却するという計算になる

例2: ガチャ

1%の確率で当たりが出るガチャを300回やってすべてハズレだったとき、このガチャの当たりが出る確率は1%でないと考えるべきかどうか
f:id:sucrose:20160312221356p:plain:w200
計算がめんどくさいのでPythonで二項検定するとp値はおよそ0.08となり、怪しいけど有意水準0.05のもとでは統計的に有意な差とは言えない、という解釈になる

scipy.stats.binom_test([0, 300], p=0.01)

カイ二乗検定

ABテストなどで使うならだいたいカイ二乗検定を覚えておけばよい
カウントが少ない場合は適していないという問題はあるが一つだけ覚えるならこれ

各セルのカウントが排他的で重複のない表が作れるときに、縦軸と横軸の属性に関係があるかどうかを調べることができる

例えばページAとページBでそれぞれ閲覧したユーザー数とページ内のコンテンツをクリックしたユーザー数が測れるときに、その結果を検定したい

閲覧したユーザー数 クリックしたユーザー数
ページA 100 15
ページB 1000 100

カイ二乗検定にかける前に、クリックしたユーザー数には閲覧したユーザー数が含まれてしまっているので、閲覧したユーザー数からクリックしたユーザー数を引いて、クリックしなかったユーザー数とクリックしたユーザー数の表を作る必要がある

クリックしなかったユーザー数 クリックしたユーザー数
ページA 85 15
ページB 900 100

この表のデータをカイ二乗検定にかけると、クリックしたユーザー数とクリックしなかったユーザー数の割合がページA、Bについて統計的に有意な差があるかどうかを調べることができる

ExcelでもCHISQ.TEST関数などでできるらしいが詳しくないので、RやPythonでのやり方をメモしておく

Rでやると

chisq.test(matrix(c(85, 15, 900, 100), ncol=2, byrow=T))

すると以下のようにp値がおよそ0.16という結果が得られる
この場合閲覧したユーザー数に対するクリックしたユーザーの割合はページAの方が1.5倍になっているが、有意水準0.05とした時に有意な差とは言えないという結論になる

Pearson's Chi-squared test with Yates' continuity correction

data:  matrix(c(85, 15, 900, 100), ncol = 2, byrow = T)
X-squared = 1.923, df = 1, p-value = 0.1655

同様にPythonでやるとscipyのライブラリにある関数を使って

scipy.stats.chi2_contingency([[85, 15], [900, 100]])

統計的検定に対する批判

統計的検定にはいろいろ批判がある

よく言われるのがp値が必ずしも効果の大きさを表さないことである
結果の差の大きさが大きくなるとp値は小さくなるが、データの量が多くてもp値は小さくなる
p値の大小を比べても効果の大きさの大小を表しているとは限らない

他にもいろいろ批判があるのでいくつか参考になりそうなURLを貼っておく

まとめ

統計的検定は用法用量を守って正しくお使いください

参考URLなど

sucrose.hatenablog.com
昔自分が書いた記事、よくわからない頃に書いたので参考になるかどうかはよくわからない

何も画像がないのはさびしいのでいらすとやさんの画像をお借りした