Edited at

p値とはなにか

More than 3 years have passed since last update.


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の機能を追加することで、改善しました

10PVの画面で、ABのボタンのテストをしました。

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が必要か、どのくらいの改善が必要か考えよう


関連