双重差分因果分析

作者:鹿Sir学术研究v1

双重差分(DiD)因果分析工具。识别行为变化的人口统计学驱动因素,带 p 值显著性检验,支持集约边际与扩展边际两种口径,按样本量自动选择多变量或单变量回归。适用于活动效果评估、A/B 测试分析、政策效果评价等因果推断场景。触发词:双重差分、DiD、因果分析、因果推断、A/B 测试分析、政策评估、事件效果分析。

下载量
397
点赞
97
价格
免费

技能文档

---
name: benchflow-ai-did-causal-analysis
description: 双重差分(DiD)因果分析工具。识别行为变化的人口统计学驱动因素,带 p 值显著性检验,支持集约边际与扩展边际两种口径,按样本量自动选择多变量或单变量回归。适用于活动效果评估、A/B 测试分析、政策效果评价等因果推断场景。触发词:双重差分、DiD、因果分析、因果推断、A/B 测试分析、政策评估、事件效果分析。
title: 双重差分因果分析
category: 学术研究
---

# 双重差分(DiD)因果分析框架

基于双重差分法的因果推断框架,按样本量自动选择多变量或单变量回归方法,输出各特征的 DiD 估计值与 p 值。

## 方法论

### 集约边际(Intensive Margin)

- **定义**:参与者行为变化了多少(连续型结果)
- **数据结构**:稀疏数据——仅包含实际参与过的实体(如发生过购买的记录)
- **结果变量**:连续型(如每购买者的消费金额)
- **关键点**:不要把未参与者补零纳入,也不要构造完整网格——只分析实际参与者

### 扩展边际(Extensive Margin)

- **定义**:有多少人改变了行为(0/1 二元结果)
- **数据结构**:完整面板——所有实体 × 所有时期(包含未参与者)
- **结果变量**:二元(0/1 表示是否参与)
- **关键点**:必须包含未参与者才能度量参与率变化

### 回归方法

两种口径均使用 `Y = α + βX + γPost + δ(X × Post) + ε`,其中 δ 即 DiD 估计值。

**多变量异质 DiD**:一次回归同时估计所有特征,控制特征间混淆;用于 `n ≥ k × min_sample_ratio`(默认最少 1 万样本)。

**单变量 DiD**:每个特征单独回归;小样本下更稳健;样本不足时自动降级使用。

两种方法均基于 statsmodels 回归,提供 p 值做统计推断。

## ⚠️ 关键:数据准备要求

### 集约边际——仅参与者(稀疏数据)

```python
# 只聚合实际发生的交易
intensive_df = transactions.groupby(['entity_id', 'period'])['value'].sum().reset_index()
```

把未参与者补零会稀释效应并改变研究问题。

### 扩展边际——完整面板(所有用户)

```python
from itertools import product
all_entities = entities_df['entity_id'].unique()
all_groups = target_groups  # 如品类、地区、产品
all_periods = ['baseline', 'treatment']

complete_grid = pd.DataFrame(
    list(product(all_entities, all_groups, all_periods)),
    columns=['entity_id', 'period']
)

# 标记是否参与(1/0)
events_lookup = transactions[['entity_id', 'period']].drop_duplicates()
events_lookup['participated'] = 1

extensive_df = complete_grid.merge(events_lookup, how='left')
extensive_df['participated'] = extensive_df['participated'].fillna(0).astype(int)
```

扩展边际度量参与率是否上升,必须同时知道谁参与了、谁没参与。

## 技能工作流

### 步骤1:明确研究问题

确认要评估的事件/干预、基线期与处理期划分,以及关心的是「参与者变化多少」(集约边际)还是「参与率变化」(扩展边际)或两者。

### 步骤2:准备数据

按上述口径构造稀疏数据或完整面板,整理人口统计学特征列(如年龄段、地区、品类)。

### 步骤3:运行分析

```python
from scripts.did_analysis import DIDAnalyzer

analyzer = DIDAnalyzer(min_sample_ratio=10, significance_level=0.05, min_group_size=1)
results = analyzer.intensive_margin(df, features=['age_group', 'region'], value_col='amount')
# 或扩展边际:
results = analyzer.extensive_margin(df, features=['age_group', 'region'], value_col='purchased')
```

构造参数:

- `min_sample_ratio=10`:多变量 DiD 的样本量/特征数比阈值
- `significance_level=0.05`:p 值显著性阈值(按研究情境可取 0.05-0.1)
- `min_group_size=1`:单变量 DiD 每组最小观测数

### 步骤4:解读结果

返回格式:`{"feature": str, "did_estimate": float, "p_value": float, "method": str}` 列表。

- `did_estimate`:该特征对应群体的行为变化差异(因果效应估计)
- `p_value`:显著性水平;`method` 标明所用回归方法
- 按 `estimate` 或 `p_value` 排序(`sort_by` 参数),`top_n` 控制输出特征数

## 注意事项

- DiD 的核心假设是平行趋势,结果解读前应检查基线期两组趋势是否平行
- 显著性结论应结合效应量与业务情境,避免只看 p 值

使用说明

# 双重差分因果分析

DiD 因果推断工具:识别行为变化的人口统计学驱动因素,带 p 值显著性检验,按样本量自动选择多变量/单变量回归。

## 用法示例

```python
from scripts.did_analysis import DIDAnalyzer

analyzer = DIDAnalyzer()
results = analyzer.intensive_margin(df, features=['age_group'], value_col='amount')
# 或扩展边际(完整面板):
results = analyzer.extensive_margin(df, features=['age_group'], value_col='purchased')
```

依赖:pandas、numpy、statsmodels。适用于活动效果评估、A/B 测试、政策效果评价。

如何安装此技能?

访问技能市场,点击「安装」按钮,按提示将技能包放入 AI 编程助手的 skills 目录即可。

浏览技能市场

支持平台:Qoder · QoderWork · Claude · Codex 等 AI 编程助手