多重比較検定

Pythonで学ぶA/Bテスト

Moe Lotfy, PhD

Principal Data Science Manager

多重比較問題の概要

  • 単一比較:
    • コントロール (A) 対 施策 (B)
    • 単一指標
    • サブカテゴリなし

 

2つのバリアントの平均売上の棒グラフ。

  • 多重比較:
    • 複数バリアント(A/B/n テスト)
    • 複数指標
    • 詳細なカテゴリ

 

複数のバリアントと指標の2つの棒グラフ。

Pythonで学ぶA/Bテスト

Family-wise error rate(FWER)

  • P(第I種過誤) = $\alpha$ = 0.05
  • P(第I種過誤しない) = 1 - $\alpha$
  • m 回の検定で P(第I種過誤しない) = (1 - $\alpha$)$^m$
  • m 回の検定で P(少なくとも1回第I種過誤) = 1 - (1 - $\alpha$)$^m$ = FWER

Family-wise Error Rate (FWER): 複数の仮説検定で、1回以上の第I種過誤を起こす確率。

  • 単一検定では、FWER = 1 - (1 - $\alpha$)^1 = $\alpha$ = 0.05
  • では、複数の検定を行うとどうなるでしょうか?
Pythonで学ぶA/Bテスト

Family-wise error rate

import matplotlib.pyplot as plt 
import numpy as np 
alpha = 0.05 
x = np.linspace(0, 20, 21) 
y = 1-(1-alpha)**x 
plt.plot(x,y, marker='o') 
plt.title('FWER vs Number of Tests') 
plt.xlabel('Number of Tests') 
plt.ylabel('FWER') 
plt.show()
  • FWER = 1 - (1 - $\alpha$)^10
  • 10 回の検定の FWER = 40%

検定数に対する FWER の線グラフ。検定数が増えると FWER は上昇。

Pythonで学ぶA/Bテスト

補正法

  • 最も単純で一般的: ボンフェローニ補正
  • 調整後の $\alpha$* は、個々の検定の $\alpha$ を検定数 m で割る

ボンフェローニ補正式。アルファを比較数 m で割る

  • それより緩やかなシダック補正
  • 望ましい $\alpha$ に FWER を設定し、$\alpha_s$ を解く

シダック補正式

Pythonで学ぶA/Bテスト

ボンフェローニ補正の例

  • 補正なしでは、3つすべてが有意
    • ただし、第I種過誤の確率は 14% に膨張
  • ボンフェローニ補正では、A 対 D は有意ではなくなるが、FWER は 0.049 に制御

4つのバリアントの平均売上と p 値の棒グラフ。

Pythonで学ぶA/Bテスト

statsmodels の multipletests メソッド

import statsmodels.stats.multitest as smt 
pvals = [0.023,0.0005,0.00004]
corrected = smt.multipletests(pvals, alpha=0.05, method='bonferroni')
print("Significant Test:", corrected[0])
print("Corrected P-values:", corrected[1])
print("Bonferroni Corrected alpha: {:.4f}".format(corrected[3]))
Significant Test: [False  True  True]
Corrected P-values: [0.069   0.0015  0.00012]
Bonferroni Corrected alpha: 0.0167
Pythonで学ぶA/Bテスト

Passons à la pratique !

Pythonで学ぶA/Bテスト

Preparing Video For Download...