共计 1449 个字符,预计需要花费 4 分钟才能阅读完成。
电商案例:传统 AB 测试的局限性
假设某电商平台优化了新用户注册流程(实验组 B),希望对比旧流程(对照组 A)的转化率提升。传统 AB 测试直接比较两组转化率差异,但可能忽略以下问题:

- 新流程上线时段恰逢节假日,自然流量激增
- 实验组用户多来自高消费地区
- 对照组包含大量历史低活跃用户
这些 混杂变量(Confounders)会导致误判改版效果,需引入因果推断方法控制变量干扰。
随机实验 vs 观察性研究
- 随机对照试验(RCT):通过随机分配消除混杂(如传统 AB 测试)
- 优点:$E[Y(1)-Y(0)|T=1]=ATE$ 成立
-
缺点:实际业务常无法满足完全随机
-
观察性研究:基于现有数据推断因果
- 挑战:需满足条件独立假设 $Y(1),Y(0) \perp T|X$
- 核心问题:如何构建可比的对照组?
倾向得分匹配 (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()
评估指标验证
- 共变量平衡检验:匹配后各 X 的标准化均值差应 <0.1
from causalml.metrics import smd smd_values = smd(matched_df[X_cols], matched_df['T']) - 支持域检查:确保倾向得分分布重叠
import seaborn as sns sns.kdeplot(data=df, x='ps_score', hue='T')
避坑实践指南
- 非重叠支持域 处理:
- 裁剪(Trimming)极端得分样本
-
使用核匹配替代最近邻
-
隐藏偏差 应对:
- 加入代理变量(如用户设备类型)
-
敏感性分析(Rosenbaum 边界检验)
-
大数据优化:
- 分层匹配:先按关键变量分桶再匹配
- 近似算法:如 Propensity Score Stratification
进阶思考
当实验组 / 对照组样本量差异较大时,可尝试:
– 逆向概率加权(IPW):$w_i = T_i/e(X_i) + (1-T_i)/(1-e(X_i))$
– 熵平衡:直接优化协变量矩条件
– 双重稳健估计:结合倾向得分与结果模型
通过系统控制混杂因素,我们能更准确地评估 AB 测试中的真实因果效应,避免被表面相关性误导。
正文完
