廿TT

譬如水怙牛過窓櫺 頭角四蹄都過了 因甚麼尾巴過不得

二項分布を用いたABテストのサンプルサイズ計算

ABテストがらみの話は完全に私怨からはじめたものですが、単純なようでなかなか奥が深いんです。

検定いらずの AB テスト:φ 係数を用いたサンプルサイズ設計 - 廿TT で考えた方法はちょっと気に入ってるけど、たいして話題にならず、議論にも発展しなかったのでもう一ネタ書きます。

多くのABテストでは次のような分割表を評価します。

コンバージョンした訪問 コンバージョンしなかった訪問
A a c
B b d

ABテストを仮説検定の枠組みの中で、例数(サンプルサイズ)設計をきっちり行ってABテストを実施しようと主張する人もいます。

が、たぶん無理だと思います。

その理由として次のように述べました。

  • 伝統的な仮説検定の枠組みで例数設計を行うには以下を想定(設定)する必要がある
  • しかし AB テストの多くは探索的なものなので、A の CVR、B の CVR を想定するのは難しいし、有意水準とか検出力とかの解釈も難しい
  • また「検定して有意にならなかった場合、どうすればいいのか」という指針が与えられない
  • 「確実な結果が欲しいので有意になるまで検定を続けます」とやったらそれはもはや検定ではない

ぼくは、ABテストで興味があるのは「有意差」ではないと思い、問題設定をこのように置きかえます。

『本当は A のほうがCVR(コンバージョンレート)が大きいのに、誤って B の方を選んでしまう確率を r くらいに抑えたい場合、どのくらい コンバージョン数が必要か』

AとBがランダムに五分五分の確率で割り付けられていた場合、分割表のaとbの数を比べるだけでこの確率 r を評価できます。

AとBがランダムに五分五分の確率で割り付けられていた場合、AとBのCVRが等しければ a/(a+b)は0.5に近い数字になります。

a/(a+b) の真の値(無限回実験すれば求まる)を p とします。

p が0.5を上回ることと、AのCVRのほうが高いことは同じになります。

そこで「p がこのくらいなら実質的に意味のある差とみなそう」という値を決め、この値を p_\mathrm{set}とよぶことにします。

p_\mathrm{set} の値の大きさと n の大きさはトレードオフの関係にあります。

  • p_\mathrm{set} を小さくして、小さな差でもちゃんとAとBを評価したい場合、必要な n は大きくなります。
  • 多少のCVRの差なら無視してもいいやと思える場合、必要な a+b(コンバージョン数)は小さくなります。

a+b を n と置くと必要な n は概ね以下で与えられます。

f:id:abrahamcow:20180911053738p:plain

Binomial は二項分布の確率分布関数です。\lceil x \rceil は天井関数です。

Rで書くとこんな感じです。

Ncalc <-function(set=0.52,r=0.05,maxit=10000){
   which.max(sapply(1:maxit,function(N)pbinom(ceiling(N/2),N,set)<r))
}
Ncalc(0.52)
# [1] 1740

この場合、コンバージョンが合計1740個以上集まったら単純にコンバージョン数が多い方を選べば、r を0.05以下に抑えられるという意味です。

φ係数を用いたほうがcやdの情報を使っている分、よりすくない実験回数で済むはずです(根拠は勘ですが)。

あと場合によってはバンディット問題的なアプローチもいいと思います。

かんたんなバンディットアルゴリズムのシミュレーション - 廿TT

おしまい。