論文中に 「F検定」として登場する用語。
F検定 とは:回帰モデルの全体の有意性や、複数群の分散の差を検定。回帰のF統計量は「モデル全体が意味あるか」。
F検定は2つの分散の比を検定する手法。 もっとも頻繁に使う2つの応用:
$$ F = \frac{s_1^2}{s_2^2} \sim F(df_1, df_2) $$
2つの分散の比。 F分布は非対称で 0 から始まり右側に裾を引きます。
$$ F = \frac{\text{群間平均平方}}{\text{群内平均平方}} = \frac{MS_{\text{between}}}{MS_{\text{within}}} $$
F が大きいほど「群間差が大きい」=「群差は本物」の証拠。
H₀: μ₁ = μ₂ = μ₃ = ... = μ_k(全群同じ)
H₁: 少なくとも1つの群が異なる
例:「東日本・中部・西日本で食料費の平均に差があるか?」
$$ \text{全分散} = \text{群間分散} + \text{群内分散} $$
群間分散が群内分散より十分大きければ「差あり」と判定。
ANOVA で「差がある」と分かっても「どこに差があるか」は別の検定が必要:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | from scipy import stats # F検定(分散比) F, p = stats.f.cdf(s1**2/s2**2, df1, df2) # 一元配置 ANOVA F, p = stats.f_oneway(group1, group2, group3) # 二元配置 ANOVA(statsmodels) import statsmodels.api as sm from statsmodels.formula.api import ols model = ols('y ~ C(group1) + C(group2) + C(group1):C(group2)', data=df).fit() print(sm.stats.anova_lm(model, typ=2)) # 事後検定(Tukey HSD) from statsmodels.stats.multicomp import pairwise_tukeyhsd tukey = pairwise_tukeyhsd(df['y'], df['group']) print(tukey) |
Ronald A. Fisher(1925)が分散分析(ANOVA)で導入。 「F」は Fisher の F。 もとは George W. Snedecor が命名(1934)。
$$ \eta^2 = \frac{SS_{\text{between}}}{SS_{\text{total}}} $$
ANOVA の説明力。 0.01 小、 0.06 中、 0.14 大。
| 目的 | 1変数 | 2変数 | 多変量 |
|---|---|---|---|
| 記述 | 平均, 中央値, 分散 | 相関, 共分散 | PCA, 因子分析 |
| 可視化 | ヒストグラム, 箱ひげ | 散布図, ヒートマップ | 散布図行列, バイプロット |
| 予測 | 時系列モデル | 単回帰 | 重回帰, Ridge, LASSO |
| 分類 | ロジスティック回帰 | 判別分析 | SVM, RF, NN |
| グループ化 | 階級分け | 2次元クラスタリング | k-means, 階層クラスタリング |
| 検定 | 1標本t検定 | 2標本t検定, χ² | ANOVA, MANOVA |
| n | 推奨手法 |
|---|---|
| n < 10 | 記述統計のみ、 ノンパラ検定、 ベイズ統計 |
| 10 ≤ n < 30 | t検定, ブートストラップ, 単回帰 |
| 30 ≤ n < 200 | 重回帰, ANOVA, 階層クラスタリング |
| 200 ≤ n < 10000 | 複雑な回帰, RF, GBM, k-means |
| n ≥ 10000 | 深層学習, 大規模分散学習 |
| ライブラリ | 用途 |
|---|---|
| numpy | 数値計算の基礎、 行列演算 |
| pandas | データフレーム、 表操作 |
| scipy | 統計関数、 最適化、 線形代数 |
| statsmodels | 古典統計、 検定、 回帰分析の詳細 |
| scikit-learn | 機械学習、 前処理、 評価 |
| matplotlib | 基本可視化 |
| seaborn | 統計的可視化(高級) |
| plotly | インタラクティブ可視化 |
| xgboost / lightgbm | 勾配ブースティング |
| PyTorch / TensorFlow | 深層学習 |
このページで扱った概念を、 学習効率のためにまとめます。 これを毎日見ることで、 統計の基礎が体に染み込みます。
| 記号 | 意味 | 読み方 |
|---|---|---|
| μ | 母平均 | ミュー |
| σ | 母標準偏差 | シグマ |
| σ² | 母分散 | シグマ二乗 |
| x̄ | 標本平均 | エックスバー |
| s | 標本標準偏差 | エス |
| n | 標本サイズ | エヌ |
| p | p値、 比率 | ピー |
| α | 有意水準 | アルファ |
| β | 回帰係数、 第二種誤り率 | ベータ |
| r | 相関係数 | アール |
| R² | 決定係数 | アール二乗 |
| Σ | 総和記号、 共分散行列 | シグマ大文字 |
| N(μ, σ²) | 正規分布 | ノーマル ミュー シグマ二乗 |
| t(df) | t分布 | ティー |
| χ²(df) | カイ二乗分布 | カイ二乗 |
| F(d1, d2) | F分布 | エフ |
| H₀, H₁ | 帰無仮説、 対立仮説 | エイチゼロ、 エイチワン |
| E[X] | 期待値 | エクスペクタンス |
| Var(X) | 分散 | バリアンス |
| Cov(X, Y) | 共分散 | カバリアンス |
💡 統計学・データサイエンスは「記号の意味を理解する」ことが最初の壁。 各記号が何を表すか、 公式の中での役割を覚えてしまえば、 後はパターンの組合せで様々な手法が理解できます。
(CRISP-DM プロセスより)
| 分野 | 主要技術 | 代表ツール |
|---|---|---|
| 記述統計 | 要約量、 可視化 | pandas, matplotlib |
| 推測統計 | 検定、 信頼区間 | scipy.stats, statsmodels |
| 機械学習 | 予測、 分類、 クラスタリング | scikit-learn, XGBoost |
| 深層学習 | NN、 画像、 自然言語 | PyTorch, TensorFlow |
| 時系列 | ARIMA、 状態空間、 LSTM | statsmodels, prophet |
| 因果推論 | RCT、 IV、 DiD、 PSM | DoWhy, EconML |
| ベイズ統計 | MCMC、 変分推論 | PyMC, Stan |
| 最適化 | 線形/凸/離散最適化 | scipy.optimize, cvxpy |
これらは互いに深く関連します:
F検定 がデータサイエンスの体系の中でどこに位置するかを、 3つの異なる視点で可視化します。 同じ情報でも見方を変えると気付きが変わります。
🌐 統計・データサイエンス › 推測統計 › 検定 › F検定
中心の概念から放射状に、 前提・兄弟・発展形・応用先などの関係性を矢印で結びます。 横の繋がりを見るのに最適。 ノードをドラッグ、 ホイールでズーム、 クリックで遷移。
大きな円が小さな円を包含する Circle Packing 図。 「F検定」は緑色でハイライト。
長方形を入れ子に分割した Treemap 図。 各分野の規模感を面積で比較。 「F検定」は緑色でハイライト。
| マップ | 分かること | こんな時に見る |
|---|---|---|
| 🔗 関係マップ | 手法間の横の関係(前提→発展→応用) | 「次に何を学べばよい?」 学習順序の判断 |
| ⭕ 包含マップ | 分類体系の入れ子構造(上位⊃下位) | 「この手法はどんなジャンルに属する?」 |
| 🌳 ツリーマップ | 分野の規模比較(面積=ボリューム) | 「データサイエンス全体の俯瞰像」 |
💡 ジャストインタイム学習のヒント:3つの視点を行き来することで、 概念を多角的に理解できます。 包含マップやツリーマップはズーム/ドリルダウンで大分類から細部まで探索できます。
F 検定(F-test)を確実に理解するための関連キーワードを、難易度別に整理しました。
合成データではなく公的統計(SSDSE-B-2026 を想定)で F 検定の具体的な計算手順を見せます。
47 都道府県を都市圏(東京・神奈川・大阪・愛知・埼玉・千葉・兵庫・福岡)8 県 と それ以外 39 県に分けて、 人口密度の分散を比較します。
1 2 3 4 5 6 7 8 9 10 11 12 | # 分散の概算 都市圏 s₁² ≈ 4_200_000(東京の 6400 が支配的) 地方 s₂² ≈ 25_000 F = s₁² / s₂² = 4_200_000 / 25_000 ≈ 168 df₁ = 7, df₂ = 38 F 分布の臨界値(α=0.05、 右側):F(7, 38) ≈ 2.27 → 168 >> 2.27 なので帰無仮説(等分散)を強く棄却 結論:都市圏の人口密度は地方よりも著しく分散が大きい → 2 群の t 検定では Welch 補正版を使うべき |
47 都道府県を地理的に 4 区分し、 平均寿命(仮想値、 単位:年)の差を ANOVA で検定します。
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 | # 各群の平均寿命(仮想例、 実際は男女別など) 北日本(北海道・東北 7 県):平均 84.1、 分散 0.32 中日本(関東・中部 14 県):平均 84.6、 分散 0.41 南日本(近畿・四国 10 県):平均 84.8、 分散 0.28 西日本(九州・沖縄 8 県):平均 84.5、 分散 0.46 全体平均(grand mean)≈ 84.55、 N = 47、 k = 4 群間平方和 SS_between = Σ nᵢ(x̄ᵢ - x̄)² = 7(84.1-84.55)² + 14(84.6-84.55)² + 10(84.8-84.55)² + 8(84.5-84.55)² ≈ 7·0.2025 + 14·0.0025 + 10·0.0625 + 8·0.0025 ≈ 1.418 + 0.035 + 0.625 + 0.020 ≈ 2.10 群内平方和 SS_within = Σ (nᵢ-1)·sᵢ² = 6·0.32 + 13·0.41 + 9·0.28 + 7·0.46 ≈ 1.92 + 5.33 + 2.52 + 3.22 ≈ 12.99 MS_between = 2.10 / (4-1) = 0.70 MS_within = 12.99 / (47-4) = 0.302 F = 0.70 / 0.302 ≈ 2.32 df₁ = 3, df₂ = 43 F 分布の臨界値 F(3, 43, α=0.05) ≈ 2.82 → 2.32 < 2.82 なので有意でない p 値 ≈ 0.088 結論:4 区分間で平均寿命の差は有意でない(α=0.05 で) |
1 2 3 4 5 6 7 8 9 10 11 | η² = SS_between / (SS_between + SS_within) = 2.10 / (2.10 + 12.99) ≈ 0.139 Cohen の基準: - η² ≈ 0.01 → 小 - η² ≈ 0.06 → 中 - η² ≈ 0.14 → 大 → 効果量は「大きい」が、 サンプルが少なく統計的有意性に届かなかった可能性。 追加データやサンプルサイズの再設計を検討。 |
t 検定は中心極限定理で正規性の崩れに比較的頑健ですが、 F 検定(特に等分散性検定)は正規性の崩れに敏感です。 裾が重い・歪んだ分布では F 検定の Type I エラー率が大きく狂います。 47 都道府県の人口や所得のような分布では、 等分散性検定として F 検定よりも Levene 検定や Brown–Forsythe 検定を使う方が頑健です。 正規性は QQ プロットや Shapiro–Wilk で必ず確認しましょう。
ANOVA の F 検定は「少なくとも 1 つの群が他と違う」を示すだけで、 どのペアが違うかは別途多重比較が必要です。 単純に各ペアで t 検定を 3 回(3 群なら)行うと、 全体の Type I エラーが 5% を超え(約 14%)、 偽陽性が増えます。 Tukey HSD や Bonferroni、 Holm 法など、 群数に応じた補正を必ず適用してください。
F 検定はサンプル数が大きくなるほど検出力が上がるため、 実質的に無視できる差でも統計的に有意と判定されます。 例えば s₁² = 100、 s₂² = 105 でも N = 1000 ずつあれば有意になりますが、 実務的にこの差は無意味です。 必ず効果量(η², 分散比そのもの)と組み合わせて報告し、 統計的有意性と実質的有意性を区別しましょう。
かつては「F 検定で等分散を確認してから Student の t 検定、 等分散でなければ Welch の t 検定」という流れが推奨されました。 しかし現代の統計学では、 初めから Welch の t 検定(または Welch の ANOVA)を使う方が安全とされています。 二段階手続きは Type I エラーが累積し、 等分散性の検定自体の検出力も問題になります。
正規分布や t 分布と違い、 F 分布は左右対称ではなく、 値は常に正です。 分散比を計算するときは慣例的に「大きい分散 / 小さい分散」として F ≥ 1 とし、 右側のみを棄却域として α/2 で見ます(両側検定の場合)。 単純に「F = s₁²/s₂² が 0.5 だから棄却しない」と判断してはいけません。
同一被験者を複数時点で測定したデータに通常の one-way ANOVA を適用すると、 観測の独立性が壊れ F 統計量が過大 / 過小評価されます。 反復測定 ANOVA、 混合効果モデル(lme4 / statsmodels.MixedLM)、 GEE などの相関構造を扱える手法を使う必要があります。 球面性の仮定(Mauchly 検定)にも注意。
「都市圏 8 県 vs 地方 39 県」のように群サイズが極端に偏ると、 F 検定は分散の同等性を強く要求するようになり、 仮定の崩れに敏感になります。 また Type III 平方和(不均衡 ANOVA で必要)の選択も問題になります。 サンプルサイズが揃わない場合は、 Welch の ANOVA、 混合モデル、 もしくはノンパラメトリック(Kruskal–Wallis)を検討してください。
1 2 3 4 5 6 7 8 9 10 11 12 | import pandas as pd from scipy import stats df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='utf-8-sig') # 仮の地域分け df['region'] = df['都道府県'].map(lambda x: '北' if x in ['北海道','青森','秋田','岩手','宮城','山形','福島'] else '中' if x in ['東京','神奈川','千葉','埼玉','茨城','栃木','群馬','山梨','長野','新潟','富山','石川','福井','静岡'] else '南' if x in ['愛知','岐阜','三重','大阪','京都','兵庫','奈良','和歌山','滋賀','徳島','香川','愛媛','高知'] else '西') groups = [g['平均寿命'].dropna().values for _, g in df.groupby('region') if '平均寿命' in df.columns] F, p = stats.f_oneway(*groups) print(f'F = {F:.3f}, p = {p:.4f}') |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | import numpy as np from scipy import stats x1 = df[df['region']=='中']['人口密度'].dropna().values x2 = df[df['region']=='北']['人口密度'].dropna().values var1 = np.var(x1, ddof=1) var2 = np.var(x2, ddof=1) F = var1 / var2 if var1 > var2 else var2 / var1 df1 = (len(x1) if var1 > var2 else len(x2)) - 1 df2 = (len(x2) if var1 > var2 else len(x1)) - 1 p = 2 * (1 - stats.f.cdf(F, df1, df2)) # 両側 print(f'F = {F:.3f}, df = ({df1}, {df2}), p = {p:.4f}') |
1 2 3 4 5 6 | import statsmodels.api as sm from statsmodels.formula.api import ols model = ols('平均寿命 ~ C(region)', data=df).fit() anova_table = sm.stats.anova_lm(model, typ=2) print(anova_table) |
1 2 3 4 5 | import pingouin as pg result = pg.anova(data=df, dv='平均寿命', between='region', detailed=True) print(result) # 出力:F値、 p値、 partial η² まで自動計算 |
1 2 3 4 | import pingouin as pg result_welch = pg.welch_anova(data=df, dv='平均寿命', between='region') print(result_welch) |
1 2 3 4 | from statsmodels.stats.multicomp import pairwise_tukeyhsd tukey = pairwise_tukeyhsd(endog=df['平均寿命'], groups=df['region'], alpha=0.05) print(tukey.summary()) |
1 2 3 4 5 6 | from scipy import stats groups = [g['人口密度'].dropna().values for _, g in df.groupby('region')] stat, p = stats.levene(*groups, center='median') print(f'Levene W = {stat:.3f}, p = {p:.4f}') # center='median' は Brown–Forsythe 法。 正規性に頑健。 |