有意水準(significance level)に関する用語を、 誤り種類・補正・代替論 別に索引化します。
| カテゴリ | キーワード(日本語) | キーワード(英語) |
|---|---|---|
| 基本概念 | 有意水準、 α、 棄却域、 臨界値、 片側/両側 | significance level, alpha, critical region, one/two-sided |
| 誤り種類 | 第一種の誤り、 第二種の誤り、 検出力(1−β)、 偽陽性率 | Type I, Type II, power, false positive rate |
| 多重比較補正 | Bonferroni補正、 Holm法、 BH法(FDR)、 Šidák、 Hochberg | Bonferroni, Holm, BH, FDR, Šidák |
| 関連指標 | p値、 信頼区間、 効果量、 ベイズファクター | p-value, CI, effect size, Bayes factor |
| 代替論 | 事前登録、 再現性、 信頼性、 p-hacking、 HARKing | preregistration, replication, p-hacking, HARKing |
| 実装関数 | scipy.stats、 statsmodels、 pingouin、 multipletests | scipy.stats, statsmodels, pingouin, multipletests |
🍰 まずはやさしく
判定の合否ラインのようなものです。
偶然ではないと判断するために使います。
テストの合格点を決めることに似ています。
この章では判定ルールの基本を学びます。
有意水準 α は、 検定の「合否ライン」です。 「p値が α より小さければ、 偶然とは考えにくいので帰無仮説を棄却する」というルール。 慣習的に α = 0.05(5%)が最も使われますが、 厳しい検証では 0.01 や 0.001 も。
α は事前に決めるのが厳密な手順。 結果を見てから「3%なら有意」と動かすのは p-hacking の温床。
α の意味:「本当は帰無仮説が正しいのに、 誤って棄却してしまう確率」の上限(第1種の過誤)。 α を小さくすると false positive は減るが、 本物の効果も見逃しやすくなる(第2種過誤の増加)。
🍰 まずはやさしく
論文などでよく見る基準の数字です。
p値という値を判定するために使います。
スマホのデータ分析などで活用されます。
定義から注意点まで順番に解説します。
論文で「α = 0.05」「有意水準5%で検定」と書かれる数字。 p値の判定基準。
有意水準 とは:「これより小さいp値なら帰無仮説を棄却する」と事前に決める閾値。慣習的に 0.05, 0.01, 0.001。
本ページでは「significance level」を扱う。 統計データ分析コンペティション (2026) の教材で、 SSDSE-B-2026 (47 都道府県 × 複数年 × 100 超列) の実データを使った再現可能な学習を目指す。
「significance level」は統計・データサイエンスの体系における重要概念のひとつ。 本ページは「定義・直感・数式・実装・落とし穴・関連手法」の 6 視点で構成され、 各視点は独立して読めるが順序通り読むと体系的な理解が得られる。
🍰 まずはやさしく
合格か不合格かを分ける境界線です。
間違いが起きる確率を抑えるために使います。
部活の選抜試験で基準を厳しくする例です。
図を使って直感的な意味を説明します。

有意水準 α は 「帰無仮説が正しいのに棄却してしまう確率 (Type I error)」 の上限。 以下 3 図で「α の意味」「α と β のトレードオフ」「分野別の α 基準」を可視化する。
→ α=0.05 は 分布の裾 5% の面積。 観測統計量がここに落ちたら帰無仮説を棄却する。 α を 0.01 に下げる = 棄却域を狭める。
→ α を小さくする = 臨界値を右へ動かす = β (見逃し) が増える。 「厳しく判定」と「見逃さない」は両立しづらい。 N を増やすことで両立可能。
→ 誤判定のコストが高い分野ほど α が小さい。 教育では 0.05、 医薬では 0.01、 GWAS は多重比較補正で 5×10⁻⁸、 物理ではヒッグス粒子発見の「5σ (≈3×10⁻⁷)」が標準。
α は「許容する第一種過誤の確率」。 以下 5 問。
α を小さくすると検出力が下がる: 上図は α と β の二律背反を可視化したもの。 n を増やせば両者を同時に改善できる。
| 補正法 | 制御対象 | 特徴 | 用途 |
|---|---|---|---|
| Bonferroni | FWER | α/k で単純厳格 | 少数の重要検定 |
| Holm | FWER | Bonferroni より検出力大 | 中規模検定 |
| Benjamini-Hochberg | FDR | 期待 偽陽性率 を制御 | 遺伝子発現・大規模 |
| Šidák | FWER | 独立仮定で正確 | 独立検定群 |
→ FWER (family-wise error rate) は「少なくとも 1 件の偽陽性を出す確率」、 FDR (false discovery rate) は「棄却された中の偽陽性割合」。 多数検定では FDR を選ぶ方が現実的。
有意水準 α は「帰無仮説 H₀ が正しいのに棄却してしまう確率(偽陽性率)の上限」。 下のスライダーで α を 0.001〜0.20 の範囲で動かすと、 帰無分布(青)の裾に 棄却域(赤)が塗られ、 臨界値が更新されます。 同時に対立分布 H₁(緑)との重なりから 見逃し β(紫)と検出力(1−β)が計算され、 「α を厳しくすると偽陽性は減るが見逃しは増える」トレードオフを体感できます。
※ 帰無分布・対立分布とも標準正規(分散 1)で近似。 赤=棄却域(面積が α)、 紫=H₁ の受容域に落ちる確率(見逃し β)、 薄緑=H₁ を正しく棄却できる確率(検出力)。 μ を大きく(効果が大きく)すれば α を厳しくしても β を抑えられる=標本設計で両立可能。
同じ「棄却の閾値」でも、 分野が要求する厳しさで臨界値(z)は大きく変わります。 誤判定のコストが高い分野ほど α が小さく、 臨界値は遠くなります。
α は検定を設計する前に決める「合否ライン」であり、 その数値は H₀ が真のときに誤って棄却する確率(第1種の過誤)の上限を表します。 α=0.05 なら「本当は差がないケースでも、 20 回に 1 回はうっかり有意と言ってしまう」ことを許容する宣言です。 上のスライダーで赤い棄却域の面積が常に α に一致することを確かめてください。 なお α は「対立仮説が正しい確率」でも「結果が偶然である確率」でもありません(p 値とも別物です)。
α(第1種の過誤)を小さくすると臨界値が外側へ動き、 棄却域が狭まります。 その結果、 本当に効果があるとき(H₁ が真)でも棄却できず見逃す確率 β(第2種の過誤)が増えます。 「厳しく判定する」と「見逃さない」は同じ標本サイズでは両立しにくく、 両方を同時に下げる唯一の手段は 標本サイズ n を増やす(=μ の見かけの分離を大きくする)ことです。 スライダーで μ を大きくすると、 α を保ったまま β が縮むのが確認できます。
つまり α は数理的必然ではなく、 「その分野が引き受ける偽陽性リスクの宣言」です。
同じデータで m 個の検定を行うと、 少なくとも 1 件が偶然有意になる確率(FWER)は 1−(1−α)^m まで膨らみます(α=0.05, m=20 で約 0.64)。 これを抑えるのが 多重比較補正(Bonferroni は各検定を α/m に、 BH 法は偽発見率 FDR を制御)です。 また、 結果を見てから α を動かす・有意なものだけ報告する等の操作(p-hacking)は実効的な α を膨らませます。 これを防ぐのが解析計画をデータ取得前に固定する 事前登録(preregistration)で、 α・検定の向き・多重比較補正をあらかじめ宣言しておくのが現代的な作法です。
🍰 まずはやさしく
数学的に決めた確率の上限のことです。
正しく判定できているかを確認するために使います。
買い物の予算をあらかじめ決める感覚です。
数式を使って厳密な定義を学びます。
有意水準 α (significance level) は、 Neyman-Pearson 流の頻度主義検定における 「帰無仮説 $H_0$ が真であるときに棄却してしまう確率の上限」 として定義される。 検定設計時に事前に決める量であり、 データを見てから動かしてはならない。
$$\alpha = \sup_{\theta \in \Theta_0} P\bigl(T(\mathbf{X}) \in R \mid \theta\bigr)$$
記号: $\Theta_0$ は $H_0$ が成り立つパラメータ空間、 $T(\mathbf{X})$ は検定統計量、 $R$ は棄却域 (rejection region)。 sup は「$H_0$ の中で最悪値」を取る。
$$p = P\bigl(T(\mathbf{X}) \geq t_{\mathrm{obs}} \mid H_0\bigr), \quad \text{reject} \iff p < \alpha$$
m 個の検定を独立に実施すると、 「少なくとも 1 つは誤って有意になる」確率 (FWER, family-wise error rate) は $1-(1-\alpha)^m$ となり、 m が大きくなると急速に膨張する。 α=0.05 で m=20 なら FWER = 1−0.95²⁰ ≈ 0.64。
$$\alpha_{\mathrm{adj}} = \frac{\alpha}{m}$$
このコードでやること: 6 つの p 値に対し、 raw / Bonferroni / Holm / BH (Benjamini-Hochberg, FDR 制御) を比較する。
📥 入力例:
1 2 3 4 5 6 7 8 | import numpy as np from statsmodels.stats.multitest import multipletests pvals = np.array([0.001, 0.012, 0.034, 0.048, 0.060, 0.090]) print('raw :', pvals) print('Bonferroni:', multipletests(pvals, 0.05, 'bonferroni')[1]) print('Holm :', multipletests(pvals, 0.05, 'holm')[1]) print('BH (FDR) :', multipletests(pvals, 0.05, 'fdr_bh')[1]) |
📤 実行結果:
💬 raw では 4 つが p<0.05 で有意。 Bonferroni では 1 つだけ。 BH (FDR) では 2 つ。 「どの過誤を制御したいか」 で選び方が変わる。 仮説生成 (探索的) なら FDR、 重要決断 (薬の承認等) なら FWER。
| 指標 | 定義 | 代表法 | 向く場面 |
|---|---|---|---|
| FWER | 少なくとも 1 つの偽陽性が出る確率 | Bonferroni, Holm, Šidák | 医薬承認、 検証的試験 |
| FDR | 棄却した中の偽陽性の期待割合 | BH, BY, Storey | GWAS, マイクロアレイ、 探索的解析 |
FDR は FWER より緩く、 m が数千〜数万のときでも検出力を保てる。 GWAS では FDR=0.05 で 1000 個の遺伝子が出ても「平均 50 個は偽」を許す立場。
前節の数式に含まれる記号を、 日本語の意味に翻訳する。
significance level の数式は、 これらの記号を組み合わせて「データから未知量を推定する」あるいは「データの構造を要約する」プロセスを記述している。
ここでは t 検定の手順を追うため、 「都道府県別の平均所得」という仮想の系列(SSDSE-B-2026 自体に所得列はないため、 手順説明用に置いた例示値)を使い、 全国平均との差を評価します。 実データでの再現は後半の Python 節(A1101 総人口)を参照してください。
H₀(帰無仮説):北海道の母平均 = 全国平均(μ₀ = 304万円)
H₁(対立仮説):北海道の母平均 ≠ 全国平均
標本平均 x̄ = 290、 SD = 35、 n = 10 とすると
t = (290 − 304) / (35 / √10) = −1.265
自由度 9、 両側p値 ≈ 0.237
α = 0.05 で 棄却できない(差は確認できない)
| α | 臨界値 t (df=9) | 判定 | 第一種の誤り率 |
|---|---|---|---|
| 0.01 | ±3.25 | 不棄却 | 1% |
| 0.05 | ±2.26 | 不棄却 | 5% |
| 0.10 | ±1.83 | 不棄却 | 10% |
47回の検定を α=0.05 で行うと、 偶然有意になる回数の期待値は 47×0.05 ≈ 2.35回。
Bonferroni 補正後の有意水準 = 0.05/47 ≈ 0.00106
BH法(FDR=5%):p値を昇順に並べ、 p₍ₖ₎ ≤ k/47 × 0.05 となる最大 k までを有意とする。
SSDSE-B-2026 の 2023 年 47 都道府県を「東日本 (Code R01〜R23)」と「西日本 (R24〜R47)」に分け、 平均人口に差があるかを Welch の t 検定で調べる。
α の選び方で結論が変わる:
このコードでやること: SSDSE-B-2026 の人口を東西で分けて Welch t 検定を行い、 α の閾値ごとに結論を出す。
📥 入力例:
1 2 3 4 5 6 7 8 9 10 11 12 13 | import pandas as pd from scipy import stats df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) latest = df[df['SSDSE-B-2026'] == 2023].copy() latest['region'] = latest['Code'].apply( lambda c: '東' if int(c[1:3]) <= 23 else '西') east = latest[latest['region'] == '東']['A1101'] west = latest[latest['region'] == '西']['A1101'] t, p = stats.ttest_ind(east, west, equal_var=False) print(f't = {t:.3f}, p = {p:.4f}') for a in [0.10, 0.05, 0.01]: print(f'α={a}: {"reject H0" if p < a else "fail to reject"}') |
📤 実行結果:
💬 同じデータでも α の選び方で結論が分かれる。 α=0.05 が「絶対」ではなく、 慣習。 報告時は p 値そのものと効果量を示し、 読者に判断材料を渡すのが現代的。
α (Type I 誤り率) を厳しくすると棄却域が狭まり、 検出力 (1−β) が下がる。 両方を同時に下げるには n を増やす しかない。
$$\text{Power} = 1 - \beta = P\bigl(\text{reject } H_0 \mid H_1\bigr)$$
| 条件 | α | 必要 n (Cohen's d=0.5, Power=0.8) |
|---|---|---|
| 緩い基準 | 0.10 | 約 51 / 群 |
| 標準 | 0.05 | 約 64 / 群 |
| 厳しい | 0.01 | 約 95 / 群 |
| 物理学 | 3×10⁻⁷ | 約 200+ / 群 |
α を事後に動かす、 検定を複数試して有意なものだけ報告する、 中間でデータを足す等の操作は p-hacking と呼ばれ、 実効的な Type I 過誤率を α 以上に膨らませる。
対策: pre-registration (事前登録)、 holdout 検証、 効果量の併記、 信頼区間中心の報告。
α=0.05 はあくまで 慣習。 分野・目的・サンプルサイズに応じて選ぶべきもので、 数理的な必然性はない。
合成データで α=0.05 の意味と多重比較への影響を計算する。
1 2 3 4 5 6 | alpha = 0.05 m = 20 fwer_no = 1 - (1-alpha)**m fwer_bonf = 1 - (1-alpha/m)**m print(f"補正なし FWER: {fwer_no:.3f}") print(f"Bonferroni FWER: {fwer_bonf:.4f}") |
💬 手計算 (Step 2) と Python 出力が完全一致。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | # ── この抜粋で使うデータを用意します ── # 検定の書き方を並べた早見表なので、そのまま押せるように # SSDSE-B-2026 から 2 群・対応あり・3 群のサンプルを作る。 import numpy as np import pandas as pd df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) df = df[df['SSDSE-B-2026'] == 2023] # 2023 年の 47 都道府県 temp = df['B4101'].astype(float).values # 年平均気温 group1 = g1 = temp[:24] # 北海道〜静岡 group2 = g2 = temp[24:] # 愛知〜沖縄 group3 = g3 = df['A4103'].astype(float).values # 合計特殊出生率 data = temp # 1 標本検定用 mu0 = float(temp.mean()) # 対応のあるデータ(同じ 47 県の 2012 年と 2023 年) _all = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) before = _all[_all['SSDSE-B-2026'] == 2012]['A1101'].astype(float).values after = _all[_all['SSDSE-B-2026'] == 2023]['A1101'].astype(float).values cond1, cond2, cond3 = before, after, (before + after) / 2 x = df['A1101'].astype(float).values y = df['A4101'].astype(float).values observed = np.array([[20, 15], [12, 18]]) # クロス集計の例 from scipy import stats # 1標本 t検定 t, p = stats.ttest_1samp(data, popmean=0) alpha = 0.05 if p < alpha: print(f"棄却: p={p:.4f} < α={alpha}") else: print(f"不棄却: p={p:.4f} ≥ α={alpha}") # 2標本 t検定(独立) t, p = stats.ttest_ind(group1, group2) # 対応のあるt検定 t, p = stats.ttest_rel(before, after) # Welch t検定(不等分散) t, p = stats.ttest_ind(g1, g2, equal_var=False) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | from statsmodels.stats.multitest import multipletests p_values = [0.001, 0.01, 0.03, 0.04, 0.10, 0.20] # Bonferroni reject, p_adj, _, _ = multipletests(p_values, alpha=0.05, method='bonferroni') # Benjamini-Hochberg (FDR) reject, p_adj, _, _ = multipletests(p_values, alpha=0.05, method='fdr_bh') # Holm reject, p_adj, _, _ = multipletests(p_values, alpha=0.05, method='holm') for p_orig, p_a, rej in zip(p_values, p_adj, reject): print(f'p={p_orig:.3f} → 補正後 p={p_a:.3f}, 棄却={rej}') |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | from statsmodels.stats.power import TTestIndPower analyzer = TTestIndPower() # 検出可能な効果量を計算 effect = analyzer.solve_power(nobs1=50, alpha=0.05, power=0.80) print(f'検出可能な最小効果量: {effect:.3f}') # 必要なサンプルサイズ n = analyzer.solve_power(effect_size=0.3, alpha=0.05, power=0.80) print(f'必要n(各群): {n:.0f}') # 与えられた条件での検出力 power = analyzer.solve_power(effect_size=0.5, nobs1=30, alpha=0.05) print(f'検出力: {power:.3f}') |
1 2 3 4 5 6 7 8 9 10 11 | import pandas as pd from scipy.stats import ttest_1samp, t df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) sample = df[df['Prefecture'] == '北海道']['A1101'] # 北海道の各年の総人口 stat, p = ttest_1samp(sample, popmean=df['A1101'].mean()) alpha = 0.05 crit = t.ppf(1 - alpha/2, df=len(sample)-1) print(f't={stat:.3f}, p={p:.4f}, 臨界値=±{crit:.3f}') print('棄却' if abs(stat) > crit else '不棄却') |
1 2 3 4 5 6 | from statsmodels.stats.weightstats import DescrStatsW desc = DescrStatsW(sample) print('mean:', desc.mean) print('95% CI:', desc.tconfint_mean(alpha=0.05)) print('t統計量, p値:', desc.ttest_mean(value=df['A1101'].mean())) |
1 2 3 | import pingouin as pg res = pg.ttest(sample, df['A1101'].mean(), alternative='two-sided') print(res) # T, dof, p-val, CI95%, cohen-d, BF10, power |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | from statsmodels.stats.multitest import multipletests from scipy.stats import ttest_1samp import pandas as pd df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) pvals = [] for pref, g in df.groupby('Prefecture'): _, p = ttest_1samp(g['A1101'], df['A1101'].mean()) pvals.append(p) # Bonferroni 補正 rej_b, padj_b, _, _ = multipletests(pvals, alpha=0.05, method='bonferroni') # BH法 (FDR) rej_bh, padj_bh, _, _ = multipletests(pvals, alpha=0.05, method='fdr_bh') # Holm法 rej_h, padj_h, _, _ = multipletests(pvals, alpha=0.05, method='holm') print('Bonferroni 棄却数:', rej_b.sum()) print('BH (FDR) 棄却数 :', rej_bh.sum()) print('Holm 棄却数 :', rej_h.sum()) |
1 2 3 4 5 6 | from statsmodels.stats.power import TTestPower # α=0.05, 検出力=0.8, 効果量 d=0.5 → 必要n analysis = TTestPower() n = analysis.solve_power(effect_size=0.5, alpha=0.05, power=0.8) print(f'必要サンプルサイズ: {n:.1f}') |
1 2 3 4 | from statsmodels.stats.weightstats import ttost_ind # 2群が「実質的に同じ」と主張するための片側2回検定 p, _, _ = ttost_ind(group1, group2, low=-5, upp=5) print('TOST p値:', p) # p<0.05 で「等価」 |
α を小さくすると Type I 誤り(false positive)が減るが、 Type II 誤り(false negative)が増える。 「厳しい基準」は「見落としが増える」を意味する。
| 効果量 d | 必要 n(各群、 α=0.05、 検出力=0.80) |
|---|---|
| 0.2(小) | 394 |
| 0.5(中) | 64 |
| 0.8(大) | 26 |
分野によって優先度が違う:
近年の流れ:α=0.05 の機械的判定をやめ、 効果量・信頼区間・ベイズ因子(Bayes factor)など複合的に評価。 「統計的有意」を絶対視しない。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | from statsmodels.stats.power import TTestIndPower, FTestAnovaPower import numpy as np # 2標本t検定の検出力 analyzer = TTestIndPower() power = analyzer.solve_power(effect_size=0.5, nobs1=50, alpha=0.05) print(f'検出力: {power:.3f}') # 必要なサンプルサイズ n = analyzer.solve_power(effect_size=0.5, alpha=0.05, power=0.80) print(f'必要n: {n:.0f}') # 検出可能な最小効果量 d_min = analyzer.solve_power(nobs1=50, alpha=0.05, power=0.80) print(f'検出可能な効果量: {d_min:.3f}') |
有意水準 α = 0.05 の両側検定と、 100×(1−α)% = 95% 信頼区間は表裏一体。
p 値の代わりに信頼区間を報告すれば、 「有意か否か」+「どれくらいの幅か」 (=効果量の不確実性) を同時に伝えられる。 近年の科学雑誌は信頼区間中心の報告を推奨。
このコードでやること: SSDSE-B-2026 東西人口差の 95% 信頼区間を計算する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | import pandas as pd, numpy as np from scipy import stats df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) latest = df[df['SSDSE-B-2026'] == 2023].copy() latest['region'] = latest['Code'].apply(lambda c: '東' if int(c[1:3]) <= 23 else '西') east = latest[latest['region'] == '東']['A1101'].values west = latest[latest['region'] == '西']['A1101'].values diff = east.mean() - west.mean() se = np.sqrt(east.var(ddof=1)/len(east) + west.var(ddof=1)/len(west)) # Welch df df_v = (east.var(ddof=1)/len(east) + west.var(ddof=1)/len(west))**2 / ( (east.var(ddof=1)/len(east))**2/(len(east)-1) + (west.var(ddof=1)/len(west))**2/(len(west)-1)) tcrit = stats.t.ppf(0.975, df_v) print(f'差 = {diff:,.0f}, SE = {se:,.0f}') print(f'95% CI = [{diff - tcrit*se:,.0f}, {diff + tcrit*se:,.0f}]') |
📤 実行結果:
💬 95% CI が 0 を含むので α=0.05 で棄却できない。 だが上限は 300 万人超 → 「効果がない」ではなく「差は最大 300 万人くらいまである可能性がある」と幅で報告するのが誠実。
有意水準 がデータサイエンスの体系の中でどこに位置するかを、 3つの異なる視点で可視化します。 同じ情報でも見方を変えると気付きが変わります。
🌐 統計・データサイエンス › 推測統計 › 検定 › 有意水準
中心に 有意水準 を置き、 そこから p値・信頼区間・標本サイズ・重回帰・t検定・標準誤差 など 計 12 個の用語へ、 前提・兄弟・発展形といった関係を矢印で結んでいます。 線がどちら向きかを見れば、 先に読むべき用語とあとから読む用語が分かります。 ノードはドラッグで動かせ、 ホイールでズーム、 クリックでその用語のページへ遷移します。
大きな円が小さな円を包含する Circle Packing 図。 「有意水準」は緑色でハイライト。
長方形を入れ子に分割した Treemap 図。 各分野の規模感を面積で比較。 「有意水準」は緑色でハイライト。
| マップ | 分かること | こんな時に見る |
|---|---|---|
| 🔗 関係マップ | 手法間の横の関係(前提→発展→応用) | 「次に何を学べばよい?」 学習順序の判断 |
| ⭕ 包含マップ | 分類体系の入れ子構造(上位⊃下位) | 「この手法はどんなジャンルに属する?」 |
| 🌳 ツリーマップ | 分野の規模比較(面積=ボリューム) | 「データサイエンス全体の俯瞰像」 |
💡 3 つの図は同じ位置関係を別の角度から描いています。 関係マップは 有意水準 の隣に何が並ぶかを、 包含マップとツリーマップは 統計・データサイエンス → 検定 → 有意水準 という入れ子の位置を示します。 「検定には他に何があったか」を思い出したいときは包含マップを、 「次に何を読むか」を決めたいときは関係マップを開いてください。
「不棄却 = 差がない」ではなく「差があるという証拠が不足」。 検出力不足が原因の可能性を必ず考慮する。
「有意水準 α」は 仮説検定で第一種過誤を許容する事前閾値 であり、 上流の研究設計 (検出力・サンプルサイズ計算) と下流の p 値・効果量・信頼区間解釈を繋ぐ意思決定の中核パラメータ。 多重比較や事前登録と組み合わせて初めて再現可能な検定が成立する。
有意水準 α は「H0 を誤って棄却する確率の許容上限」で、 多重比較では Bonferroni / FDR で調整し、 さらに効果量で「統計的に有意 ≠ 実用的に重要」を区別する。
有意水準をどう設定するかは、 第一種誤りと第二種誤りのトレードオフ、 多重比較の有無、 分野の慣習で決まる。
| シナリオ | 重視する観点 | 候補手法 |
|---|---|---|
| 単純な 1 回検定 (探索的分析) | 誤検出をある程度許容 | α = 0.05 が標準 |
| 医療・新薬 (重大な意思決定) | 第一種誤りを極小化 | α = 0.01 または 0.001 |
| 多重比較 (m 回の検定) | ファミリーワイズエラー率の制御 | Bonferroni: α/m |
| 多重比較で検出力を保ちたい | 偽発見率 (FDR) の制御 | BH 法 (Benjamini-Hochberg) |
| 物理学 (新粒子発見など) | 極めて高い確実性 | 5σ ≈ α = 3×10⁻⁷ |
| A/B テスト (実務) | 実装コスト vs リフト | α = 0.05 + 効果量・検出力を事前設計 |
追記(既存の直感節の補完)。 有意水準 α のいちばんの核心は、 「帰無仮説 H₀ が本当は正しいのに、 データのブレだけで棄却してしまう事故(第一種の過誤=偽陽性)を、 どの確率まで許すか」を検定の前に宣言した数字だという点です。 α=0.05 とは「効果が本当は無い状況でも、 20 回に 1 回はうっかり“有意”と言ってしまうのを承知で進めます」という覚悟の表明にほかなりません。
検定統計量が従う分布(H₀ が真と仮定した分布)の裾に、 面積がちょうど α になる領域を切り取ります。 これが棄却域で、 その境界が臨界値です。 観測した統計量が棄却域に落ちれば「偶然にしては起こりにくい」として H₀ を棄却します。 α を 0.05 → 0.01 に下げるとは、 棄却域を狭め、 臨界値を外側へ押しやること。 「よほど極端でないと棄却しない」厳しい態度に変わります(上の🎮ウィジェットで赤い領域の面積が常に α と一致することを確かめてください)。
0.05 という値に数理的な必然性はありません。 R.A. Fisher が 1925 年に「便利な区切り」として例示した数字が慣習として定着しただけです。 だからこそ、 誤判定のコストが高い分野(医薬・素粒子物理・ゲノム)では 0.01・5σ・5×10⁻⁸ とはるかに厳しい α が採用されます。 α は「真理の境界線」ではなく「その分野が引き受ける偽陽性リスクの水準」です。
追記(既存の落とし穴節の補完)。 α をめぐる誤りは「数式の間違い」ではなく「運用と解釈の間違い」として現れます。 とくに再現性危機の文脈で繰り返し問題になった論点を整理します。
上の「多重比較で α が膨張する」落とし穴を、 SSDSE-B-2026(2023 年・47 都道府県)の実データで確かめます。 各数値列を人口(A1101)あたりの率に変換し、 「東日本(Code R01〜R23, 23 県)と西日本(R24〜R47, 24 県)で率に差があるか」を全列について Welch の t 検定で調べ、 補正の有無で「有意」件数がどう変わるかを数えます。 これは 100 本以上の同時検定であり、 補正なしのままでは偽陽性が紛れ込むリスクが高い状況です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | import pandas as pd, numpy as np from scipy import stats from statsmodels.stats.multitest import multipletests df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) latest = df[df['SSDSE-B-2026'] == 2023].copy() latest['region'] = latest['Code'].apply( lambda c: '東' if int(str(c)[1:3]) <= 23 else '西') # 各数値列を「人口(A1101)あたり」の率に変換(規模効果を除く) pop = latest['A1101'] num = latest.select_dtypes('number').drop(columns=['SSDSE-B-2026']) rate = num.div(pop, axis=0).drop(columns=['A1101']) rate = rate.loc[:, rate.std() > 0].dropna(axis=1) east = latest['region'] == '東' pvals = [stats.ttest_ind(rate.loc[east, c], rate.loc[~east, c], equal_var=False).pvalue for c in rate.columns] pvals = np.array(pvals) m, alpha = len(pvals), 0.05 raw = int((pvals < alpha).sum()) bonf = int(multipletests(pvals, alpha, 'bonferroni')[0].sum()) holm = int(multipletests(pvals, alpha, 'holm')[0].sum()) bh = int(multipletests(pvals, alpha, 'fdr_bh')[0].sum()) print(f'検定数 m : {m}') print(f'補正なし p<0.05 : {raw}') print(f'Bonferroni (α/m={alpha/m:.5f}): {bonf}') print(f'Holm : {holm}') print(f'BH (FDR) : {bh}') |
📤 実行結果:
💬 補正なしでは 108 検定中 37 列が「有意(p<0.05)」でした。 ところが Bonferroni(各検定を α/m≈0.00046 に厳格化)では 8 列、 Holm でも 8 列、 偽発見率を制御する BH 法(FDR)でも 26 列まで減ります。 同じデータ・同じ α=0.05 でも、 「多重性をどう扱うか」で結論が大きく動くことが実測で分かります。 FWER を厳しく守りたい確認的分析なら Bonferroni/Holm、 探索的に候補を絞るなら BH(FDR)が現実的です。 補正前の 37 列をそのまま「発見」と報告するのは、 α の膨張を見逃した典型的な誤りです。
※ 実測値は SSDSE-B-2026.csv(cp932, skiprows=[1], 2023 年 47 県)を人口比に変換した Welch t 検定の集計。 列数 m は「率に変換でき分散が正の列」の数に依存します。 東西の境界(Code 23/24)は説明のための便宜的な二分であり、 因果を主張するものではありません。
追記(発展的トピック)。 α を「点」ではなく、 検定設計・多重性・意思決定論の中に位置づけます。
検定設計では α(第一種)、 β(第二種)、 効果量、 標本サイズ n の 4 つが連動し、 3 つを決めると残り 1 つが定まります。 慣例では検出力 1−β ≥ 0.80 を確保するよう n を逆算します(事前の検出力分析)。 α を 0.05→0.01 と厳しくすると、 同じ n・同じ効果量では検出力が下がるため、 厳格化と引き換えに必要 n が増えるのが原則です。 検出力のページで n の逆算を扱っています。
α を事前固定の合否ラインとして運用し、 棄却域を最適設計する立場は Neyman-Pearson の枠組み(1933)に由来します(最強力検定を与える Neyman-Pearson の補題)。 一方 Fisher は p 値を証拠の連続的な強さとみなし、 機械的な 0.05 判定を意図していませんでした。 現代の実務は両者の折衷で、 「α で最終判断しつつ p 値と効果量も併示する」形が主流です。
制御したい過誤で選びます。 FWER(少なくとも 1 件の偽陽性を出す確率)を守るなら Bonferroni(α/m, 単純厳格)・Holm(段階的でより高検出力)・Šidák(独立仮定で正確)。 FDR(棄却した中の偽陽性の期待割合)を守るなら Benjamini-Hochberg(BH)。 検定数が数千〜数万に及ぶゲノム解析では、 FWER を守ると検出力がほぼ消えるため FDR が標準です。 「重大な単一決定なら FWER、 大規模スクリーニングなら FDR」が目安。
α=0.05 両側検定で H₀: μ=μ₀ を棄却することは、 95% 信頼区間が μ₀ を含まないことと表裏一体です(α=0.01 なら 99% 区間)。 p 値の代わりに信頼区間を報告すれば、 「有意か否か」だけでなく「効果がどの範囲にありうるか(不確実性の幅)」まで一度に伝えられます。 近年の学術誌は信頼区間と効果量中心の報告を推奨しています。
こうした議論の背景には事前登録(preregistration)の重要性があります。 α・仮説・検定の向き・多重比較補正をデータ取得前に公開して固定すれば、 p-hacking や HARKing(結果を見てからの仮説づくり)の余地が構造的に消えます。 事前登録のページも参照。
「対立仮説が正しい確率」を知りたいなら、 頻度主義の α ではなくベイズ統計へ移ります。 ベイズファクター(Bayes factor)は 2 つの仮説の下でのデータの尤度比で、 「データがどちらの仮説をどれだけ支持するか」を連続的に表します。 α のような固定閾値による二分ではなく、 証拠の重みそのものを扱う枠組みです(本用語集にベイズファクター単独ページは未作成のため、 ここではテキストで補足)。