从零构建PSM实战:Python代码解析与常见陷阱规避
在数据科学和商业分析领域,我们经常需要评估某项干预措施(如营销活动、产品功能更新或政策实施)对目标指标的真实影响。当无法进行随机对照实验时,倾向得分匹配(Propensity Score Matching,PSM)成为因果推断的重要工具。本文将带您从零开始构建完整的PSM分析流程,通过Python代码实现并结合电商场景案例,深入解析每个环节的技术细节与常见陷阱。
1. PSM核心原理与电商场景应用
倾向得分匹配的核心思想是通过构建"虚拟对照组"来解决观察性研究中的选择偏差问题。在电商场景中,假设我们想评估"新用户首单补贴"对用户留存率的影响,由于补贴通常不是随机分配的(例如可能针对特定地区或用户群体),直接比较补贴组和非补贴组的留存率会存在偏差。
PSM解决这一问题的三个关键步骤:
- 倾向得分估计:使用逻辑回归等模型预测每个用户接受干预(获得补贴)的概率
- 样本匹配:为每个补贴用户找到倾向得分相近的非补贴用户作为对照 3 效应评估:比较匹配后两组用户的留存率差异
注意:PSM只能控制可观测的混杂变量,对于未观测的混杂因素仍需结合其他方法处理
在Python中,我们可以使用statsmodels和sklearn等库实现完整流程。以下是一个基础框架:
import pandas as pd
import statsmodels.api as sm
from sklearn.neighbors import NearestNeighbors
# 数据准备
data = pd.read_csv('ecommerce_data.csv')
covariates = ['age', 'gender', 'region', 'pre_purchase'] # 协变量
treatment = 'subsidy' # 干预变量
outcome = 'retention' # 结果变量
# 倾向得分估计
ps_model = sm.Logit(data[treatment], data[covariates]).fit()
data['ps'] = ps_model.predict(data[covariates])
2. 数据预处理与协变量选择
数据质量直接决定PSM的效果。在电商用户补贴案例中,我们需要特别注意:
关键预处理步骤:
- 缺失值处理:删除或合理填充缺失值
- 异常值检测:避免极端值影响倾向得分估计
- 变量转换:对分类变量进行独热编码,连续变量必要时标准化
协变量选择原则:
| 选择标准 | 说明 | 示例 |
|---|---|---|
| 同时影响干预和结果 | 必须包含的变量 | 用户历史购买频率 |
| 仅影响干预 | 建议包含 | 用户注册渠道 |
| 仅影响结果 | 可选包含 | 用户设备类型 |
| 与两者无关 | 应当排除 | 随机生成的用户ID |
常见错误是遗漏重要协变量或包含无关变量。实践中可通过以下方法验证:
# 协变量平衡检验函数
def check_balance(data, covariates):
before = data.groupby(treatment)[covariates].mean()


395

被折叠的 条评论
为什么被折叠?



