論文一覧に戻る 📚 用語解説(ジャストインタイム型データサイエンス教育)
F検定
F-test (F)
回帰モデルの全体の有意性や、複数群の分散の差を検定。回帰のF統計量は「モデル全体が意味あるか」。
仮説検定FF検定ANOVA
📍 文脈💡 30秒結論

📍 あなたが今見ているもの

論文中に 「F検定」として登場する用語。

F検定 とは:回帰モデルの全体の有意性や、複数群の分散の差を検定。回帰のF統計量は「モデル全体が意味あるか」。

💡 30秒で分かる結論

👁️ 直感 — F検定は「分散比の検定」

F検定は2つの分散の比を検定する手法。 もっとも頻繁に使う2つの応用:

F分布

📐 F統計量

$$ F = \frac{s_1^2}{s_2^2} \sim F(df_1, df_2) $$

2つの分散の比。 F分布は非対称で 0 から始まり右側に裾を引きます。

ANOVA での F統計量

$$ F = \frac{\text{群間平均平方}}{\text{群内平均平方}} = \frac{MS_{\text{between}}}{MS_{\text{within}}} $$

F が大きいほど「群間差が大きい」=「群差は本物」の証拠。

🎯 一元配置 ANOVA — 3群以上の平均差

H₀: μ₁ = μ₂ = μ₃ = ... = μ_k(全群同じ)
H₁: 少なくとも1つの群が異なる

例:「東日本・中部・西日本で食料費の平均に差があるか?」

分散の分解

$$ \text{全分散} = \text{群間分散} + \text{群内分散} $$

群間分散が群内分散より十分大きければ「差あり」と判定。

事後検定

ANOVA で「差がある」と分かっても「どこに差があるか」は別の検定が必要:

🐍 Python での F検定

 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)

🚧 落とし穴と注意点

🔬 「F検定」を深く理解する

F分布の発見

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. この手法が使われる典型的なシナリオを3つ挙げられますか?
  3. この手法の前提条件・仮定を確認できますか?
  4. 結果を解釈する際の注意点は何ですか?
  5. 類似手法との違いを説明できますか?
  6. Python(または他言語)で実装できますか?
  7. SSDSE データで応用例を作成できますか?

📚 参考文献・さらなる学習

古典的教科書

実践書

オンラインリソース

💼 実務応用ガイド

データサイエンスプロジェクトでの位置づけ

  1. 探索的分析(EDA):基本統計量・可視化でデータを理解
  2. 前処理:標準化・正規化・欠損値処理
  3. モデリング:回帰・分類・クラスタリング
  4. 評価:CV、 指標計算、 統計的検定
  5. 解釈・報告:効果量・信頼区間・可視化

業界別ユースケース

📖 完全ガイド — 統計学習の参照表

分析の流れ — 8ステップ

  1. 問題定義:何を知りたいのか、 目的を明確に
  2. データ収集:信頼できるソースから(SSDSEなど公的データ)
  3. データクリーニング:欠損値、 外れ値、 入力ミスの確認
  4. 探索的分析(EDA):要約統計量、 ヒストグラム、 散布図
  5. 変数変換:標準化、 対数変換、 カテゴリのエンコード
  6. モデリング:適切な手法を選び、 学習
  7. 評価:CV、 指標、 統計的検定
  8. 解釈・報告:効果量、 信頼区間、 可視化

統計手法の選び方マトリクス

目的 1変数 2変数 多変量
記述平均, 中央値, 分散相関, 共分散PCA, 因子分析
可視化ヒストグラム, 箱ひげ散布図, ヒートマップ散布図行列, バイプロット
予測時系列モデル単回帰重回帰, Ridge, LASSO
分類ロジスティック回帰判別分析SVM, RF, NN
グループ化階級分け2次元クラスタリングk-means, 階層クラスタリング
検定1標本t検定2標本t検定, χ²ANOVA, MANOVA

サンプル数別の手法ガイド

n 推奨手法
n < 10記述統計のみ、 ノンパラ検定、 ベイズ統計
10 ≤ n < 30t検定, ブートストラップ, 単回帰
30 ≤ n < 200重回帰, ANOVA, 階層クラスタリング
200 ≤ n < 10000複雑な回帰, RF, GBM, k-means
n ≥ 10000深層学習, 大規模分散学習

Python 主要ライブラリ早見表

ライブラリ 用途
numpy数値計算の基礎、 行列演算
pandasデータフレーム、 表操作
scipy統計関数、 最適化、 線形代数
statsmodels古典統計、 検定、 回帰分析の詳細
scikit-learn機械学習、 前処理、 評価
matplotlib基本可視化
seaborn統計的可視化(高級)
plotlyインタラクティブ可視化
xgboost / lightgbm勾配ブースティング
PyTorch / TensorFlow深層学習

よくある質問(FAQ)

📓 用語のまとめ — 30秒で理解

このページで扱った概念を、 学習効率のためにまとめます。 これを毎日見ることで、 統計の基礎が体に染み込みます。

必ず押さえるべき記号

記号 意味 読み方
μ母平均ミュー
σ母標準偏差シグマ
σ²母分散シグマ二乗
標本平均エックスバー
s標本標準偏差エス
n標本サイズエヌ
pp値、 比率ピー
α有意水準アルファ
β回帰係数、 第二種誤り率ベータ
r相関係数アール
決定係数アール二乗
Σ総和記号、 共分散行列シグマ大文字
N(μ, σ²)正規分布ノーマル ミュー シグマ二乗
t(df)t分布ティー
χ²(df)カイ二乗分布カイ二乗
F(d1, d2)F分布エフ
H₀, H₁帰無仮説、 対立仮説エイチゼロ、 エイチワン
E[X]期待値エクスペクタンス
Var(X)分散バリアンス
Cov(X, Y)共分散カバリアンス

💡 統計学・データサイエンスは「記号の意味を理解する」ことが最初の壁。 各記号が何を表すか、 公式の中での役割を覚えてしまえば、 後はパターンの組合せで様々な手法が理解できます。

🌐 データサイエンス全体像での位置づけ

データサイエンスのワークフロー

  1. ビジネス理解:何を解決したいか
  2. データ理解:どんなデータがあるか
  3. データ準備:前処理、 特徴量エンジニアリング
  4. モデリング:手法選択、 学習
  5. 評価:性能、 解釈性、 ビジネス価値
  6. 展開:実装、 運用、 監視

(CRISP-DM プロセスより)

主要分野のマッピング

分野 主要技術 代表ツール
記述統計要約量、 可視化pandas, matplotlib
推測統計検定、 信頼区間scipy.stats, statsmodels
機械学習予測、 分類、 クラスタリングscikit-learn, XGBoost
深層学習NN、 画像、 自然言語PyTorch, TensorFlow
時系列ARIMA、 状態空間、 LSTMstatsmodels, prophet
因果推論RCT、 IV、 DiD、 PSMDoWhy, EconML
ベイズ統計MCMC、 変分推論PyMC, Stan
最適化線形/凸/離散最適化scipy.optimize, cvxpy

キャリアパス

💎 良いデータ分析のための10のコツ

  1. 必ず可視化から始める:散布図、 ヒストグラム、 箱ひげ図
  2. 外れ値を意識する:除く前にドメイン的に理解
  3. 仮定を確認する:正規性、 独立性、 等分散性
  4. サンプルサイズに見合う複雑性:n=10 で深層学習はしない
  5. 効果量も併記する:p値だけでは不十分
  6. 信頼区間で不確実性を示す:点推定だけでは誤解の元
  7. 多重比較を補正する:探索的解析でも誠実に
  8. ホールドアウト or CV で評価する:訓練データの精度は意味がない
  9. 解釈可能性も重視する:ブラックボックスより white-box
  10. 再現可能なコードを書く:random_seed、 バージョン管理

🔗 用語間の関係 — 統計概念のネットワーク

記述統計の基本セット

これらは互いに深く関連します:

推測統計の基本セット

回帰モデルファミリー

クラスタリング・次元削減ファミリー

検定ファミリー

🗺️ 概念マップ — 3つの視点で体系を理解する

F検定 がデータサイエンスの体系の中でどこに位置するかを、 3つの異なる視点で可視化します。 同じ情報でも見方を変えると気付きが変わります。

📍 体系階層のパス

🌐 統計・データサイエンス推測統計検定F検定

① 🔗 関係マップ — 「他の手法とどう繋がっているか」

中心の概念から放射状に、 前提・兄弟・発展形・応用先などの関係性を矢印で結びます。 横の繋がりを見るのに最適。 ノードをドラッグ、 ホイールでズーム、 クリックで遷移

凡例:現在の用語上位カテゴリ兄弟(並列)前提発展形応用先2階層先

② ⭕ 包含マップ — 「どのカテゴリに含まれているか」

大きな円が小さな円を包含する Circle Packing 図。 「F検定」は緑色でハイライト

📍現在地:統計・データサイエンス

③ 🌳 ツリーマップ — 「面積で見るボリューム比較」

長方形を入れ子に分割した Treemap 図。 各分野の規模感を面積で比較。 「F検定」は緑色でハイライト

🎯 3つのマップの使い分け

マップ 分かること こんな時に見る
🔗 関係マップ手法間の横の関係(前提→発展→応用)「次に何を学べばよい?」 学習順序の判断
⭕ 包含マップ分類体系の入れ子構造(上位⊃下位)「この手法はどんなジャンルに属する?」
🌳 ツリーマップ分野の規模比較(面積=ボリューム)「データサイエンス全体の俯瞰像」

💡 ジャストインタイム学習のヒント:3つの視点を行き来することで、 概念を多角的に理解できます。 包含マップやツリーマップはズーム/ドリルダウンで大分類から細部まで探索できます。

🔖 キーワード索引 — F 検定を多角的に理解する

F 検定(F-test)を確実に理解するための関連キーワードを、難易度別に整理しました。

🟢 基礎キーワード(まず押さえる)

🟡 中級キーワード

🔴 上級キーワード

🧮 SSDSE-B-2026 実値計算例 — F 検定を 47 都道府県データで実行

合成データではなく公的統計(SSDSE-B-2026 を想定)で F 検定の具体的な計算手順を見せます。

① 等分散性の検定:「都市圏 vs 地方」で人口密度の分散は等しいか?

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 補正版を使うべき

② ANOVA:「気候区分(北・中・南・西)4 区分」で平均寿命に差があるか?

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̄ᵢ - )²
= 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  

 効果量は大きい サンプルが少なく統計的有意性に届かなかった可能性
  追加データやサンプルサイズの再設計を検討

⚠️ F 検定の落とし穴 — 実務で必ず引っかかるポイント 7 選

① F 検定は正規性に「敏感」である

t 検定は中心極限定理で正規性の崩れに比較的頑健ですが、 F 検定(特に等分散性検定)は正規性の崩れに敏感です。 裾が重い・歪んだ分布では F 検定の Type I エラー率が大きく狂います。 47 都道府県の人口や所得のような分布では、 等分散性検定として F 検定よりも Levene 検定や Brown–Forsythe 検定を使う方が頑健です。 正規性は QQ プロットや Shapiro–Wilk で必ず確認しましょう。

② ANOVA が有意でも「どの群間に差があるか」は分からない

ANOVA の F 検定は「少なくとも 1 つの群が他と違う」を示すだけで、 どのペアが違うかは別途多重比較が必要です。 単純に各ペアで t 検定を 3 回(3 群なら)行うと、 全体の Type I エラーが 5% を超え(約 14%)、 偽陽性が増えます。 Tukey HSD や Bonferroni、 Holm 法など、 群数に応じた補正を必ず適用してください。

③ サンプルサイズが大きいと「実質的に同じ分散」でも有意になる

F 検定はサンプル数が大きくなるほど検出力が上がるため、 実質的に無視できる差でも統計的に有意と判定されます。 例えば s₁² = 100、 s₂² = 105 でも N = 1000 ずつあれば有意になりますが、 実務的にこの差は無意味です。 必ず効果量(η², 分散比そのもの)と組み合わせて報告し、 統計的有意性と実質的有意性を区別しましょう。

④ 「等分散性の前検定 → t 検定」という二段階手続きは推奨されない

かつては「F 検定で等分散を確認してから Student の t 検定、 等分散でなければ Welch の t 検定」という流れが推奨されました。 しかし現代の統計学では、 初めから Welch の t 検定(または Welch の ANOVA)を使う方が安全とされています。 二段階手続きは Type I エラーが累積し、 等分散性の検定自体の検出力も問題になります。

⑤ F 分布は右に裾を引く非対称分布である

正規分布や t 分布と違い、 F 分布は左右対称ではなく、 値は常に正です。 分散比を計算するときは慣例的に「大きい分散 / 小さい分散」として F ≥ 1 とし、 右側のみを棄却域として α/2 で見ます(両側検定の場合)。 単純に「F = s₁²/s₂² が 0.5 だから棄却しない」と判断してはいけません。

⑥ 反復測定データに通常の ANOVA を適用してしまう

同一被験者を複数時点で測定したデータに通常の one-way ANOVA を適用すると、 観測の独立性が壊れ F 統計量が過大 / 過小評価されます。 反復測定 ANOVA、 混合効果モデル(lme4 / statsmodels.MixedLM)、 GEE などの相関構造を扱える手法を使う必要があります。 球面性の仮定(Mauchly 検定)にも注意。

⑦ 群サイズが不均衡だと不安定になる

「都市圏 8 県 vs 地方 39 県」のように群サイズが極端に偏ると、 F 検定は分散の同等性を強く要求するようになり、 仮定の崩れに敏感になります。 また Type III 平方和(不均衡 ANOVA で必要)の選択も問題になります。 サンプルサイズが揃わない場合は、 Welch の ANOVA、 混合モデル、 もしくはノンパラメトリック(Kruskal–Wallis)を検討してください。

🐍 Python 実装のバリエーション — scipy / statsmodels / pingouin

① scipy.stats.f_oneway による一元配置 ANOVA

 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}')

② scipy.stats.f による分散比検定

 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}')

③ statsmodels の anova_lm で本格的 ANOVA

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)

④ pingouin で効果量とともに ANOVA

1
2
3
4
5
import pingouin as pg

result = pg.anova(data=df, dv='平均寿命', between='region', detailed=True)
print(result)
# 出力:F値、 p値、 partial η² まで自動計算

⑤ Welch の ANOVA(等分散を仮定しない)

1
2
3
4
import pingouin as pg

result_welch = pg.welch_anova(data=df, dv='平均寿命', between='region')
print(result_welch)

⑥ 多重比較(Tukey HSD)

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())

⑦ Levene 検定(F 検定の頑健な代替)

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 法。 正規性に頑健。