🔍

Frigner-Killeen(フリグナー・キリーン)検定|等分散性の検定

に公開

概要

2つ以上の独立したグループ間で分散の等質性等分散性)を検定するノンパラメトリック検定方法

主な用途

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

データ要件

  • 従属変数:数値型/連続変数(例:売上、CV率、支出)
  • 独立変数:独立した2群以上のグループ
         (例:施策AvsB、都道府県、メール配信ありvsなし など)
  • 前提条件:特になし ※正規分布でなくてもOK

理論

Fligner-Killeen検定は、各グループの中央値からの偏差をランクに変換して処理することで、
バラツキ(分散)の違いを順位情報に基づいて検定
 - 帰無仮説:すべてのグループで分散は等しい(=等分散)
 - 対立仮説:いずれかのグループで分散が異なる(両側検定) ※片側検定は存在しない

【検定の手順】

  1. 各グループで中央値からの絶対偏差を計算しランク化

  2. ランク情報に基づいて検定統計量を算出(近似的にカイ二乗分布に従う) ※式は省略

  3. 自由度 (k-1) のカイ二乗分布に基づいてp値を算出
     ※ k:分散を比較するグループの数(群数)
     → p値が有意水準(例:0.05)未満なら、少なくとも1つの群の分散が異なると判断
      (帰無仮説を棄却)

統計量とp値の計算は実際にはscipy.stats.fligner()などのライブラリで内部的に計算される

実装コード例

Python

from scipy.stats import fligner

# グループごとの値を抽出
group_a = df[df['group'] == 'A']['value']
group_b = df[df['group'] == 'B']['value']
group_c = df[df['group'] == 'C']['value'] 

# Fligner-Killeen検定
stat, p_val = fligner(group_a, group_b, group_c)
print(f"Fligner-Killeen検定統計量={stat:.3f}, p値={p_val:.5f}")

# 評価(有意水準=0.05、両側検定で設定)
if p_val < 0.05:
    print("→ 分散に有意な差があります(等分散ではありません)")
else:
    print("→ 分散に有意な差はありません(等分散とみなせます)")

注意点・Tips

  • 正規性を仮定せず、外れ値にも強い等分散性検定
    • BartlettやF検定が使いづらい場合に有効
    • LeveneやBrown-Forsythe検定よりも外れ値や分布の歪みに強く頑健性が高い
  • グループ数が2群以上で使用可能:2群だけでなく、3群以上の分散比較にも対応
  • 等分散が成り立たない場合
    t検定であればWelchのt検定、ANOVAであればWelchのANOVAなど代替手法を使用
  • スコアに対しても検定可能だが、以下の場合は使えなかったり注意が必要
    • スコアが非常に粗い(例:1〜3点しかない)
    • 数値的間隔に意味がないスコア(例:好き=3、普通=2、嫌い=1)
    • スコアがカテゴリ扱い(例:S/A/B/C/D)

ケーススタディ

🔗キャンペーン施策の効果測定

関連手法

参考リンク・文献

Discussion