倾向得分匹配(PSM)
PSM能解决什么问题?
在一场促销活动后,业务发现领券的的人均下单金额120元,没有领券的人均下单金额80元。是因为发放消费券使得下单金额提升的吗?—— 不一定,因为领券的人群本来就更爱买东西,可能没有券一样会买。这就是选择偏差。两组人群起点不一样,不能直接比较。
我们希望比较的是 “和领券人群差不多的人,如果没领券会怎样?”,也就是需要找历史消费、活跃度、年龄都相似,但刚好没领券的人,再比两人花了多少钱,这个方法就叫 匹配(Matching)。
那“倾向得分”起到什么作用?现实影响领不领券的因素很多:比如历史消费金额、所在城市级别、活跃天数、是否容易被push触达等,如果按这么多特征一一匹配,结果就是几乎找不到完全相同的人。
原理的核心是:只要两个人在「领券概率」上一样,就说明他们“各方面综合相似”。
所以PSM起到的作用是:第一步:用历史特征算每个人“看起来有多像会领券的人”(倾向得分);第二步:给每个领券的人,找一个得分最接近、但没领券的人;第三步:对比两组的结果 —— 这就可以证明下单金额的提升是消费券的作用。
本质就是:把多维匹配问题,压缩成一维(得分)再匹配。
PSM是基于什么原理?
PSM 基于两个核心理论支柱:潜在结果框架(Rubin Causal Model, RCM)、条件独立假设(Conditional Ignorability / Unconfoundedness)
通俗地说:先算一个人“有多像会接受干预的人”,再只比较得分相近、但一个干预一个没干预的两人,从而近似随机实验的效果。
举个例子
平台发了 10 万张“满 50 减 10”优惠券,用户可以自己领。
月底一看:领券的人平均花了 120 元,没领券的人平均花了 80 元。
能不能说:领券让人多花了 40 元? 不能!因为愿意领券的人,本来就更爱买东西。如果不处理这个“选择偏差”,效果会被严重高估。
这时候用 PSM(倾向得分匹配):给每个领券的人,找一个“长得像他、但没领券”的人,再比较。
消费层级 | 领券人数 | 领券GMV | 未领券人数 | 未领券GMV | PSM效应 |
|---|---|---|---|---|---|
low | 500 | 60 | 5000 | 55 | +5 |
medium | 1500 | 130 | 8000 | 120 | +10 |
high | 800 | 180 | 3000 | 170 | +10 |
结果解读:
在 low(低消费)人群里,效应只有 +5
在 medium/high(中高消费)人群里,效应是 +10
优惠券对中高消费人群效果更好,对低消费人群拉动有限。以后发券可以减少给低频用户的投放,集中资源给中高频用户。
双重差分(DID)
双重差分DID是基于什么理论?
潜在结果模型(Rubin Causal Model, RCM)+ 平行趋势假设(Parallel Trends)
DID 基于潜在结果框架,通过在面板数据中引入个体固定效应和时间固定效应,利用处理组与对照组在干预前后双重差分识别平均处理效应(ATT),它的因果识别依赖于平行趋势假设,也就是若无干预两组结果变量的时间趋势是相同的。
平行趋势假设:若无干预,处理组和对照组的 outcome 随时间的变化趋势相同
为什么不直接用AB Test,而要用DID?
之所以用 DID 而不是 A/B,是因为很多业务和政策干预无法随机分配;之所以用 DID 而不是简单前后或组间对比,是因为 DID 能同时消除不随时间变的个体异质性和共同时间冲击,从而避免严重的混淆偏误。
AB Test 不适用的场景:
限制 | 说明 |
|---|---|
不能随机化 | 政策、法规、全量上线、线下门店、城市级干预 |
伦理/商业不允许 | 不能故意不给某些用户核心权益 |
历史数据复盘 | 功能已上线,无法回滚重做实验 |
网络效应/溢出 | 同一城市随机会污染(如补贴、推荐)。 |
溢出的概念:处理组的干预“漏”到了对照组,使对照组不再代表"无干预状态"。破坏了AB测试的核心假设:无相互干扰SUTVA被破坏。
比如给A组的用户发券,B组的用户没有,那么A组的区域订单变多,司机/骑手就去A组区域接单,导致B组的订单更难被满足了,B组的转化率因此被A组影响。
或者:A组用户把优惠发给B组朋友(拼单等),B组也受益了,压低AB组直接的差距。
因为 A/B 要求"组间互不干扰",而上面场景做不到,而采用DID 能用地理/时间隔离代替用户级随机,规避同一城市内的溢出污染。
举个例子
平台1月在北京上线优惠活动,想测算活动能不能对GMV带来提升。
上海没有这个活动,作为对照组。问题是北京消费比上海高,1月有元旦春节等节假日,大家本来就会多花钱。而DID可以消除这两个干扰的影响。
city | month | total_amount |
|---|---|---|
beijing | 2023-11 | 1000 |
beijing | 2023-12 | 1100 |
beijing | 2024-01 | 1300 |
beijing | 2024-02 | 1400 |
shanghai | 2023-11 | 900 |
shanghai | 2023-12 | 950 |
shanghai | 2024-01 | 1000 |
shanghai | 2024-02 | 1050 |
组别 | 政策前(11–12月) | 政策后(1–2月) | 变化 |
|---|---|---|---|
北京(处理组) | (1000+1100)/2 =1050 | (1300+1400)/2 =1350 | +300 |
上海(对照组) | (900+950)/2 =925 | (1000+1050)/2 =1025 | +100 |
| DID = (北京变化)−(上海变化) = (+300)−(+100) = +200 |
业务意义:优惠活动让北京用户每个月多贡献了 200 元业绩。
拆解:
上海涨了 100 → 这是元旦/春节的自然增长
北京多涨了 200 → 这是免配送费的真实效果
PSM与DID区别与联系
PSM 是横向对比,只关心组内特征是否平衡。目的是让两组静态可比。
DID 纵向+横向对比,先算各自前后变化(消个体差异),再比变化量的差(消时间冲击)。目的是让两组变化趋势可比。
维度 | PSM | DID |
|---|---|---|
解决偏误来源 | 选择偏差(组间特征不同) | 组间固有差 + 时间共同冲击 |
数据要求 | 丰富协变量 X | 前后面板 + 对照组 |
关键假设 | 条件独立(已观测全) | 平行趋势 |
匹配维度 | 横截面(特征相似) | 时间 + 组别(趋势相似) |
能消未观测固定异质? | ❌ | ✅(不随时间那部分) |
一句话总结 | “找和他差不多的人” | “看他和对照组变化差多少” |
什么时候要用 PSM‑DID 而不是单独 PSM?
当既有"自选",又有"前后"时,可以采用PSM‑DID
PSM能做的事:① 让处理组和对照组在基期“特征相似”,② 控制可以观测的选择偏差。
PSM做不到的:① 不能消除时间周期的影响,比如节假日、大盘增长。② 如果平行趋势边际不满足,PSM 样本仍可能残存趋势差。也即PSM 只能消“静态差异”,消不掉“趋势差异”。(DID能做到)③ 不能处理 不随时间而变动的观测不到的(比如用户天生特质、潜在付费意愿)对趋势的解释。
以下场景要用PSM-DID:
# | 条件 | 说明 |
|---|---|---|
1 | 非随机干预(用户/城市自选或运营指定) | 需 PSM 平衡协变量 |
2 | 有前后面板(同批单位有干预前 + 干预后) | 能做 DID |
3 | 处理 / 对照组基线存在显著差异 或平行趋势边缘可疑 | 单独 DID 也可能偏;先做 PSM 改善平行趋势条件 |
4 | 你想报告因果效应而非描述差异 | 需双重差分消除时间×固定效应 |
PSM 补 DID 的短板(组间不可比)
DID 补 PSM 的短板(时间趋势、未观测固定效应)
以下场景不能用PSM-DID:
情况 | 建议 |
|---|---|
可随机分流(A/B) | 直接 RCT(随机对照试验) |
只有横截面,无前后期 | 只能 PSM(承认局限) |
有面板,但随机分配城市(真自然实验)且平行趋势 OK | 单独 DID 足够 |
| 处理组 = 全量用户(整个总体都受了干预,无对照组) | 需合成控制 / 中断时间序列 |
合成控制法:造一个对照组——用多个“未受干预的相似单元”加权组合,拼成一个“虚拟对照组”,模拟如果该地/产品没被干预会怎样。
中断时间序列:用干预前后的自身时间趋势——不靠横向对照(别人),而是用自己干预前的时间序列做对照,看干预点前后趋势是否发生突变。
DID 、 PSM 与 AB Test
A/B 是理想 → DID / PSM 是在观测数据里“尽量像随机实验”。
都是为逼近 随机对照试验RCT 的因果识别:
RCT(A/B):直接随机 → 无混杂;
DID:用时间和组别双重差分 模拟 RCT 的控制逻辑;
PSM:用匹配 模拟随机分组下的“可比对照组”。
三种方法如何选择?
A/B Test 通过随机化无偏识别因果,是黄金标准;DID 在无法随机但拥有处理组/对照组前后面板数据时,利用双重差分消除不随时间变异质性与共同时间冲击,依赖平行趋势假设;PSM 在干预非随机且有丰富协变量时,通过倾向得分匹配构造可比对照组,仅能控制已观测混杂。三者目标相同——估计因果效应,适用条件不同,常据数据与研究设计选择或联用(PSM‑DID)。
Q1: 能对干预随机分配吗? ├─ YES → ★ A/B Test(首选) └─ NO → Q2: 有处理组/对照组【前后面板数据】? ├─ YES → 优先考虑 DID │ └─ 若组间基线差异大 → PSM‑DID └─ NO → 用 PSM(确认已观测协变量充分)方法 | 能否消未观测偏差 | 说明 |
|---|---|---|
PSM | ❌ 只能消可观测 | 观测数据匹配——用已观测特征构造“假随机”对照组 |
DID | ✅ 消不随时间变未观测(需平行趋势) | 准实验 + 面板——用“前后差分 × 组间差分”模拟控制组 |
AB Test ✅✅ | 直接消所有未观测偏差 | RCT是因果推断的“黄金标准“ |
3种方法核心对比:
维度 | A/B Test (RCT) | DID (双重差分) | PSM (倾向得分匹配) |
|---|---|---|---|
是否随机 | ✅ 是 | ❌ 否(自然/运营分组) | ❌ 否 |
数据要求 | 可随机分流 + 记录结果 | 面板数据(同一样本前后 ≥2 期)+ 对照组 | 横截面或面板 +丰富协变量 X |
控制未观测固定异质 | ✅ 随机化消去 | ✅ 消去不随时间变部分(需平行趋势) | ❌ 只控制已观测 X |
控制时间冲击 | ✅(同期随机) | ✅(通过对照组时间差分) | ❌ |
核心假设 | 随机化、SUTVA | 平行趋势 + 无溢出 | 条件独立(CIA) + 共同支撑 |
典型场景 | UI改版、算法上线、发券随机 | 政策试点、城市分批上线、历史复盘 | 用户自选领券/买会员/参加活动 |
主要风险 | 实操不可行(伦理/全量/历史) | 平行趋势不成立 → 偏误 | 遗漏关键未观测变量 → 仍有偏差 |
因果可信度 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐(假设成立) | ⭐⭐⭐(仅已观测) |