Workflow / 工具选型
Python vs Stata / R / Excel / SQL / SAS:优劣与按研究任务选型
选型不是"哪个语言更好",而是把每种工具放回它最擅长的研究环节:数据工程、成熟计量、统计建模、数据库取数、机器学习与自动化。这一页给出一套可操作的"按任务对号入座"决策框架,并落到社科因果推断的实际工作流。
原理图解
一图看懂原理
先看这里
学完这一页你应该会什么
能从数据规模、方法成熟度、可复现性、自动化生态四个维度比较 Python / Stata / R / Excel / SQL / SAS。
知道成熟的因果计量(DiD / IV / RD / SCM)在 Stata / R 里往往"一条命令 + 完善的稳健标准误",而前沿 ML 因果(DML / 因果森林 / 深度学习因果)在 Python 生态更全。
理解为什么 Excel 适合小核对、不适合可复现分析;为什么大数据取数应交给 SQL。
能为一个具体研究项目画出"任务 → 工具"的分工图,并说明每段为什么这样选。
学习路径
动画:任务 → 工具的分工流
把一个实证项目拆成五个环节,看每个环节最该交给谁。
Step 1
取数
数据库 / 大表 → SQL 在库内过滤聚合。
SQL
Step 2
采集
网页 / API / 文本 → Python(requests / BeautifulSoup)。
Python
Step 3
清洗
合并 / 重塑 / 缺失 / 正则 → pandas 或 tidyverse。
pandas / R
Step 4
识别
成熟因果计量(DiD / IV / RD / SCM)→ Stata / R。
Stata / R
Step 5
前沿 + 自动化
DML / 因果森林 / 深度因果与 Agent 自动化 → Python。
Python
01 / 直觉
核心直觉
工具的"优劣"离不开任务:同一个回归,statsmodels、Stata 的 reg、R 的 lm 都能跑;但要做聚类稳健标准误、固定效应、面板、IV 的成熟实现与默认稳健性,Stata / R 的计量生态更省心。
Python 的真正优势在"数据进来之前"和"计量之后":网络爬虫 / API、文本与非结构化数据、机器学习、可复现脚本,以及让 Agent 串起整条研究链路。
可复现性比语言更重要:能从原始数据 + 脚本一键重跑的 R / Python 流程,胜过在 Excel 里手工点出来的"漂亮但无法追溯"的结果。
02 / 数学
"按任务对号入座"的选型框架
01 / 数据规模与来源
几十万行以内的本地文件,三种语言都从容;上亿行或要从数据库取,先用 SQL 在库内过滤聚合,再把小样本拉进 Python / R。Excel 一般几十万行就开始卡且难复现。
data in DB / >1e7 rows → SQL 先聚合 → Python / R 再分析02 / 数据工程(采集 / 清洗 / 文本)
爬虫、API、正则、非结构化文本、合并与重塑大表——Python(requests / BeautifulSoup / pandas)生态最完整,R 的 tidyverse 也很强,Stata 偏弱。
scraping / API / text / reshape → Python ≳ R ≫ Stata03 / 成熟因果计量
DiD(含异质性稳健估计量)、IV、RD、合成控制等在 Stata(reghdfe / did / rdrobust / synth)与 R(fixest / did / rdrobust)里命令成熟、标准误默认稳健、与文献对齐。
DiD / IV / RD / SCM(一条命令 + 稳健 SE)→ Stata ≈ R04 / ML 与前沿因果 / 深度学习
DML、因果森林、DeepIV / Dragonnet / TARNet 等以 Python(scikit-learn / econml / pytorch)生态最全;R 有 grf 等亮点。
DML / 因果森林 / 深度因果 → Python ≳ R05 / 自动化与 AI / Agent
MCP、Skills、StatsPAI、Paper-WorkFlow 等把整条研究链路自动化,几乎都以 Python 为粘合层;这也是为什么"最后都要会一点 Python"。
Agent / MCP / 自动化科研 → Python(粘合层)03 / 代码
代码案例:同一个回归,三种工具的对照
下面用 Python 跑一个最小的交互项回归,并在注释里给出 Stata 与 R 的等价命令,说明"能跑"不等于"最省心"。
案例 1:大数据先用 SQL 在库内聚合,再拉进 Python
当原始数据在数据库且行数巨大时,不要把全表拉进内存。先用 SQL 过滤、聚合到研究单元,再用 pandas 分析。
import pandas as pd
import sqlite3
# in-memory demo: build a tiny "firm panel", then aggregate IN the database
con = sqlite3.connect(":memory:")
pd.DataFrame({
"province": ["AH", "AH", "AH", "ZJ", "ZJ"],
"year": [2010, 2010, 2011, 2010, 2011],
"employment": [50, 66, 71, 90, 88],
}).to_sql("firm_panel", con, index=False)
query = """
SELECT province, year,
AVG(employment) AS mean_emp,
COUNT(*) AS n_firms
FROM firm_panel
WHERE year BETWEEN 2010 AND 2020
GROUP BY province, year
"""
panel = pd.read_sql(query, con)
print(panel)预期输出
province year mean_emp n_firms
0 AH 2010 58.0 2
1 AH 2011 71.0 1
2 ZJ 2010 90.0 1
3 ZJ 2011 88.0 1怎么读这段代码
- SQL 在库内完成过滤与聚合,只把"省—年"面板拉进内存。
- 同样的事在 Excel 里几乎不可能,在纯 pandas 里要先读全表、很吃内存。
- 取数与分析分层:SQL 管"取",Python 管"算与建模"。
案例 2:成熟计量在 Stata / R 里往往是"一条命令"
高维固定效应 + 聚类稳健标准误的 DiD,是 Stata / R 计量生态的主场;Python 也能做,但要更显式地拼装固定效应与方差类型。
import numpy as np
import pandas as pd
import statsmodels.formula.api as smf
rng = np.random.default_rng(0)
n = 300
df = pd.DataFrame({
"firm": rng.integers(0, 30, n),
"year": rng.integers(2010, 2020, n),
"treat": rng.integers(0, 2, n),
"post": rng.integers(0, 2, n),
})
df["y"] = 1 + 1.2 * (df.treat * df.post) + 0.3 * (df.firm % 5) + rng.normal(size=n)
# Stata (one line): reghdfe y i.treat##i.post, absorb(firm year) cluster(firm)
# R/fixest (one line): feols(y ~ treat*post | firm + year, cluster = ~firm, df)
# Python: spell out fixed effects as factors + cluster-robust SE
m = smf.ols("y ~ treat*post + C(firm) + C(year)", data=df).fit(
cov_type="cluster", cov_kwds={"groups": df["firm"]})
print(round(float(m.params["treat:post"]), 3))预期输出
1.214怎么读这段代码
- Stata 的 reghdfe、R 的 fixest 把"高维固定效应 + 聚类稳健标准误"做成一行,默认就对。
- Python 能得到同样的点估计,但你要显式写出固定效应(C(firm)+C(year))并指定 cluster 方差。
- 结论:把成熟、文献对齐的计量交给 Stata / R,常常比在 Python 手工复刻更稳、更省时间。
04 / 案例
案例:一个混合工作流的研究项目分工
- 场景:评估某地区产业补贴政策对企业就业的影响,原始数据来自企业数据库、政策公告网页与统计年鉴。
- 取数与采集:用 SQL 从企业库拉"省—年—行业"面板,用 Python(requests / BeautifulSoup)抓政策公告与统计年鉴文本。
- 清洗与变量构造:用 pandas 合并多来源、处理缺失与重复,用正则从公告文本抽取政策时点与强度。
- 识别与估计:用 Stata / R 跑交错 DiD(现代稳健估计量)+ 事件研究 + 稳健性;前沿异质性用 Python 的 econml 做 DML / 因果森林。
- 自动化与产出:用 Agent(MCP / Skills / StatsPAI)把"取数 → 清洗 → 估计 → 稳健性 → 出表"串成可一键重跑的流程,最后只在 Excel 里做小范围人工核对。
05 / 因果
把工具选型接回因果识别工作流
工具选型不是因果方法的替代,而是为同一套识别假设服务:每个环节选对工具,能让"测量—识别—估计—稳健性"这条链路更可靠、更可复现。
01 / 测量与数据工程(Python / SQL)
用 Python 抓取并用正则 / LLM 从文本构造处理变量与协变量,用 SQL 在库内构造研究单元——这是识别之前的"测量"环节。
raw → SQL/Python → 处理 D, 结果 Y, 协变量 X02 / 识别与估计(Stata / R)
把构造好的变量送进 DiD / IV / RD / SCM 的成熟命令,拿到与文献对齐、默认稳健的标准误。
D, Y, X → reghdfe / fixest / rdrobust → tau-hat03 / nuisance 与异质性(Python)
DML / 因果森林把高维协变量的预测交给 ML,但识别仍来自设计;Python 的 econml / grf 生态最全。
theta 由正交矩条件识别;ML 只负责 nuisance三条红线:(1) 工具的便利不能反过来决定识别策略——先有可信的设计,再选实现它的工具;(2) 不论用哪种语言,结果都要能从原始数据 + 脚本一键重跑;(3) 跨工具传数据时盯紧变量定义、缺失与单位,避免"换了语言就换了样本"。
06 / 风险
常见误区
参考资料
- Wickham et al. (2019), Welcome to the tidyverse, Journal of Open Source Softwarehttps://doi.org/10.21105/joss.01686
- Harris et al. (2020), Array programming with NumPy, Naturehttps://doi.org/10.1038/s41586-020-2649-2
- Cunningham (2021), Causal Inference: The Mixtape (Stata & R code)https://mixtape.scunning.com/
- Huntington-Klein (2022), The Effect (R, Stata, and Python examples)https://theeffectbook.net/
- Stata Documentation, Features and estimatorshttps://www.stata.com/features/