AB测试与因果推断入门指南:从实验设计到效果评估

1次阅读
没有评论

共计 1449 个字符,预计需要花费 4 分钟才能阅读完成。

image.webp

电商案例:传统 AB 测试的局限性

假设某电商平台优化了新用户注册流程(实验组 B),希望对比旧流程(对照组 A)的转化率提升。传统 AB 测试直接比较两组转化率差异,但可能忽略以下问题:

AB 测试与因果推断入门指南:从实验设计到效果评估

  • 新流程上线时段恰逢节假日,自然流量激增
  • 实验组用户多来自高消费地区
  • 对照组包含大量历史低活跃用户

这些 混杂变量(Confounders)会导致误判改版效果,需引入因果推断方法控制变量干扰。

随机实验 vs 观察性研究

  1. 随机对照试验(RCT):通过随机分配消除混杂(如传统 AB 测试)
  2. 优点:$E[Y(1)-Y(0)|T=1]=ATE$ 成立
  3. 缺点:实际业务常无法满足完全随机

  4. 观察性研究:基于现有数据推断因果

  5. 挑战:需满足条件独立假设 $Y(1),Y(0) \perp T|X$
  6. 核心问题:如何构建可比的对照组?

倾向得分匹配 (PSM) 技术实现

数学原理

倾向得分定义为:
$$e(X) = P(T=1|X)$$
通过 Logistic 回归估计得分后,匹配实验组与对照组中 $e(X)$ 相近的样本。ATT(平均处理效应)计算公式:
$$ATT = E[Y(1)|T=1] – E[Y(0)|T=1]$$

Python 代码示例

from causalml.match import NearestNeighborMatch
from sklearn.linear_model import LogisticRegression

# 假设 df 包含特征 X、处理标签 T、结果 Y
ps_model = LogisticRegression().fit(df[X_cols], df['T'])
df['ps_score'] = ps_model.predict_proba(df[X_cols])[:,1]

# 最近邻匹配(caliper=0.2 表示最大得分差限制)matcher = NearestNeighborMatch(
    caliper=0.2,  # 经验值:建议取倾向得分标准差的 20%
    replace=False  # 防止对照组样本重复使用
)
matched_df = matcher.match(data=df, treatment_col='T', score_cols=['ps_score'])

# 计算 ATT
att = matched_df[matched_df['T']==1]['Y'].mean() - \
      matched_df[matched_df['T']==0]['Y'].mean()

评估指标验证

  1. 共变量平衡检验:匹配后各 X 的标准化均值差应 <0.1
    from causalml.metrics import smd
    smd_values = smd(matched_df[X_cols], matched_df['T'])
  2. 支持域检查:确保倾向得分分布重叠
    import seaborn as sns
    sns.kdeplot(data=df, x='ps_score', hue='T')

避坑实践指南

  1. 非重叠支持域 处理:
  2. 裁剪(Trimming)极端得分样本
  3. 使用核匹配替代最近邻

  4. 隐藏偏差 应对:

  5. 加入代理变量(如用户设备类型)
  6. 敏感性分析(Rosenbaum 边界检验)

  7. 大数据优化

  8. 分层匹配:先按关键变量分桶再匹配
  9. 近似算法:如 Propensity Score Stratification

进阶思考

当实验组 / 对照组样本量差异较大时,可尝试:
逆向概率加权(IPW):$w_i = T_i/e(X_i) + (1-T_i)/(1-e(X_i))$
熵平衡:直接优化协变量矩条件
双重稳健估计:结合倾向得分与结果模型

通过系统控制混杂因素,我们能更准确地评估 AB 测试中的真实因果效应,避免被表面相关性误导。

正文完
 0
评论(没有评论)