การทดสอบเปรียบเทียบหลายกลุ่ม

A/B Testing ด้วย Python

Moe Lotfy, PhD

Principal Data Science Manager

บทนำสู่ปัญหาการเปรียบเทียบหลายกลุ่ม

  • การเปรียบเทียบเดี่ยว:
    • กลุ่มควบคุม (A) กับกลุ่มทดลอง (B)
    • เมตริกเดียว
    • ไม่มีหมวดหมู่ย่อย

 

แผนภูมิแท่งแสดงยอดขายเฉลี่ยของสองตัวแปร

  • การเปรียบเทียบหลายกลุ่ม:
    • หลายตัวแปร (การทดสอบ A/B/n)
    • หลายเมตริก
    • หมวดหมู่ที่ละเอียดขึ้น

 

แผนภูมิแท่งสองชุดแสดงหลายตัวแปรและหลายเมตริก

A/B Testing ด้วย Python

Family-wise error rate

  • P(เกิด Type I error) = $\alpha$ = 0.05
  • P(ไม่เกิด Type I error) = 1 - $\alpha$
  • P(ไม่เกิด Type I error ใน m การทดสอบ) = (1 - $\alpha$)$^m$
  • P(เกิด Type I error อย่างน้อยหนึ่งครั้งใน m การทดสอบ) = 1 - (1 - $\alpha$)$^m$ = FWER

Family-wise Error Rate (FWER): ความน่าจะเป็นที่จะเกิด Type I error อย่างน้อยหนึ่งครั้งเมื่อทำการทดสอบสมมติฐานหลายครั้ง

  • สำหรับการทดสอบครั้งเดียว FWER = 1 - (1 - $\alpha$)^1 = $\alpha$ = 0.05
  • แล้วถ้าทดสอบมากกว่าหนึ่งครั้งจะเกิดอะไรขึ้น?
A/B Testing ด้วย Python

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
  • FWER สำหรับ 10 การทดสอบ = 40%

กราฟเส้นแสดง FWER ตามจำนวนการทดสอบ โดย FWER เพิ่มขึ้นเมื่อจำนวนการทดสอบมากขึ้น

A/B Testing ด้วย Python

วิธีการแก้ไข

  • วิธีที่ง่ายและนิยมที่สุดคือ Bonferroni Correction
  • กำหนด $\alpha$* ที่ปรับแล้วเท่ากับ $\alpha$ ของการทดสอบแต่ละครั้งหารด้วยจำนวนการทดสอบ m

สมการ Bonferroni correction แสดง alpha หารด้วยจำนวนการเปรียบเทียบ 'm'

  • Sidak correction ที่เข้มงวดน้อยกว่า
  • กำหนด FWER ให้เท่ากับ $\alpha$ ที่ต้องการ แล้วแก้หา $\alpha_s$

สมการ Sidak correction

A/B Testing ด้วย Python

ตัวอย่าง Bonferroni correction

  • หากไม่มีการแก้ไข การทดสอบทั้งสามถือว่ามีนัยสำคัญ
    • แต่ความน่าจะเป็นที่จะเกิด Type I error เพิ่มสูงขึ้นถึง 14%
  • เมื่อใช้ Bonferroni Correction A กับ D ไม่มีนัยสำคัญอีกต่อไป และ FWER ถูกควบคุมที่ 0.049

แผนภูมิแท่งแสดงยอดขายเฉลี่ยของ 4 ตัวแปรพร้อม p-value

A/B Testing ด้วย Python

เมธอด multipletests ของ statsmodels

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
A/B Testing ด้วย Python

มาฝึกกันเถอะ!

A/B Testing ด้วย Python

Preparing Video For Download...