p値とはなにか
概要
一言で言うと、意味のない数字(偶然に起きる)可能性がx%
コイン投げの実験結果
- 100回のコインを投げると、81%の確率で、44-56枚になる
- 19%の確率で、7%以上本来の確率(50%)から値が離れる
100枚投げて44枚が表になるときのp値は?
- 以下のようにbinom.testを実行する
-
binom.test(c(44, 56))
- 44枚が表、56枚が裏という意味
- p値は、0.27。(ざっくり言うと、0.5でない確率が0.27)
- 95%の信頼区間で、0.34-0.54になる
> binom.test(c(44, 56))
Exact binomial test
data: c(44, 56)
number of successes = 44, number of trials = 100, p-value = 0.2713
alternative hypothesis: true probability of success is not equal to 0.5
95 percent confidence interval:
0.3408360 0.5428125
sample estimates:
probability of success
0.44
binom.testの使い方
- 省略しないと、
binom.test(c(44, 56), p = 0.5, conf.level = 0.95)
となる - 確率が0.55の時は、p値は3%になり、55%である確率は3%となる。
> binom.test(c(44, 56), p = 0.55)
Exact binomial test
data: c(44, 56)
number of successes = 44, number of trials = 100, p-value = 0.03427
alternative hypothesis: true probability of success is not equal to 0.55
95 percent confidence interval:
0.3408360 0.5428125
sample estimates:
probability of success
0.44
- 信頼区間が80%の時は、37%-50.9%になる。
> binom.test(c(44, 56), conf.level = 0.8)
Exact binomial test
data: c(44, 56)
number of successes = 44, number of trials = 100, p-value = 0.2713
alternative hypothesis: true probability of success is not equal to 0.5
80 percent confidence interval:
0.3727990 0.5090527
sample estimates:
probability of success
0.44
A/Bテストの行い方
- A/Bテストを行った結果が偶然かどうかは以下のように
prop.test
を使ってp値を計算する。
prop.test(c(5000, 53), c(10000, 100))
=> p値 0.6195
prop.test(c(5000, 58), c(10000, 100))
=> p値 0.1358
prop.test(c(5000, 58), c(10000, 100))
=> p値 0.02216
prop.test(c(5000, 510), c(10000, 1000))
=> p値 0.5688
prop.test(c(5000, 520), c(10000, 1000))
=> p値 0.2408
prop.test(c(5000, 530), c(10000, 1000))
=> p値 0.07574
=> 厳密には、このp値は1つをコインを投げたときと、2つのコインをなげて比較すると違うので、実験結果(例えば、100回のコインを投げると、81%の確率で、44-56枚になる)と同じではないですが、だいたい数字は近い。
信頼区間をいくつに設定するのか
- 信頼区間をいくつに設定するのかによって判断が変わる
- 結果が改善しているかどうか、偶然改善したか、偶然改善してないか判断する必要がある
- 例)
=> Wantedlyでは、基本的には90%で見ているが、PVが多く実験しやすいページは95%。
練習: A/Bテストの検証をしてみてください
10万PVの画面で、AとBのボタンのテストをしました。
A 5.1万PV 5.5%
B 5万PV 5.7%
Bにすることで改善しました
AとB二つの画面で、応募ユーザの改善のA/Bテストをしよう
A 2万人 10.5%
B 2万人 10.0%
おお、Aの機能を追加することで、改善しました
10万PVの画面で、AとBのボタンのテストをしました。
Aは、click率は上がるけど、その後のコンバージョンは下がりそう。(応募数は増えるけど、企業からの返信率は下がりそう)
Bは、click率は低いけど、その後のコンバージョンは上がりそう。(募集のハードルは高いけど、いい人が応募してくれそう)
A 5万ユーザ 応募率 3% 返信率 50%
B 5万ユーザ 応募率 2.7% 返信率 55%
振り返り
- 結果が改善しているかどうか、偶然なのか判断する必要がある
- 信頼区間をいくつに設定するのかによって判断が変わる
- p値は、結論を出す前に、サンプル数を増やすことで、p値を低くすることができる。(待つとp値
は下がる) - binom.testで信頼区間を調べる。prop.testでA/Bテストを行う
施策をする上でのA/Bテストの捉え方
- 対象のPV(人数)が少ない、コンバージョン率が低いときは、検証しにくい
- 実験対象のコンバージョンの影響範囲が分からないときも利用しにくい
- 深いコンバージョンの精度は非常に悪く、期間内に判断できないことも多いが、サービスを続ける上では大切になってくる
- A/Bテストすれば分かるということでもない。
- 特に初期のリリースでは分からないことのほうが多い
- A/Bテストで分からない改善に対してA/Bテストを行うことは無意味。よくなったかどうかも分からない。
- 改善するときは、A/Bテストで分かる改善を行うか、分からない場合は別の判断(デザイナー判断)で行う必要がある。
- PVが多い時は、A/Bテストより重要になる
- 10万人のユーザがいるときにできる精度と、1万人のユーザがいるときにできる精度と、1000人のユーザしかいないときの精度は全然違う。
A/Bテストで重要なことまとめ
- 今取り組む問題はどのくらいの精度(コンバージョン)で改善しないといけないか把握する
- PVがある画面はA/Bテストをするのがいい
- PVが少ないのに、数字を見て、改善をしても意味がない。数字をだけでなく、ユーザのフィードバックや自分で改善を見つけることも重要。
- 深いコンバージョンの判断の場合は、数字で判断できない問題もある。その場合は、数字以外の判断が必要で、判断をしないことがいいわけでもない
- p値を下げることと、判断を早くすることは両立できないときもある
- 基本的には、正しく改善するのでなく、素早く改善するほうがよいことが多い
=> 施策を行う前にどのくらいのPVが必要か、どのくらいの改善が必要か考えよう
関連
- 偶然とはなにか。コインを投げてみよう http://qiita.com/reikubonaga/items/12329122772d8161439d
- p値とはなにか http://qiita.com/reikubonaga/items/c4684fcea0810441a955
- A/Bテストは完全ではない http://qiita.com/reikubonaga/items/6f12543aa2478a6ac3b4
- 乱数(モンテカルロ法)を使って確率を計算しよう http://qiita.com/reikubonaga/items/28ee2c2c8074b98b0b04