唯物是真 @Scaled_Wurm

プログラミング(主にPython2.7)とか機械学習とか

ABテストの12の落とし穴

Twitterで見かけた以下の記事で紹介されていた論文がおもしろそうだったので読んだ感想と内容のてきとーな紹介(詳しく知りたい人は元論文を呼んでください)

内容が間違っている部分があったらコメントなどで教えていただけると嬉しいです

論文

このKDD2017の論文ではABテストの結果を解釈する時に陥りがちな12種類の罠についてMicrosoftの研究者が実例と対策を交えて説明しています
Pavel Dmitriev, Somit Gupta, Dong Woo Kim and Garnet Vaz, "A Dirty Dozen: Twelve Common Metric Interpretation Pitfalls in Online Controlled Experiments"

ちなみにイントロダクションで触れられていた「おそらく一番よくある罠は実装時のバグによって出たものだろう」的な話は「せやな……」って感じですね

ABテスト

ABテストとは何か大雑把に説明しておくと、一番シンプルな場合だとユーザーをランダムな2つのグループに分けて、片方には既存のシステム、もう片方には改良したシステムを使ってもらい、それらの2つのグループでユーザーの行動が改善しているかの結果を何らかの評価尺度の数値で比較するというものです
ユーザーをランダムに分けたことで、システムの違い以外の差がない状態でシステムの効果を検証できる

12の落とし穴

1. Metric Sample Ratio Mismatch(ABテストのそれぞれのグループでサンプルの比率が異なってしまう)

MSN.comでリンクをクリックした時に同じタブで開く/新しいタブで開くというA/Bテストを行った時の話が例として書かれている
新しいタブで開くようにした結果何故かページの平均ロード時間が8%も遅くなってしまった

よく調査すると「新しいタブで開くようにした」グループではページのロード回数が異常に減っていた
同じタブで開く場合ユーザーは戻るボタンを押すが、別のタブで開く場合には押さない。戻るボタンを押した場合にはキャッシュなどで早く読み込まれることが多いのでこのような差が出ていた

2. Misinterpretation of Ratio Metrics (比率の尺度の誤った解釈)

MSN.comのメインページはいくつかのモジュールで構成されている
モジュールをページのどの位置に置くかというABテストがよく行われている

上にある要素の方がクリックされやすいはずなのに、あるモジュールを上の方に移動したらCTR(ユーザーがクリックした回数を見られた回数で割ったもの)が40%も下がってしまうという結果が得られた

これが何故かというと、位置を上にしたことでユーザーがクリックした回数は増えたがそれよりも大きな増加量でユーザーが見る回数が増えてしまい、比率的には悪化したように見えてしまった
実際にはクリック数が大きく増えていてこの変更は良い結果が得られていることがわかった
このように比率の尺度は分母が変わる場合には誤った解釈を導いてしまう可能性があるので、比率ではなくそれぞれの数値も見るべき

ちなみにCTRの計算の方法には次の2種類がある。各々のユーザーについてCTRを出してユーザーごとのCTRの平均を取る。全体のクリック数と見られた回数でCTRを計算する。
この論文では前者のそれぞれのユーザーについて計算した値の平均を取るほうが変化に敏感でよいと言っている(分散も計算できる)

ちなみに上の2種類の計算は機械学習の分野だとマクロ平均マイクロ平均と呼ばれているのを見かける

3. Telemetry Loss Bias (遠隔測定ロスによるバイアス)

SkypeのiPhoneアプリのプッシュ通知がよりちゃんと届くように変更を行った話
この変更によってメッセージ関連の評価尺度に変化が起こるはずだったが、何故か通話関連の尺度に奇妙な改善が見られた

何故このような変化が起こったかというと、ユーザーのローカルの環境で起こったイベントはモバイルアプリ側でバッファに溜めておいて、wifi環境につながっている時に送信されていた。
バッファから溢れたイベントは捨てられていたが、プッシュ通知によってアプリが起動される時間が増えたためより多くのイベントが送られるようになった

このようなバイアスはWebサイトでもありえて、例えばリンクをクリックした時に同じタブで移動していたのを別のタブで開くように変えると元のページが開かれたままになるのでJavaScriptのクリックのイベントが正確に記録されるようになるようなことがありうる

データ収集や処理の流れのドキュメント化やちゃんと記録されていない場合の検出をやるべき

4. Assuming Underpowered Metrics had no Change

実験によってページビューが0.5%増加したが、統計的に有意な結果にならなかった
しかし0.5%の増加はビジネス上は大きな変化なので、効果があったのか知りたい

あらかじめ検出力(対立仮説が正しい時に帰無仮説を棄却する確率)を考えて必要なサンプルサイズを求めておく必要があった

5. Claiming Success with a Borderline P-value

ABテストでp値が0.029という統計的に有意な結果が得られた
重要な数値だったので確認のため、より大規模なABテストを行ったところ今度は統計的に有意な結果が得られなかった

ABテストは偶然有意な結果が得られることがあるので微妙なp値の時には気をつける必要がある

6. Continuous Monitoring and Early Stopping

2週間の予定のABテストを行う。1週目で統計的に有意な結果が出たから途中でABテストをやめたり、統計的に有意な結果が出なかったから期間を伸ばすというのをやってしまいがちだがこれはダメ

7. Assuming the Metric Movement is Homogeneous

数値の変化は等質的に起こるのではなく、例えばユーザーの国やブラウザなどが違えば異なった反応をする

8. Segment Interpretation

ユーザーを国やデバイスの種類などでセグメント分けをすることはよく行われる
2つのグループでABテストを行い、ユーザーをセグメントに分けてグループ間でセグメント同士を比べると統計的に有意な結果が得られているように見えた
しかしグループ全体で見ると何故か結果に差は見られなかった

これはグループ間でセグメントの割合が変わってしまったことでこういう奇妙な結果が得られた

ABテストで結果が差が得られなかった場合、どんどん差が得られるまでセグメント分けを試すというのをやってしまいがち

9. Impact of Outliers

外れ値の影響は大きいので対策すべき

  • trimming: 外れ値を取り除く
  • capping: 外れ値を固定の閾値で置き換える
  • windsorizing: 外れ値をあるパーセンタイルの値で置き換える

10. Novelty and Primacy Effects

システムの変更による効果には目新しさによる最初だけのものや、後からジワジワ効いてくるものがあったりする
こういったものを見分けるのは難しいが、何日目の結果か、何回目のアクセスの結果かといった風にセグメントを分けると何かがわかるかもしれない
最初のアクセスだけ効果があって、2回目以降急激に数値が下がったりする

11. Incomplete Funnel Metrics

ユーザーが目的の処理を行う各段階をステップに分けて数値を評価すべき

12. Failure to Apply Twyman’s Law

MSN.comのOutlook.comへのボタンをメールアプリのボタンに変えたら変更していないボタンまでクリック数の大きな増加が得られた

数日経つとこの数値の変化はどんどんなくなっていった。ユーザーが混乱してクリックが増えただけだと考えられる

予想外の数値の変化があったら疑ってかかるべき

感想

実例がいろいろあって興味深かった
ABテストの話とはあまり関係ないが、Google Analyticsのイベント機能を使っていてポップアップなどの表示に対してもnonInteractionを指定せずにイベントを送ってしまい直帰率などが異常な数値になるのをたまに見かけるのを思い出した(nonInteractionはイベントがユーザーの行動によるものでないことを表すフラグで、これを指定しない場合ユーザーが行動したとみなされて直帰率が激減する)