統計的推論は、サンプルデータに基づいて結論を導き出し、母集団について予測を行うための強力なツールです。これにより、情報に基づいた意思決定が可能になり、さまざまなオプションの有効性を理解できるようになります。統計的推論の一般的なアプリケーションの 1 つはA/B テストであり、2 つのバージョンまたは処理を比較して優れたパフォーマンスを決定します。しかし、実験にさらに多くのバージョンや処理を導入するとどうなるでしょうか?
実験での追加バージョンの導入は、より適切な決定を下す機会になるように思えるかもしれません。残念ながら、適切に処理しないと、テスト可能な仮説の数が増加し、誤解を招く結果や誤った決定につながる可能性があります。この課題は、多重比較問題として知られています。
この記事では、複数の仮説テストの概念とその潜在的な落とし穴について説明し、Python シミュレーションでサポートされる考えられる解決策の 1 つを示します。
複数の仮説テストを理解するには、 2 つのバリアントを含む単純な A/B テストの基本概念を調べることから始めましょう。
A/B テストでは、2 つの競合する仮説を立てることから始めます。1 つはバリアント間に差異がないことを表す帰無仮説、もう 1 つは差異の存在を示唆する対立仮説です。
次に、 alpha
で示される有意水準を設定します。このしきい値によって、帰無仮説を棄却するために必要な証拠の量が決まります。一般的に使用される有意水準は 0.05 (5%) および 0.01 (1%) で、帰無仮説が真である場合にデータが観察される確率を示します。
実験を実行してデータを収集した後、 p 値を計算します。 p 値は、帰無仮説が真である場合に、観察されたデータと同じかそれよりも極端な結果が得られる確率を表します。 p 値が有意水準alpha
より小さい場合、帰無仮説を棄却して対立仮説を優先します。
低い p 値は帰無仮説に対する強力な証拠を示唆し、観察されたデータが偶然のみで発生する可能性が低いことを示していることに注意することが重要です。ただし、これは確実性を意味するものではありません。帰無仮説が正しい場合でも、サンプル間の差異が観察される確率はゼロではありません。
複数の対立仮説がある状況に遭遇した場合、それを多重仮説検定と呼びます。このような場合、複数のテストを同時に実行することによる潜在的な影響を慎重に考慮する必要があるため、複雑さが増します。
複数の仮説検定の落とし穴は、有意水準alpha
を調整せずに複数の仮説を検定するときに発生します。このような場合、私たちは誤って「タイプ I」の誤りの割合を大きくしてしまいます。これは、この帰無仮説が実際には真である (差異がまったくない) にもかかわらず、帰無仮説を棄却する(差異を見つける) 傾向があることを意味します。
同時にテストする仮説の数が多いほど、少なくとも 1 つの仮説でalpha
よりも低い p 値が見つかり、誤って有意差があると結論付けられる可能性が高くなります。
この問題を説明するために、 N
の仮説をテストして、複数の新しい Web ページ デザインのどれが望ましいalpha = 0.05
でより多くの顧客を引き付けるかを決定するシナリオを考えてみましょう。新しい設計はどれもデフォルトの設計より優れていないことがわかっていると仮定しましょう。これは、 N
個のケースすべてに対して帰無仮説が成り立つことを意味します。
ただし、各ケースで、 「タイプ I」エラー、つまり偽陽性が発生する確率は 5% です (帰無仮説が正しいと仮定)。言い換えれば、95% の確率で誤検知が正しく検出されないということです。理論的には、 N
回のテストで少なくとも 1 つの偽陽性が発生する確率1 - (1 - alpha)^N = 1 - 0.95^N
に等しくなります。たとえば、 N = 10
の場合、この確率は約 40% となり、最初の 5% よりも大幅に高くなります。
テストされる仮説の数が増えるにつれて、問題はより明らかになります。少数のバリアントとサブサンプルのみが関係するシナリオでも、比較の数はすぐに蓄積される可能性があります。たとえば、すべてのユーザーについて 3 つのデザイン D1、D2、および D3 を比較し、次に C1 国のユーザーについて個別に比較し、さらに C1 以外の国のユーザーについて再度比較すると、合計 9 つの比較が行われます。タイプ I エラー率がその後上昇することに気づかずに、無意識のうちに複数の比較を行ってしまうことがよくあります。
複数の仮説をテストするときに「タイプ I」エラーを制御しない場合の結果を浮き彫りにする興味深い例を詳しく見てみましょう。
2009 年、研究者グループは死んだタイセイヨウサケの fMRI スキャンを実施し、驚くべきことに、あたかも生きているかのような脳活動を発見しました。この予期せぬ結果がどのようにして生じたのかを理解するには、fMRI スキャンの性質を調査する必要があります。
fMRI スキャナーは、各患者に対して多数の検査が行われる広範な実験プラットフォームとして機能します。スキャナーは、脳活動の指標として血液酸素化の変化を監視します。研究者は通常、特定の関心領域に焦点を当て、体積全体をボクセルと呼ばれる小さな立方体に分割します。各ボクセルは、その特定の立方体内の脳活動の存在をテストする仮説を表します。高解像度のスキャンが必要なため、 fMRI スキャナーは 1 回の手順で何千もの仮説を評価することになります。
この場合、研究者らは意図的に初期の有意水準alpha = 0.001
を適切に補正せず、死んだサケの脳活動のある 3 つのボクセルを特定しました。しかし、この結果は、サケが確かに死んでいるという私たちの理解に矛盾します。有意水準を修正すると、復活のような現象が消え、タイプ I エラーの問題に対処する重要性が示されました。
1 つの実験内で複数の仮説をテストする場合は常に、この課題に取り組み、タイプ I のエラーを制御することが重要になります。ボンフェローニ補正などのさまざまな統計手法を使用して、複数の仮説検定に関連して増大する偽陽性率を軽減できます。
ボンフェローニ補正は、仮説検定中の多重比較の課題に対処するために特別に設計された統計手順です。
実験中に、タイプ I エラーの確率がalpha
未満に留まるようにしながら、 N
仮説をテストする必要があるとします。
この手順の基本的な考え方は単純です。つまり、対立仮説ごとに帰無仮説を棄却するために必要な有意水準を下げるというものです。少なくとも 1 つの偽陽性が発生する確率の公式を覚えていますか?この式にはalpha
があり、これを減らすと全体の確率が減少します。
したがって、複数の仮説の間で少なくとも 1 つの偽陽性の確率を低くするには、各 p 値をalpha
ではなく、より小さい値と比較できます。しかし、「もっと小さなもの」とは一体何でしょうか?
個々の仮説の有意水準としてbonferroni_alpha = alpha / N
を使用すると、タイプ I 過誤の全体的な確率がalpha
未満に保たれることがわかります。
たとえば、10 個の仮説 ( N = 10
) を検定し、望ましい有意水準が 5% ( alpha = 0.05
) である場合、個々の p 値をbonferroni_alpha = alpha / N = 0.05 / 10 = 0.005
と比較する必要があります。したがって、少なくとも 1 つの真の帰無仮説を誤って棄却する確率は、望ましいレベルの 0.05 を超えることはありません。
この注目すべき手法は、イベントの結合の確率が個々の確率の合計以下であるというブールの不等式によって機能します。正式な数学的証明は存在しますが、視覚的な説明により直感的な理解が得られます。
したがって、個々の仮説がbonferroni_alpha = alpha / N
有意水準でテストされると、偽陽性のbonferroni_alpha
確率が得られます。 N
回のそのようなテストでは、「偽陽性」イベントの結合の確率は、個々の確率の合計以下になります。これは、すべての N 検定で帰無仮説が成立する最悪のシナリオでは、 N * bonferroni_alpha = N * (alpha / N) = alpha
に等しくなります。
前に説明した概念をさらにサポートするために、 Python でシミュレーションを実行してみましょう。結果を観察し、ボンフェローニ補正の有効性を評価します。
1 つのテスト内に 10 個の対立仮説があるシナリオを考えてみましょう。 10 件すべてのケースで帰無仮説が正しいと仮定します。あなたは、 alpha = 0.05
の有意水準が分析に適切であることに同意します。ただし、増大したタイプ I エラーを修正しない場合、理論上の確率は約 40% で、少なくとも 1 つの偽陽性結果が発生すると予想されます。そして、ボンフェローニ補正を適用した後、この確率は 5% を超えないと予想されます。
特定の実験では、少なくとも 1 つの偽陽性が得られるか、得られないかのどちらかです。これらの確率は、複数の実験のスケールでのみ確認できます。次に、個々の実験のシミュレーションを 100 回実行し、少なくとも 1 つの偽陽性 (有意水準を下回る p 値) が発生した実験の数を計算してみましょう。
このシミュレーションを実行してグラフを生成するためのすべてのコードを含む.ipynb
ファイルは、GitHub の私のリポジトリで見つけることができます - IgorKhomyanin/blog/bonferroni-and-salmon
import numpy as np import matplotlib.pyplot as plt # To replicate the results np.random.seed(20000606) # Some hyperparameters too play with N_COMPARISONS = 10 N_EXPERIMENTS = 100 # Sample p-values # As we assume that null hypothesis is true, # the p-value would be distributed uniformly sample = np.random.uniform(0, 1, size=(N_COMPARISONS, N_EXPERIMENTS)) # Probability of type I error we are ready to accept # Probabiltiy of rejecting null hypothesis when it is actually true alpha = 0.05 # Theoretical False Positive Rate # # 1. # Probability that we cocnlude a significant difference for a given comparison # is equal to alpha by definition in our setting of true null hypothesis # Then [(1 - alpha)] is the probability of not rejecting the null hypothesis # # 2. # As experiments are considered independent, the probability of not rejecting # the null hypothesis in [(1 - alpha)]^N # # 3. # Probability that at least one is a false positive is equal to # 1 - (probability from 2.) prob_at_least_one_false_positive = 1 - ((1 - alpha) ** N_COMPARISONS) # Observed False Positive Rate # We conclude that experiment is a false positive when p-value is less than alpha false_positives_cnt = np.sum(np.sum(sample <= alpha, axis=0) > 0) false_positives_share = false_positives_cnt / N_EXPERIMENTS # Bonferroni correction bonferroni_alpha = alpha / N_COMPARISONS bonferroni_false_positive_comparisons_cnt = np.sum(np.sum(sample <= bonferroni_alpha, axis=0) > 0) bonferroni_false_positive_comparisons_share = bonferroni_false_positive_comparisons_cnt / N_EXPERIMENTS print(f'Theoretical False Positive Rate Without Correction: {prob_at_least_one_false_positive:0.4f}') print(f'Observed False Positive Rate Without Correction: {false_positives_share:0.4f} ({false_positives_cnt:0.0f} out of {N_EXPERIMENTS})') print(f'Observed False Positive Rate With Bonferroni Correction: {bonferroni_false_positive_comparisons_share:0.4f} ({bonferroni_false_positive_comparisons_cnt:0.0f} out of {N_EXPERIMENTS})') # Output: # Theoretical False Positive Rate Without Correction: 0.4013 # Observed False Positive Rate Without Correction: 0.4200 (42 out of 100) # Observed False Positive Rate With Bonferroni Correction: 0.0300 (3 out of 100)
結果を視覚化したものが次のとおりです。
上の図は、個々の比較 (仮説検定) の p 値として各四角形を表します。正方形が暗いほど、p 値は高くなります。すべての場合に帰無仮説が成り立つことがわかっているため、有意な結果はすべて偽陽性になります。
p 値が有意水準 (ほぼ白い四角で示されます) より低い場合、帰無仮説が棄却され、偽陽性の結果が得られます。中央のグラフは補正なしの実験を表し、下のグラフはボンフェローニ補正を行った実験を表します。少なくとも 1 つの偽陽性がある実験は赤色で表示されます。
明らかに、修正は効果的に機能しました。補正を行わない場合、100 件中 42 件の実験で少なくとも 1 つの偽陽性が観察され、これは理論上の約 40% の確率とほぼ一致しています。ただし、ボンフェローニ補正を使用すると、少なくとも 1 つの偽陽性を伴う実験は 100 件中 3 件のみとなり、望ましい 5% のしきい値を十分に下回ったままになります。
このシミュレーションを通じて、偽陽性の発生を軽減するボンフェローニ補正の影響を視覚的に観察することができ、複数の仮説検定におけるその有用性をさらに検証できます。
この記事では、複数の仮説検定の概念を説明し、その潜在的な危険性を強調しました。 A/B テスト中に複数の比較を実行するなど、複数の仮説をテストする場合、まれなイベント「偽陽性」が観察される確率が増加します。この確率の高まりにより、適切に対処しないと、偶然に発生した可能性のある重大な影響について誤った結論が導かれる可能性があります。
この問題に対する考えられる解決策の 1 つは、個々の仮説の有意水準を調整する Bonferroni 補正です。ブールの不等式を活用することで、この補正は全体の有意水準を目的のしきい値で制御するのに役立ち、偽陽性のリスクを軽減します。
ただし、すべてのソリューションにはコストがかかることを認識することが重要です。ボンフェローニ補正を利用すると、必要な有意水準が低下し、実験の検出力に影響を与える可能性があります。これは、同じ違いを検出するには、より大きなサンプル サイズまたはより強力な効果が必要になる可能性があることを意味します。研究者は、ボンフェローニ補正または他の補正方法を実装することを決定する際に、このトレードオフを慎重に考慮する必要があります。
この記事の内容に関してご質問やご意見がございましたら、お気軽にお寄せください。より深く理解し、実際に応用するには、統計手法についてさらに議論し、探求することが不可欠です。