做数据分析这行久了,总会撞上一种尴尬:业务方拿着一张趋势图过来说“你看,功能上线后活跃度涨了,这肯定是功能的功劳”。你心里知道这话经不起推敲——也许不推这个功能,活跃度也会涨;也许只是恰好赶上旺季;也许那批高活跃用户根本不是功能吸引来的。但你要是只回一句“相关不等于因果”,又显得像个只会背定义的复读机。因果推断(causal inference)就是专门回答这类问题的工具箱:在没有做A/B测试、或者实验根本做不了的条件下,如何从观测数据里把“干预的净效果”拆出来。
这篇笔记是某博士因果推断学习笔记的上篇,核心是梳理因果推断的框架性知识和主力方法:潜在结果与结构因果模型两条底层路线,以及随机实验、匹配、双重差分、断点回归、工具变量、合成控制这几种最常用的识别策略,最后附上一份文献速览地图。适合刚开始啃因果推断的数据分析师、量化研究员和社科方向的同学参考,目标是用一篇笔记的时间建立起整棵知识树的主干,以后再往里填细节时才不容易迷路。
1. 为什么需要因果推断:相关不等于因果的实战场景
1.1 “转化率涨了,凭什么不是活动的功劳”——归因困境
假设运营部门在3月做了一次大促,当月下单转化率比2月高了0.8个百分点。能不能直接说“大促带来了0.8个点的提升”?不能。至少有三股力量混在这0.8个点里:一是季节效应,3月本身就是行业惯例的春季回暖期;二是用户结构变化,运营部门在活动前加强了新客投放,新客转化率天然和存量用户不一样;三是竞争环境变化,竞品同期在收缩投放,流量被动回流。这些因素和“是否做了活动”混杂在一起,会同时影响你的处理变量和结果变量,统计上把它们称为混淆变量。由混淆导致的系统性偏差,是观察性因果推断要对付的头号敌人。
我们真正想回答的问题是“假如没有这个大促,3月的转化率会是多少”——这在观测世界里不存在,只能靠推演。你永远只能看到“做了活动”或“没做活动”中的一种情况。因果推断的整套语言,就是围绕这种“看不见的另一条时间线”建立起来的。
1.2 从相关到因果的思维转换:改问“What if”
相关性问的是:X和Y是不是一起波动?因果性问的是:如果我强行把X改一改,Y会跟着变多少?举个经典例子:冰淇淋销量和溺水人数高度相关,但吃冰淇淋并不会导致溺水,共同原因是夏天。夏天的到来同时推高了冰淇淋销量和下水游泳的人数,如果只看相关,你会得出一个荒谬的政策建议:禁止卖冰淇淋来减少溺水。
因果推断要求把问题改写成干预形式:“给所有人发放补贴,会让他们多花多少钱?”“把广告预算从渠道A转移到渠道B,能带来多少额外转化?”“让患者提前一个月开始服药,存活率会不会提高?”一旦问题变成“What if”,你就不是在描述世界,而是在模拟干预后的世界。这个思维的转换,是数据分析师从“做报表”走向“辅助决策”的分水岭。
1.3 因果推断能做什么、不能做什么
因果推断能做的,从窄到宽大致是:估计平均处理效应(某项干预对总体人群的平均影响)、估计异质性处理效应(哪些人受益最多、哪些人反而受损)、做敏感性分析(结论在多大程度上依赖未观测到的假设)、设计观察性研究来模拟随机实验。它也能帮助你在一开始就把问题定义清楚:到底该控制哪些变量、不该控制哪些变量,哪些数据是多余的,哪些数据缺失了会要命。
但它不能做的同样重要。因果推断不可能从观测数据里凭空保证结论正确——所有方法都建立在一组可检验或不可检验的假设之上。假设合理,结论有说服力;假设被推翻,再花哨的模型都只是精致的垃圾。这不是悲观,而是提醒你:因果推断的功夫,一半在模型里,另一半在研究设计和假设论证里。
2. 因果推断的两大底层语言:潜在结果与结构因果模型
2.1 潜在结果框架:一个人的两种人生
潜在结果框架(Potential Outcomes Framework)用两个符号定义因果:(Y(1)) 表示个体接受处理后会出现的结果,(Y(0)) 表示同一个体未接受处理时会有的结果。个体因果效应就是 (Y(1) - Y(0))。但这里有个根本困难:任何一个人在同一时刻只能处于一种状态,你看到吃了药的张三,就永远看不到没吃药的张三。这就是著名的反事实问题。
好在大多数决策并不需要知道每一个具体个体的效应,只需要知道群体平均的效应ATE,即 (E[Y(1) - Y(0)])。随机实验之所以是黄金标准,是因为随机分组让两组在处理之外的特征上“可交换”,于是处理组的平均结果减去对照组的平均结果,恰好就是ATE的无偏估计。观察性研究里没有随机化,研究者就退而求其次:在“给定可观测协变量后,处理组和对照组可交换”的假设下,用匹配、加权、分层等手段去近似随机分组。
2.2 结构因果模型与有向无环图:画出变量之间的关系
结构因果模型(Structural Causal Model, SCM)换成可视化的语言就是有向无环图:每个节点是一个变量,每条箭头表示一条因果方向,箭头从原因指向结果。图的好处是把“该控制什么”变成了一道几何题。
关键操作是干预算子 (do(X=x))。观察数据里的 (P(Y|X=x)) 是在“X自然取值”条件下的分布,而 (P(Y|do(X=x))) 是在“强制所有人把X设为x”条件下的分布,两者通常不相等。用刚才的例子:观察数据里“常锻炼的人更健康”,也可能是“本来就健康的人才有精力锻炼”,这两句话对应的因果方向完全不同。只有切掉外界指向X的箭头、强制让X变化之后,Y的变化才是X的因果效应。什么变量该控制、什么变量不能控制,图模型给了非常直观的答案——控制混淆路径上的变量,但不要控制中介变量,更不要控制对撞变量。这些规则用裸公式推导很绕,画成图却是一目了然。
2.3 两派怎么选:不同视角下的取舍
潜在结果框架从实验出发,它最早的落地场景就是随机实验和临床试验,习惯用“处理、对照、协变量、分配机制”这套词。结构因果模型从图出发,擅长表达多变量之间的复杂结构,在“能否从整体结构里识别出某一个效应”这类问题上更强。做实证研究的人通常建议先把潜在结果框架打底,因为它和实验直觉贴得最近,理解匹配、加权、DID都顺理成章;图模型则可以作为第二语言,在做偏差分析、决定控制变量清单时非常高效。两派在近十年里已经高度融合,很多现代论文一边画DAG说明识别策略,一边用潜在结果记号写估计量,你不需要二选一。
3. 因果效应的识别策略版图:实验思想如何落地到数据
3.1 随机实验:黄金标准,但现实会打脸
随机实验之所以是黄金标准,是因为它把“可交换性”这个核心假设直接做出来了。只要随机化被严格执行,处理组和对照组在期望意义下除了处理状态以外没有系统性差异。但现实里,随机实验经常做不成或做不好:成本太高,样本量撑不起小效应的检验;伦理不允许,你不能随机让一组人去做危险行为;时效不够,你等不及完整实验周期;还有外部效度问题——实验样本是一批人,推广到全量用户时结论可能不适用。
所以因果推断方法的大部分篇幅,都在讨论一个核心命题:如果随机实验做不了,我能不能通过某种设计,在观测数据里“模仿”出随机实验的效果?下面四种策略就是这个思路下的产物。
3.2 倾向评分与匹配:再造一个“准对照组”
匹配的思想很朴素:想评估某个处理的效果,就在没接受处理的人群里,找那些“如果当初大概率也会接受处理”的人当对照组。问题是协变量一多,直接按所有变量匹配会碰到维度灾难。倾向评分把这个难题化解了:先估计每个人接受处理的概率 (e(x)=P(A=1|X=x)),再把倾向评分相近的人放在一起比,处理组和对照组在协变量分布上就趋向均衡。
实际操作中还要盯住两个细节:一是共同支撑域,如果某些处理组的倾向评分在对照组里根本找不到对应的人,这些样本不是在“比较”,而是在“外推”,必须剔除或降权;二是不要为了追求均衡把处理变量本身放进倾向评分模型,那会导致过度调整,反而引入新的偏差。倾向评分不是灵丹妙药,它的效果上限取决于“无未测混淆”假设——如果你的混淆变量没被测量到,任何匹配技巧都救不回来。
3.3 双重差分:利用时间维度的“前后对照”
双重差分(DID)的思路是:虽然处理组和对照组在处理前不完全一样,但假设它们在没有处理的情况下会沿着同样的趋势走。于是先用对照组的前后变化“估计”掉时间趋势,再把这股趋势从处理组的前后变化里减掉,剩下的就是处理效应。这个“平行趋势”假设是整个DID的命根子。
DID的实战场景非常典型:某个平台在某一天针对特定城市上线了新改版,这时可以用邻近未改版的城市做对照。取改版前后的数据各一截,处理组的差值减去对照组的差值,就是改版的净影响。DID的扩展很多,比如事件研究法把单一前后比较展开成多个时间点的动态效应,可以检验平行趋势假设是否成立。最怕的是政策冲击和分组本身相关,比如“被选中改版的城市本来增速就更快”,那平行趋势一开始就是假的。
3.4 断点回归:让规则替你做随机
断点回归(RDD)利用的是“某个连续变量超过阈值就进入处理组”的制度规则。比如考试成绩超过60分就能获得奖学金,那60分附近的学生,本质上没差多少,却因为一个硬性规则被分到了不同组。在阈值附近,处理几乎是随机的,于是可以对局部样本做因果推断。
RDD分为精确断点和模糊断点。精确断点里,阈值完全决定处理状态;模糊断点里,超过阈值只是增加进入处理组的概率,需要用工具变量式的做法去估计。实操中要检查两个地方:一是阈值附近是否有人为操纵(比如成绩恰好卡在60分的人异常多),如果分数线附近样本密度有明显突变,随机性假设就站不住脚;二是带宽选择,带选得太大,偏差变大;带选得太小,方差变大。RDD得到的效应是“阈值附近人群的局部平均处理效应”,解释时千万别推广到全人群。
3.5 工具变量:找一个“只通过X影响Y”的遥控器
工具变量(IV)是处理内生性最猛的工具。它的直觉是:X里有一部分变异是被混杂因素污染的,我们需要找到另一个变量Z,它能够驱动X变化,但除了通过X这条路径之外,对Y没有直接影响,也不和未观测混淆相关。找到这样的Z,就相当于一个“遥控器”,按一下它,X动,而Y跟着动的部分就是干净的因果信号。
举个例子,研究教育年限对收入的影响时,人本身的潜质(未观测的)同时影响教育选择和收入,直接回归会有偏。距离学校的远近就是一个经典的工具变量思路:住得离学校近,上学的成本低,教育年限更可能更长;而住址本身不该直接影响成年后的收入。IV的问题是“排他性”假设很难验证,很多所谓工具变量只是在讲故事。另外弱工具变量会带来巨大的估计偏差和标准差膨胀,实操中必须检查第一阶段F统计量。
3.6 合成控制:没有好对照时自己“造”一个
合成控制(Synthetic Control)方法适合那种“只有一个处理单位,找不到满意对照组”的场景。做法是从一堆候选对照地区中选出权重,加权拼出一个“合成版”处理单位,让它在处理前的各项特征和处理单位尽量贴合,然后用这个合成对象预测处理期反事实走势。对比实际值和反事实值的差距,就是政策效应。
这是双重差分思路的升级版,在区域政策评估里用得非常多。它的一大优点是让人看到“如果没有政策,这个地区本来会长什么样”——这种反事实可视化非常有说服力。局限也明显:对照组池需要足够大且与处理单位同质,如果没有任何一个池成员能近似处理单位的行为,合成效果就是空中楼阁。
3.7 选型对照:不同识别策略的适用结论
| 策略 | 核心识别假设 | 适用场景 | 主要局限 |
|---|---|---|---|
| 随机实验 | 可交换性 | 可做实验、有预算和伦理许可 | 成本高、样本局限、时效慢 |
| 倾向评分/匹配 | 无未测混淆+共同支撑 | 协变量多、对照组充足 | 无法消除未测混淆 |
| 双重差分 | 平行趋势 | 有前后两期、有对比组 | 政策时间错位、溢出效应 |
| 断点回归 | 阈值附近局部随机 | 存在确定规则的分组制度 | 外部效度差、需要大量数据 |
| 工具变量 | 排他性+外生性 | 能找到干净的外部变异来源 | 找工具变量难、弱工具风险 |
| 合成控制 | 合成对象能复现反事实趋势 | 单个处理单位、多对照池 | 对照池要求高、可推广性受限 |
选策略不是选“最高级”的,而是选“最匹配数据结构”的。判断标准一句话:为了让手头数据的识别假设尽可能可信,哪种设计的假设最少、最可辩护,就优先用它。
4. 文献速览:从奠基之作到前沿方向的阅读地图
4.1 框架性奠基文献:先把“因果问题”本身定义清楚
因果推断的现代框架大致有两个源头。一个是上世纪七十年代在统计学界逐渐成形的潜在结果语言,它用两种“平行世界”的结果来定义因果效应,直接催生了后来在生物统计和社科领域被广泛使用的反事实框架;另一个是八十年代到九十年代逐步完善的图模型路线,它把因果假设画成有向无环图,把“干预”形式化为一种特殊运算,让研究者能从图的结构直接判断哪些变量该控制、哪些不该控制。
找原始文献时,我建议用“潜在结果”、“反事实”、“因果图加干预”这类关键词组合去检索,顺着综述的脚注往回找经典篇目,比一上来就按人名去搜资料库要容易得多。读这些奠基文献不用逐行推导,重点抓住三件事:它定义了什么问题、提出了什么记号、解决了当时什么争论。
4.2 识别策略的经典文献:每种方法都有“开山之作”
每一种识别策略背后都有一批里程碑式的工作。匹配方向上,提出利用倾向得分把高维协变量压缩成一维的做法,让匹配在实际项目中突然变得可操作,后续的加权与分层方法大多可以视为它的变体。双重差分方向的经典文献把“自然实验”带入主流视野,研究者不再只能依赖人为随机化,而是可以利用制度变化、政策调整形成的近似随机分组。断点回归方向的奠基性工作把设计思想从实验室搬到观测数据里,之后的大量应用证明它在教育、劳动、公共管理等场景都相当出效果。工具变量方法的历史则更长,它的核心识别思路在上世纪中后期就已经有完整表述。
阅读这类文献时,不要按时间顺序全读,而是先读该方法的综述章。综述里一般会用一张表格总结哪些论文提出了关键假设、哪些论文做了第一例应用、哪些论文补上了理论缺失,按图索骥效率高很多。每篇经典文献看三遍:第一遍看摘要和引言的识别策略图景,第二遍看假设在定理中的位置,第三遍看应用部分怎么用数据检验这些假设。
4.3 应用典范:看别人怎么把方法用起来
方法最终要在数据里见真章。应用文献我重点看三类:经济学侧重政策评估,经典场景包括教育投入、劳动力市场制度、区域政策等,特点是样本量大、识别策略干净;公共卫生领域关注暴露因素的效应,经常要和生存数据结合,对敏感性分析的要求特别高;营销与互联网行业则关心增长策略、补贴投放、广告触达的因果效果,特点是AB测试与观测数据长期并存。
读应用文献时我关注三个点:作者怎么论证识别假设、怎样做稳健性检验、审稿人最容易攻击哪个环节。把这三点看懂,再回到自己的项目里对照,比单纯背公式有用得多。很多应用论文的“识别假设论证部分”写得像侦探小说,从数据收集过程、制度背景、样本特征三个方面互相印证,这种论证习惯是单人学习者最该模仿的。
4.4 综述与教科书:一份不踩雷的书单和阅读顺序
入门阶段找写给社科背景的因果推断导论,这类书公式少、术语直观,适合先建立整体直觉。第二步看计量经济学方向的教材,专门啃潜在结果与识别策略的章节,把估计量的推导补上。第三步可以接触图模型视角的专著,重点理解干预算子和反事实的统一框架。手边再放一本“方法百科”式的工具书,每种方法单独一章,写作时当字典翻。
阅读顺序上,不要试图通读一本书再做项目,那是学生思维。更现实的路径是:先读前四章建立框架感,然后立刻回到自己手头的数据上,尝试把一个问题用因果语言写清楚,再按需要查具体方法的章节。以问题驱动读书,一本书可以读三个月,但每一章都真的用上了。
4.5 前沿方向:机器学习与因果推断正在交汇
最近几年的高活跃度方向有几个:异质性处理效应,用树模型、森林类方法估计“哪些人效果好、哪些人没效果”的分组结构,这正好呼应业务里的个性化运营;因果关系发现,即从观测数据里自动推断变量之间的因果结构,把画图这件事部分自动化;敏感性分析,系统评估“如果未测混淆存在于某个强度,结论会不会翻盘”,近年围绕E值这类工具形成了新的标准;外部有效性,研究如何把局部样本的效应条件外推到更广目标总体。这些方向正是因果推断笔记下篇打算继续整理的内容,届时会逐一把方法和代码实现铺开。
5. 给实操者的四条建议:学习路径、工具、误区和笔记法
5.1 一条合适的学习路径:从提问到复现
学因果推断最忌讳一上来就刷公式。我的建议是三步走。第一步,练“翻译”:把业务问题改写成因果问题,明确目标量是ATE、ATT还是CATE,画出待检验的DAG,写清楚处理、结果、混淆、中介变量各是什么。第二步,学策略:不必同等精力学所有方法,先挑一种跟你业务数据结构最贴近的做精,比如你有面板数据就优先搞透DID,你有制度性阈值就主攻RDD。第三步,做复现:找有公共数据的经典论文,复现它主要表格里的估计结果,再试着换一种识别策略,比较结论的差异。这一步做完,你对方法的理解和仅停留在公式层面的感受截然不同。
5.2 工具选择与效率工具
Python生态和R生态都能覆盖因果推断的主流操作,无非是估计器、图模型可视化、敏感性分析、数据加载这四类功能。我的建议是不要囤积工具包,固定使用一两个熟悉的环境把流程跑顺,然后围绕它写自己的模板函数。日常练手按“三类数据”分配精力:推导公式用纸笔,模拟实验用合成数据,真实分析用实际业务数据——三者缺一不可。
效率上最值得投入的是搭一套“标准分析流程模板”:拿到一个因果推断问题后,按描述统计、识别假设论证、主估计、稳健性检验、敏感性分析、反事实可视化、报告输出的顺序走。模板的好处是把容易遗漏的步骤固化成习惯,比如描述统计阶段就得展示处理组和对照组的协变量平衡表,这一步做扎实了,后续估计才有底气。
5.3 常见的四个误区
误区一是把预测模型当因果模型,用特征重要性或者SHAP值的大小去解释因果效应,两者逻辑完全不同;误区二是控制变量越多越好,把中介变量和对撞变量一股脑塞进回归,会造成过度调整偏差和选择性偏差,正确做法是回到DAG去判断每个变量的位置;误区三是只看P值不看效应量,因果推断报告的核心是置信区间的宽度和估计值的方向,显著不等于重要;误区四是等到分析阶段才补救,数据采集阶段没有设计好关键协变量、没有记录分组规则,后面用什么方法都白搭。
5.4 我是怎么做这套笔记的
这套笔记目前用卡片式记录法:每种方法一张卡片,厚度不等,内容固定包含定义、识别假设、估计思路、代码模板、常见坑位、文献来源。卡片不是一次写成的,每做一个新项目就往对应卡片里补充一处“这次数据分析里真实踩过的坑”。过几个月再回头看,有些卡片会被改得面目全非——这说明理解升级了,反而是好事。
写到这里,这套笔记的上篇就暂告一段落。对我个人来说,最大的感受是:因果推断不像机器学习那样“跑通一个模型就完事”,它的每一步都在跟假设搏斗,而这种搏斗恰恰是它最有魅力的地方。下一篇笔记我会接着整理中介分析、敏感性分析和机器学习方法在因果推断里的具体实现,到时候再继续分享。