🆎

A/B テストで各群のサンプルサイズを均等に揃えるべき理由

2023/10/03に公開

はじめに

Web マーケティング等で施策の効果を調べる方法のひとつとして A/B テストがある[Kohavi et al.(2021)]。これは、施策対象をランダムに複数の群へ分けてそれぞれの群に異なる介入を行い結果を比較するもので、ランダムコントロール実験とも呼ばれる。
この時、群の間で平均購入額やCV率といったゴール指標に差があるかを判断する目安として、統計的仮説検定(特に2群比較なら t 検定や z 検定)[竹村(2020), 上田(2009)]がよく用いられる。

原則では A/B テストにおいて各群に含まれるサンプルの数は均等にすべきとされている[丹後(2018, 2.4節)]。
しかし一方で、現実には均等に割り振らず A/B テストを実施するケースもしばしば見受けられる。[1]

このように各群のサンプルサイズを不均等に割り振った A/B テストで t 検定や z 検定に基づいて「勝ちパターン」を決めるような場合でも、「サンプルサイズが十分に大きい」という前提条件が満たされていれば問題なく検定を適用できる。
しかし、データの分布が非対称な偏ったケースでは、条件を満たすために必要なサンプルサイズが想定以上に大きくなることが知られている[Kohavi et al.(2021, 第17章), Kohavi et al.(2014)]。
その場合、正しい比較ができないことに気がつかないまま誤った意思決定をおこなってしまう恐れがある。

本記事では、前述の「分布が偏ったデータ」がどのようなものかを述べたうえで、人工データを用いたシミュレーションを交えながら実際にどのような問題が起き得るかについて述べる。

結論(ダイジェスト)

  • 原則として A/B テストでは各群同数ずつ配信を行うべきである。
  • 特に「データの分布が偏っている」ケースでは注意が必要で、この場合に各群のサンプルサイズ(配信数)が不均等だと、t 検定などの統計的仮説検定により「勝ちパターン」を決めた際に想定と反する結果が出て誤った意思決定に繋がる危険性がある。
    • 具体的には、本来「勝ちパターン」ではない群が「勝ちパターン」として選ばれやすくなってしまうケースが存在する。
  • 「分布が偏ったデータ」の典型的な例には以下のようなものがある:
    • ごく一部のユーザーしか商品購入や会員登録といったゴールイベントを実行(Conversion, CV)しない
    • 一部のユーザーの購入数や課金額が突出して多い
  • 理論的には「分布の偏り」は歪度(skewness)と呼ばれる統計量で評価でき、目安として最小群でサンプルサイズが 355 \times |{\rm skewness}|^2 未満では上記の問題に注意を払う必要がある。
  • どうしてもサンプルサイズを均等にできない場合には、以下のような対処法がある:
    • 多数派の群のサンプルサイズをランダムに減らして無理矢理同数比較にする
    • permutation test を用いる

前提・問題設定

以下では話を簡単にするために、A群とB群の2群比較を行うこととする。

本投稿では「A/B テスト」といったとき、以下のような操作を指す。

  1. 施策対象をA群とB群にランダムに分ける
  2. それぞれの群に、異なるパターンの施策を行う(例・文面の異なるメッセージを配信する)
  3. 施策後、各群で評価指標を計算する
  4. 2標本 t 検定(もしくは2標本母比率の差のz検定)を行いA群・B群の指標間に有意な差が認められた場合、指標の値が大きい方を「勝ちパターン」とする

本来想定される理想的な結果

A群・B群で差がなかった場合、サンプルサイズが十分大きい限り有意水準\alpha%で検定を行えば「有意差あり」判定が出る頻度は\alpha%になり、さらに両側検定であればA群・B群が「勝ちパターン」に選ばれる頻度は等しく\alpha/2%ずつである。

たとえばアプリ内でランダムに分けたA群とB群に別々のメッセージを配信したとして、両者のその後の平均購入金額に差があるかを有意水準5%の t 検定(両側検定)で判断することを考える。
このときもし両群の購入金額期待値に差がないのであれば、同一の条件で1,000回実験を繰り返すとそのうち「有意差あり」判定が出るのは50回程度になるはずである。
さらに「有意差あり」判定が出た中で、A群が「勝ちパターン」となる回数とB群が「勝ちパターン」となる回数は共に等しくおよそ25回程度になるはずである。[例えば 丹後(2018, 第2章)]

問題になるケース: データの分布が偏っていて、かつ各群のサンプルサイズが均等でない場合

上記のシナリオ通りになるのは、サンプルサイズが十分大きい場合である。
サンプルサイズが十分でないと、 t 検定もしくは z 検定を適用するうえでの前提が成り立たず予期せぬ結果が得られてしまう場合がある。

この「十分に大きい」というのが問題で、データ次第では必要なサンプルサイズが想像以上に大きくなり、一般的な Web サービスなどで気軽に集められるデータ量のオーダーでは足りなくなってしまうケースも多々ある。

特に、以下の2つの条件が両方揃っていると、そのような現象が発生しやすくなるうえに、それに伴い発生する問題も複雑になる:

  • データの分布が偏っている
  • 各群のサンプルサイズが不均等

以下では「データの分布が偏った」状態がどのようなものかを述べたうえで、分布が偏っているうえで群ごとのサンプルサイズが不均等だとどのような問題が発生しうるかを述べる。

「分布が偏っている」とはどういうことか?

「データの分布が偏っている」とは、分布が期待値に対して非対称でないことを指す。
そして、分布の偏りは統計的には下記の歪度(skewness)という量[2]で定義される:

{\rm skewness} = \frac{E[(X - E[X])^3]}{V[X]^{3/2}}.

巷に溢れる「分布が偏った」データの例

上記だけ見ると理論家の頭の中だけに存在する机上の空論のように見えてしまうかもしれないが、実は「分布が偏った」データというのは実務上でも頻繁に見かけるものである。

以下、2つほど例を挙げる。

例1: 率・割合データの場合

母集団のうち極々少数しかポジティブサンプルが存在しないデータは、skewness が高く偏ったデータである。

たとえば、全ユーザーのうち 0.1% しか会員登録や課金といった Conversion (CV) 行動を起こさないような場合がこれに相当する。

実際、CV率を p として Bernoulli 分布を仮定すると、skewness は以下のように求められる:[3]

{\rm skewness} = \frac{1 - 2p}{\sqrt{p(1-p)}}.

ここで p=0.001 を代入すると、{\rm skewness} = 31.57 となる。

例2: 数量データの場合

ECサイトやゲームアプリなどで大半のユーザーは購買・課金行動を起こさずごく一部のユーザーの購入回数・課金額が突出して多いような場合も、「分布が偏ったデータ」といえる。

上記のような性質を持つ分布として、Gamma 分布を挙げる。[4]
Gamma 分布は、以下のような確率密度関数を持つ分布であり、その skewness は 1/\sqrt{\alpha} である:[5]

P(x; \alpha, \beta) = \frac{\beta^{\alpha}}{\Gamma(\alpha)} x^{\alpha-1} \exp(-\beta x).

Gamma 分布は右に裾野の広い形状をしており、たとえば \alpha=0.001, \beta=10^{-5} では期待値は 100 であるものの全体の98.9%以上が1未満の値をとり、また上位0.4% だけで合計値の99%に寄与する[6]。なおこのとき skewness は 63.25 である。

「分布の偏り」 \times 「各群のサンプルサイズの不均等」で生じる問題

分布が偏っていることに加えて各群でサンプルサイズが揃っていない場合、t 検定ないし z 検定を安全に適用するために必要なサンプルサイズが大きくなってしまう。[7]
そして、十分なサンプルサイズがないまま検定を適用した際に、以下に挙げるような想定と異なる事態が発生し得る:

  • あらかじめ設定した有意水準通りに「有意差あり」判定が出なくなる。
    • たとえばA群・B群間で差がない状況で有意水準5%で検定を行ったとしても、5%以下もしくは5%を超える頻度で「有意差あり」との判定が出てしまう。
  • 特定の群に「勝ちパターン」判定が偏る[8]

このような状況で検定の結果に基づき判断を行ってしまうと、本来群間で差がないのにも関わらず特定の群を「勝ちパターン」としてしまうケースや、最悪の場合は本来勝っている群とは別のパターンを「勝ちパターン」扱いしてしまうケースのような、誤った意思決定の増加につながる恐れがある。

なお、検定を安全に適用するためには、各群で最低 355 \times |{\rm skewness}|^2 以上のサンプルサイズが必要と経験的に言われている[Kohavi et al.(2014)]。
これに従うと、たとえば先ほど例として挙げた CV率 p=0.001 (=0.1%) の場合では、35万以上のサンプルが必要ということになる。
アプリの規模や配信セグメントの切り方に次第ではそこまでサンプルを集められず気が付かぬうちに上記の問題が発生している可能性が大いに考えられる。

シミュレーションによる結果

前節で述べた分布が偏っている場合に生じうる問題について、簡単なシミュレーションを用いて示してみる。

以下は、(真の)CV率 p が同一な2群 A・B について、サンプルから計算した標本CV率を比較するようなケースを模したシミュレーションである。
実行コードはこちらにアップしている。

CV率 p が 0.5 に近く分布があまり偏っていない(|skewness|<1)ケースとCV率 p が低く分布が偏った(|skewness|>1)ケースの2通りについて、A群・B群の配信数 N_A, N_B を変えながら複数回試行を行い、それぞれ検定により勝敗が決まった回数を調べた。

その結果、

  • 分布の skewness が大きい
  • A群・B群の配信数が不均等で、かつともに十分な大きさでない

という条件が揃ったケースにおいて、理論と比べて「有意差あり」の判定が出やすかったことに加えて、「勝ちパターン」も少数派の群に偏るという結果が得られた。

シミュレーション方法

あらかじめ決められたCV率 p と配信数 N_A, N_B をもとに乱数を生成し、得られたCV数 x_A, x_B から標本CV率 \hat{p}_A=x_A/N_A, \hat{p}_B = x_B / N_B とその差 \hat{p}_A - \hat{p}_B を計算した。
そして、「A群・B群で CV 率に差はない(同一の母集団から生成された)」という帰無仮説に基づいて有意水準5%の2標本母比率の差の z 検定(両側検定)を適用し、「勝ちパターン」の判定を行った。

この試行を10,000回行い、A・Bいずれかのパターンに有意差が出て「勝ちパターン」が決まった割合を調べた。

理論通りであれば、有意水準を5%に設定した場合「有意差あり」との判定が出る割合は試行全体の5%程度(10,000回の試行中、A群勝利が約250回、B群勝利が約250回)になるはずである。

結果1: 分布の偏りが小さい場合 (|skewness|<1)

CV率を p=0.4 とする。なお、このとき歪度は {\rm skewness}=0.41 である。

この場合は理論の通り、A群・B群でサンプルサイズが均等であっても不均等であっても、「有意差あり」判定が出た割合は5%程度であり、かつどちらか片方の群に「勝ちパターン」が偏ることもなかった。

均等に配信

(N_A, N_B) ①Aが勝ちパターン ②Bが勝ちパターン ① + ②
(100, 100) 2.52% 2.73% 5.25%
(1000, 1000) 2.39% 2.53% 4.92%

不均等に配信

(N_A, N_B) ①Aが勝ちパターン ②Bが勝ちパターン ① + ②
(1000, 100) 2.52% 2.38% 4.90%
(10000, 1000) 2.36% 2.41% 4.77%

結果2: 分布の偏りが大きい場合 (|skewness|>1)

p=0.001 とする。このとき {\rm skewness} = 31.58 である。

この場合、先ほどの skewness が小さい場合とは大きく異なる結果となった。

均等に配信

まず、A群・B群でサンプルサイズが均等な場合から見る。サンプルサイズが10,000であれば概ね理論通り「有意差あり」判定が出る割合がそれぞれ2.5%・2.5%程度であった。
サンプルサイズが1,000では「有意差あり」判定が出る割合が1.3%と理論と比べて少ないものの、それでもA群・B群どちらかに「勝ちパターン」が大きく偏ることはなかった。

(N_A, N_B) ①Aが勝ちパターン ②Bが勝ちパターン ① + ②
(1000, 1000) 0.61% 0.71% 1.32%
(10000, 10000) 2.58% 2.68% 5.26%

不均等に配信

A群・B群でサンプルサイズが不均等な場合についてみてみる。

N_A=1000N_B=100 のときの結果を見ると、「有意差あり」判定が出た割合が7.26%と5%を上回っているうえに、さらにその全てがB群、つまり少数派を「勝ちパターン」としている。

次に、N_AN_B の比率を保ったままサンプルサイズを大きくしてみた。
「有意差あり」判定が出る割合については、少数派側のB群のサンプルサイズが1,000の時点で5%に近い値が出た。しかし依然として「勝ちパターン」がB群に偏る問題は続き、N_B が 100,000 でようやく均等に近い値になった。

(N_A, N_B) ①Aが勝ちパターン ②Bが勝ちパターン ① + ②
(1000, 100) 0.00% 7.26% 7.26%
(10000, 1000) 0.00% 4.42% 4.42%
(10^5, 10^4) 1.76% 3.20% 4.96%
(10^6, 10^5) 2.46% 2.72% 5.18%

まとめ

本記事では、「データの分布が偏っている」場合に配信数の割り振りが均一でない A/B テストをおこなってしまうと、誤った意思決定に繋がり得る危険性があることを述べた。

具体的には、本来「勝ちパターン」でないはずの特定の群が「勝ちパターン」として選ばれやすくなってしまう可能性があった。

したがって、原則としては A/B テストでは各群同数ずつ配信を行うべきである。

なお、ここで挙げた問題はデータの分布の偏りが小さければ大きな問題になりにくい。
なぜなら、その場合は比較的現実的な大きさのサンプルサイズでも検定を安全に適用できることに加え、仮にサンプルサイズが十分でなくても特定の群に「勝ちパターン」が偏る問題は避けられるからである。

とはいえA/Bテストを行う前にあらかじめデータの偏りを把握できるとは限らないので、やはり余程の理由がない限り各群のサンプルサイズは揃えておくのが無難だろう。

それでもどうしても均一に割り振れないようなケースも往々にしてあると思うので、最後にそのような場合の対処法について2通り紹介する。

対処法1: 多数派側の群のサンプルサイズを減らす(もしくは、比較用に区切っておく)

やや無理矢理だが、多数派側からランダムにサンプルを減らして少数派の群とサンプルサイズを揃えてしまう。
より確実には、あらかじめ配信枠全体のうち一部だけ実験用に分けておいて、その中でA群B群半々ずつ配信するとよい。

たとえば A群90%とB群10%の2群比較であっても、A群80% VS A群10% VS B群10%のように形式上は3群に分け、試作評価段階では10%の方のA群とB群を用いて指標比較を行う。

この方法では検出力は落ちてしまうものの、少なくとも特定の群だけに「勝ちパターン」判定が出やすくなる不均等は避けることができる。

対処法2: permutation test

やや高度な方法になるが、permutation test を用いる。[Kohavi et al.(2021, 第17章)]

これを簡単に説明すると、データをランダムに並び替えたサンプルで統計量を計算し、その分布の中でオリジナルデータの統計量がどれだけ稀なものかを調べる、というものである。

この方法を Excel や SQL で行うのは困難なため、Python や R といったプログラミング言語を用いる必要がある。
幸いにも、 Python なら SciPy の scipy.stats.permutation_test という関数を、 R なら permute パッケージ を用いれば[9]比較的容易に実行可能である。

試しに Python にて、 p=0.001, N_A=1000, N_B=100 の例(前述のシミュレーションでは全 10,000回の試行中726回で B 群が「勝ちパターン」に選ばれた)で実験を行なってみたところ、10,000回の試行のうちこの方法で有意差が出て勝ちパターンが決まった例は1回も存在しなかった。[10]

参考文献

  • R. Kohavi, D. Tang, Y. Xu (大杉直也 訳)「A/Bテスト実践ガイド 真のデータドリブンへ至る信用できる実験とは」(KADOKAWA、2021)

https://amzn.asia/d/b03yXeD

  • Kohavi, Ron, et al. "Seven rules of thumb for web site experimenters." Proceedings of the 20th ACM SIGKDD international conference on Knowledge discovery and data mining. 2014.

https://dl.acm.org/doi/abs/10.1145/2623330.2623341

  • 竹村彰通「新装改訂版 現代数理統計学」(学術図書出版社, 2020)

https://amzn.asia/d/6tX7q9q

  • 上田拓治「44の例題で学ぶ統計的検定と推定の解き方」(オーム社, 2009)

https://amzn.asia/d/iY6YMKz

  • 丹後俊郎「新版 統計学のセンス ―デザインする視点・データを見る目― (医学統計学シリーズ1)」(朝倉書店、2018)

https://amzn.asia/d/9ORLnGc

脚注
  1. 例えば介入群とコントロール群の2群での比較において、介入による悪影響を危惧して「介入群1:コントロール群9」の割合でサンプルを割り振って実験を行う場合や、逆に機会損失を懸念して「介入群9:コントロール群1」に設定する場合などで特によく目にしたことがある。 ↩︎

  2. 例えば https://en.wikipedia.org/wiki/Skewness ↩︎

  3. https://zenn.dev/link/comments/af5aad31676090 ↩︎

  4. あくまでも前述の例と「似た性質を持っている」というだけであり、実際に現実の問題に対して Gamma 分布を仮定するのが妥当かどうかは別問題である。 ↩︎

  5. https://zenn.dev/link/comments/0036474aa5e9a2 ↩︎

  6. https://zenn.dev/link/comments/c5eba62a487ccb ↩︎

  7. 簡単に理論的な補足を行う(所々粗い点はご容赦願いたい)。t 検定・z 検定は、サンプルの平均値の分布が正規分布に近いことを前提としている。ここで中心極限定理といって、サンプル平均値の分布は(余程病的な分布に基づかない限り)サンプルサイズを大きくするほど正規分布に近づくという性質がある。この正規分布への漸近速度が skewness が大きいほど遅くなってしまうため、「分布が偏っていると検定に必要なサンプルサイズが大きくなってしまう」のである。 ↩︎

  8. 検定の際に重要になるのは、A群とB群のサンプル平均値の差である。偏りのある分布から得られたサンプルの平均値の分布は、サンプルサイズが大きくなるにつれ skewness が小さくなり、最終的に skewness が0の正規分布に収束する。したがって、A群・B群でサンプルサイズが異なる場合、それぞれの群のサンプル平均の分布の偏りの大きさは異なっていて、一般にはサンプルサイズの少ない群の方が skewness の大きさが大きくなる。このような状況では「サンプル平均の差」の分布も skewness が0にならず非対称で偏った分布を持つ。非対称な分布をもとに検定を行うと、当然結果も偏ってしまい、A群・B群それぞれ「勝ちパターン」に選ばれる頻度が同一で無くなってしまうのである。逆に、A群・B群のサンプルサイズを等しくしておけば、平均の差の分布は skewness が0の対称な分布となるため、少なくとも検定の結果が偏ることはなくなる。 ↩︎

  9. https://cran.r-project.org/web/packages/permute/vignettes/permutations.html ↩︎

  10. https://github.com/tatamiya/blog_artifacts/blob/main/zenn/20230924_imbalanced_ab_test/不均等に割り振ったABテスト_Permutation_Test.ipynb ↩︎

Discussion