ソウゾウにベイジアンA/Bテストを導入しました

はじめに

こんにちは!ソウゾウのSoftware Enginner(Machine Learning)の@nkato_です。「メルカリShops [フライング] アドベントカレンダー2022」の4日目を担当します。

この記事では、ソウゾウの機械学習チームで取り組んだこととして、施策の評価にベイジアンA/Bテストという手法を取り入れた話をします。

ベイジアンA/Bテストを用いるとテスト結果が解釈しやすく、そのため最終的な意思決定に繋げやすいというメリットがあります。A/Bテストに取り組む中で「有意差がなかったから既存ロジックを採用してしまう」「信頼区間の解釈に迷う」といった経験がある方にはぜひお読みいただきたい内容です。

また、この記事は統計学に関する用語を含んでいるため、統計学についての基本的な知識を有する方を対象としています。

A/Bテストとは

A/Bテストとは、ユーザーをランダムに2つに分け、一方のユーザー群にのみ新しい施策を実施し、その介入効果の有無を検討するテストのことです。Webサイトの改善を例にすると、一方のユーザー群には従来通り青色のボタンを表示し、もう一方のユーザー群には新しく赤色のボタンを表示することで、ボタンを青色から赤色に変更することによる介入効果を測定します。

新しい機能をプロダクトに導入する際には往々にして「KPIに好影響を与えると思ったが実際に導入してみると効果はなかった(悪化した)」というケースが起こり得ます。そもそも事前に効果を予測することは難しく、そのような場合に本当に好影響を与えたのか確認しないまま事業を進めることは、言わば山の中をコンパスを持たずに闇雲に歩くようなものとなります。実際にはKPIが改善されていないと知らずにただ歩くことが目的化してしまいます。そのような状況に対して、自分たちが進む方向が正しいことを証明するコンパスの役割を担うのがA/Bテストです。

A/Bテストを実施する際によく用いられる統計的検定手法としては、カイ二乗検定やt検定といったものがあります。それらの検定では帰無仮説や有意水準(多くは5%)を設定した上で検定統計量を算出し、そこからp値を導くことで「今回観測された効果差以上の差が偶然得られる確率」を確かめます。p値が有意水準より低い値だった場合に、今回観測された効果差は偶然得られたものではない、つまり介入効果があると結論づけることができます。

ベイジアンA/Bテストとは

ベイジアンA/Bテストとは、ベイズ推定の理論を用いて推定したい介入効果を確率分布として表し、その確率分布を比較することで施策の良し悪しを測るといった手法です。ユーザーをランダムに2つに分け、一方のユーザー群にのみ新しい施策を実施するところまでは従来のA/Bテストと同様に行いますが、結果の集計方法が異なります。

ベイジアンA/Bテストではまず、観測値がある確率分布(尤度分布)に従って生成されると仮定し、さらにその尤度分布のパラメータが別の確率分布(事前分布)によって生成されていると仮定します。パラメータが確率的に揺らぐことを仮定する推定方法だと言えるでしょう。そして観測値を用いて事前分布を更新することにより、事後分布を得ます。この事後分布を用いて介入効果をモデリングすることで、効果差を検討します。

ある施策によって、ユーザーが特定の行動を行う回数が増えるのかテストしたいケースを考えます。このとき、行動回数について 人の観測データ がポアソン分布 に従って生成されたと仮定してみます。ポアソン分布は、期間中に平均 回起こるような現象が実際に 回起きる確率の分布として知られています。

そしてこのポアソン分布のパラメータ の生成確率がガンマ分布 に従うと仮定します。ガンマ分布はポアソン分布の共役事前分布であり、ガンマ分布を指定することで事後確率を解析的に求めることができます。このとき、図1のようなグラフィカルモデルによってデータが生成されていると考えることができます。

図1: 観測データが生成されるまでのグラフィカルモデル

このような生成過程を仮定した上で、ガンマ分布のパラメータである , を適当な初期値から観測データを用いて , へと更新することで事後確率 を得られます。こうして得られた事後確率に基づいて測定したい指標の平均値などを確率分布として導出することで、測定したい介入効果も確率分布として導かれます。この確率分布に基づいて「新規ロジックの勝率は○○%で、そのときの介入効果の期待値は△△」というように表せるのがベイジアンA/Bテストの特徴です。

従来のA/BテストとベイジアンA/Bテストとの違い

ここで、従来のA/BテストとベイジアンA/Bテストを比較することで、ベイジアンA/Bテストを採用することによるメリットを考えてみましょう。まず従来のA/Bテストでは、サンプルサイズを事前に決めるために、検知したい効果差をあらかじめ決めておく必要があります。しかし実際のプロダクト改善やビジネス施策ではこの数値以下の改善幅は切り捨てるといった取捨選択が難しく、「1日1万円以上の売上向上を検知したい。しかし1日9900円の売上向上は切り捨てていいのか?」のような葛藤が生まれます。そして小さめの効果差まで検知できるようにするとサンプルサイズが大きくなり、A/Bテストが終わりません。

次に、p値が有意水準より大きかった場合の意思決定に困ることがよく起こりえます。有意差がないことは介入効果がないことを意味せず(事前に決めた検知したい効果に満たなかったことは言えますが)、このときに新規ロジックを棄却する判断は、既存ロジックに偏った判断だと言えるでしょう。

また、p値や信頼区間という言葉の定義がむずかしく「p値が0.05だったので帰無仮説が真である確率は5%」「95%信頼区間には95%の確率で真の介入効果が含まれる」といった誤解がよく生まれてしまいます。前者は正しくは「帰無仮説が真だと仮定したときに今以上に極端な結果を得る確率が5%」という意味であり、後者は「母集団から何度も標本を取り信頼区間を求めたときに95%の確率でこの範囲に真の値が存在する」という意味になります。

一方でベイジアンA/Bテストの場合は、最終的に求まるのは勝率と介入効果の確率分布です。また信頼区間ではなく信用区間が得られます。これらは直感的な解釈と一致するため「勝率が○○%以上なので新規ロジックを採用しよう」「介入効果が△△〜◻◻の間である確率は✕✕%」のような直感的な判断を下せます。個人的にはこちらのほうが、ビジネスにおける意思決定に繋げやすいと感じています。

逆にデメリットとして、ベイズ推定の仕組みとして観測されたデータがある確率分布から発生したと考える必要がある以上、適切な確率分布を見つけられなければベイジアンA/Bテストを実施することができません。観測データが「ある行動を行ったかどうか」のような二値で表せられるケースではベルヌーイ分布(確率 p で1を、確率 1 − p で0をとる離散確率分布)を用いることができますが、「ある行動を行った回数」や「ある指標の値」のようなケースについては、自力で適切な確率分布を見つける必要があります。その確率分布が適切かどうかについては、カーブフィッティングによって実測値が最もよく当てはまるように確率分布のパラメータを調整し、その確率分布と実測値とで適合度検定を行うのがよいと思われます。

また、共役事前分布を用いない場合は事後分布を計算できないケースが多く、その場合はマルコフ連鎖モンテカルロ法(MCMC)で概算することとなります。MCMCとは、事後分布を解析的に求められないときに、事前分布と尤度分布から事後分布を概算する手法です。これについてはPyMC3などの便利なライブラリは存在しますが、導出過程を自力で記述する必要があります。

実際に使ってみた

それでは、ソウゾウで実際にベイジアンA/Bテストを実施した様子を紹介します。都合により、指標や確率分布の詳細については割愛させていただきます。これはあるレコメンドシステムに新規ロジックを実装した際に実施しました。

ユーザーごとに算出されるある指標Kが、新規ロジックによって増加するのかをテストする必要がありました。そこで、半数のユーザーにのみ新規ロジックを適用し、指標Kを集計してベイズ推定を行うことで、それぞれのロジックでの指標Kの平均値を確率分布として表しました。それぞれの確率分布は図2のようになりました。

図2: 既存ロジック、新規ロジックそれぞれについて指標Kの平均値を確率分布として表した図

この確率分布からシュミレーションすることによって、新規ロジックを採用することによる介入効果を図3のような確率分布として表せました。

図3: 新規ロジックの介入効果を確率分布として表した図

この図より、新規ロジックを採用することで82%の確率で指標Kは平均的に向上することが分かります。この結果から、新規ロジックを採用することになりました。

今後の課題

今後の課題について触れてこの記事を締めくくりたいと思います。前述の通り、ベイジアンA/Bテストを用いる場合は測定指標が特定の確率分布から生成されたと仮定する必要があります。しかし一部の指標では測定値の分布が特殊な形状をしており、適切な確率分布を仮定することができませんでした。そのような指標については通常のA/Bテストの枠組みで検定しました。それらに対しても適切な確率分布を見つけることで、全ての指標でベイジアンA/Bテストの枠組みを使えないか検討しています。

さいごに

株式会社ソウゾウではメンバーを大募集中です。メルカリShopsの開発やソウゾウに興味を持った方がいればぜひご応募お待ちしています。詳しくは以下のページをご覧ください。

Software Engineer
Software Engineer, Site Reliability
Software Engineer (Internship) – Mercari Group (※新卒採用に応募するにはまずインターンへの参加をお願いしています。)

またカジュアルに話だけ聞いてみたい、といった方も大歓迎です。こちらの申し込みフォームよりぜひご連絡ください!

以上となります。お読みいただきありがとうございました!

  • X
  • Facebook
  • linkedin
  • このエントリーをはてなブックマークに追加