Difference-in-Differences (DiD) for Causal Effect Estimation
Skill-DiD-Difference-in-Differences · 01-因果推断
causalexperimentforecastingpricing广告与投放定价与利润WF-B 广告优化WF-F 动态定价WF-G Listing内容优化
年化 ROI50万
实现难度⭐⭐☆☆☆
业务优先级⭐⭐☆☆☆
业务视角
适用角色增长负责人 / CMO · 数据分析师 · 广告优化师
适用平台Amazon · TikTok Shop · Meta Ads · DTC 独立站
什么情况下用广告预算花了,但不确定哪个渠道真的带来新客;做了大促,不知道销量增长是促销效果还是季节规律
成功是什么样的能区分「真实增量」和「自然购买」,砍掉虚假归因渠道后同等预算 ROI 提升 20-40%
业务痛点
1. 解决的问题
核心思想:利用处理组和对照组在政策/干预前后的变化差异来估计因果效应。基本逻辑是:如果没有干预,处理组的趋势应该与对照组平行(平行趋势假设)。干预后的实际差异减去趋势差异,就是干预的净效应。
2. 核心算法逻辑
核心思想:利用处理组和对照组在政策/干预前后的变化差异来估计因果效应。基本逻辑是:如果没有干预,处理组的趋势应该与对照组平行(平行趋势假设)。干预后的实际差异减去趋势差异,就是干预的净效应。
3. 业务应用场景
业务问题:2025年美国对中国产婴儿推车加征25%关税。团队需要评估:关税究竟导致销量下降了多少?是自然的市场波动,还是关税的直接影响?
应用流程: 1. 定义处理组和对照组: - 处理组:销往美国的婴儿推车(受关税影响) - 对照组:销往加拿大/英国的婴儿推车(未受关税影响) 2. 定义时间窗口: - 干预前:2024年6月-2025年5月(12个月) - 干预后:2025年6月-2026年5月(12个月) 3. 检验平行趋势:事件研究法,看干预前12个月处理组和对照组的趋势是否平行 4. 估计DiD效应:计算交互项系数
预期产出: - 关税导致的销量下降幅度(如:月均销量下降 18%,其中 12% 可归因于关税) - 事件研究图:干预前后各月的动态效应 - 稳健性检验:安慰剂检验、替换对照组
4. 输入数据要求
请查看原始代码模板获取输入规格。
5. 输出结果
请查看原始代码模板获取输出规格。
6. 业务价值 / ROI
- 数据要求:需要处理组和对照组在干预前后的面板数据
- 技术门槛:低,核心是OLS回归
- 主要挑战:平行趋势假设的检验和满足(需要领域知识选择合理的对照组)
- 必要性极高:跨境电商面临大量外部政策冲击(关税、平台规则、物流变化),DiD是最自然的评估工具
- 通用性强:几乎所有"自然实验"场景都适用
- 实施成本低:不需要实验数据,利用现有历史数据即可
7. 代码模板
代码块数量:1 · 路径:未检测到
"""
Difference-in-Differences (DiD) — 双重差分因果效应估计
用于评估政策/干预对母婴出海业务的因果影响
支持:经典DiD、Staggered DiD(Callaway-Sant'Anna)、事件研究法
"""
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
import warnings
warnings.filterwarnings('ignore')
# ==================== DiD 核心实现 ====================
class DifferenceInDifferences:
"""双重差分估计器"""
def __init__(self, method='classic'):
"""
初始化 DiD 估计器
Args:
method: 'classic' 或 'staggered'
"""
self.method = method
self.model = None
self.tau = None
self.se = None
self.event_study_results = None
def fit(self, df, unit_col, time_col, treat_col, post_col, outcome_col,
covariates=None, cluster_col=None):
"""
拟合 DiD 模型
Args:
df: DataFrame
unit_col: 单元标识列(如店铺ID、国家)
time_col: 时间列
treat_col: 处理标志列(1=处理组,0=对照组)
post_col: 干预后标志列(1=干预后,0=干预前)
outcome_col: 结果变量列(如销量、转化率)
covariates: 协变量列表(可选)
cluster_col: 聚类标准误的聚类变量(可选)
"""
df = df.copy()
# 创建交互项
df['treat_post'] = df[treat_col] * df[post_col]
# 构建特征矩阵
feature_cols = [treat_col, post_col, 'treat_post']
if covariates:
feature_cols.extend(covariates)
X = df[feature_cols].values
y = df[outcome_col].values
8. 论文来源
未自动抽取;请查看原始 Skill 卡片。