CodeWalk

AB测试(实验)的统计原理与大数据评估方法

作者:屠龙少年 · 2026-05-30 12:55

请解释AB测试的核心统计原理(假设检验/置信区间/p值/最小样本量计算),以及在大数据场景下如何用Spark SQL计算实验结论。给出一个完整的实验评估SQL:计算实验组vs对照组的转化率差异、p值和显著性判断,并说明辛普森悖论(Simpson's Paradox)在AB测试中的影响。

回答

屠龙少年

AB测试统计原理与SQL实现:

1. 核心统计概念

  • 原假设H0:实验组=对照组(无差异)
  • 备择假设H1:实验组≠对照组(有差异)
  • p值:在原假设成立下观察到当前结果的概率
  • 显著性水平α:通常取0.05(p<0.05拒绝H0)
  • 置信区间:差异的95%置信区间

2. 最小样本量计算

n = (Z_α/2 + Z_β)² × (p1×(1-p1) + p2×(1-p2)) / (p1-p2)²
  • p1=对照组基准转化率,p2=实验组预期转化率
  • Z_α/2=1.96(α=0.05),Z_β=0.84(power=80%)

3. Spark SQL实验评估

SELECT
  experiment_id,
  variant,
  COUNT(*) AS total_users,
  SUM(CASE WHEN converted = 1 THEN 1 ELSE 0 END) AS converted_users,
  ROUND(AVG(CASE WHEN converted = 1 THEN 1.0 ELSE 0 END), 4) AS conversion_rate,
  -- Z-score计算
  ROUND((AVG(CASE WHEN variant='treatment' THEN 1.0 ELSE 0 END) -
         AVG(CASE WHEN variant='control' THEN 1.0 ELSE 0 END)) / 
    SQRT(
      AVG(CASE WHEN variant='treatment' THEN 1.0 ELSE 0 END) *
      (1 - AVG(CASE WHEN variant='treatment' THEN 1.0 ELSE 0 END)) /
      SUM(CASE WHEN variant='treatment' THEN 1 ELSE 0 END) +
      AVG(CASE WHEN variant='control' THEN 1.0 ELSE 0 END) *
      (1 - AVG(CASE WHEN variant='control' THEN 1.0 ELSE 0 END)) /
      SUM(CASE WHEN variant='control' THEN 1 ELSE 0 END)
    ), 4) AS z_score
FROM experiment_results
WHERE experiment_id = 'exp_001'
GROUP BY experiment_id, variant;

4. 辛普森悖论

  • 分组比较时发现趋势,但合并后趋势消失甚至反转
  • 示例:实验组整体转化率5% vs 对照组6%(对照组胜),但按渠道分层后实验组每层都优于对照组
  • 解决:分层随机化+分层分析(Mantel-Haenszel方法)

5. 大数据AB测试注意事项

  • 互斥与正交:同时运行的实验不能互相干扰
  • SRM(Sample Ratio Mismatch):检查实验组用户数是否符合预期比例
  • AA测试:无差异实验验证系统无偏
  • 多重比较修正:多个指标同时比较需Bonferroni修正