RでベイジアンABテストやってみた。

こんにちは!
データサイエンティストの望月です。

最近、私が携わっている案件で新規会員のCV率向上のため、ウェルカムメール配信を始めました。 このメール配信施策の効果を測定する際、カイ2乗検定のような古典的ABテストではなくベイジアンABテストを実施したのですが、個人的に色々なメリットを感じたので、 本記事ではベイジアンABテストのメリットとともにRでの実装~解釈方法について共有したいと思います。

ベイジアンABテストとは?

簡潔に言うとベイズ統計の理論を踏襲したABテストです。 今回のメール配信施策であれば以下のような流れで2つのグループを比較します。

  1. メールを送ったグループと送らなかったグループそれぞれで、CV率がだいたいこれぐらいの値を取りうるだろうという予想を立てる(=事前分布を設定する)
  2. データが来たらその情報(尤度)をもとに各々の予想(事前分布)を更新する(=事後分布を算出する)
  3. 事後分布をもとに2つのグループを比較する

「もう少し詳しく理解したい!」という方には"楽しみながら学ぶベイズ統計"という本をおすすめします。 最低限の数式理解があれば、ベイズ統計の概要や旨味を知ることができます。

古典的ABテストとの違い

カイ2乗検定のような古典的ABテストの場合、以下のような手間や問題が生じてしまいます。

  • あらかじめサンプルサイズ(何件データを取るか?)を決めておく必要がある
  • サンプルが揃うまでテストを始めることができない
  • テスト結果からわかることは「AとBに有意な差があると言える」か「AとBに有意な差があるとは言えない」であり、 「有意な差があるとは言えない」となったときに、どれくらい言えないのかわからない

対してベイジアンABテストは

  • あらかじめサンプルサイズを決めておく必要がない(テスト設計に統計的知識を必要としない)
  • 任意のタイミングでテスト結果を確認することができる(テストの終了タイミングも柔軟に決められる)
  • テスト結果からわかることは「AはBと比べて何%の確率で効果があると言える」であり、 効果の有無を確率に落とし込むことができる

といったメリットがあります。

Rでやってみる

仮にメール配信施策の途中結果が下図の通りになったとします。

CVした CVしなかった
A(メールを送ったグループ) 50 100
B(メールを送らなかったグループ) 45 105

RでベイジアンABテストを実施する際には"bayesAB"パッケージのbayesTest関数を利用すると便利です。 以下がRのスクリプトです。

# パッケージの読み込み
library(bayesAB)

# サンプルデータ作成
A_cv <- rep(1,50)
A_notcv <- numeric(100)
B_cv <- rep(1,45)
B_notcv <- numeric(105)
A <- c(A_cv,A_notcv)
B <- c(B_cv,B_notcv)

# いざ、ベイジアンABテスト
AB_1 <- bayesTest(A_data = A,
                  B_data = B,
                  priors = c('alpha' = 1,'beta' = 1),
                  n_samples = 1e5,
                  distribution = "bernoulli")

# 結果をプロット
plot(AB_1)

2行目でパッケージを読み込み、5~10行目にかけてサンプルデータを作成しています。 ここで作成したサンプルデータA,BはCVした場合は1,しなかった場合は0が入っている01ベクトルになっています。 13~17行目にかけてベイジアンABテストを実施しています。 bayesTest関数では第1引数"A_test"と第2引数"B_test"に各データを指定します。 第3,第4引数はいったん飛ばして第5引数"distribution"ではデータの母集団分布を指定します。 今回の場合では、確率pで1(CVする)をとり確率1-pで0(CVしない)をとるベルヌーイ分布を指定します。 第3引数"priors"では事前分布のパラメータを設定します。 第5引数"distribution"でベルヌーイ分布を指定した場合、計算上の都合により事前分布にはベータ分布を置くのが一般的です。 このベータ分布は下図の通り2つのパラメータαとβをどのような値にするかによって形が変動します。

f:id:gri-blog:20210329121249p:plain

α=1,β=1の時は[0,1]区間でフラットな一様分布となります。 ここではとりあえず、事前分布としてα=1,β=1のベータ分布(=一様分布)を指定します。

20行目でベイジアンABテストの結果をプロットします。 実行すると3つの図が出力されます。
1つ目の図では、事前分布が表示されます。

f:id:gri-blog:20210329120251p:plain

2つ目の図では、A,Bそれぞれの事後分布から第4引数"n_samples"で指定した回数分のランダムサンプリングを行い、得られたデータの分布が表示されます。 ※今回は100,000と表記しましたが、デフォルトが100,000なので省いても大丈夫です。

f:id:gri-blog:20210329120417p:plain

A(メールを送ったグループ)の分布の方がB(送らなかったグループ)の分布よりも全体的にやや右側に位置しており、 「メール配信の効果が若干だけどあるかも?」ということがなんとなくわかります。

3つ目の図では、(A-B)/Bの分布(相対効果の分布)がヒストグラムとして表示されます。

f:id:gri-blog:20210329120726p:plain

「(A-B)/Bが0より大きい場合」つまり「A>Bの場合」はAのほうがCV率が高いと考えられ、その割合がヒストグラム内に表示されます。 よって、AのほうがBに比べて73.1%効果があるという結論にいたります。 もう少し調査時間をとってサンプルサイズを増やすことが可能であれば、より精緻な値を算出することが見込めます。

最後に

今回は事前分布をとりあえず一様分布としましたが、本当にそれでいいのか疑問に思った方もいらっしゃるかと思います。 そこで次回は事前分布の決め方についてお話したいと思います。 こうご期待!

参考文献

・楽しみながら学ぶベイズ統計学
https://www.amazon.co.jp/%E6%A5%BD%E3%81%97%E3%81%BF%E3%81%AA%E3%81%8C%E3%82%89%E5%AD%A6%E3%81%B6%E3%83%99%E3%82%A4%E3%82%BA%E7%B5%B1%E8%A8%88-%E3%82%A6%E3%82%A3%E3%83%AB%E3%83%BB%E3%82%AB%E3%83%BC%E3%83%88-ebook/dp/B08CDJ56GJ
※こちらの動画もベイジアンABテストを理解するのにおすすめです!
https://www.youtube.com/watch?v=zILHctOFqxM&t=533s