当前位置: 首页 > news >正文

市场营销科学 101:如何使用合成控制分析基于地理的活动

原文:towardsdatascience.com/how-to-analyze-geo-based-campaigns-with-synthetic-control-a90b839479a8?source=collection_archive---------8-----------------------#2024-05-22

使用 Meta 的 GeoLift 库

https://medium.com/@mandymliu?source=post_page---byline--a90b839479a8--------------------------------https://towardsdatascience.com/?source=post_page---byline--a90b839479a8-------------------------------- Mandy Liu

·发表于 Towards Data Science ·6 分钟阅读·2024 年 5 月 22 日

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/35d2615d2d8eab8cdb7d716962c85c55.png

图片来自 Z 在 Unsplash

(如果你不是 Medium 会员,可以在这里) 阅读完整文章

导航基于位置的测试的复杂性可能是一个挑战。

幸运的是,GeoLift 在这里可以优化这个过程。

由 Meta 的市场营销科学团队开发,这个开源库旨在进行基于地理位置的实验。它使我们能够:

  1. 轻松选择测试市场,且

  2. 生成一个合成控制市场,用来与选定的测试地点进行基准对比

虽然 GeoLift 文档提供了关于选择测试市场的全面指南,但本文将重点介绍如何创建和使用合成控制市场

让我们深入了解。

合成控制方法(SCM)

这些图表展示了“差异中的差异”方法与合成控制方法(SCM)之间的比较。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/0e3507b10492d1be57b427f2fb35c480.pnghttps://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/374975efcbf4583aa6c8008deaaf0a9f.png

由作者使用 ChatGPT x Wolfram 生成

根据维基百科,SCM

该方法旨在估算在没有实施干预的情况下,处理组可能的结果。与差异中的差异方法不同,SCM 通过加权控制组,使其在干预前尽可能接近处理组,从而调整时间变化的混杂因素。

简单来说,SCM 构建了一个“平行宇宙”,使您能够观察如果没有启动活动,潜在的结果会是什么,从而清晰地比较和衡量活动的真实增量效果。

精简版合成对照创建指南

1. 处理数据

2. 生成权重

3. 可视化合成对照

4. 测量增量效果

前两步在 GeoLift 文档中有详细说明。为了保持一致性,我会在这里包括代码和输出。

我们将在 R 中执行初步步骤,并在 Python 中执行最后两步。

如果您主要使用 Python,请不要担心——R 代码简单易懂,我保证这将非常容易跟随!

1. 处理数据

您的数据应该是什么样子的:

安装包:

加载数据:

library(GeoLift)data(GeoLift_PreTest)
>head(GeoLift_PreTest)location Y date1new york33002021-01-012new york32022021-01-023new york41382021-01-034new york37162021-01-045new york32702021-01-056new york32602021-01-06
GeoTestData_PreTest<-GeoDataRead(data=GeoLift_PreTest,date_id="date",location_id="location",Y_id="Y",X=c(),#empty list as we have no covariatesformat="yyyy-mm-dd",summary=TRUE)####################################### Summary #######################################*Raw Number of Locations:40*Time Periods:90*Final Number of Locations(Complete):40

2. 生成权重

假设我们的实验将在德克萨斯州的奥斯汀市进行。我们的目标是创建一个合成对照,它在实验开始之前尽可能地反映奥斯汀的实际情况。

创建权重:

weights<-GetWeights(Y_id="Y",location_id="location",time_id="time",data=GeoTestData_PreTest,locations=c("austin"),pretreatment_end_time=90,fixed_effects=TRUE)

排除任何市场不作为对照:

exclude_markets<-c("honolulu","washington")GeoTestData_PreTest_Excl<-subset(GeoTestData_PreTest,!location%in%exclude_markets)

然后将GeoTestData_PreTest_Excl传入上面的GetWeights函数。

显示前几名权重:

>head(dplyr::arrange(weights,desc(weight)))location weight1cincinnati0.352325412detroit0.279550093honolulu0.129608184minneapolis0.109510335portland0.062650986san antonio0.01844960

下载权重和市场数据到 csv:

write.csv(weights,"/Users/mandyliu/Documents/R/geolift_weights.csv",row.names=FALSE)write.csv(GeoLift_PreTest,"/Users/mandyliu/Documents/R/market_data.csv",row.names=FALSE)

3. 可视化合成对照

现在我们已经有了权重文件,我们将创建一个合成对照地理对象,与我们的测试市场——奥斯汀进行比较。

设置:

importpandasaspdimportseabornassnsimportmatplotlib.pyplotaspltfromdatetimeimportdatetime,timedelta,date
df_weights=pd.read_csv('/Users/mandyliu/Documents/R/geolift_weights.csv')df_markets=pd.read_csv('/Users/mandyliu/Documents/R/market_data.csv')

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/cac3289e17affc0face75ec36d0a873f.pnghttps://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/cdf25bd7dfd363629c72bd8b784ac7c2.png

作者在 Jupyter notebook 中创建

将权重和城市结合在一起,创建一个单一的对照:

# convert to pandas datetimedf_markets['date']=pd.to_datetime(df_markets['date'],format='%Y-%m-%d')# combine control markets with weightsdf_markets_weights=df_markets.merge(df_weights,on='location')df_markets_weights['weighted_Y']=df_markets_weights['Y']*df_markets_weights['weight']# sum weighted_Y by date to create a single synthetic control citydf_syn_control=df_markets_weights.groupby('date').sum('weighted_Y')\.reset_index()[['date','weighted_Y']].rename(columns={'weighted_Y':'Y'})df_syn_control['location']='syn_control'# append Austin data to syn controldf_markets_austin=df_markets[df_markets['location']=='austin'].reset_index(drop=True)df_syn_control_austin=pd.concat([df_markets_austin,df_syn_control],ignore_index=True)

可视化奥斯汀与合成对照

sns.lineplot(data=df_syn_control_austin,x="date",y="Y",hue='location',palette=['purple','pink'])plt.xticks(rotation=45)

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/ab8e346385d8339fdfa3a609e2d6e775.png

作者在 Jupyter notebook 中创建

检查相关性:

df_corr=df_syn_control[['date','Y']].merge(df_markets_austin[['date','Y']],on='date')df_corr['Y_x'].corr(df_corr['Y_y'])

奥斯汀与合成对照的相关性为0.950——非常稳固!

测量增量效果

有一点小的变化。

尽管奥斯丁及其对照组显示出高度的相关性,图表揭示了对照组始终呈现更高的值。

为了方便直接比较,我们可以应用一个乘数来对齐启动前的数值。

创建乘数:

# create multiplieraustin_Y=df_markets_austin.loc[df_markets_austin['date']==df_markets_austin['date'].max(),'Y'].iloc[0]syn_control_Y=df_syn_control.loc[df_syn_control['date']==df_syn_control['date'].max(),'Y'].iloc[0]M=austin_Y/syn_control_Y

M = 0.9556415990151904

模拟启动后的数据:

# create a list of datesdate_list=[]start_date=df_markets_austin['date'].max()k=15fordayinrange(1,k):date=start_date+timedelta(days=day)date_list.append(date)# create fake austin data post-launchdata_austin_new={"date":date_list,"Y":df_markets_austin.tail(14)['Y'].values*1.2,#assuming a 20% lift"location":['austin']*14}df_austin_new=pd.DataFrame(data_austin_new)df_markets_austin_test=pd.concat([df_markets_austin,df_austin_new])# create fake synthetic control data post-launchdata_syn_control_new={"date":date_list,"Y":df_syn_control.tail(14)['Y'].values,"location":['syn_control']*14}df_syn_control_new=pd.DataFrame(data_syn_control_new)df_syn_control_test=pd.concat([df_syn_control,df_syn_control_new])#adjust synthetic control with multiplier Mdf_syn_control_adj=df_syn_control_test.copy()df_syn_control_adj['Y']=df_syn_control_adj['Y']*M# combine austin and adjusted control datadf_syn_control_austin_adj=pd.concat([df_markets_austin_test,df_syn_control_adj]\,ignore_index=True)

可视化奥斯丁与调整后的对照组:

ax=sns.lineplot(data=df_syn_control_austin_adj,x="date",y="Y",hue='location',palette=['purple','pink'])ax.axvline(x=date(2021,3,31),c='b',linestyle="dashed")plt.xticks(rotation=45)

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/e0032aafd669b12d6e589c5163de86f1.png

作者在 Jupyter notebook 中创建

我们创建了一张引人注目的图表,完美展示了启动前后的不同!

收获

尽管现实数据可能更为复杂,但通过比较测试市场与合成对照,我们能够观察到随时间推移的增量提升

由于我们使用历史数据将对照组在干预前紧密地校准到处理组,合成方法通常比差异中的差异方法提供更可靠且更具可解释性的结果。

资源

你可能也会喜欢这个:

## 我作为初级数据科学家犯的 3 个痛苦错误

今天就从他们那里学习,快速推进你的职业生涯

towardsdatascience.com

联系我:Twitter/X|LinkedIn

http://www.jsqmd.com/news/116424/

相关文章:

  • Linly-Talker支持实时摄像头推流吗?直播推流配置指南
  • Linly-Talker与LangChain整合构建知识库问答数字人
  • 企业级动物领养平台管理系统源码|SpringBoot+Vue+MyBatis架构+MySQL数据库【完整版】
  • Linly-Talker生成视频的人物眨眼频率可调吗?
  • Java日志框架,零基础小白到精通,收藏这篇就够了
  • Linly-Talker在博物馆导览中的沉浸式应用案例
  • Linly-Talker能否识别方言输入?ASR模块能力测试
  • Linly-Talker在大学慕课制作中的高效应用实例
  • Hanzi Writer 是 javascript 免费开源库,根据汉字书写时按照笔画顺序的特征,可以播放正确笔画顺序的描边动画和练习测试。 支持简体字和繁体字
  • NPP 草原:美国迪金森,1970 年,R1
  • +高校线上心理咨询室设计与实现pf信息管理系统源码-SpringBoot后端+Vue前端+MySQL【可直接运行】
  • Java Web +线上教育培训办公系统系统源码-SpringBoot2+Vue3+MyBatis-Plus+MySQL8.0【含文档】
  • 计算机毕业设计springboot软件学院体育设备管理系统 基于SpringBoot的软件学院体育器材全生命周期管理平台 软件学院智慧体育资产运营系统的设计与实现
  • Linly-Talker云端部署最佳实践(Kubernetes+GPU节点)
  • NPP 热带森林:巴拿马达连,1967-1968 年,R1
  • 【2025最新】基于SpringBoot+Vue的+校园求职招聘系统管理系统源码+MyBatis+MySQL
  • +校园求职招聘系统信息管理系统源码-SpringBoot后端+Vue前端+MySQL【可直接运行】
  • 计算机毕业设计springboot中国好山水 基于SpringBoot的“华夏山水行”旅游分享社区 SpringBoot驱动的“云游神州”自然风光互动平台
  • 10种被动收入来源,帮助开发者度过裁员难关
  • 【华为 ICT HCIA eNSP 习题汇总】——题目集26
  • Linly-Talker如何实现唇形与语音精准同步?技术揭秘
  • Linly-Talker在保险产品讲解中的标准化应用
  • Linly-Talker在房地产虚拟看房中的交互设计
  • Linly-Talker支持自定义动作库吗?高级控制参数介绍
  • 13.位置尝试 (@position-try)
  • 鸿蒙学习实战之路-数据持久化键值型数据库KV-Store全攻略
  • Linly-Talker能否输出透明通道视频?后期合成支持情况
  • 智能宠物屋:AI Agent的宠物行为分析
  • Linly-Talker与RVC结合实现更自然的歌声合成
  • LLM 采样参数详解:Temperature, Top-k 与 Top-p