Welch の t 検定

Welch の t 検定は、2つの独立した母集団からの標本に基づいて、それらの母平均が等しいかどうかを検定するために使用される。 特に、Welch の検定は2つの母集団が 異なる分散 を持つ場合(分散の等質性が仮定できない場合)に有用。

従来の 独立二標本 t 検定 では2つの母集団が 等しい分散 を持つという仮定が必要

■ どんな場面で使えるか

A/B テストを例にすると、以下のような場面が 異なる分散 が起こりうる状況といえる:

例1. 異なるトラフィックボリューム

  • A/B テストで、異なる広告戦略やマーケティング施策を用いた場合、訪問者の数 がグループ間で大きく異なることがある。
  • 大きなトラフィックの差は、データの分散に影響を与える可能性があり、この場合、Welch の t 検定が適切となる。

例2. 非均一なユーザー行動

  • 特定の ユーザーセグメント(例えば、新規ユーザー対リピーター)に対する施策をテストする場合、これらのグループが異なる行動パターンや反応を示す可能性がある。
  • グループ間で行動の Variance が異なる場合、Welch の検定を使用することで、これらの差異をより正確に評価可能となる。

例3. 異なるデバイスタイプ

  • 例えば「PC ユーザー」と「スマホユーザー」の間で A/B テストを行う場合、これらのデバイスタイプは 使用状況やユーザーの行動 が大きく異なる可能性がある。
  • デバイスタイプによる行動の違いが分散に影響を与える場合、Welch の t 検定が適切。

■ 利点と注意点

利点

  • 分散の不等質性に対する堅牢性:
    上記の通り、異なる分散を持つグループ間でも有効。通常の t 検定(独立二標本 t 検定)では、二つのグループが等分散であるという仮定に基づいているが、この仮定が破れると、エラーリスクが高まる。
  • 一般的な適用性:
    分散が等しい場合でも、Welch の t 検定を用いることによるクリティカルな統計的デメリットは以下の注意点を除き特にない。

注意点

  • 自由度の減少:
    Welch の検定では、通常の t 検定と比較して 自由度が低く なることがある。
    特にサンプルサイズが小さい場合には、p-value が大きくなりやすく、帰無仮説を棄却する力(検定力)が若干低下する可能性がある。
  • 解釈の変化:
    自由度の調整により、検定統計量の解釈が少し異なる場合がある。(通常の t 検定と比較して、Welch 検定の方が 厳しい条件 で帰無仮説を棄却する)

■ Python による実行サンプル

# ライブラリ
import pandas as pd
import numpy as np

◆ データの準備

まずは、サンプルデータを Pandas DataFrame として定義する。

# サンプルデータの生成
np.random.seed(0)
data = {
    'group': ['TG'] * 50 + ['CG'] * 50,
    'cv_per_visitor': np.concatenate([np.random.normal(2.5, 0.5, 50), np.random.normal(2.0, 1.0, 50)])
}
df = pd.DataFrame(data)

出力イメージは以下

df
 groupcv_per_visitor
0TG3.382026
1TG2.700079
98CG2.126912
99CG2.401989
  • group にて、TG(Treatment Group)と CG(Control Group)には、ランダムに1:1の割合でユーザーが割り当てられていると仮定。
  • cv_per_visitor は訪問者毎の何かしらの CV 指標

◆ Welch の t 検定の実行

Welch の t 検定を行い、二つのグループ間での平均の差を検定する。
ここでは scipy.statsttest_ind 関数を使用し、equal_var = False オプションを設定して分散の不等性を仮定している。

通常のt検定(独立二標本 t 検定)では、equal_var = True ← 両群の分散が等しいことを仮定する

from scipy.stats import ttest_ind

# TG と CG のデータを分ける
tg_data = df[df['group'] == 'TG']['cv_per_visitor']
cg_data = df[df['group'] == 'CG']['cv_per_visitor']

# Welch の t 検定を実行
t_stat, p_value = ttest_ind(tg_data, cg_data, equal_var = False)

◆ 出力結果

# 結果の表示
print(f"t統計量: {t_stat}, p値: {p_value}")

t統計量: 4.003685078305505, p値: 0.00013393435904555088

結果より、TG と CG の間で平均 CV 数に統計的に有意な差があることが示された。
(帰無仮説の棄却)