A/Bテストの有意差とサンプルサイズの計算方法

結論を先に。A/Bテストの有意差は、2群の比率の差のz検定(両側)で判定します。p値が有意水準(通常5%)を下回れば「偶然では説明しにくい差」です。そして見落とされがちですが、テストを始める前に必要サンプルサイズを決めるのが先です。CV率5%のサイトで10%の相対リフトを検出するには、1グループあたりおよそ3万人が必要になります。

z = (pB − pA) / √( p̂(1−p̂)(1/nA + 1/nB) ) ※p̂は両群を合わせたCV率
p値 = 2 × (1 − Φ(|z|))

手計算は面倒なので、コンバージョン数を入れるだけで判定できるA/Bテスト計算機を作りました。サンプルサイズの逆算もできます。データはブラウザ内だけで計算します。

有意差の判定:比率の差のz検定

AとBのコンバージョン率の差が偶然の範囲か調べるのが検定です。手順は次の通りです。

  1. 両群を合わせたコンバージョン率 p̂ を計算する
  2. 差の標準誤差 √(p̂(1−p̂)(1/nA+1/nB)) を計算する
  3. 差を標準誤差で割ってzスコアにし、p値に変換する

たとえばA: 5,000人中250CV(5.0%)、B: 5,000人中300CV(6.0%)なら、z≒2.19、p≒0.028で、5%水準では有意です。あわせて差の信頼区間も見ると、効果の幅(この例では+0.1%〜+1.9%ポイント)が分かります。

サンプルサイズの逆算

「どれくらいの差を検出したいか(MDE)」を決めると、必要な人数が逆算できます。

n(1群あたり) = ( z_{α/2}√(2p̄q̄) + z_{β}√(p1q1 + p2q2) )² / (p2 − p1)²

直感的には、検出したい差が小さいほど・CV率が低いほど、必要人数は急激に増えます。CV率5%で相対10%リフト(5.0%→5.5%)を、α=5%・検出力80%で検出するには1群約31,000人。これを知らずに数千人でテストを打ち切ると、本当は効果があっても「有意差なし」で終わります。

つまずきやすい点

  1. 覗き見問題。テスト途中でp値を何度も確認し、有意になった瞬間に止めると偽陽性が大幅に増えます。サンプルサイズを先に決め ,集まってから1回だけ判定するのが原則です。

  2. 有意差なし=効果なし、ではありません。サンプル不足で検出できなかっただけの可能性があります。信頼区間を見て判断します。

  3. CV数が極端に少ない場合(各群10件未満など)は正規近似が崩れるので、この方法は使えません。

まとめ

  • 有意差は2群の比率の差のz検定(両側)で判定
  • p値が有意水準未満なら有意。信頼区間で効果の幅も見る
  • サンプルサイズはテスト開始前に逆算する(CV率5%×リフト10%なら1群約3万人)
  • 途中で何度も判定しない(覗き見は偽陽性を生む)
  • 計算はA/Bテスト計算機
  • 関連:JavaScriptで機械学習アルゴリズムを実装する