PSM倾向得分匹配法【python实操篇】

本文是关于PSM倾向得分匹配法的Python实操教程,详细讲解了从数据集创建到匹配过程,包括数据介绍、完整代码示例和结果检验。作者提供了保姆级注释的代码,便于读者理解和复用。文中使用了虚构的电商场景数据,通过匹配得分进行干预组和对照组的匹配,并探讨了匹配规则和匹配效果。最后,作者分享了匹配结果的检验标准和资源获取方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

大家好,我是顾先生,PSM倾向性得分匹配法的Python代码实操终于来啦!

对于PSM原理不太熟悉的同学可以看看前一篇文章:PSM倾向得分匹配法【上篇:理论篇】

目前网上PSM实操的相关文章都是R语言、SPSS和STATA实现的,少数Python版本代码不全,可读性有限(有些甚至要钱。。。)

所以我想出一版可读性强、能迅速复用的Python版本PSM,让各位同学既能看懂又能快速上手。

本次Python代码实操主要参考了psmatching的源码,并做了一定的修改,地址在文末参考资料。

这次我把每段代码都做了保姆级的注释,相信每位同学都能理解到位,当然肯定有注释不对的地方,也欢迎后台私信我。

本文的代码和数据集可关注我的公众号“顾先生聊数据”,后台发送“psm”后领取~

数据集介绍

为了更好地进行演示,我现编了一个数据集,该数据集以电商场景为基础,判断给用户发送优惠券PUSH是否会影响到用户。
在这里插入图片描述

数据集的类别主要由事实层标签(年龄、性别等)和行为层标签(最近一次购买diff、之前使用优惠券情况等)。

重申一下!数据集是我randbetween现编的,不用太较真具体内容。

完整代码

下面的代码我做了尽可能详细的注释,复用时需要修改的地方我也做了标注,如有不合理的地方欢迎后台私聊我哦~

安装psmatching包。

!pip install psmatching
import psmatching.match as psm
import pytest
import pandas as pd
import numpy as np
from psmatching.utilities import *
import statsmodels.api as sm

path及model设置。

#地址
path = "./data/psm/psm_gxslsj_data.csv"
#model由干预项和其他类别标签组成,形式为"干预项~类别特征+列别特征。。。"
model = "PUSH ~ AGE + SEX + VIP_LEVEL + LASTDAY_BUY_DIFF + PREFER_TYPE + LOGTIME_PREFER + USE_COUPON_BEFORE + ACTIVE_LEVEL"
#想要几个匹配项,如k=3,那一个push=1的用户就会匹配三个push=0的近似用户
k = "3"
m = psm.PSMatch(path, model, k)

获得倾向性匹配得分。

df = pd.read_csv(path)
#将用户ID作为数据的新索引
df = df.set_index("ID")
print("\n计算倾向性匹配得分 ...", end = " ")
#利用逻辑回归框架计算倾向得分,即广义线性估计 + 二项式Binomial
glm_binom = sm.formula.glm(formula = model, data = df, family = sm.families.Binomial())
#拟合拟合给定family的广义线性模型
#https://www.w3cschool.cn/doc_statsmodels/statsmodels-generated-statsmodels-genmod-generalized_linear_model-glm-fit.html?lang=en
result = glm_binom.fit()
# 输出回归分析的摘要
# print(result.summary)
propensity_scores = result.fittedvalues
print("\n计算完成!")
#将倾向性匹配得分写入data
df["PROPENSITY"] = propensity_scores
PSM倾向得分匹配(Propensity Score Matching, PSM)是一种常用的统计分析方,目的是通过匹配处理组和对照组中的个体,从而减少处理组和对照组之间的选择偏差。 Python是一种常用的编程语言,可以利用Python进行PSM倾向得分匹配现。 在Python中,可以使用多种库和工具来PSM倾向得分匹配,如statsmodels、scikit-learn等。以下是一个基本的PSM倾向得分匹配Python代码示例: ```python import numpy as np import pandas as pd from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression from sklearn.neighbors import NearestNeighbors from scipy.spatial.distance import pdist # 读取数据 data = pd.read_csv('data.csv') # 划分处理组和对照组 treatment_group = data[data['treatment'] == 1] control_group = data[data['treatment'] == 0] # 提取特征和目标变量 features = ['feature1', 'feature2', 'feature3'] target = 'outcome' # 拟合Logistic回归模型估计倾向得分 logreg = LogisticRegression() logreg.fit(treatment_group[features], treatment_group['treatment_score']) treatment_scores = logreg.predict_proba(control_group[features])[:, 1] # 使用最近邻算法找到匹配样本 nn = NearestNeighbors(n_neighbors=1) nn.fit(treatment_group[features]) distances, indices = nn.kneighbors(control_group[features]) matched_treatment_group = treatment_group.iloc[indices.flatten()] # 对匹配样本进行比较 matched_control_group = control_group.copy() matched_control_group['matched_treatment_score'] = matched_treatment_group['treatment_score'].values # 计算倾向得分匹配后的效果 matched_control_group['difference'] = matched_control_group['outcome'] - matched_control_group['matched_treatment_score'] # 打印结果 print(matched_control_group['difference'].mean()) ``` 上述示例代码中,首先读取数据,并将数据划分为处理组和对照组。然后,使用Logistic回归模型拟合处理组数据,以估计倾向得分。接下来,使用最近邻算法找到对照组中与处理组中每个个体最相似的个体。最后,计算匹配后对照组的结果差异。 通过上述Python代码,我们可以PSM倾向得分匹配的分析。当然,根据具体情况,可能需要对代码进行一定的修改和调整。
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值