Open4

ベイジアンABテストを導入するために調べたこと

hanatahanata

はじめに

ベイジアンABテストの導入にあたり調べたことをまとめたスクラップ。
結論から言うと、自分はあまりメリットが感じられずベイジアンABテストの導入を見送った。

hanatahanata

作業フロー

ベイズなやり方のABテストは以下のフローが想定される。

hanatahanata

所感

  • 色々調べたが、指標や意思決定の方法は様々だった。頻度論ほど画一的な方法はなさそうな印象を受けた。
  • 目的変数を確率分布として扱えることによる柔軟性が、このような自由度の高さを生んでいるように感じる。
  • 頻度主義では中心極限定理を拠り所にして確率分布を意識することはあまりなかったが、ベイズでは否応なしに確率分布に思いを馳せる必要がある。個人的には知的好奇心を満たせて面白いと感じる一方で、ビジネスの現場においてチームで運用するには少しハードルが高いように感じる。
  • メリットが感じられないので、ベイズを採用することはなさそう。
    • 頻度論的な検定であまり困ったことがない
    • 結局勝ち負けの2値判断をするのだから、勝率X%の表記になることのメリットを見いだせない
    • 早期停止したいモチベーションがそこまでない
    • 指標としてpdを用いるなら、頻度論的な検定でp値を見るのとほとんど大差ない
    • かといって他の指標を使いこなす自信もあまりない
      • 事後分布が分かることによるメリットを活かせない
    • ベイズの利点の1つに、ドメイン知識を事前分布に反映出来るというものがあるが、あまり上手く活用できない
    • ベイズ手法をチームに浸透させるのが難しい

もしも自分がやるなら

以下のようなカスタマイズを行う想定。

  • 目的変数の構造決定
    • 連続変数は シンプルな単回帰モデルを設定
    • 2値変数は 二項分布 + ベータ分布モデルを設定
  • 事後分布の推定
    • 解析的な方法
      • MCMC使うほど複雑なモデルを組めない
      • MCMCのエラーハンドリングが出来る自信がない
  • サンプルサイズの計算
    • 指標はpdを用いて検出力ベースなシミュレーションを行う
  • テスト期間
    • ビジネス都合とサンプルサイズのシミュレーション結果に応じてN週間を設定
  • 指標(pd)の閾値
    • 90 ~ 97.5%くらい?
hanatahanata

numpyを用いた事後分布の推定

numpyで事後分布を推定する。

連続値

単回帰モデル Y = X\beta + \varepsilon を仮定して推定する。

import numpy as np

# 解析的なベイジアン線形回帰
mu_0 = np.array([0, 0])  # 事前分布の平均
Sigma_0 = np.eye(2) * 100  # 事前分布の共分散行列(弱情報)

# 事後分布のパラメータ計算
Sigma_n = np.linalg.inv(X.T @ X + np.linalg.inv(Sigma_0))
mu_n = Sigma_n @ (X.T @ y + np.linalg.inv(Sigma_0) @ mu_0)

# 事後分布からサンプリング
lift_samples = np.random.multivariate_normal(mu_n, Sigma_n, 1000)

離散値(バイナリ)

二項分布 + ベータ分布でモデリングする。

import numpy as np


# パラメータの更新
alpha_c = np.sum(data[data['z'] == 0]['y']) + 1
beta_c = np.sum(data[data['z'] == 0]['y'] == 0) + 1
alpha_t = np.sum(data[data['z'] == 1]['y']) + 1
beta_t = np.sum(data[data['z'] == 1]['y'] == 0) + 1

# 事後分布のサンプリング
samples_c = np.random.beta(alpha_c, beta_c, 10000)
samples_t = np.random.beta(alpha_t, beta_t, 10000)

# p_t - p_c の事後分布
lift_samples = samples_t - samples_c