🔍

WelchのANOVA|独立3群以上の差検定

に公開

概要

3群以上のグループに対して平均値に有意な差があるかを検定する手法(等分散性不要)

主な用途

パターン 説明 実務ユースケース
群間比較(3群以上) 異なる3群以上の平均を比較 地域(東京・大阪・福岡)や施策別(A,B,C)で売上額に差があるかを検証
属性による比較 属性で分けた3群以上の差を比較 学歴別に平均収入の差を検定
ランダム分割テスト 無作為に3群以上を作り効果を検証 ボタンA/B/Cでクリック率の差を検定

データ要件

  • 従属変数:数値型(例:売上額、収入、クリック率など)
  • 独立変数:3群以上の独立したカテゴリグループ(例:都道府県、施策、属性など)
  • 前提条件:
    • 各群が独立している(同一人物が複数群にいない)
    • 各群の従属変数が正規分布に従う
    • 等分散性は不要(仮定しない)

理論

WelchのANOVAでは、各群の分散とサイズが異なることを考慮しつつ、
群間の平均値の違いが偶然かどうかを検定
 - 帰無仮説:すべての群の母平均は等しい(=差がない)
 - 対立仮説:いずれかの群に平均の差がある(=差がある) ※ 片側検定は存在しない

【検定の手順】

  1. 各群の平均・分散・サンプルサイズを取得
  2. サンプルサイズに基づき、重み係数を算出
  3. 重みを使用して調整後平均を計算
  4. 重みと平均、調整後平均を使用して平方平均を算出
  5. ラムダ項を計算
  6. 平方和とラムダ項、自由度からF統計量を計算
  7. 自由度に基づきF分布からp値を計算
     → p値が有意水準(例:0.05)未満なら帰無仮説は棄却=平均値に有意な差があると判断

計算式は複雑なため、通常は pingouin.welch_anova()statsmodels を使用

実装コード例

import pingouin as pg
import pandas as pd

# WelchのANOVA('value'を'group'で分けて比較)
anova_result = pg.welch_anova(dv='value', between='group', data=df)

# 結果表示
f_val = anova_result['F'][0]
p_val = anova_result['p-unc'][0]

print(f"F値 = {f_val:.3f}, p値 = {p_val:.5f}")

if p_val < 0.05:
    print("→ 少なくとも1つのグループに有意な平均差があります(WelchのANOVA)")
else:
    print("→ 有意な差は確認できません(平均差なし)")

注意点・Tips

  • 等分散性を仮定しないため、より現実に即した検定が可能
  • 正規分布の前提は残るため、分布の歪みに注意
  • 「どの群が違うか」はANOVA単体ではわからない
    → 有意差が出た場合は事後検定で確認する必要あり
      必要に応じてBonferroni補正などを考慮

ケーススタディ

🔗ComingSoon

関連手法

参考リンク・文献

Discussion