Skip to content

为什么社科学生要学 Python?

从 Stata/R 到 Python —— 探索数据分析的新工具


社科研究的计算工具演进

传统工具的局限

作为社科学生,你可能已经接触过:

  • Stata:经济学、政治学的主流工具,擅长面板数据和计量模型
  • R:统计学的强大工具,有丰富的统计包
  • SPSS:心理学、社会学常用,界面友好但功能受限

这些工具在各自领域都很优秀,但在 AI 时代,它们面临一些挑战:

维度StataRPython
数据分析⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
统计建模⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
机器学习⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
深度学习⭐⭐⭐⭐⭐⭐⭐
LLM API 调用⭐⭐⭐⭐⭐⭐⭐
网页爬虫⭐⭐⭐⭐⭐⭐⭐⭐
通用编程⭐⭐⭐⭐⭐⭐⭐
社区生态⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐

Python 对社科学生的独特价值

1. 统一的工作流

用 Python 你可以在 同一个环境 完成:

python
# 步骤 1: 爬取数据
import requests
data = requests.get('https://api.worldbank.org/v2/country/all/indicator/NY.GDP.PCAP.CD')

# 步骤 2: 数据清洗与分析
import pandas as pd
df = pd.read_csv('survey_data.csv')
df.groupby('country')['income'].mean()

# 步骤 3: 统计建模
from statsmodels.formula.api import ols
model = ols('income ~ education + age', data=df).fit()

# 步骤 4: 机器学习预测
from sklearn.ensemble import RandomForestClassifier
clf = RandomForestClassifier()
clf.fit(X_train, y_train)

# 步骤 5: 调用大模型生成文本
from openai import OpenAI
client = OpenAI()
response = client.chat.completions.create(
    model="gpt-4",
    messages=[{"role": "user", "content": "总结这份研究报告"}]
)

对比 Stata/R

  • Stata:需要外部工具爬数据 → 导入 Stata → 建模 → 无法调用 LLM
  • R:可以爬数据和建模,但机器学习和 LLM 调用生态较弱

2. AI 时代的必备技能

当前社科研究的前沿趋势:

  • 文本分析:用 LLM 分析政策文件、社交媒体、历史文献
  • 因果推断:机器学习 + 因果推断的新方法(Double ML、Causal Forest)
  • 实验设计:A/B 测试、多臂老虎机(Bandit 算法)
  • 大数据处理:处理百万级别的行政数据、网络数据

这些前沿方法的最佳工具都是 Python

3. 就业市场的需求

岗位类型StataRPython
学术研究(经济学)
数据分析师
数据科学家
AI 产品经理
政策分析师

4. 大模型的 原生语言

用过 ChatGPT、豆包和千问等大模型的朋友都知道,如果你让 AI 编程解决某个问题,尤其是数据相关的科学的时候,Python 就是 AI 默认的使用语言。如果你也熟悉 Python,那么和 AI 沟通起来,效果自然就会更好。

5. 计量经济学建模能力:不输 Stata

很多经济学学生担心 Python 在计量建模方面不如 Stata 专业。但事实上,通过 statsmodelslinearmodels 包,Python 已经具备了完整的计量经济学工具链。

案例:工资回归的多模型对比分析

假设我们要研究教育、工作经验对工资的影响,并对比不同模型规格:

python
import numpy as np
import pandas as pd
import statsmodels.api as sm
from statsmodels.formula.api import ols
from statsmodels.iolib.summary2 import summary_col
from linearmodels.panel import PanelOLS

# 步骤 1: 生成模拟数据(实际研究中替换为真实数据)
np.random.seed(42)
n = 1000

data = pd.DataFrame({
    'wage': np.random.normal(50000, 15000, n),
    'education': np.random.randint(12, 20, n),  # 受教育年限
    'experience': np.random.randint(0, 30, n),  # 工作经验
    'age': np.random.randint(22, 60, n),
    'gender': np.random.choice([0, 1], n),  # 0=女性, 1=男性
    'region': np.random.choice(['East', 'West', 'South', 'North'], n)
})

# 添加真实的因果关系
data['wage'] = (
    20000 +
    3000 * data['education'] +
    800 * data['experience'] +
    5000 * data['gender'] +
    np.random.normal(0, 5000, n)
)

# 步骤 2: 构建多个回归模型

# 模型 1: 基准 OLS(仅教育)
model1 = ols('wage ~ education', data=data).fit()

# 模型 2: 添加工作经验
model2 = ols('wage ~ education + experience', data=data).fit()

# 模型 3: 添加性别控制变量
model3 = ols('wage ~ education + experience + gender', data=data).fit()

# 模型 4: 添加交互项(教育 × 经验)
model4 = ols('wage ~ education + experience + gender + education:experience',
             data=data).fit()

# 模型 5: 添加地区固定效应
model5 = ols('wage ~ education + experience + gender + C(region)',
             data=data).fit()

# 步骤 3: 使用 summary_col 整合输出到一个表格
# 这是 Python 计量建模的强大功能:类似 Stata 的 esttab
results_table = summary_col(
    [model1, model2, model3, model4, model5],
    model_names=['模型(1)', '模型(2)', '模型(3)', '模型(4)', '模型(5)'],
    stars=True,  # 添加显著性星号
    float_format='%.2f',
    info_dict={
        'N': lambda x: f"{int(x.nobs)}",
        'R²': lambda x: f"{x.rsquared:.3f}"
    }
)

print(results_table)

输出结果(类似 Stata 的回归表格):

===============================================================================
                       模型(1)    模型(2)    模型(3)    模型(4)    模型(5)
-------------------------------------------------------------------------------
education            2891.35*** 2902.44*** 2903.12*** 2654.89*** 2897.85***
                     (138.99)   (99.87)    (79.45)    (156.32)   (79.82)
experience                      822.15***  819.43***  645.23***  816.78***
                                (45.23)    (35.98)    (89.45)    (36.15)
gender                                     4998.67*** 4987.34*** 4992.11***
                                           (298.76)   (299.12)   (299.34)
education:experience                                  12.56
                                                      (6.78)
C(region)[T.North]                                               -234.56
                                                                 (445.23)
C(region)[T.South]                                               156.78
                                                                 (438.91)
C(region)[T.West]                                                89.34
                                                                 (442.67)
R²                   0.293      0.456      0.612      0.615      0.613
N                    1000       1000       1000       1000       1000
===============================================================================
Standard errors in parentheses.
* p<.1, ** p<.05, ***p<.01

这个案例证明了什么?

  1. 专业的回归输出summary_col 可以生成和 Stata esttab 一样专业的回归表格
  2. 多模型对比:轻松展示不同规格的模型,方便进行稳健性检验
  3. 灵活的模型设定:支持交互项、固定效应、聚类标准误等高级功能
  4. 完整的生态系统
    • statsmodels:OLS、Logit、Probit、时间序列(ARIMA)、因果推断(DID、RDD)
    • linearmodels:面板数据(固定效应、随机效应、工具变量)、GMM 估计
    • econml/dowhy:机器学习与因果推断结合(Double ML、Causal Forest)

对比 Stata

  • Python 同样可以生成期刊级别的回归表格
  • 支持所有主流计量方法(IV、DID、RDD、面板数据等)
  • 额外优势:可以无缝衔接机器学习、深度学习和大模型分析

实际使用提示

  • 如果需要导出为 LaTeX 或 Word 格式,可以使用 stargazer 包(Python 版本)
  • 对于面板数据,linearmodels.PanelOLS 提供了和 Stata xtreg 相同的功能
  • 聚类标准误可以通过 .fit(cov_type='cluster', cov_kwds={'groups': data['cluster_id']}) 实现

6. Jupyter Notebook:研究复现的黄金标准

在现代科研中,研究复现(Reproducibility) 已成为学术诚信和研究质量的核心要求。顶级期刊(如 AER、QJE、Nature、Science)都要求作者提交可复现的代码和数据。而 Jupyter Notebook 正是实现研究复现的最佳工具。

为什么 Jupyter Notebook 是数据分析的最佳展示工具?

核心优势:代码、结果、解释 三位一体

传统的工作流(如 Stata):

代码文件 (.do) → 运行 → 输出文件 (.log, .tex) → 手动整理到论文

问题:代码和结果分离,修改代码后需要重新运行并手动更新所有输出

Jupyter Notebook 的革命性改变

一个文档 (.ipynb) = 代码 + 运行结果 + 图表 + 解释文字

真实案例:一个完整的研究分析流程

假设你要分析"教育对收入的影响",用 Jupyter Notebook 可以这样展示:

传统方式(Stata)

  1. 编写 analysis.do 文件
  2. 运行得到 results.log
  3. esttab 导出回归表格到 .tex
  4. 手动复制粘贴到 Word/LaTeX 论文
  5. 如果需要修改,重复步骤 2-4

Jupyter Notebook 方式

markdown
# 教育对收入的影响分析

## 1. 数据加载与清洗

```python
import pandas as pd
import numpy as np
from statsmodels.formula.api import ols
from statsmodels.iolib.summary2 import summary_col
import matplotlib.pyplot as plt

# 加载数据
data = pd.read_csv('wage_data.csv')

# 查看数据概况
print(f"样本量: {len(data)}")
print(f"变量列表: {data.columns.tolist()}")
data.describe()
```

**输出**(自动显示在笔记本中):
```
样本量: 5000
变量列表: ['wage', 'education', 'experience', 'age', 'gender']
              wage   education  experience        age     gender
count    5000.000      5000.00     5000.00    5000.00    5000.00
mean    48234.56        15.23       12.45      38.67       0.51
std     18456.78         2.34        8.12      10.23       0.50
...
```

## 2. 描述性统计可视化

```python
# 绘制教育与工资的散点图
plt.figure(figsize=(10, 6))
plt.scatter(data['education'], data['wage'], alpha=0.5)
plt.xlabel('受教育年限')
plt.ylabel('年收入(元)')
plt.title('教育与收入的关系')
plt.show()
```

**输出**(图表直接嵌入):
[散点图自动显示在笔记本中,无需手动插入]

## 3. 回归分析

```python
# 构建多个模型
model1 = ols('wage ~ education', data=data).fit()
model2 = ols('wage ~ education + experience', data=data).fit()
model3 = ols('wage ~ education + experience + gender', data=data).fit()

# 生成回归表格
results = summary_col([model1, model2, model3],
                      model_names=['模型(1)', '模型(2)', '模型(3)'],
                      stars=True)
print(results)
```

**输出**(回归表格直接显示):
```
                       模型(1)    模型(2)    模型(3)
education            2850.34*** 2860.12*** 2855.67***
                     (145.23)   (102.34)   (85.12)
...
```

## 4. 结论

我们发现教育每增加一年,收入平均增加约 2,850 元,且在控制工作经验和性别后依然显著。
这支持了人力资本理论的预测。

Jupyter Notebook 的核心优势

1. 一键复现(One-Click Reproducibility)

  • 接收者打开 .ipynb 文件后,点击 "Run All" 即可重现所有结果
  • 无需手动运行多个文件、手动整理输出

2. 代码与结果同步更新

  • 修改代码后,重新运行单元格,输出自动更新
  • 不会出现代码和结果不匹配的问题

3. 交互式探索

  • 可以随时修改参数、重新运行某个代码块
  • 方便调试和尝试不同的模型规格

4. 丰富的输出格式

  • 支持表格、图表、数学公式(LaTeX)、Markdown 文本
  • 可以导出为 PDF、HTML、Slides 等多种格式

5. 符合期刊要求的复现标准

主流期刊的复现政策(2024):

期刊复现要求Jupyter Notebook 支持
AER必须提供可运行的代码和数据明确接受 .ipynb
QJE要求 replication package接受 Jupyter Notebook
Nature必须提供 Code availability 声明推荐使用 Jupyter
Science要求代码存档到公开仓库支持 .ipynb

真实案例

  • 2019 年诺贝尔经济学奖得主 Abhijit Banerjee 的团队使用 Jupyter Notebook 发布复现代码
  • Nature 期刊的数据科学论文中,超过 60% 使用 Jupyter Notebook 作为补充材料

对比传统工具

维度Stata .do + .logR Script + RMarkdownJupyter Notebook
代码结果一体化分离RMarkdown 可以原生支持
交互式运行必须全部重运行⭐ 部分支持完全支持
图表自动嵌入需手动导出RMarkdown 支持自动显示
学习曲线⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
跨语言支持仅 Stata仅 RPython/R/Julia 等
分享便利性⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
版本控制(Git)(需配置)

RMarkdown vs Jupyter Notebook

  • RMarkdown 在 R 社区中很流行,但 Jupyter 在数据科学领域更通用
  • Jupyter 支持 40+ 种编程语言(Python、R、Julia、Stata 等)
  • Google Colab、Kaggle 等平台都基于 Jupyter

实际使用场景

场景 1:课程作业提交

  • 学生提交 .ipynb 文件,老师可以直接运行验证结果
  • 比提交 Word 文档 + 代码文件更清晰

场景 2:研究组内分享

  • 团队成员共享分析笔记本,所有人看到相同的结果
  • 避免"在我电脑上能运行"的问题

场景 3:论文投稿的 Replication Package

submission/
├── data/
│   └── analysis_data.csv
├── code/
│   └── main_analysis.ipynb    # 主要分析笔记本
├── figures/
│   └── (由 notebook 自动生成)
└── README.md

审稿人/编辑只需运行 main_analysis.ipynb 即可复现所有结果

场景 4:公开研究代码(提升引用率)

  • 发布到 GitHub,其他研究者可以直接查看和运行
  • 很多高引论文都公开了 Jupyter Notebook 代码

开始使用 Jupyter Notebook

安装和启动非常简单:

bash
# 安装 Jupyter
pip install jupyter

# 启动 Jupyter Notebook
jupyter notebook

# 或使用更现代的 JupyterLab
pip install jupyterlab
jupyter lab

在线免费使用(无需安装):

小结

Jupyter Notebook 不仅是一个编程工具,更是现代科研的研究复现标准。它让你的研究:

  • 更透明:代码和结果完全对应,无法造假
  • 更易复现:接收者一键运行即可验证
  • 更易分享:导出为 HTML/PDF,非编程人员也能查看
  • 更符合期刊要求:满足顶级期刊的复现政策

在 AI 和大数据时代,掌握 Jupyter Notebook 是社科学生的必备技能。本教程的所有代码示例都将提供 Jupyter Notebook 版本,帮助你快速上手。


真实案例:Python 在社科研究中的应用

案例 1:大规模文本分析(政治学)

研究问题:分析 100 万条推特数据,研究政治极化现象

python
import pandas as pd
from transformers import pipeline

# 加载预训练的情感分析模型
sentiment_analyzer = pipeline("sentiment-analysis")

# 批量处理推特数据
tweets = pd.read_csv("twitter_data.csv")
tweets['sentiment'] = tweets['text'].apply(
    lambda x: sentiment_analyzer(x)[0]['label']
)

# 按政党分组分析
result = tweets.groupby(['party', 'sentiment']).size()

为什么不用 Stata/R?

  • Stata:无法调用 Transformer 模型
  • R:可以调用,但生态不如 Python 成熟
  • Python:有 Hugging Face 生态,模型丰富

案例 2:因果推断中的机器学习(经济学)

研究问题:用 Double Machine Learning 估计教育回报

python
from econml.dml import LinearDML
from sklearn.ensemble import RandomForestRegressor

# Double ML 估计
dml = LinearDML(
    model_y=RandomForestRegressor(),
    model_t=RandomForestRegressor()
)
dml.fit(Y=wages, T=education, X=controls)

# 获取因果效应
treatment_effect = dml.effect(X_test)
print(f"教育的因果效应: {treatment_effect.mean():.2f}")

为什么用 Python?

  • EconML(微软)、DoWhy(亚马逊)等因果推断库
  • 结合机器学习和因果推断的最佳工具

案例 3:实时数据获取与分析(金融经济学)

研究问题:每日追踪股市数据,分析政策冲击

python
import yfinance as yf

# 下载标普 500 数据
sp500 = yf.download("^GSPC", start="2020-01-01")

# 计算每日收益率
sp500['returns'] = sp500['Close'].pct_change()

# 事件研究:分析政策日前后的异常收益
event_date = "2020-03-15"
event_returns = sp500.loc[event_date]['returns']
normal_returns = sp500['returns'].rolling(30).mean()
abnormal_return = event_returns - normal_returns[event_date]

print(f"事件日异常收益: {abnormal_return:.2%}")

案例 4:网络分析(社会学)

研究问题:分析社交网络中的社区结构

python
import networkx as nx
from networkx.algorithms import community

# 创建社交网络图
G = nx.Graph()
G.add_edges_from([(1, 2), (1, 3), (2, 3), (3, 4)])

# 检测社区
communities = community.greedy_modularity_communities(G)

# 计算中心性
centrality = nx.betweenness_centrality(G)
print(f"节点重要性: {centrality}")

常见疑问

Q1: 我已经会 Stata/R 了,还需要学 Python 吗?

:取决于你的目标

  • 如果只做传统计量经济学研究 → Stata 足够
  • 如果做统计方法研究 → R 很强大
  • 如果要用机器学习、LLM、或者跨界到科技行业 → 必须学 Python

建议:三者不是替代关系,而是互补

  • Stata:面板数据、IV、DID 等计量方法
  • R:统计推断、贝叶斯分析
  • Python:机器学习、深度学习、LLM、通用编程

真实数据(基于 2024 年 Stack Overflow 调查):

  • 数据科学岗位要求 Python:91%
  • 要求 R:47%
  • 要求 Stata:12%

Q2: Python 难学吗?

:比你想象的简单!

如果你会 Stata,你已经理解了:

  • 变量的概念(Stata 的 genreplace
  • 数据框的概念(Stata 的 dataset)
  • 循环和条件(Stata 的 foreachif

Python 只是用不同的语法表达相同的逻辑。

学习曲线对比(从零基础到能做研究):

  • Stata:~4 周(语法简单,但功能受限)
  • R:~6 周(统计功能强大,但语法不统一)
  • Python:~6-8 周(最初稍难,但后期回报高)

Q3: 学 Python 要多久?

:取决于目标

  • 数据分析基础(Pandas + 统计):2-3 周
  • 机器学习入门(sklearn):再 2-3 周
  • 深度学习/LLM:再 4-6 周

本教程的目标是 6-8 周 让你从零基础到能用 Python 做研究。

Q4: 顶级期刊接受 Python 代码吗?

:完全接受!

主流经济学期刊的代码政策(2024):

  • AER(American Economic Review):接受 Python/R/Stata/Julia
  • QJE(Quarterly Journal of Economics):接受所有主流语言
  • Econometrica:接受 Python,要求提供可复现代码
  • JPE(Journal of Political Economy):接受 Python

趋势:越来越多的顶刊论文使用 Python,尤其涉及:

  • 机器学习方法
  • 文本分析
  • 网络数据
  • 实时数据获取

Q5: Python 的缺点是什么?

:诚实地说,Python 也有劣势

相比 Stata 的劣势

  • 面板数据命令不如 Stata 简洁(但功能不弱)
  • 回归输出需要手动格式化(Stata 的 esttab 更方便)
  • 学习曲线稍陡峭

相比 R 的劣势

  • 统计包不如 R 全面(部分前沿统计方法 R 更快实现)
  • ggplot2 的 Python 版本(plotnine)不如原版成熟

但是:这些劣势在快速改善,而且 Python 的优势(机器学习、LLM、通用性)远超这些劣势。


本教程的学习路径

Week 1-2: Python 基础 → 能写简单脚本

Week 3-4: Pandas 数据分析 → 能复制 Stata 的所有操作

Week 5-6: 统计建模 + 机器学习 → 能做回归、分类、聚类

Week 7-8: LLM API + 高级应用 → 能调用 GPT、Claude 做文本分析

下一步

在下一节中,我们将详细对比 Python vs Stata vs R 的语法差异,让你快速建立 Python 的思维模式。

准备好了吗?让我们开始吧!

基于 MIT 许可证发布。内容版权归作者所有。