Menu

A/Bテスト途中確認シミュレーター

AとBが同じページである2,000件のテストを、あなたのトラフィックで走らせます。毎日確認する人がそのうち何件を勝者と呼んだか、そして終了日まで待つ人が同じテストに何件騙されるかを見てください。

著者 Nethanel Bar, Co-founder & CEO

最終更新

本気でプログラミングを学びませんか?

Coddyはブラウザ上で実際にコードを書きながら学ぶサービスです。インタラクティブなレッスン、即時フィードバック、行き詰まったときのAIサポート付き。

A/Bテストで最も高くつく習慣を、あなたの数字でシミュレーション

その習慣とはこうです。テストを始め、毎朝ダッシュボードを開く。バーはじわじわ上がり、下がり、また上がり、ある火曜日に95%を越える。あなたは勝者を宣言し、出荷して、次へ進む。問題は、p値はさまようということです。2つのバリエーションが同一のテストでも、p値は偶然にある日0.05を割ります。後でまた戻るだけです。最初に割った時点で止めるということは、通り過ぎる途中で捕まえるということで、持っていたはずの信頼水準は消えています。

その効果の大きさに人は驚きます。信頼水準95%で最後に一度だけ読むテストは、およそ20回に1回騙されます。それが同意した取引です。同じテストを4週間毎日読み、最初に緑になった日に止めると、シミュレーターは何も変わっていないテストの4分の1以上で偽の勝者を示すのが普通です。Evan Millerの元の記事は毎日確認する人で20%超としており、Optimizelyは顧客の偽陽性率がそれを越えたため2015年に統計エンジンを作り直しました。毎日ではなく毎週確認すれば被害はおよそ半分になりますが、なくなりはしません。

ここのシミュレーションは、自分が何であるかについて正直です: 各テストは両群の真の率でコンバージョンを抽選し、確認のたびにそれまでに集まったすべてのデータに通常の2標本比率のz検定を走らせ、途中確認する人がどこで止めるかを記録します。チャートの各線は1つのテスト、各点は誰かが結果を発表していたはずの朝です。本当の改善率を+10%に設定すると物語の残り半分が見えます: 途中確認する人は本物の効果を早く捕まえますが、改善率は誇張されており、効果がゼロでも同じくらい熱心に「勝って」いたはずです。

シミュレーションが示すこと

  • p値はランダムウォークです。帰無仮説のもとでは、どの1回の確認でも一様分布に従います。つまりどの朝でも0.05を下回っている確率は5%あります。28回の朝を重ねれば、その確率は積み上がります。
  • 偽陽性率は、テストの長さではなく、確認した回数で決まります。毎週読む4週間のテストは、毎日読む2週間のテストより騙される頻度が低いのです。
  • 早期の停止は改善率を誇張します。途中確認する人が運の良い日に止めるとき、その日の観測改善率は定義上、異常に大きいです。ローンチ後に「色あせた」出荷済みの勝者は、たいていこれでした。
  • 解決策は規律か、別の検定かのどちらかです。規律: サンプルサイズと終了日を事前に固定し、一度だけ読む。別の検定: Optimizely、Statsig、Eppoが使う常時有効なp値のような逐次的手法は、サンプルサイズを犠牲にして継続的に読めるように作られています。
  • ベイズのダッシュボードも無縁ではありません。毎日確認して閾値で行動する「最良である確率」は、衣装を変えた同じ問題を抱えています。

シミュレーターの使い方

  1. コンバージョン率と1日の訪問者数を入力する

    シミュレーションはあなたの実際の率でコンバージョンを抽選するので、p値のさまよい方は実際に目にするノイズと一致します。

  2. 予定期間と確認頻度を設定する

    毎日、3日ごと、毎週。途中確認する人の率と正直な率の差が、その習慣の代償です。

  3. 本当の改善率は「なし」のままにする

    それですべてのテストがA/Aテストになります: どの勝者も構造上、偽の警報です。その後で+10%や+30%に切り替えて、本物の効果に対する途中確認する人の様子を見てください。

  4. 2つの大きな数字を読む

    途中確認する人の率は、毎日確認する人が勝者を宣言した頻度です。終了日の率は選んだアルファに近いはずで、そうなら正直なテストは約束どおりに働いています。

  5. もう一度走らせる

    実行のたびに新しいランダムなテストを抽選します。率は少し動きますが、差は動きません。

A/Aテストでの典型的な偽陽性率

信頼水準95%で、最後に一度だけ正直に読めば騙されるのは約5%。最初に有意になった確認で止める人について、シミュレーションと文献からの概算値。

確認頻度4週間での確認回数偽の勝者
最後に一度だけ1約5%
毎週4約10〜13%
3日ごと9〜10約15〜20%
毎日28約25〜30%
12週間毎日8435%超

3つの習慣をシミュレーション

毎日確認する人

コンバージョン率5%、1日1,000人の訪問者、28日間、毎朝確認。私たちの実行では: 途中確認する人は2,000件のA/Aテストのうち約28%で勝者を宣言。最後に一度だけ読むと4.5%。

誰かが毎日見ていたから慎重に感じられたテストで、偽の警報率は6倍です。それらの「勝者」の半分はBを、半分はAを勝者にしました。見つけるべきものが何もなかったからです。

毎週確認する人

同じトラフィック、同じ期間、週に一度確認。私たちの実行では: 途中確認する人は約12%、最後に読むと5%。

28回ではなく4回見るだけで大きく改善しますが、それでも約束した率の2倍以上です。約束を守れる確認回数は1回しかありません。

本物の+10%の改善

同じトラフィックでBの本当の改善率を+10%に設定。28日での正直なテストは、このトラフィックでこれほど小さな改善に対しては検出力が限られる。途中確認する人は運の良い日に、より頻繁に早期停止する。

これが誘惑的なケースです: 途中確認する人のほうが速く何かを見つけているように見えます。しかし止めた日は改善率が最も大きく見えた日なので、出荷される推定値は膨らんでおり、同じ習慣は改善率をゼロにしても「勝者」を見つけていたはずです。

途中確認のミス

  • 最初に有意になった朝に止めること。このページはすべてこれについてです。信頼水準は、結果を一度だけ読むときにしかその意味を持ちません。
  • 「あと一歩」のテストを延長すること。結果がほぼ有意だからともっと長く走らせると決めるのは逆向きの途中確認で、同じように偽陽性率を膨らませます。
  • 「何も壊れていないか確認するだけ」と毎日確認すること。バグを見張るのは構いません。p値を見張るのはいけません。終了日までは改善率ではなく、トラフィック配分とエラー率を見てください。
  • ベイズのダッシュボードなら途中確認しても安全だと信じること。毎日確認する確率の閾値で行動すれば、同じ膨張が起きます。
  • 止めた日の改善率を報告すること。どうしても早く止めるなら区間を報告し、本当の改善率は点推定値より小さいと想定してください。

途中確認のよくある質問

A/Bテストの「途中確認(peeking)」の問題とは何ですか?
固定期間のテストを繰り返し読み、有意に見えた最初の時点で止めることです。データが入るあいだp値は変動するので、確認のたびに偶然で閾値を越える機会が増えます。信頼水準95%で1か月毎日読むテストは、何も変わっていなくてもおよそ4分の1の確率で偽の勝者を生みます。信頼水準が約束する5%ではなく。
終了前にテストを見るのは間違いですか?
見るのは構いません。行動するのが問題です。トラフィックが均等に分かれているか、両方のバリエーションが読み込まれるか、コンバージョンが記録されているかは確認してください。改善率や信頼度は読まず、見たものによって終了日をどちらの方向にも変えないでください。
継続的に確認したい場合はどうA/Bテストすればいいですか?
逐次的手法を使ってください。常時有効なp値、群逐次デザインなどはいつ読んでもよいように作られており、その代償として同じ検出力でより大きなサンプルサイズが必要です。現代のプラットフォームの多くはそのいずれかを提供しています。このシミュレーターが古典的な固定期間のテストをモデル化しているのは、スプレッドシートやダッシュボードの計算の大半、このサイトの他のタブも含めて、それだからです。
毎週確認するなら途中確認は問題になりますか?
少なくはなりますが、なります。4週間で4回の確認は、95%での偽陽性率を通常2倍にします。約束した率を守れる確認回数は1回だけです。
なぜシミュレーターはA/Aテストを使うのですか?
両群が同一なら、どの勝者も構造上偽の警報なので、シミュレーターが報告する率は、シミュレーションしている習慣の偽陽性率そのものになるからです。本物の改善率をオンにすると裏面が見えます: 途中確認する人は運の良い日に早く止め、膨らんだ効果を報告します。
ベイズ検定なら途中確認の問題は解決しますか?
それだけでは解決しません。継続的に読んで固定の閾値で行動するベイズ確率は、Georgi Georgievらが示したように、同じように誤った判断を膨らませます。適切な決定ルールと事前分布を持つベイズ手法は継続的なモニタリングのもとでもうまく振る舞えますが、「ベイズ」というだけでは解決策ではありません。

その他の開発者ツール

Coddyのプログラミング言語のイラスト

Coddyでコードを学ぼう

始める