因果推断(一)合成控制法(SCM)

news2024/11/25 20:34:29

因果推断(一)合成控制法(SCM)

在互联网时代,产品迭代速度越来越快,营销活动也越来越多。分析师因此需要快速的量化每次迭代或每次营销的效果,探索改变与结果之间的因果关系,并将优秀的改变用以引导迭代方向,指导业务朝正确方向行走。

但产品本身具有明显的时间趋势,例如季节性、周期性,亦或自然增长趋势,而且营销活动本身也带有较强的噪音。因此如何排除这些干扰因素来量化真正的影响就显得尤为重要了。

在互联网中最常见的自然就是A/B试验,但现实情况中有很多情况下无法开展实验,这个时候就只能观察业务历史数据了。好在统计学上有一些经典的因果推断方法,例如合成控制法、倾向匹配得分等。

总结我们前面的一些专题分析,发现基本都是总结各因素与标的变量的相关性,即如果数据存在某些特征,则很大概率出现某种结果。但是我们无法断定如果数据存在某些特征,则一定出现某种结果。这就是相关性与因果性的差异。

因果推断是一门复杂的学科,但本质是反事实推断,即在假设没有发生的情况下,如果采取某种干预,会发生什么结果。如果又想深入研究的同学可以参考Causal Inference for The Brave and True

使用背景

德国统一是否影响了西德经济呢?那常见的思路就是比较没有统一的西德和统一的西德在同一时间上的经济差异,此时没有统一的西德就是反事实了,我们可以合成一个假的西德,这样在同一时间就同时出现了统一的西德和统一的西德,该方法就是合成控制法,本文参考自How to use SyntheticControlMethods。

合成控制法的核心就是构造一个相似的对照组,原理简单且具有说服力,因此对业务很友好。例如广告在北京投放一段时间后,用户增长了30%,是否可以直接推广到全国呢?怎么判断这个提升不是来自于自然增长呢?所以利用其余城市合成一个北京,就可以进行简单的比较了,

⚠️注意:合成控制法常用于面板数据

Python实战

数据准备

# pip install SyntheticControlMethods
import pandas as pd
import numpy as np
from scipy.optimize import fmin_slsqp, minimize
from matplotlib import pyplot as plt
from SyntheticControlMethods import Synth, DiffSynth

以下数据如果有需要的同学可关注公众号HsuHeinrich,回复【因果推断01】自动获取~

# 数据查看
data = pd.read_csv("german_reunification.csv")
data = data.drop(columns="code", axis=1) # 删除多余的id列
data.head()

image-20230206154654726

  • 数据格式要求
    • 数值变量,id变量可以是分类变量
    • 存在唯一id变量,如果有多个,删除一个。例如本例删除code,保留country
    • 数据按照id列和time列排序
    • 数据集必须包含一个控制组和多个对照组。较多的对照组合成误差更小
    • 结果变量非空,协变量可以含有空值
  • Synth主要参数
    • data:数据集
    • outcome_var:结果变量,eg:gdp
    • id_var: ID变量,eg:country
    • time_var:时间变量,eg:year
    • treatment_period:干预时期,eg:1990-德国统一日期
    • treated_unit:干预组,eg:West Germany

模型拟合

# 合成控制拟合
sc = Synth(data, "gdp", "country", "year", 1990, "West Germany", n_optim=100) # 1990-德国统一日期

结果展示

# 查看合成结果
print(sc.original_data.weight_df)
print('-'*60)
print(sc.original_data.comparison_df)
print('-'*60)
print(sc.original_data.rmspe_df)
           Weight
USA      0.396718
Belgium  0.603282
------------------------------------------------------------
           West Germany  Synthetic West Germany    WMAPE  Importance
gdp             8169.83                 8148.46  1002.35        0.13
infrate            3.39                    5.08     1.69        0.12
trade             45.76                   71.27    50.07        0.13
schooling         55.78                   37.48    18.31        0.13
invest60           0.34                    0.26     0.08        0.12
invest70           0.33                    0.27     0.06        0.12
invest80          27.02                   22.07     4.94        0.12
industry          39.69                   35.30     4.39        0.12
------------------------------------------------------------
           unit  pre_rmspe   post_rmspe   post/pre
0  West Germany  96.243293  2246.032119  23.337025
  • weight:合成的主要权重为USA和Belgium
  • comparison:与西德相比,合成控制的结果
  • rmspe:与西德相比,合成控制结果的均方根预测误差96.24,较低
# 观察实验结果
sc.plot(["original", "pointwise", "cumulative"], treated_label="West Germany", 
            synth_label="Synthetic West Germany", treatment_label="German Reunification")

output_10_0

  • 可以看出西德与合成控制结果的反事实干预下的趋势基本一致
  • 在干预后,实际西德较对照组(合成控制结果)经济明显下滑,第三张图为累计效应,即经济累计下滑显著

模型评估

# 模型评估
# 加入时间安慰剂
sc.in_time_placebo(1982, n_optim=10) # 将干预时间变更为1982念
sc.plot(['in-time placebo'], 
            treated_label="West Germany",
            synth_label="Synthetic West Germany")

output_12_0

直到1990真实的干预时期,西德与对照组的差异基本一致,没有明显扩大差异。因此合成效果较好

# 加入空间安慰剂
sc.in_space_placebo(10)
sc.plot(['rmspe ratio'])

output_14_0

循环地对每个组、其余组合成进行干预,可以发现西德在干预前后的RMSPE差异最大。因此合成效果较好

总结

合成控制法能很好的解决构造相似的对照组,然后在同一干预下,就能很好的比较实验与对照组的差异了。

共勉~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/785112.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

idea如何解决导入的项目不是Maven工程(文件下面没有蓝色的方格)二

简介: Maven项目导入,idea不识别项目 解决方法: 选中pom.xml -- 右键 -- Add as Maven Project

使用Python搭建代理服务器- 爬虫代理服务器详细指南

搭建一个Python爬虫代理服务器可以让你更方便地管理和使用代理IP。下面是一个详细的教程来帮助你搭建一个简单的Python爬虫代理服务器: 1. 首先,确保你已经安装了Python。你可以在官方网站(https://www.python.org/)下载并安装最新版本的Python。 2. 安…

Spring 中简单存取 Bean 的相关注解

目录 前言存储 Bean 对象五大类注解方法注解(Bean) 获取 Bean 对象 (Autowired)属性注入多个同类型 Bean 注入怎么办? Setter 注入构造方法注入(官方推荐) 前言 之前我们存储获取 Bean 的操作很繁琐,需要将…

在职硕士|2023级中国社科院-美国杜兰大学合办双证能源管理硕士(MME)

金融硕士 在职硕士|2023级中国社科院-美国杜兰大学合办双证能源管理硕士(MME) 中国社会科学院大学与美国杜兰大学合作举办的能源管理专业硕士学位教育项目(UCASS-Tulane Master of Management in Energy,简称MME)于2…

《人工智能安全》课程总体结构

1 课程内容 人工智能安全观:人工智能安全问题、安全属性、技术体系等基本问题进行了归纳整理。人工智能安全的主要数据处理方法,即非平衡数据分类、噪声数据处理和小样本学习。人工智能技术赋能网络空间安全攻击与防御:三个典型实例及攻击图…

mybatis_配置之属性优化

概念 别名优化: 类型别名可为 Java 类型设置一个缩写名字。 它仅用于 XML 配置,意在降低冗余的全限定类名书写。例如: 在xml文件里为SQL映射文件中定义返回值类型的属性起个别名 之后直接使用User进行使用 核心配置文件: MyBa…

常见面试题分享1

一、对JVM的了解 1.1 什么是JVM? JVM(Java Virtual Machine),俗称Java虚拟机。它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java语言的一个非常重要的特点就是与平台的无关性。…

商城体系之产商品系统

本文主要讲解商城体系下产商品系统的设计。商城系统可以拆分成多个业务中台和多个应用服务。 1、产商品系统业务架构 产商品系统作为商城重要的基础信息组成部分,主要划分为产品信息和商品信息,产品信息保持最原始的产品基础属性和内容,商品…

下拉框可筛选可树状多选组件

实际效果图片 父页面 <el-form-item label"转发&#xff1a;" :label-width"formLabelWidth" class"formflex_item"><el-select ref"select" :clearable"true" clear"clearSelect" remove-tag"r…

day2 驱动开发 c语言

通过驱动开发给pcb板子点灯。 u-boot已经提前移植到了emmc中。 灯也是一种字符型设备。 编程流程需要先注册设备&#xff0c;然后创建结点&#xff0c;然后操作电灯相关寄存器 应用层直接调用read write来打开字符设备进行操作。 这样写会造成无法处理内核页面请求的虚拟地址…

SpringBoot中java操作excel【EasyExcel】

EasyExcel 处理Excel&#xff1b;简单记录&#xff0c;方便日后查询&#xff01; 官方文档&#xff1a; Easy Excel (alibaba.com) 一、EasyExcel概述 Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存&#xff0c;poi有一套…

前端食堂技术周刊第 91 期:2023 npm 状态、TC39 会议回顾、浏览器中的 Sass、React 18 如何提高应用程序性能

美味值&#xff1a;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f; 口味&#xff1a;茶椰生花 食堂技术周刊仓库地址&#xff1a;https://github.com/Geekhyt/weekly 大家好&#xff0c;我是童欧巴。欢迎来到前端食堂技术周刊&#xff0c;我们先来看下…

js基础-练习三

九九乘法表&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthsc, initial-scale1.0"><title>九九乘法表</title><style&g…

5.9 Bootstrap 警告框(Alert)插件

文章目录 Bootstrap 警告框&#xff08;Alert&#xff09;插件用法选项方法事件 Bootstrap 警告框&#xff08;Alert&#xff09;插件 警告框&#xff08;Alert&#xff09;消息大多是用来向终端用户显示诸如警告或确认消息的信息。使用警告框&#xff08;Alert&#xff09;插件…

基于 Flink SQL CDC 数据处理的终极武器

文章目录 一、传统的数据同步方案与 Flink SQL CDC 解决方案1.1 Flink SQL CDC 数据同步与原理解析1.2 基于日志的 CDC 方案介绍1.3 选择 Flink 作为 ETL 工具 二、 基于 Flink SQL CDC 的数据同步方案实践2.1 CDC Streaming ETL2.2 Flink-CDC实践之mysql案例 来源互联网多篇文…

Redis—分布式系统

Redis—分布式系统 &#x1f50e;理解分布式&#x1f50e;分布式—应用服务与数据库服务分离引入更多的应用服务节点理解负载均衡 引入更多的数据库服务节点缓存分库分表 微服务 &#x1f50e;常见概念应用(Application) / 系统(System)模块(Module) / 组件(Component)分布式(D…

nvm 安装 Node 报错:panic: runtime error: index out of range [3] with length 3

最近在搞 TypeScript&#xff0c;然后想着品尝一下 pnpm&#xff0c;但是 pnmp 8.x 最低需要 Node 16.x&#xff0c;但是电脑上暂时还没有该版本&#xff0c;通过 nvm list available 命令查看可用的 Node 版本&#xff1a; nvm list available# 显示如下 | CURRENT | …

【C++进阶】:继承

继承 一.继承的概念和定义1.概念2.定义 二.基类和派生类对象赋值转换三.继承中的作用域四.派生类的默认成员函数五.继承与友元六.继承与静态成员七.复杂的菱形继承及菱形虚拟继承1.二义性2.原理 八.总结 一.继承的概念和定义 1.概念 继承(inheritance)机制是面向对象程序设计使…

虚拟文件描述符VFD

瀚高数据库 目录 环境 文档用途 详细信息 环境 系统平台&#xff1a;Linux x86-64 Red Hat Enterprise Linux 7 版本&#xff1a;14 文档用途 了解VFD 详细信息 1.相关数据类型 typedef struct vfd{int fd; /* current FD, or VFD_CLOSED if non…

23 自定义控件

案例&#xff1a;组合Spin Box和Horizontal Slider实现联动 新建Qt设计师界面&#xff1a; 选择Widget&#xff1a; 选择类名&#xff08;生成.h、.cpp、.ui文件&#xff09; 在smallWidget.ui中使用Spin Box和Horizontal Slider控件 可以自定义数字区间&#xff1a; 在主窗口w…