「2つの製造ラインで製品の品質にばらつきの差があるか」「新しい測定機器と従来の機器で精度に違いがあるか」。こうした問いに答えるために、2つの母集団の分散を比較する手法が必要となる。その代表格がF検定(等分散性の検定)である。
F検定の「F」は、統計学の父と呼ばれるロナルド・フィッシャー(Ronald Fisher, 1890-1962)に由来する。フィッシャーは1920年代に農業試験場での実験計画法の研究を通じて、分散比の分布を導いた。後に統計学者のジョージ・W・スネデカーがフィッシャーに敬意を表して「F分布」「F検定」と命名した。F検定は今日でも、品質管理や医学研究など幅広い分野で活用されている。
本記事では、F検定の基本的な考え方から、具体的な計算方法、t検定との関係まで解説する。F分布や統計的仮説検定の基礎知識があると理解しやすい。
F検定とは
F検定は、2つの母集団の分散が等しいかどうかを検定する手法である。正確には「等分散性の検定」や「分散比の検定」とも呼ばれる。
F検定が必要となる主な場面は以下の通りである。
- 品質管理:2つの製造ラインの製品ばらつきを比較
- 測定精度の評価:新旧の測定機器の精度を比較
- t検定の前提確認:2標本t検定(スチューデント)は等分散を仮定するため、事前にF検定で確認
- 医学研究:治療法による効果のばらつきを比較
問題設定と仮説
群Aから n_A 個の標本 X_{A1}, X_{A2}, \ldots, X_{An_A} が得られ、群Bから n_B 個の標本 X_{B1}, X_{B2}, \ldots, X_{Bn_B} が得られたとする。各群の母集団は正規分布に従うと仮定する。
母平均 \mu_A, \mu_B は未知とし、2つの母分散が等しいかを検定する。
帰無仮説と対立仮説
片側検定を行う場合は、対立仮説を H_1: \sigma_A^2 < \sigma_B^2 または H_1: \sigma_A^2 > \sigma_B^2 とする。
検定統計量
各群の不偏分散を計算する。
帰無仮説 H_0: \sigma_A^2 = \sigma_B^2 のもとで、検定統計量
は自由度 (n_B - 1, n_A - 1) のF分布に従う。
F統計量の定義では、分子・分母の取り方に注意が必要である。本記事では群Bの分散を分子に置いたが、文献によっては逆の場合もある。大切なのは自由度の対応である。分子の自由度(第1自由度)は分子に使った分散のサンプルサイズ−1、分母の自由度(第2自由度)は分母に使った分散のサンプルサイズ−1となる。
なぜF分布に従うのか
正規母集団からの標本について、\dfrac{(n-1)s^2}{\sigma^2} は自由度 n-1 のカイ二乗分布に従う。したがって、帰無仮説のもと(\sigma_A^2 = \sigma_B^2)では
となり、これは自由度 (n_B-1, n_A-1) のF分布の定義そのものである。
棄却域と判定
F分布は非対称な分布であるため、両側検定と片側検定で棄却域の設定が異なる。
両側検定
対立仮説 H_1: \sigma_A^2 \neq \sigma_B^2 のとき、有意水準 \alpha で次の条件を満たせば帰無仮説を棄却する。
ここで F_{\alpha/2}(d_1, d_2) は自由度 (d_1, d_2) のF分布の上側 \dfrac{100\alpha}{2}%点である。
片側検定
| 対立仮説 | 棄却域 | 意味 |
|---|---|---|
| H_1: \sigma_A^2 < \sigma_B^2 | F \ge F_{\alpha}(n_B-1, n_A-1) | 群Bのばらつきが大きいか |
| H_1: \sigma_A^2 > \sigma_B^2 | F \le F_{1-\alpha}(n_B-1, n_A-1) | 群Aのばらつきが大きいか |
| H_1: \sigma_A^2 \neq \sigma_B^2 | F \ge F_{\alpha/2} または F \le F_{1-\alpha/2} | ばらつきが異なるか |
F分布には F_{1-\alpha}(d_1, d_2) = \dfrac{1}{F_{\alpha}(d_2, d_1)} という関係がある。そのため、分散が大きい方を分子に置けば、常に上側パーセント点のみで判定できる。多くの統計ソフトや教科書ではこの方法を採用している。
計算例
ある工場で、2つの製造ライン(A, B)から製品を抽出し、重量(g)を測定した。
ラインA(12個):50.2, 49.8, 50.5, 49.7, 50.3, 50.1, 49.9, 50.4, 50.0, 49.6, 50.2, 50.1
ラインB(10個):49.5, 51.2, 48.8, 50.8, 49.1, 51.0, 49.3, 50.7, 49.0, 51.5
有意水準5%で、2つのラインの分散に差があるか検定せよ。
【解答】
Step 1:仮説の設定
「差があるか」を調べるので両側検定を行う。
Step 2:統計量の計算
まず、各群の標本平均と不偏分散を計算する。
不偏分散を計算する。
Step 3:検定統計量の計算
s_B^2 > s_A^2 なので、ラインBの分散を分子に置く。
Step 4:棄却域との比較
自由度 (9, 11) のF分布の上側2.5%点は F_{0.025}(9, 11) = 3.588 である。
検定統計量が棄却域に入るので、帰無仮説を棄却する。
結論:有意水準5%で、2つの製造ラインの分散には有意な差がある。ラインBはラインAよりばらつきが大きく、製品の品質安定性に問題がある可能性がある。
t検定との関係
独立な2標本t検定(スチューデントのt検定)は、2群の母分散が等しいこと(等分散)を仮定している。そのため、t検定を実施する前にF検定で等分散性を確認することが推奨されてきた。
従来のアプローチ
- F検定で等分散性を検定
- 等分散が棄却されなければ → スチューデントのt検定
- 等分散が棄却されれば → ウェルチのt検定
現代的なアプローチ
しかし近年では、以下の理由からこの2段階アプローチは推奨されなくなっている。
- F検定は正規性からの逸脱に敏感で、実用上の信頼性に欠ける
- 2回の検定を行うことで全体の第一種の過誤確率が膨らむ
- ウェルチのt検定は等分散でも等分散でなくても適切な結果を与える
現在では、2群の平均を比較する際は最初からウェルチのt検定を使用することが推奨されている。等分散性の事前検定は多くの場合不要である。ただし、分散そのものに興味がある場合(品質管理での精度比較など)は、F検定は依然として有用なツールである。
前提条件と注意点
正規性の仮定
F検定は母集団が正規分布に従うことを仮定している。t検定は正規性からの逸脱にある程度頑健だが、F検定は正規性の仮定に対して敏感である。つまり、データが正規分布から外れると、検定結果の信頼性が低下する。
代替手法
正規性が疑わしい場合や、外れ値が存在する場合は、以下の代替手法が利用できる。
| 手法 | 特徴 |
|---|---|
| レヴェーン検定 | 正規性に対して頑健。各データの絶対偏差を用いる |
| ブラウン-フォーサイス検定 | 中央値からの偏差を使用。外れ値に強い |
| バートレット検定 | 3群以上の等分散性を検定。正規性を仮定 |
練習問題
メーカーA(5個):1200, 1180, 1220, 1190, 1210
メーカーB(6個):1150, 1250, 1100, 1280, 1180, 1230
有意水準5%で、2つのメーカーの製品寿命の分散に差があるか検定せよ。
H_0: \sigma_A^2 = \sigma_B^2 vs H_1: \sigma_A^2 \neq \sigma_B^2
各群の統計量:
\bar{X}_A = 1200.0、s_A^2 = 250.00(n_A = 5)
\bar{X}_B = 1198.3、s_B^2 = 4536.67(n_B = 6)
検定統計量:
自由度 (5, 4) のF分布の上側2.5%点:F_{0.025}(5, 4) = 9.364
F = 18.15 > 9.364 なので帰無仮説を棄却する。
結論:有意水準5%で、2つのメーカーの製品寿命の分散には有意な差がある(メーカーBのばらつきが大きい)。
機器A:118, 122, 120, 119, 121, 120, 118, 123
機器B:115, 125, 118, 128, 112, 130, 116, 126
有意水準5%で、機器Bの測定値のばらつきは機器Aより大きいか検定せよ(片側検定)。
H_0: \sigma_A^2 = \sigma_B^2 vs H_1: \sigma_A^2 < \sigma_B^2(右片側検定)
各機器の統計量:
\bar{X}_A = 120.1、s_A^2 = 3.27
\bar{X}_B = 121.3、s_B^2 = 45.93
検定統計量:
自由度 (7, 7) のF分布の上側5%点:F_{0.05}(7, 7) = 3.787
F = 14.06 > 3.787 なので帰無仮説を棄却する。
結論:有意水準5%で、機器Bの測定値のばらつきは機器Aより有意に大きい。機器Aの方が精度が高い。
新薬(10人):15.2, 14.8, 15.5, 15.0, 14.5, 15.3, 14.9, 15.1, 14.7, 15.4
既存薬(8人):13.5, 16.0, 14.0, 15.8, 13.2, 16.5, 14.5, 15.0
有意水準5%で、2つの薬の効果の分散に差があるか検定せよ。t検定を行う際の等分散の仮定が適切かどうかを判断せよ。
H_0: \sigma_{\text{new}}^2 = \sigma_{\text{old}}^2 vs H_1: \sigma_{\text{new}}^2 \neq \sigma_{\text{old}}^2
各群の統計量:
新薬:\bar{X} = 15.04、s^2 = 0.1027(n = 10)
既存薬:\bar{X} = 14.81、s^2 = 1.4784(n = 8)
検定統計量:
自由度 (7, 9) のF分布の上側2.5%点:F_{0.025}(7, 9) = 4.197
F = 14.40 > 4.197 なので帰無仮説を棄却する。
結論:有意水準5%で、2つの薬の効果の分散には有意な差がある。新薬は効果のばらつきが小さく安定している。t検定を行う場合は、等分散を仮定しないウェルチのt検定を使用すべきである。
まとめ
| 項目 | 内容 |
|---|---|
| 目的 | 2つの母集団の分散が等しいかを検定 |
| 帰無仮説 | H_0: \sigma_A^2 = \sigma_B^2 |
| 検定統計量 | F = \dfrac{s_B^2}{s_A^2}(分散比) |
| 帰無仮説下の分布 | 自由度 (n_B-1, n_A-1) のF分布 |
| 前提条件 | 各群のデータが正規分布に従う |
| 注意点 | 正規性からの逸脱に敏感。代替としてレヴェーン検定がある |
| t検定との関係 | 現在はウェルチのt検定を使用することが推奨されている |
Python実装
SciPyを使ったF検定の実装例を示す。
import numpy as np
from scipy import stats
# === F検定(等分散性の検定)===
print("=== F検定:製造ラインの精度比較 ===")
# データ
line_a = np.array([50.2, 49.8, 50.5, 49.7, 50.3, 50.1, 49.9, 50.4, 50.0, 49.6, 50.2, 50.1])
line_b = np.array([49.5, 51.2, 48.8, 50.8, 49.1, 51.0, 49.3, 50.7, 49.0, 51.5])
n_a, n_b = len(line_a), len(line_b)
# 不偏分散の計算
var_a = np.var(line_a, ddof=1)
var_b = np.var(line_b, ddof=1)
print(f"ラインA: n={n_a}, 平均={np.mean(line_a):.3f}, 分散={var_a:.4f}")
print(f"ラインB: n={n_b}, 平均={np.mean(line_b):.3f}, 分散={var_b:.4f}")
# F統計量(大きい分散を分子に)
F = var_b / var_a
df1, df2 = n_b - 1, n_a - 1
print(f"\nF統計量 = {F:.3f}")
print(f"自由度 = ({df1}, {df2})")
# P値(両側検定)
p_value = 2 * min(stats.f.sf(F, df1, df2), stats.f.cdf(F, df1, df2))
print(f"P値(両側) = {p_value:.6f}")
# 臨界値
alpha = 0.05
F_crit = stats.f.ppf(1 - alpha/2, df1, df2)
print(f"臨界値 F_0.025({df1},{df2}) = {F_crit:.3f}")
# 判定
if F > F_crit:
print("→ 帰無仮説を棄却(分散に有意な差がある)")
else:
print("→ 帰無仮説を棄却しない")
print()
# === レヴェーン検定(正規性に頑健な等分散検定)===
print("=== レヴェーン検定 ===")
stat_levene, p_levene = stats.levene(line_a, line_b)
print(f"統計量 = {stat_levene:.3f}")
print(f"P値 = {p_levene:.6f}")
print()
# === F検定を行う関数 ===
def f_test(x, y, alpha=0.05, alternative='two-sided'):
"""
F検定を実行する関数
Parameters:
-----------
x, y : array-like
2つの標本データ
alpha : float
有意水準
alternative : str
'two-sided'(両側), 'greater'(x の分散が大きい), 'less'(y の分散が大きい)
Returns:
--------
dict : F統計量、P値、判定結果
"""
x, y = np.array(x), np.array(y)
n_x, n_y = len(x), len(y)
var_x, var_y = np.var(x, ddof=1), np.var(y, ddof=1)
# F統計量
F = var_x / var_y
df1, df2 = n_x - 1, n_y - 1
# P値の計算
if alternative == 'two-sided':
p_value = 2 * min(stats.f.sf(F, df1, df2), stats.f.cdf(F, df1, df2))
elif alternative == 'greater':
p_value = stats.f.sf(F, df1, df2)
else: # 'less'
p_value = stats.f.cdf(F, df1, df2)
reject = p_value < alpha
return {
'F_statistic': F,
'df': (df1, df2),
'p_value': p_value,
'reject_H0': reject,
'var_x': var_x,
'var_y': var_y
}
# 使用例
print("=== f_test関数の使用例 ===")
result = f_test(line_a, line_b)
print(f"F統計量 = {result['F_statistic']:.4f}")
print(f"自由度 = {result['df']}")
print(f"P値 = {result['p_value']:.6f}")
print(f"帰無仮説を棄却: {result['reject_H0']}")