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テストを開始する前に有意水準 \alpha、検出力 1-\beta、効果量 d= \frac{\mu_0 - \mu_1}{\sigma}を定めてサンプルサイズを求めなければなりません。またサンプルサイズを定めても必要なサイズを満たすのに何日かかるかも不透明であり、施策の実行→A/Bテスト→振り返り、の1サイクルに時間がかかってしまう場合があります(継続率や広告のCVRを主要メトリクスとする場合は特に)。
 上記の問題点を解決するため、本記事では試しにベイズ統計によるA/Bテストの導入を検討したいと思います。

ベイズ統計

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


\begin{aligned}
p(\theta |x) = \frac{p(x|\theta)p(\theta)}{p(x)}
\end{aligned}

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

例: 継続率

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


\begin{aligned}
 x_i \sim Bernoulli(\theta)
\end{aligned}

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


\begin{aligned}
\prod _{i=1}^{N} \theta ^{x_i} (1-\theta )^{1-x_i}
\end{aligned}

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


\begin{aligned}
Beta(\theta |\alpha , \beta ) \propto \theta ^{\alpha -1} (1-θ)^{\beta -1}  
\end{aligned}

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


\begin{aligned}
p(\theta |x) & \propto p(x|\theta )p(\theta ) \\
       &\propto (\prod _{i=1}^{N} \theta ^{x_i} (1-\theta )^{1-x_i}) (\theta ^{\alpha -1} (1-\theta )^{\beta -1}) \\
       & = \theta ^{k+\alpha −1} (1−\theta )^{N-k+\beta -1} \\
       & = Beta(\theta |k+\alpha −1, N-k+\beta -1)
\end{aligned}

となります。

事後分布のプロット

コードは以下のブログを参考にしました
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アプリについての記事です!