news 2026/7/10 13:04:30

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
市场营销科学 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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/10 10:01:18

11.CSS属性 (@property)

property规则允许开发者定义自定义CSS属性&#xff0c;具有类型检查、默认值和继承行为控制&#xff0c;创建更强大、可动画的自定义属性。本章概述property是CSS中一个强大的特性&#xff0c;它将自定义CSS属性&#xff08;CSS变量&#xff09;提升到了一个新的层次。通过prop…

作者头像 李华
网站建设 2026/7/10 9:59:13

LLM 采样参数详解:Temperature, Top-k 与 Top-p

在大型语言模型&#xff08;LLM&#xff09;的文本生成过程中&#xff0c;解码&#xff08;Decoding&#xff09; 阶段决定了模型最终输出什么内容。为了平衡生成的准确性和多样性&#xff0c;我们通常会使用三个关键参数&#xff1a;Temperature、Top-k 和 Top-p。 本文档详细…

作者头像 李华
网站建设 2026/7/10 9:57:09

六、背景相关属性

六、背景相关属性 1.1 背景颜色 属性名: background-color (bgc)属性值&#xff1a; 颜色取值:关键字、rgb表示法、rgba表示法、十六进制…… 注意点&#xff1a; 背景颜色默认值是透明&#xff1a; rgba(0,0,0,0)、transparent背景颜色不会影响盒子大小&#xff0c;并且还能看…

作者头像 李华
网站建设 2026/7/9 21:19:21

从文本到数字人视频:Linly-Talker全流程演示

从文本到数字人视频&#xff1a;Linly-Talker全流程解析 在虚拟主播24小时不间断带货、AI客服秒回千条咨询的今天&#xff0c;一个更高效、更低门槛的数字人生成方案正悄然改变内容生产的底层逻辑。你是否想过&#xff0c;只需一张照片和一段文字&#xff0c;就能让静态肖像“活…

作者头像 李华
网站建设 2026/7/10 6:09:38

掌握AI原生应用领域函数调用的核心要点

AI原生应用函数调用:从原理到实战的7个核心密码 关键词 AI原生应用、函数调用、工具集成、上下文管理、prompt工程、安全性、性能优化 摘要 当我们谈论「AI原生应用」时,本质上是在说「让AI成为应用的大脑,自主指挥工具完成任务」。而函数调用,就是AI大脑与外部工具之间…

作者头像 李华