Gunosyデータ分析ブログ

Gunosyで働くデータエンジニアが知見を共有するブログです。

A/Bテストの時間短縮に向けて 〜ベイズ統計によるA/Bテスト入門〜

はじめに

こんにちは、19卒でGunosy Tech LabのBIチームの齊藤です。

data.gunosy.io

この記事はGunosy Advent Calender 2019の4日目の記事です。昨日の記事は高橋さん(@tkhs0604)によるプロダクトマネージャーカンファレンス2019 参加レポート でした。

背景

GunosyではUI・ロジックの変更等を行う際にA/Bテストにより効果検証を行っています。

data.gunosy.io

 上記のブログの通り、従来の(頻度論に基づく)仮説検定ではA/Bテストを開始する前に有意水準α、検出力1β、効果量d=μ0μ1σを定めてサンプルサイズを求めなければなりません。またサンプルサイズを定めても必要なサイズを満たすのに何日かかるかも不透明であり、施策の実行→A/Bテスト→振り返り、の1サイクルに時間がかかってしまう場合があります(継続率や広告のCVRを主要メトリクスとする場合は特に)。
 上記の問題点を解決するため、本記事では試しにベイズ統計によるA/Bテストの導入を検討したいと思います。

ベイズ統計

 頻度論に基づく仮説検定では帰無仮説H0の元で調べたい母数θを固定し、得られた標本がどの程度起こりうるかを論じるものでした。一方ベイズ統計ではθ自体を確率変数とし、データxを得た上でのθの事後分布p(θ|x)をベイズの定理

p(θ|x)=p(x|θ)p(θ)p(x)

を用いて導出します。ここで、p(x|θ)θを固定した時のxについての確率分布(尤度)、p(θ)は事前分布、p(x)は周辺尤度(θに依存しないため一旦保留)となります。

例: 継続率

 登録日から7日後の継続率を考えます。各ユーザーxiについて、7日後に再度アプリへの来訪があった場合xi=1、そうでなければxi=0とするとxi

xiBernoulli(θ)

という継続率θを持つベルヌーイ分布の実現値とみなすことができ、尤度p(x|θ)

i=1Nθxi(1θ)1xi

となります。また登録人数Nのうちの継続人数k=i=1Nxi の確率分布はkBinomial(N,θ)という二項分布で表すことができます。
 事前分布p(θ)は事後分布の計算を楽にするため共役事前分布を用います。今回は尤度がベルヌーイ分布に従うため、事前分布としてベータ分布を使用します。ベータ分布は

Beta(θ|α,β)θα1(1θ)β1

と表され、α=1,β=1のとき一様分布となり、θの事前分布として θUniform(0,1)を利用することと同じになります。
 実際に事後分布を計算してみると、

p(θ|x)p(x|θ)p(θ)(i=1Nθxi(1θ)1xi)(θα1(1θ)β1)=θk+α1(1θ)Nk+β1=Beta(θ|k+α1,Nk+β1)

となります。

事後分布のプロット

コードは以下のブログを参考にしました
http://tdual.hatenablog.com/entry/2018/04/21/004620
A群とB群のそれぞれで事後分布の従うベータ分布をプロットし、2つの分布の重なり具合を見ます。
f:id:IoriS:20191203203631p:plain
1日分のデータを使用しただけだと、差のある確率は0.5程度のままでした。
これを2日目、3日目・・・と続けていきます。

f:id:IoriS:20191203204210p:plain
2日目
f:id:IoriS:20191203204023p:plain
3日目
f:id:IoriS:20191203204230p:plain
6日目
6日目でかなり差が出てきました。
このように事前にサンプルサイズを定めることなく、逐次的に2群の差を観察することができました。

継続率以外の指標は?

 継続率以外にも、広告のコンバージョン率や記事のCTRなど比率で表せるものは上記の方法で簡単に出すことができますが、単純な記事のクリック数やインプレッション数などの指標はベルヌーイ分布とはならないため別の手法を用いる必要があります。
 指標が正規分布に従うと仮定すれば共役事前分布も正規分布となり事後分布を簡単に導出できるのですが、なんでもかんでも正規分布に従うとは限らないので・・・
 この辺りは現在チームのメンバーと検討中です。

おわりに

 ベイズ統計を用いた仮説検定はここ数年での流行となっている(と勝手に感じている)のでより深く勉強していきたいです。。。
 明日は吉岡さん(rikusouda)さんによるiOSアプリについての記事です!