🔍

Mann-Whitney(マン・ホイットニー)検定

に公開

概要

異なる2群の対象に対して中央値に有意な差があるかを検定するノンパラメトリック検定手法[1]
※ t検定と異なり、正規分布や等分散性の仮定が不要

主な用途

パターン 説明 実務ユースケース
群間比較 異なる2群の平均を比較 施策AとBを別ユーザーに実施しCV率比較
属性による比較 属性で分けた2群の差を比較 男女の平均購入額の差を検定
施策 vs 非施策 施策あり・なし群で効果比較 メール配信ありvsなしでCTR比較
ランダム分割テスト 無作為に2群を作り効果を検証 ボタンA/Bでクリック率の差を検定

データ要件

  • 従属変数:順序情報のある数値型/連続変数(例:CV率、購入額、CTR、クリック率、スコアなど)
         ※ 順位付けが可能で、大小関係に意味がある変数
  • 属率変数:独立した2群の比較(例:施策AvsB、男女、メール配信ありvsなし、ボタンAvsBなど)
  • 前提条件:
    • 比較する2群間に独立性がある
    • 正規分布・等分散の仮定は不要

理論

異なる2群(施策AvsB、男女など)の中央値に差がないかを検定
 - 帰無仮説::2群の分布は同じ(中央値に差がない)
 - 対立仮説:2群の分布に差がある(中央値に差がある)、一方が大きい/小さい(片側検定)

【検定の手順】

  1. 2群のデータを結合し、順位付け
    全データに順位(rank)をつける(順位は小さい順に1から付与、同順位があれば平均順位)

  2. 各群の順位和を算出

R_A = \sum_{i=1}^{n_A} r_i

同様に R_B も算出

  1. U統計量を算出
U_A = R_A - \frac{n_A(n_A + 1)}{2}

同様に U_B を算出し、最終的に U = \min(U_A, U_B) を検定統計量とする

  1. U統計量からp値を算出

    • サンプル数が少ない場合 → 正確なp値(exact)を使う
      - すべての可能な符号の組み合わせを列挙し、観測されたU以上(または以下)の確率を計算

    • サンプル数が多い場合 → 正規近似(Z変換)でp値を求める
      - U統計量は中心極限定理[2]により正規分布に近似できる

    → p値が有意水準(例:0.05)未満なら、有意な差があると判断

実装コード例

Python

from scipy.stats import mannwhitneyu

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

# Mann-WhitneyのU検定
u_stat, p_val = mannwhitneyu(group1, group2, method='auto', alternative='two-sided')

print(f"U値 = {u_stat:.3f}, p値 = {p_val:.3f}")

# 評価(有意水準=0.05、両側検定で設定)
if p_val < 0.05:
    print("→ グループAとBに有意な差があります。")
else:
    print("→ 有意な差は認められません。")

補足1:methodパラメータの指定について
method='auto'
どちらか一方のサンプルサイズが8以下で、かつデータに同順位(ties)がない場合は'exact'
それ以外は'asymptotic'を自動選択(デフォルト)
method='exact':正確な p 値を計算
method='asymptotic':正規近似(Z変換)でp値を計算

補足2:alternativeパラメータの指定について
alternative='two-sided':中央値が異なる(デフォルト)
alternative='greater':group1の方が中央値が大きい
alternative='less':group1の方が中央値が小さい

注意点・Tips

  • 非正規分布でもOK:各群が正規分布に従う必要はない(ノンパラメトリック検定)
    → 各群に正規分布がある場合は、t検定の方が検出力が高くなる傾向がある
  • 中央値の差を検定:平均ではなく、順位の大小関係に基づいて中央値の差を評価
  • 具体的な中央値の値は見ていない:観測値の大小を比較して片方の群の方が大きい値を取りやすいかを評価
  • 外れ値に強い:順位ベースの比較のため、極端な値の影響を受けにくく、頑健性が高い
  • 同点の扱いに注意:同点(ties)の場合は順位平均が順位になる
  • method='exact'は同点(ties)があると使えないため、その場合はapproxへ自動で切り替わる

ケーススタディ

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

関連手法

  • 前提条件に関連する手法
    • Shapiro-Wilk検定(正規性の確認) → 正規性がない/微妙な場合に使用
  • 類似手法

参考リンク・文献

脚注
  1. データが特定の分布(例:正規分布)に従っているという仮定を必要としない統計的検定 ↩︎

  2. 中心極限定理:サンプル数が大きくなるにつれて、正規分布に収束する ↩︎

Discussion