使用优惠券的用户下单更多,能否说明优惠券有效?未必。愿意领券的人可能本来就更常购物,直接比较两组会混入用户选择的影响。A/B 测试通过随机分配减少这种偏差;当只能使用历史数据时,因果推断需要明确额外假设,并解释这些假设在哪些情况下不成立。
因果推断研究干预如何改变结果,既包括随机实验,也包括基于观测数据的方法。这篇主要讨论后者。
前置阅读:建议先读 A/B 测试与统计推断、Pandas 数据分析。
为什么「控制变量」不够:混杂因子
核心概念就一个词:混杂(confounding)——存在一个变量同时影响「是否接受处理」和「结果」,它就会制造虚假相关。
原有购买意愿(混杂)
↙ ↘
是否领优惠券 下单概率
判断因果前,先画这个因果图(DAG),问自己:有没有同时指向处理和结果的箭头? 有 → 简单对比两个组的均值是错的。技术上这叫「后门路径」——必须阻断它才能估计真实效应,方法包括:分层、匹配、回归调整、工具变量。
辛普森悖论就是混杂的极端形态:总体看 A 药效果好,按病情分层后每层都是 B 药好——因为轻症大多分到了 A 药组。A/B 测试篇提过它的工业形态,这里正式认识它的因果本质。
黄金标准:随机实验为什么有效
理想的随机分配让处理分配独立于处理前的混杂因素。但有限样本仍可能偶然不平衡,失访、不依从和组间干扰也会影响解释。因此组间差值需要同时报告不确定性,并检查实验是否按设计执行,不能把观察到的每一点差异都直接归因于处理。
但实验有边界:伦理(不能随机害人)、成本(政策没法 A/B)、时间(长期效应等不起)、外溢(用户互相干扰)。A/B 测试篇覆盖实验内的坑,本篇覆盖实验外的世界。
观察性研究的四大武器
① 倾向得分匹配(PSM):寻找可比的对照样本
思路:用逻辑回归预测「每个人接受处理的概率」(倾向得分),然后给每个处理组样本找一个得分相近的对照组样本配对——配出来的两组在观测特征上接近平衡,近似随机化。
# 伪代码骨架:score → 匹配 → 平衡检验 → 比较
from sklearn.linear_model import LogisticRegression
ps_model = LogisticRegression().fit(X_covariates, treatment)
scores = ps_model.predict_proba(X_covariates)[:, 1]
# 最近邻匹配:每个处理样本找得分最近的对照样本
# 关键一步:匹配后检查两组各特征的分布是否平衡(SMD < 0.1)
生死点是平衡性检验:匹配后必须验证两组在所有协变量上分布接近(标准化均差 SMD < 0.1),不平衡说明模型或匹配失败,结论无效。以及 PSM 只能平衡观测到的特征——看不见漏掉的混杂(比如「动机」),结论就可能仍是错的。这是所有观察方法的阿喀琉斯之踵。
② 双重差分(DID):政策评估的国民方法
场景:新政策只在 A 城实施,B 城没有。直接比 A、B 两城?不公平(两城本来就有差异)。DID 比较的是变化的差:
A 城的变化减去 B 城的变化——减掉了「不随时间变的城间差异」和「两城共同经历的时间趋势」,剩下的才是政策效应。
核心假设是平行趋势:如果没有政策,两城的变化趋势本该平行。验证方法:看政策前多个时期两城的趋势是否平行(画出来肉眼可见)。DID 是经济学顶刊里最常见的识别策略,互联网场景用于「某功能只对部分城市/部分版本开放」的评估。
③ 工具变量(IV):找一根「只通处理不通结果」的杠杆
当混杂无法观测(如「能力」影响「教育」也影响「收入」),找一个工具变量 Z:它影响处理、但不直接影响结果、且与混杂无关。经典例子:用「距大学远近」做「是否上大学」的工具来估计教育回报——住得近影响上学概率,但不住在大学旁边本身不会让工资变高。
IV 的难处全在「找工具」:它必须相关(能撬动处理)且排他(不碰结果),排他性无法被数据证明,只能靠领域论证。好工具可遇不可求,这也是 IV 文章常被审稿人集火的原因。
④ 断点回归(RDD):政策阈值边的自然实验
规则驱动的场景:分数线以上的录取、信用分 600 以上给额度。阈值附近的个体几乎同质(599 分和 601 分的人没有本质差别),但一边被处理一边没有——阈值就是一个局部的自然随机化。比较阈值两侧的「跳跃」即可估计效应。
ML × 因果:两个世界的交汇
预测和因果是两个问题:预测问「看到 X 时 Y 是多少」(P(Y|X)),因果问「做了 X 后 Y 会怎样」(P(Y|do(X)))。但两者正在融合:
- Causal ML / 异质性效应:不仅问「平均效应多少」,还问「对谁有效」——uplift model 预估每个个体的处理效应,用于「给谁发券才划算」(只对会被券改变行为的人发)。meta-learner(T/X-learner)、causal forest 是主流工具。
- ML 辅助因果:用 ML 估倾向得分、估 nuisance 参数(双重机器学习 DML,用 ML 处理高维协变量同时保住因果效应的无偏估计)。
- 因果辅助 ML:反事实数据增强、去偏推荐(用户只看到被推荐的,推荐数据天生有偏——因果视角下这是「暴露机制」问题)。
决策框架:遇到问题先问三句
- 能随机实验吗? 能 → A/B 测试,别折腾观察方法。
- 有明确的规则/时间点吗? 有阈值 → RDD;有前后+对照组 → DID。
- 只能观测吗? → 画因果图、找混杂,PSM/DML 处理可观测混杂,并诚实声明不可观测混杂的风险。
所有观察性研究的结论都该带一句:「在 XX 假设成立的前提下」——这是专业与民科的分界线。
踩坑排查
| 现象 | 原因 | 解法 |
|---|---|---|
| PSM 匹配后效应很大但置信区间宽 | 匹配丢了太多样本(共同支撑太小) | 换卡尺、换核匹配,报告匹配保留率 |
| DID 结果显著但政策前趋势就不平行 | 平行趋势假设不满足 | 换对照组;或加时间趋势项;诚实放弃 DID |
| 分层后结论反转 | 辛普森悖论/混杂显现 | 以分层结果为准,检查分组逻辑 |
| 工具变量第一阶段 F 统计量 <10 | 弱工具,估计偏倚可能比 OLS 还大 | 换更强的工具或放弃 IV |
| 「控制了很多变量」结果还是不靠谱 | 不可观测混杂 | 敏感性分析:混杂要多强才能推翻结论 |
| uplift 模型给所有人都发券 | 把响应率当成了提升率 | 优化目标应是「增量效应」非「转化率」 |
练习
- 模拟混杂:生成数据让「年龄」同时影响「是否用药」和「康复率」,先直接比两组(会看到假效应),再按年龄分层比较(效应消失或反转)。
- 用
psmpy或手写实现 PSM 完整流程,重点完成匹配后的平衡性检验表(每个协变量的 SMD)。 - 造一份两城三期数据验证 DID:政策前两城趋势平行、政策后 A 城额外增长,手算 DID 值并与回归法(交互项)对比。
- 思考题:公司想评估「VIP 客服对续费率的因果效应」,但 VIP 是分配给高价值用户的——写出你会用的识别策略和主要风险。
面试常问
Q:相关和因果的区别?什么时候相关蕴含因果? 相关是 P(Y|X),因果是 P(Y|do(X))——后者要求切断 X 的一切其他成因。随机实验下相关即因果(随机化切断了后门路径);观察数据下只有满足「所有混杂都被观测并调整」(可忽略性假设)时才能近似。核心判断工具是因果图和后门准则。
Q:PSM 的局限? 只能平衡可观测协变量;依赖倾向得分模型的正确性;共同支撑外的样本被丢弃(处理组里「注定被处理」的人找不到对照);匹配质量需要平衡性检验兜底。结论强度排序:随机实验 > RDD/DID(有可信自然实验)> PSM/回归调整。
Q:DID 的平行趋势假设怎么验证? 画政策前多期两组结果趋势图,肉眼检查平行;正式做法做「安慰剂检验」——假装政策在政策前某时点发生,DID 应该不显著。若政策前就不平行,可以用三重差分(DDD)或合成控制法(给对照组加权拼一个「合成 A 城」)补救。
Q:uplift model 和普通响应模型区别? 响应模型预测 P(购买|发券),会把「本来就买的人」也排前面——券发给他们是浪费。uplift 预测的是 τ(x) = P(购买|发券,x) − P(购买|不发券,x),即「因为券而买」的增量概率。四类人:必买(别发)、因券而买(发!)、不为所动(别发)、反感(发了反而不买)。营销预算该全部砸在第二类。
Q:为什么 ML 不能自动解决因果? ML 优化的是预测损失,而因果需要的是「反事实」——同一个人既处理又不处理的结果,数据里永远缺一半(因果推断的基本问题)。预测模型可以在观测分布内完美插值,但对「改变分布后」的问题无能为力。因果需要结构假设(图、实验、识别策略),这些假设来自领域知识,不在数据里。
相关阅读
- A/B 测试与统计推断——能做实验时的黄金标准
- 模型可解释性:SHAP——「解释」与「因果」的边界
- 特征工程实战——混杂控制在特征层的体现
- ML 数学基础——条件概率与期望的基础
- 研究方法:AI 论文与实验——因果识别在研究设计中的位置
因果推断教给数据人的终极一课:数据只记录发生了什么,回答「如果……会怎样」需要的是假设、设计和诚实。每一个「X 导致 Y」的结论,都值得问一句:你排除了什么?
💬 评论
这套方案在哪一步卡住了?也欢迎补充你的实现方式或踩坑经验。