1.1 本章介绍(回归分析与 Python 应用)
"Essentially, all models are wrong, but some are useful.""所有的模型本质上都是错的,但有些是有用的。"— George E. P. Box, Statistician (统计学家)
从零开始掌握 Python 回归分析的核心方法
本章目标
完成本章后,你将能够:
- 使用 Python 进行 OLS 线性回归分析
- 掌握 Logit/Probit 等二元因变量模型
- 像顶级期刊一样展示回归结果表格
- 理解并解读回归输出的每一个指标
- 将 Python 回归结果与 Stata/R 进行对比
为什么从回归分析开始?
回归分析在社会科学中的地位
回归分析是社会科学实证研究的基石。无论是经济学、社会学、政治学还是管理学,绝大多数实证论文都使用回归方法:
| 领域 | 典型研究问题 | 回归类型 |
|---|---|---|
| 劳动经济学 | 教育回报率、性别工资差异 | OLS、Mincer 方程 |
| 发展经济学 | 贫困陷阱、经济增长因素 | 面板回归、工具变量 |
| 公司金融 | 资本结构、公司治理 | Logit、固定效应 |
| 社会学 | 社会流动、不平等 | 多层回归、Logit |
| 政治学 | 投票行为、政策效果 | Probit、DID |
Python vs Stata vs R:为什么选择 Python?
| 特性 | Python | Stata | R |
|---|---|---|---|
| 回归功能 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
| 学习曲线 | 中等 | 简单 | 较陡 |
| 通用性 | ⭐⭐⭐⭐⭐ | ⭐⭐ | ⭐⭐⭐⭐ |
| 数据处理 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐ |
| 机器学习 | ⭐⭐⭐⭐⭐ | ⭐ | ⭐⭐⭐⭐ |
| 免费开源 | (昂贵) | ||
| 社区支持 | 最活跃 | 中等 | 活跃 |
Python 的独特优势:
- 一站式解决方案:从数据清洗 → 统计分析 → 机器学习 → Web 应用
- 职业发展:Python 是数据科学、AI 领域的标准语言
- 生态系统:pandas(数据处理)+ statsmodels(统计)+ scikit-learn(机器学习)+ PyTorch(深度学习)完美结合
- 工业界认可:95% 的科技公司使用 Python,Stata 仅限学术界
本章内容概览
第 1 节:Python 回归分析快速入门
学习时长:30 分钟
- 5 分钟运行第一个 OLS 回归
- 核心工具:statsmodels 库介绍
- Python vs Stata vs R 语法对比
- 理解回归输出的关键指标
你将学会:
import statsmodels.api as sm
# 3 行代码完成回归
X = sm.add_constant(data[['education', 'experience']])
model = sm.OLS(data['wage'], X).fit()
print(model.summary())第 2 节:OLS 回归详解
学习时长:1.5 小时
- 从简单回归到多元回归
- �� 深入理解回归输出:R²、F 统计量、t 统计量、p 值
- 案例:研究教育回报率(Mincer 方程)
- ️ 提取回归结果:系数、标准误、置信区间
- 模型诊断:残差分析、多重共线性
核心概念:
- Mincer 方程:经济学中最经典的工资方程
- 教育回报率:每多受一年教育,工资平均增加 8-12%
- 控制变量:如何加入性别、城市、行业等控制变量
实战技能:
# 提取回归系数
coef = model.params['education']
se = model.bse['education']
pvalue = model.pvalues['education']
# 95% 置信区间
conf_int = model.conf_int(alpha=0.05)
# 预测
predictions = model.predict(new_data)第 3 节:Logit 回归 - 二元因变量模型
学习时长:1.5 小时
- 什么时候用 Logit/Probit?
- Logit 模型的数学原理
- 案例:影响大学录取的因素
- 解读系数:对数几率比 vs 边际效应
- 与 Stata/R 的
logit命令对比
典型应用场景:
| 研究问题 | 因变量 | 自变量示例 |
|---|---|---|
| 是否上大学 | 上大学=1, 否=0 | 家庭收入、父母教育、SAT 分数 |
| 是否找到工作 | 就业=1, 失业=0 | 教育、经验、性别、所在地 |
| 是否违约 | 违约=1, 否=0 | 信用分数、收入、负债率 |
| 是否投票 | 投票=1, 否=0 | 年龄、教育、收入、政治倾向 |
核心技能:
from statsmodels.formula.api import logit
# Logit 回归
model = logit('admitted ~ gpa + sat + income', data=df).fit()
# 边际效应(最重要!)
marginal_effects = model.get_margeff()
print(marginal_effects.summary())
# 预测概率
prob = model.predict(new_data)边际效应解读:
- 系数不能直接解释(因为是对数几率)
- 边际效应:自变量变化 1 单位,因变量概率变化多少
- 例如:GPA 每提高 0.1,录取概率提高 5.2 个百分点
第 4 节:summary_col - 优雅地对比多个模型
学习时长:1 小时
- 学术论文标准:并列展示多个模型
- 使用
summary_col()生成回归表格 - 与 Stata 的
esttab、R 的stargazer对比 - 自定义输出:星号标注显著性、添加统计量
为什么需要对比模型?
在顶级期刊(AER、QJE、JPE)中,标准做法是展示 3-6 个渐进式模型:
| 模型 | 包含变量 | 目的 |
|---|---|---|
| Model 1 | 只有核心解释变量 | 展示基础关系 |
| Model 2 | + 基本控制变量 | 控制混杂因素 |
| Model 3 | + 更多控制变量 | 稳健性检验 |
| Model 4 | + 固定效应 | 控制不可观测异质性 |
实战示例:
from statsmodels.iolib.summary2 import summary_col
# 建立 4 个渐进式模型
model1 = sm.OLS(y, X1).fit()
model2 = sm.OLS(y, X2).fit()
model3 = sm.OLS(y, X3).fit()
model4 = sm.OLS(y, X4).fit()
# 一键生成对比表格
table = summary_col([model1, model2, model3, model4],
stars=True, # 添加显著性星号
float_format='%.3f',
model_names=['(1)', '(2)', '(3)', '(4)'],
info_dict={'N': lambda x: f"{int(x.nobs):,}",
'R-squared': lambda x: f"{x.rsquared:.3f}"})
print(table)输出效果:
================================================================
(1) (2) (3) (4)
----------------------------------------------------------------
education 450.000*** 380.000*** 320.000*** 310.000***
(25.000) (22.000) (20.000) (19.000)
experience 50.000*** 45.000*** 42.000***
(5.000) (4.800) (4.500)
female -800.000***-750.000***
(100.000) (95.000)
urban 400.000***
(80.000)
----------------------------------------------------------------
N 1,000 1,000 1,000 1,000
R-squared 0.450 0.520 0.580 0.600
================================================================
Standard errors in parentheses.
* p<0.1, ** p<0.05, ***p<0.01️ 核心工具与技术栈
必备 Python 库
| 库 | 用途 | 安装命令 |
|---|---|---|
| pandas | 数据处理 | pip install pandas |
| numpy | 数值计算 | pip install numpy |
| statsmodels | 统计建模(本章核心) | pip install statsmodels |
| matplotlib | 数据可视化 | pip install matplotlib |
| seaborn | 高级可视化 | pip install seaborn |
statsmodels 核心功能
import statsmodels.api as sm
from statsmodels.formula.api import ols, logit, probit
# 1. OLS 回归(矩阵形式)
model = sm.OLS(y, X).fit()
# 2. OLS 回归(公式形式,类似 R)
model = ols('wage ~ education + experience', data=df).fit()
# 3. Logit 回归
model = logit('admitted ~ gpa + sat', data=df).fit()
# 4. Probit 回归
model = probit('admitted ~ gpa + sat', data=df).fit()
# 5. 加权最小二乘(WLS)
model = sm.WLS(y, X, weights=weights).fit()
# 6. 广义线性模型(GLM)
model = sm.GLM(y, X, family=sm.families.Binomial()).fit()本章案例数据集
案例 1:教育回报率研究(Mincer 方程)
- 样本量:1,000 个观测
- 变量:
- 因变量:
wage(工资,元) - 核心解释变量:
education(受教育年限) - 控制变量:
experience(工作经验年限)、female(性别)、urban(城市/农村)
- 因变量:
- 研究问题:教育每多一年,工资提高多少?
案例 2:大学录取影响因素(Logit 模型)
- 样本量:500 个申请者
- 变量:
- 因变量:
admitted(是否录取,1=是,0=否) - 解释变量:
gpa(GPA 成绩)、sat(SAT 分数)、extracurricular(课外活动数量)、income(家庭收入)
- 因变量:
- 研究问题:什么因素影响大学录取概率?
案例 3:渐进式模型对比(summary_col 应用)
- 样本量:1,000 个观测
- 模型对比:
- Model 1:仅教育变量
- Model 2:+ 工作经验
- Model 3:+ 性别
- Model 4:+ 城市/农村
- 目的:展示如何像顶级期刊一样呈现回归结果
学习路径建议
推荐学习顺序(总计 4-6 小时)
第 1 节(30 分钟)
↓
运行第一个回归,建立信心
↓
第 2 节(1.5 小时)
↓
深入理解 OLS,掌握核心技能
↓
第 3 节(1.5 小时)
↓
学习 Logit 模型,扩展工具箱
↓
第 4 节(1 小时)
↓
学会专业展示回归结果
↓
完成本章!每节学习建议
- 先看理论:理解回归的基本原理(15 分钟)
- 运行代码:在网页内执行所有代码示例(30 分钟)
- 修改参数:尝试改变变量、样本量,观察结果变化(15 分钟)
- 对比 Stata/R:如果你会 Stata 或 R,对比语法差异(15 分钟)
- 完成练习:每节末尾的编程练习(30 分钟)
前置知识要求
必备技能
Python 基础:
- 变量、数据类型、列表、字典
- 函数定义与调用
- 条件判断(if/else)和循环(for/while)
- 如果不熟悉,建议先学习 Module 1: Python 编程入门
pandas 基础:
- 读取 CSV 文件:
pd.read_csv() - 数据选择:
df['column']、df[['col1', 'col2']] - 数据筛选:
df[df['age'] > 30] - 不熟悉可以边学边查文档
- 读取 CSV 文件:
统计学基础(建议但非必需)
- 了解均值、方差、标准差的概念
- 知道什么是相关系数
- 听说过"显著性检验"和"p 值"
- 不懂也没关系:本章会用通俗语言解释所有统计概念
你不需要会的
- 高等数学(线性代数、微积分)
- 复杂的统计理论
- Stata 或 R(但会的话可以对比学习)
学习成果检验
完成本章后,你应该能够:
理论理解
- [ ] 解释 OLS 回归的基本原理
- [ ] 说明什么时候用 Logit/Probit 而不是 OLS
- [ ] 理解 R²、p 值、置信区间的含义
- [ ] 知道如何判断回归系数是否显著
编程技能
- [ ] 使用 statsmodels 进行 OLS 回归
- [ ] 使用 statsmodels 进行 Logit 回归
- [ ] 提取回归系数、标准误、p 值
- [ ] 计算边际效应(Logit 模型)
- [ ] 使用 summary_col 对比多个模型
实战能力
- [ ] 独立完成一个完整的回归分析项目
- [ ] 像学术论文一样展示回归结果
- [ ] 解读回归输出并得出结论
- [ ] 识别常见的回归陷阱(多重共线性、内生性)
下一步学习
完成本章后,你可以继续学习:
- Module 2: 反事实与 RCT - 学习因果推断的基础框架
- Module 3: 数据清洗与变量构造 - 掌握实证研究的数据处理技能
- Module 5: 回归分析进阶 - 学习异方差、自相关、内生性等高级话题
- Module 9: 双重差分(DID) - 掌握经济学顶级期刊最常用的因果识别方法
参考资料
推荐教材
Wooldridge, J. M. (2020). Introductory Econometrics: A Modern Approach (7th ed.). Cengage Learning.
- 最经典的计量经济学教材,适合初学者
Angrist, J. D., & Pischke, J. S. (2009). Mostly Harmless Econometrics. Princeton University Press.
- 实证研究必读,深入浅出讲解因果推断
Stock, J. H., & Watson, M. W. (2020). Introduction to Econometrics (4th ed.). Pearson.
- 另一本经典教材,配有丰富的实证案例
Python 官方文档
- statsmodels 文档:https://www.statsmodels.org/stable/index.html
- pandas 文档:https://pandas.pydata.org/docs/
经典论文(使用回归分析)
Mincer, J. (1974). "Schooling, Experience, and Earnings." NBER.
- 教育回报率研究的奠基之作
Card, D., & Krueger, A. B. (1994). "Minimum Wages and Employment." American Economic Review.
- 使用 DID 方法研究最低工资对就业的影响
学习建议
给初学者的话
"回归分析看起来复杂,但本质很简单:找出变量之间的关系。不要被数学公式吓到,专注于理解直觉,代码会帮你完成计算。"
给有 Stata/R 经验的学习者
"Python 的回归语法与 Stata/R 非常相似。本章会详细对比三者的差异,帮助你快速迁移。statsmodels 的输出格式几乎与 Stata 一模一样!"
给想做实证研究的学生
"掌握本章内容后,你就具备了阅读 80% 经济学、社会学论文的技能。回归分析是实证研究的基石,无论你将来做什么研究,这些技能都不会过时。"
开始学习
准备好了吗?让我们从第一节开始,5 分钟内运行你的第一个 Python 回归模型!
统计学习之旅,从这里开始!