ノンパラメトリック検定

Pythonで学ぶA/Bテスト

Moe Lotfy, PhD

Principal Data Science Manager

パラメトリック検定の前提

  1. 無作為抽出
    • 集団からデータを無作為抽出する。
    • 収集/サンプリング方法を確認。
  2. 独立性
    • 各観測は互いに独立。
    • 依存を無視すると誤差率が増える。
  3. 正規性
    • データは正規分布に従う。
    • サンプルサイズは十分に大きい。
      • 2標本 t 検定: 各群 n >= 30。
      • 2標本比率検定: 各群で成功 >=10、失敗 >=10。
Pythonで学ぶA/Bテスト

マン・ホイットニーのU検定

  • 統計的有意差のノンパラメトリック検定
  • 2つの独立標本が同じ母集団分布かを判定
  • 順位和検定
  • 非対応データ向け
Pythonで学ぶA/Bテスト

Python でのマン・ホイットニーU検定

# バリアント別のページ滞在時間の平均と件数を算出
print(checkout.groupby('checkout_page')['time_on_page'].agg({'mean', 'count'}))
                    mean  count
checkout_page                  
A              44.668527   3000
B              42.723772   3000
C              42.223772   3000
# 再現用の乱数シード設定 
np.random.seed(40)
# 各バリアントから25件を無作為抽出
ToP_samp_A = checkout[checkout['checkout_page'] == 'A'].sample(25)['time_on_page']
ToP_samp_B = checkout[checkout['checkout_page'] == 'B'].sample(25)['time_on_page']
Pythonで学ぶA/Bテスト

Python でのマン・ホイットニーU検定

# マン・ホイットニーU検定を実行
mwu_test = pingouin.mwu(x=ToP_samp_A,
                        y=ToP_samp_B,
                        alternative='two-sided')
# 結果を出力
print(mwu_test)
     U-val alternative     p-val     RBC    CLES
MWU  441.0   two-sided  0.013007 -0.4112  0.7056
Pythonで学ぶA/Bテスト

独立性のカイ二乗検定

  • パラメトリック前提に依存しない
  • 2つ以上のカテゴリ変数の独立性を検定
    • 帰無仮説: 変数は独立。
    • 対立仮説: 変数は独立でない。
Pythonで学ぶA/Bテスト

Python でのカイ二乗検定

ホームページのサインアップ率 A/B テスト

帰無仮説: ランディングページ C と D のサインアップ率に有意差はない

対立仮説: それらの間に有意差がある

# グループ C と D のユーザー数を計算
n_C = homepage[homepage['landing_page'] == 'C']['user_id'].nunique()
n_D = homepage[homepage['landing_page'] == 'D']['user_id'].nunique()
# 各グループの一意のサインアップ数を算出
signup_C = homepage[homepage['landing_page'] == 'C'].groupby('user_id')['signup'].max().sum()
no_signup_C = n_C - signup_C
signup_D = homepage[homepage['landing_page'] == 'D'].groupby('user_id')['signup'].max().sum()
no_signup_D = n_D - signup_D
Pythonで学ぶA/Bテスト

Python でのカイ二乗検定

# サインアップ表を作成
table = [[signup_C, no_signup_C], [signup_D, no_signup_D]]
print('Group C signup rate:',round(signup_C/n_C,3))
print('Group D signup rate:',round(signup_D/n_D,3))

# p 値を計算
print('p-value=',stats.chi2_contingency(table,correction=False)[1])
Group C signup rate: 0.064
Group D signup rate: 0.048
p-value= 0.009165
Pythonで学ぶA/Bテスト

¡Vamos a practicar!

Pythonで学ぶA/Bテスト

Preparing Video For Download...