🔍

F検定|等分散性の検定

に公開

概要

2つの独立したグループ間で分散の等質性等分散性)を検定する方法。
F検定は、各群の標本分散の比をとり、そのF値が帰無仮説(等分散)と矛盾するかを検証する。

主な用途

パターン 説明 実務ユースケース
等分散性の確認 2群間の分散が等しいかを検定 施策別グループでの売上やCV率比較におけるグループ間の等分散性確認 (前提条件確認)
グループ間のばらつき比較 グループ間で数値のばらつきに差があるかどうかを検定 東京と神奈川での支出を比較し、ばらつきに差があるかを検証

データ要件

  • 従属変数:数値型/連続変数(例:売上、CV率、支出)
  • 独立変数:独立した2群(例:施策AvsB、東京vs神奈川、メール配信ありvsなし など)
  • 前提条件:各群が正規分布に従うこと

理論

F検定は、2つの群の分散の比をとり、理論的なF分布と比較して「分散が等しいか」を検定
 - 帰無仮説:2つの群の分散は等しい(=等分散)
 - 対立仮説:2つの群の分散は異なる(両側検定)、片方の分散が他方より大きいか(片側検定)

片側検定としても使用できるが大きさの方向に注意が必要なため、
「分散が等しいか」の用途では両側検定が安全

【検定の手順】

  1. 各グループの不偏分散s_1^2,s_2^2を計算

  2. 統計量F(分散比)を算出 ※ 大きい方の値を分子にする

    F = \frac{s_1^2}{s_2^2}
  3. 自由度 (n_1 - 1, n_2 - 1) の F分布に基づいてp値を算出
     → p値が有意水準(例:0.05)未満なら、分散に差があると判断(帰無仮説を棄却)

F分布表から値を読み取る場合は「設定した有意水準÷2」の位置(例:0.025,0.075)を読み取る点に注意
F分布表から厳密なp値は算出できないためPythonを使った計算が必要

実装コード例

Python

from scipy.stats import f

# 2群のデータ 
group_a = df[df['group'] == 'A']['value']
group_b = df[df['group'] == 'B']['value']

# 標本分散の計算
var_a = group_a.var(ddof=1)
var_b = group_b.var(ddof=1)

# 分散比(大きい方 / 小さい方)
f_stat = max(var_a, var_b) / min(var_a, var_b)

# 自由度
df1 = len(group_a) - 1
df2 = len(group_b) - 1

# 両側検定のp値計算(両端の確率を合計する)
p_val = 2 * min(
    f.cdf(f_stat, df1, df2),
    1 - f.cdf(f_stat, df1, df2)
)

print(f"F検定統計量={f_stat:.3f}, p値={p_val:.5f}")

if p_val < 0.05:
    print("→ 分散に有意な差があります(等分散ではありません)")
else:
    print("→ 分散に有意な差はありません(等分散とみなせます)")

補足1:var()のddofパラメータの指定について
ddof=0:母分散(デフォルト)
ddof=1:不偏分散

補足2:両側検定のp値計算ついて
f.cdf(f_stat, df1, df2):F分布の累積分布関数:F値以下となる確率(左側)
1 - f.cdf(f_stat, df1, df2):F分布の累積分布関数:F値以上となる確率(右側)
2 * min():両側p値
例:f.cdf(f_stat, df1, df2)=0.05としたとき、
  1 - f.cdf(f_stat, df1, df2)=0.95,min(0.05,0.95)=0.05p値=2*0.05=0.1となる

注意点・Tips

  • 等分散性が必要な検定の前提確認に用いられる(例:Studentのt検定)
  • 正規分布が前提条件:外れ値に弱い、正規性がない場合はLevene検定などを使う方が安全
  • 2群間のみ対応:3群以上の分散比較には使用できない(代替手法ANOVAまたはLevene検定へ)
  • 等分散性検定の用途では両側検定が使われる
  • 等分散が成り立たない場合:t検定であればWelchのt検定など代替手法を使用
  • グループ数が3つ以上でも使用可能:2群だけでなく、3群以上の比較にも対応
  • スコアに対しても検定可能だが、以下の場合は使えなかったり注意が必要
    • スコアが非常に粗い(例:1〜3点しかない)
    • 数値的間隔に意味がないスコア(例:好き=3、普通=2、嫌い=1)
    • スコアがカテゴリ扱い(例:S/A/B/C/D)

関連手法

参考リンク・文献

Discussion