メインコンテンツへスキップ
ブログ一覧に戻る
統計・データサイエンス

多重比較問題とは?セグメントを切るほど「有意差」が出る理由と補正の選び方

2026年8月29日
最終更新: 2026年10月8日
8分で読めます

この記事でわかること

多数のセグメントから有意差を探すとき、何を検定の集合に含めるべきでしょうか。FWERとFDR、1回の誤発見割合と期待値を区別し、架空5検定でBonferroniとBHの境界・補正p値を計算します。依存条件、探索履歴、主指標の事前指定、Ioannidisの理論モデルの限界まで、表と図とPythonで具体的に解説します。

2026年10月8日に、statsmodelsの多重検定補正とASAのp値声明を再読しました。仮説族、FWER/FDR、補正法、依存構造、主要指標を先に固定し、補正後の棄却フラグを発見・効果量・因果・実務重要性とは分けて報告します。

30秒で要点

多重比較問題は、同じ判断のために多数の検定を行うと、偶然の小さいp値を拾いやすくなる問題です。「有意になった地域だけ」「反応がよかった年代だけ」を結果の後から選んでも、そこまでに調べた検定が消えるわけではありません。

表が収まらない場合は、横にスクロールできます

守りたい判断指標と選択肢注意点
1件でも誤って採用する危険を抑えるFWER。BonferroniやHolmを検討各p値が妥当で、検定の集合を定めていること
多数の候補から次の調査対象を探すFDR。BH法などを検討独立性・依存条件、再検証の費用を確認
探索で見つけた仮説を確かめる新しいデータで確認計画を立てる後付け探索を、当初から決めた検証に見せない

補正は「好きなだけ切ってよい」という許可ではありません。主指標、対象期間、セグメント、検定の集合を定め、探索した経路も残すことが先です。

「何回の検定か」を先に数える

5地域で同じ購入率を比べるなら5検定です。さらに3指標と2期間を別々に調べれば、設計によっては30検定になります。どこまでを同じ意思決定の集合、つまり検定ファミリーとするかを記録します。見栄えのよい5件だけを取り出して、分母を5に戻してはいけません。

帰無仮説がすべて真で、各検定の第1種過誤率がちょうど5%なら、誤棄却数の期待値は20検定で1件、30検定で1.5件です。これは繰り返したときの平均であり、毎回その件数になるという意味ではありません。この期待値の足し算に独立性は不要ですが、個々の検定が保守的なら値は上限側になります。

さらに検定が独立なら、1件以上の誤棄却が生じる確率は 1−(1−0.05)^m。20検定で約64.15%、30検定で約78.54%です。重なる顧客のセグメントなど、検定が依存する場合にこの式をそのまま当てはめることはできません。これらは条件を固定した計算例で、実際のマーケティング分析の誤り率を測った数値ではありません。

FWERとFDRは、分母と平均の取り方が違う

Vを誤って棄却した仮説の数、Rを棄却した全仮説の数とします。FWERは P(V≥1)。FDRは E[V/max(R,1)] で、何も棄却しない場合の割合を0として平均します。

例えば、ある1回で10件を棄却し、そのうち2件が誤りなら、実現した誤発見割合FDPは20%です。「FDRを5%に制御する手続き」は、すべての回でFDPが5%以下になるという保証でも、個々の仮説が95%正しいという意味でもありません。実データではどれが誤棄却か分からないことも、方法を選ぶ理由になります。

SciPyのFDR資料は、この期待割合とBH法・BY法の条件を区別しています。1件の誤採用の損失が大きい判断と、再調査を前提にした候補探索とで、管理したい誤りを先に決めます。

架空の5検定で、BonferroniとBHを比べる

同じファミリーに属する5検定の、すでに妥当な方法で計算されたp値を使う架空教材です。検定自体のデータや効果量は用意していないので、商品の採用や因果効果の判断には使えません。有意水準・FDR目標をともに0.05とします。

表が収まらない場合は、横にスクロールできます

小さい順の順位i元のp値Bonferroniの境界BHの境界 i×0.05/5Bonferroni補正p値BH補正p値
10.0040.0100.0100.0200.020000
20.0130.0100.0200.0650.032500
30.0280.0100.0300.1400.046667
40.0600.0100.0400.3000.075000
50.2000.0100.0501.0000.200000

Bonferroniは元のp値を 0.05/5=0.01 と比べ、1件を棄却します。補正p値は min(1, 5×p) です。各検定の妥当なp値を前提に、検定間の独立性を要求せずFWERを抑えます。

BH法は、小さい順のp値について p(i) ≤ i×q/m を満たす最大の順位kを見つけ、1〜kをまとめて棄却します。この例では最後に条件を満たすのが順位3なので、3件を棄却します。各行を独立に合否判定する方法ではありません。条件を満たす順位がなければ棄却は0件です。

架空の5つのp値とBonferroniの固定境界0.01、BHの順位別境界0.01から0.05を比較し、BHで最後に条件を満たす順位3までを棄却する図
丸が元のp値、ひし形がBHの順位別境界、縦の破線がBonferroniの境界。架空例ではBonferroniが1件、BHが3件を棄却する。BHは最後に条件を満たす順位までをまとめて扱う。数値は本文の表にも掲載。

BHの補正p値を読む

ソート後の順位iについて、後ろの順位を含めた min(m×p(j)/j) を求め、1で上限を切ります。これが単純な m×p(i)/i の列だけではなく、後ろから累積最小値を取る理由です。最後に元の仮説の順序へ戻します。Rのp.adjust資料と公式実装のBH部分で、この補正の対応を確認できます。

Pythonで補正と元の順序を確かめる

ここでは入力をわざと並べ替えています。multipletests の既定の is_sorted=False は入力順に対応する結果を返すため、仮説名とp値をずらさず記録できます。statsmodelsの資料で引数と戻り値を確認してください。

import numpy as np
from statsmodels.stats.multitest import multipletests

# Fictional p-values; every tested hypothesis in this family is included
names = ["C", "A", "E", "B", "D"]
p = np.array([0.028, 0.004, 0.200, 0.013, 0.060])
bonf = multipletests(p, alpha=0.05, method="bonferroni")
bh = multipletests(p, alpha=0.05, method="fdr_bh")
for name, raw, pb, ph, rb, rh in zip(
        names, p, bonf[1], bh[1], bonf[0], bh[0]):
    print(name, f"{raw:.3f}", f"{pb:.6f}", f"{ph:.6f}", rb, rh)
assert bonf[0].sum() == 1 and bh[0].sum() == 3
assert np.allclose(bh[1], [0.0466666667, 0.02, 0.2, 0.0325, 0.075])

棄却した件数が多いことだけでBHを選ぶのは、目的と順序が逆です。先にFWERとFDRのどちらを管理するか決め、想定される依存構造も確認します。

手法を選ぶときに残す条件

表が収まらない場合は、横にスクロールできます

手法管理するもの主な確認点
BonferroniFWER妥当なp値と検定数。計算が単純だが保守的になりやすい
HolmFWER段階的な補正。任意の依存構造でも使える選択肢
BH(fdr_bh)FDR独立、または真の帰無仮説に関するPRDSなどの条件
BY(fdr_by)FDRより一般的な依存に対応するが、BHより保守的

「正の相関がありそう」という印象だけでPRDSの条件を満たすとは言えません。繰り返し測定、同じ利用者が重なる比較、指標の選び直しなど、p値を作った設計を確認します。Sidak、Holm–Sidak、Hochberg、Hommelなどもライブラリにありますが、名前を取り替えるだけで同じ保証になるわけではありません。

補正は欠測、交絡、不適切な検定、結果に合わせた停止、隠した分析経路を自動で修復しません。効果量や区間推定、対象者の違いも別に報告します。

Ioannidisの論考を、この判断にどう使うか

Ioannidis(2005)のEssayは、事前の見込み、検出力、バイアスなどを置く分析的枠組みを使った論考です。新しいマーケティング実験で、誤り率を測った報告ではありません。

Corollary 3は、多くの関係を弱い選別で調べる状況を、結果の信頼性との関係で論じています。Corollary 4は、設計・定義・アウトカム・解析の自由度が大きい状況を扱います。ここから、調べた比較を隠さず、主指標や確認用データを先に定めるという注意につなげます。「自由度を減らせば必ず補正より効く」という普遍的な性能比較にはしません。

2022年の訂正はTable 2の括弧欠落についてです。本記事ではその表の式を再利用していません。上の20・30・5検定の数値は、条件を明示した別の架空教材です。

解析前から報告までの手順

  1. 意思決定と主指標を決め、検定ファミリー・対象期間・セグメントを記録する。
  2. FWERかFDRか、許容する水準、依存構造に合う方法を事前に選ぶ。
  3. 探索で追加した比較も記録し、都合のよい結果だけを分母から切り離さない。
  4. 元のp値、補正p値、効果量、区間推定、全検定数と方法を一緒に報告する。
  5. 探索で得た候補は、可能なら独立した新しいデータで確認してから重要な施策に採用する。

補正後に有意でなかった結果も、「効果がない証明」とは限りません。重要な差を検出できる設計だったか、不確実性がどれほど残っているかを確認します。実装する前に手法と前提を整理したい場合は、分析の道具箱も入口にできます。

よくある質問(FAQ)