对象 / Audience: 编程零基础的初学者(经济学/社科背景友好 / beginners with zero programming, economics-friendly) 周期 / Duration: 5 周 · 15 节 / 5 weeks · 15 sessions 节奏 / Schedule: 每周一、三、五各 1 节,每节 60 分钟 / Mon, Wed, Fri — one 60-min session each 单节结构 / Per-session: 20 min 理论 Theory + 20 min 演示 Demo + 20 min 练习答疑 In-class Practice
中文: 本课程面向零基础初学者(尤其适合经济学/社会科学方向),目标是让你在 5 周内从"没写过一行代码"成长为"能独立用 Python 做经济数据分析"。我们不教面向对象、算法、爬虫等通用计算机科学内容,而是把每一分钟都投入到经济学真正用得上的技能:用 pandas 读取与清洗数据、用 matplotlib 画图、用 statsmodels 跑一元和多元 OLS 回归并正确解读系数/R²/p 值/虚拟变量,最后用真实的 gapminder 数据完成一份可复现的分析报告。
English: This course takes a complete beginner in Economics from "never wrote a line of code" to "can independently analyze economic data in Python" in five weeks. We deliberately skip OOP, algorithms, and web scraping. Every minute targets skills an economist actually uses: reading and cleaning data with pandas, plotting with matplotlib, running simple and multiple OLS regressions with statsmodels — interpreting coefficients, R², p-values, and dummy variables correctly — and finally delivering a reproducible analysis report on real gapminder data.
完成课程后,你应能 / After this course, you will be able to:
- 独立用 pandas 读取 CSV、筛选行列、处理缺失值、分组聚合 / Independently load CSVs, filter rows/columns, handle missing values, and do group-by aggregation with pandas.
- 用 matplotlib / pandas 绘制折线图、柱状图、散点图、直方图并加标注 / Produce annotated line, bar, scatter, and histogram plots.
- 计算描述统计量与相关系数,判断变量关系 / Compute descriptive statistics and correlations to assess relationships.
- 用
statsmodels跑一元与多元 OLS(含虚拟变量),并解读summary()中的 coef、R²、p 值、t 值 / Run simple and multiple OLS (incl. dummies) and readcoef,R²,p-value,tfromsummary().
完整《Anaconda 安装指南》单独成文(
SETUP_GUIDE.md,课前发放)。此处仅列要点。 A full Anaconda Setup Guide (SETUP_GUIDE.md) is distributed separately before class. Key points only here.
- 下载 Anaconda / Download Anaconda (Python 3.x) from the official site — 选择对应操作系统 (Windows / macOS)。
- 创建独立环境 / Create an isolated environment so versions stay stable:
说明 / Note: 本课程在 Python 3.12 + pandas 2.x + statsmodels 下编写并逐个 notebook 执行验证。详细安装与排障见
conda create -n pycourse python=3.12 conda activate pycourse conda install pandas numpy matplotlib statsmodels jupyter openpyxl
SETUP_GUIDE.md。 - 启动 Jupyter Notebook / Launch Jupyter:
jupyter notebook,浏览器自动打开。 - 验证环境 / Verify: 在一个 cell 里运行
import pandas, numpy, matplotlib, statsmodels不报错即成功 / no error means success. - 第 1 节课预留 5–10 分钟环境排障 / Session 1 reserves 5–10 min for setup troubleshooting (PATH issues, conda not found, kernel errors). 建议课前已完成安装。
课程数据集已放在 data/ 目录,无需联网下载;notebook 在各 weekN/ 目录下用相对路径 ../data/... 读取 / All datasets live in data/ (offline-ready); notebooks read them via ../data/... from each weekN/ folder. 核心数据:
data/tips.csv— 餐厅小费 (244 行),贯穿 pandas / 分组 / 绘图 / 入门回归 / The workhorse dataset.data/macrodata.csv— 美国宏观经济季度数据 (203 行, 1959–2009),用于第 4 周 OLS / Macro data for the Week-4 regression.data/gapminder.csv— 全球各国 1952–2007 预期寿命/人口/人均 GDP (1704 行),用于第 5 周实战项目 / Real gapminder data for the Week-5 project.data/ex1.csv,ex2.csv,ex1.xlsx— 微型读写练习文件 / Tiny files for read/write drills.
关键约束:每节课只能使用之前节次已教过的语法。 严格单向递进,绝不"超前引用"。 Hard rule: each session may only use syntax taught in prior sessions. Strictly forward-only; no forward references.
语法解锁顺序 / Unlock order:
S1 变量/类型/print → S2 列表/循环/range → S3 字典/if/函数
→ S4 NumPy 数组 → S5-S6 pandas Series/DataFrame/索引筛选
→ S7 读写文件 → S8 缺失值/清洗 → S9 matplotlib 绘图
→ S10 groupby/描述统计 → S11 一元 OLS → S12 多元 OLS + 虚拟变量 + 实战
→ S13-S15 真实数据综合实战(无新语法;仅 np.log 做数据变换,numpy 已于 S4 学)
例:S9 绘图前不用 groupby;S11 回归只用一个自变量;虚拟变量直到 S12 才出现;第 5 周不引入新语法。
Example: no groupby before S10; S11 uses a single regressor; dummies appear only in S12; Week 5 introduces no new syntax.
每节产出三份 notebook,放在对应周目录下 / Three notebooks per session, under its week folder:
python-course/
├── week1/
│ ├── session1_lecture.ipynb # 理论 + 演示 + 末尾课堂练习(填空式)/ theory + demo + in-class practice at the end
│ ├── session1_homework.ipynb # 课后作业题面 / homework prompts
│ ├── session1_answers.ipynb # 课后作业答案 / homework answers
│ ├── session2_*.ipynb
│ └── session3_*.ipynb
├── week2/ (session4–6)
├── week3/ (session7–9)
├── week4/ (session10–12)
├── week5/ (session13–15) # 真实数据实战项目 / real-world project
└── data/ # 课程数据集 / course datasets (tips, macrodata, gapminder, ex*)
Notebook 内部规范 / Inside each notebook:
- 每个知识点 = 双语 Markdown 讲解 cell(中文 + English)+ 演示 code cell / bilingual markdown + demo code.
- 所有输出用
print(),不依赖 IPython 自动回显(参考素材是裸代码、靠自动回显,零基础学生会困惑)/ Always useprint(), never rely on auto-echo. - 代码与变量名用英文,注释中英对照 / Code in English, comments bilingual.
- 例子尽量经济学语境(GDP、通胀、工资、价格),降低认知距离 / Prefer economics framing.
学习目标 / Objectives
- 在本机成功启动 Jupyter 并运行一个 cell / Launch Jupyter and run a cell.
- 用变量保存数字与文本,并用
print()输出 / Store numbers/text in variables and print them. - 区分
int、float、str三种基本类型 / Distinguish int, float, str. - 用
+ - * / **做算术,理解 Python 是"高级计算器" / Do arithmetic.
理论要点 (20') / Theory
- 课程地图 + 为什么经济学家学 Python(数据科学项目长什么样)/ Course map; why economists code.
- Jupyter 界面:cell、运行 (Shift+Enter)、Markdown vs Code。
- 变量赋值
=;int / float / str;type();算术运算符与运算顺序。 print()与 f-string:print(f"GDP = {gdp}")。
演示内容 (20') / Demo
- 改编自
hello_word.py、name.py:gdp = 21000、country = "China",用 f-string 输出一句经济陈述。 - 改编自 QMUL Part 1:算术表达式
(3 - 5*1.8)/1.2、np.sqrt暂不用,纯内置运算。 - 顺带演示 1 条魔法命令
%timeit(来自 appb,仅提一句)。
课堂练习 (20') / In-class Practice
- 填空式(fill-in-the-blank,借鉴 QMUL 形式):定义
price、quantity,计算revenue并打印。 - 把一段老式字符串拼接改写成 f-string。
课后作业 (~30') / Homework
- 用变量计算"名义 GDP 增长率":给定两年 GDP,输出增长率百分比字符串。
- 改三处类型错误(如把
"100" + 5修正)。附答案。
参考素材 / References
references/Python-Crash-Course/hello_word.py,name.pyreferences/QMULSBM_PhDWorkshop/SBM_PhD_python_workshop_part1.ipynb(算术/变量/类型段)references/pydata-book/ch02.ipynb(精选标量类型 cell)
仅用语法 / Allowed syntax: 变量、int/float/str、算术、print、f-string。
学习目标 / Objectives
- 创建列表,按索引/切片访问元素 / Create lists; index and slice.
- 用
for循环遍历列表 / Iterate withfor. - 用
range()生成数字序列 / Generate sequences withrange(). - 用列表方法
append、sort、len/ Use list methods.
理论要点 (20') / Theory
- 列表是"一列历年通胀率"——有序、可变、用
[]。/ List = ordered mutable sequence. - 索引从 0 开始;切片
[1:4];负索引。 for x in mylist:缩进的意义(Python 用缩进表示代码块)。range(start, stop, step);len();append();sort()/sorted()。
演示内容 (20') / Demo
- 改编自
cars.py、foods.py、magicians.py、number.py、even_numbers.py: 用inflation = [2.1, 3.4, 1.9, ...]列表,循环打印每年通胀,求平均(sum()/len())。 - 保留
cars.py的print(cars.sort)漏括号 bug 作"找错"引子。
课堂练习 (20') / In-class Practice
- 给一个"历年工资"列表:用循环打印每个值,找出最大值(仅用已学:循环 + if 暂未学,故用
max())。 - 用
range(0, 10, 2)生成偶数列表并打印。
课后作业 (~30') / Homework
- 给定 5 个国家的 GDP 列表,计算总和、平均、最大、最小并打印。
- 切片练习:取前 3 个、后 2 个元素。附答案。
参考素材 / References
references/Python-Crash-Course/cars.py,foods.py,magicians.py,number.py,even_numbers.py,squares.pyreferences/QMULSBM_PhDWorkshop/...part1.ipynb(list 段)references/pydata-book/ch03.ipynb(list 精选 cell)
仅用语法 / Allowed syntax: 前述 + 列表、索引/切片、for、range、len/append/sort/sum/max/min。
学习目标 / Objectives
- 用字典存"键→值"映射(如 国家→GDP)/ Use dicts for key→value (country→GDP).
- 用
if / elif / else做条件判断 / Branch with if/elif/else. - 定义带参数和返回值的函数 / Define functions with params and return.
- 用
dict+zip把两列配成一个字典(pandas 列标签雏形)/ Build dict via zip.
理论要点 (20') / Theory
- 字典
{ "China": 21000 };d[key]、增改、.keys()、.values()、.items()遍历。 - 条件:比较运算符、
if/elif/else、布尔。 - 函数:
def f(x): return ...;参数、返回值、为什么封装(DRY)。 zip(names, values)→dict(zip(...)):强调"这就是后续 pandas 列名→数据的雏形"。
演示内容 (20') / Demo
- 改编自
user.py、many_users.py、admin.py、pizza.py、name_function.py:gdp = {"China": 21, "US": 25},遍历打印;写函数growth_rate(old, new)返回增长率;用if判断"扩张/衰退"。 dict(zip(countries, capitals))(QMUL 答案版片段)。
课堂练习 (20') / In-class Practice
- 写函数
classify(infl):通胀 >5% 打印 "high",2–5% "normal",<2% "low"。 - 用 zip 把
["A","B"]与[10,20]配成字典并打印。
课后作业 (~30') / Homework
- 建立"国家→人口"字典,写函数返回人口最多的国家(遍历 + if)。
- 写函数
cagr(begin, end, years)计算年复合增长率。附答案。
参考素材 / References
references/Python-Crash-Course/user.py,many_users.py,admin.py,pizza.py,name_function.py,favorite_languages.pyreferences/QMULSBM_PhDWorkshop/...part1.ipynb(dict / zip 段)+ answers 版references/pydata-book/ch03.ipynb(dict / function 精选)
仅用语法 / Allowed syntax: 前述 + 字典、if/elif/else、def/return、zip。
学习目标 / Objectives
- 创建一维
ndarray,理解它与 list 的区别 / Create 1-D arrays; contrast with lists. - 对整个数组做向量化运算(无需循环)/ Do vectorized arithmetic without loops.
- 用布尔条件筛选数组元素 / Filter with boolean masks.
- 用
mean / sum / std等聚合 / Aggregate with mean/sum/std.
理论要点 (20') / Theory
- 为什么要 NumPy:经济数据是"一整列数字",向量化又快又简洁。
np.array([...]);array * 2、array + array(逐元素)。- 广播简述(标量 + 数组);布尔索引
arr[arr > 0]。 - 聚合:
arr.mean(),.sum(),.std(),.max()。
演示内容 (20') / Demo
- 改编自
ch04.ipynb(精简,去掉花式索引):把上节"通胀列表"变np.array,一次性算实际利率nominal - infl;筛选infl[infl > 3]。 - 全部输出用
print()。
课堂练习 (20') / In-class Practice
- 给一个"季度 GDP"数组,计算环比变化(
arr[1:] - arr[:-1])。 - 用布尔索引选出所有正增长的季度。
课后作业 (~30') / Homework
- 给"价格数组"和"数量数组",向量化算总收入数组与总和。
- 算数组的均值与标准差并打印。附答案。
参考素材 / References
references/pydata-book/ch04.ipynb(数组创建 / 向量化 / 布尔索引 / 聚合,挑约 20 cell)
仅用语法 / Allowed syntax: 前述 + import numpy as np、ndarray、向量化运算、布尔索引、数组聚合。
学习目标 / Objectives
- 创建
Series,理解"索引 + 值" / Build a Series (index + values). - 从字典创建
DataFrame,理解"表格"结构 / Build a DataFrame from a dict. - 查看
head(),shape,columns,dtypes,describe()/ Inspect a DataFrame. - 选取单列与多列 / Select one or more columns.
理论要点 (20') / Theory
- Series = 带标签的一维数组(上节 NumPy + 上周字典的结合体)。
- DataFrame = 多个 Series 拼成的表(行=观测,列=变量)——正是经济数据的样子。
pd.DataFrame({...});df.head(),df.shape,df.columns,df["col"],df[["a","b"]]。df.describe()一眼看统计概览。
演示内容 (20') / Demo
- 改编自
ch05.ipynb(前半,约 20 cell):用字典手建一个"国家/GDP/人口" DataFrame;展示 head / shape / 选列。 - 强调列选择返回 Series vs DataFrame 的区别。
课堂练习 (20') / In-class Practice
- 用
dict(zip(...))思路手建一个 4 行 3 列的经济 DataFrame,打印 shape 与某一列。 - 调用
describe()并口头解读 mean / max。
课后作业 (~30') / Homework
- 用给定的几列数据建 DataFrame,选出两列组成新 DataFrame,打印
head()与describe()。附答案。
参考素材 / References
references/pydata-book/ch05.ipynb(Series / DataFrame 构造,前半段)references/reproducible-data-science-python/notebooks/02_...ipynb(pandas 极简入门节奏,去 Colab 化)
仅用语法 / Allowed syntax: 前述 + import pandas as pd、Series、DataFrame(字典)、head/shape/columns/dtypes/describe、列选择。
学习目标 / Objectives
- 用
loc/iloc选行选列 / Select rows/cols with loc/iloc. - 用布尔条件筛选行(如 GDP > 均值)/ Filter rows with boolean conditions.
- 新增计算列 / Create derived columns.
- 用
sort_values排序 / Sort by a column.
理论要点 (20') / Theory
df.loc[行标签, 列名]vsdf.iloc[行号, 列号]。- 布尔筛选:
df[df["gdp"] > 1000];多条件&、|与括号。 - 新列:
df["gdp_per_cap"] = df["gdp"] / df["pop"](向量化的延续)。 df.sort_values("gdp", ascending=False)。
演示内容 (20') / Demo
- 改编自
ch05.ipynb(后半,约 20 cell):在上节 DataFrame 上做条件筛选、加人均 GDP 列、排序取前几名。
课堂练习 (20') / In-class Practice
- 筛出"人均 GDP 高于平均"的国家行。
- 新增一列"是否高收入"(先用算术/比较生成布尔列,dummies 概念留到 S12)。
课后作业 (~30') / Homework
- 给定经济 DataFrame:筛选满足某条件的行、加一个比率列、按该列排序输出前 3。附答案。
参考素材 / References
references/pydata-book/ch05.ipynb(loc/iloc/布尔索引/算术,后半段)references/reproducible-data-science-python/notebooks/04_...ipynb(索引/筛选片段,简化)
仅用语法 / Allowed syntax: 前述 + loc/iloc、布尔筛选、新增列、sort_values。
学习目标 / Objectives
- 用
pd.read_csv读取真实 CSV 文件 / Load real CSVs. - 用参数处理表头、分隔符、缺失标记 / Use key parameters.
- 读 Excel
read_excel;写出to_csv/ Read Excel; write CSV. - 第一次接触真实数据集
tips.csv/ Meettips.csv.
理论要点 (20') / Theory
- 真实工作流:数据在文件里,第一步是"读进来"。
pd.read_csv("path");常用参数header,names,na_values。pd.read_excel(..., sheet_name=...)(需 openpyxl);df.to_csv("out.csv", index=False)。- 读进来后立刻
head()/shape/describe()体检。
演示内容 (20') / Demo
- 改编自
ch06.ipynb:读examples/ex1.csv,ex2.csv(练参数),再读真实的examples/tips.csv,看 head/describe。 - 读
examples/ex1.xlsx演示 Excel。
课堂练习 (20') / In-class Practice
- 读
tips.csv,打印行数、列名、前 5 行。 - 把筛选后的子集
to_csv写出。
课后作业 (~30') / Homework
- 读
tips.csv:报告有多少行、total_bill的均值与最大值、day列有哪些取值(unique())。附答案。
参考素材 / References
references/pydata-book/ch06.ipynb(read_csv / read_excel / to_csv,挑核心)- 数据 / Data:
data/ex1.csv,data/ex2.csv,data/ex1.xlsx,data/tips.csv(notebook 用../data/...读取)
仅用语法 / Allowed syntax: 前述 + read_csv/read_excel/to_csv、unique。
学习目标 / Objectives
- 检测缺失值
isnull/sum/ Detect missing values. - 删除或填充缺失值
dropna/fillna/ Drop or fill them. - 去重
drop_duplicates/ Remove duplicates. - 用
replace/map做值替换与重编码 / Recode values.
理论要点 (20') / Theory
- 真实数据"脏":缺失、重复、错值——分析前必须清洗。
df.isnull().sum()统计每列缺失;dropna()vsfillna(value)(均值填充)。drop_duplicates();replace({...});map()把类别映射成数字(为 S12 虚拟变量埋伏笔,但此处只讲 map,不讲回归 dummy)。
演示内容 (20') / Demo
- 改编自
ch07.ipynb(改用简单数据):造一个含 NaN 的小经济 DataFrame,演示检测→填充→去重→map把 "Yes/No" 映射为 1/0。 - 也可在
tips.csv的smoker列演示map({"Yes":1,"No":0})。
课堂练习 (20') / In-class Practice
- 给含缺失的工资数据:统计缺失数、用均值填充、再 describe。
- 用
replace把异常值(如 -1)改成 NaN 再处理。
课后作业 (~30') / Homework
- 清洗一份小脏数据:删重复行、填缺失、把某类别列 map 成 0/1,输出清洗后
head()。附答案。
参考素材 / References
references/pydata-book/ch07.ipynb(缺失/去重/replace/map,简化数据)references/reproducible-data-science-python/notebooks/04_...ipynb(缺失值片段)
仅用语法 / Allowed syntax: 前述 + isnull/sum、dropna/fillna、drop_duplicates、replace、map。
学习目标 / Objectives
- 画折线、柱状、散点、直方图 / Plot line, bar, scatter, histogram.
- 加标题、坐标轴标签、图例 / Add titles, axis labels, legend.
- 用
df.plot(...)快速出图 / Use pandas.plot. - 用散点图直观看两个变量的关系(为回归铺垫)/ Read a scatter as a relationship.
理论要点 (20') / Theory
%matplotlib inline;import matplotlib.pyplot as plt。- 折线(时间趋势)、柱状(分类比较)、散点(两变量关系)、直方图(分布)各自何时用。
plt.title/xlabel/ylabel/legend;df.plot(kind="scatter", x=..., y=...)。
演示内容 (20') / Demo
- 改编自
ch09.ipynb(用tips.csv):total_billvstip散点图;total_bill直方图;按day的小费均值柱状图(均值用上周已学的列运算,分组留到 S10,这里先手动或用 value_counts)。 - 散点图引出:"看起来 bill 越高 tip 越高——下周我们用回归量化它。"
课堂练习 (20') / In-class Practice
- 画
tips.csv中size(人数)的直方图,加标题与轴标签。 - 画
tipvstotal_bill散点并加标题。
课后作业 (~30') / Homework
- 用
macrodata.csv画realgdp随year的折线图,加标签;再画unemp直方图。附答案。
参考素材 / References
references/pydata-book/ch09.ipynb(折线/柱状/散点/直方,强烈推荐 tips.csv 演示)- 数据 / Data:
data/tips.csv,data/macrodata.csv(notebook 用../data/...读取)
仅用语法 / Allowed syntax: 前述 + matplotlib.pyplot、plt.title/xlabel/ylabel/legend、df.plot、value_counts。
学习目标 / Objectives
- 用
groupby做分组聚合(split-apply-combine)/ Aggregate by groups. - 计算分组均值/计数/求和 / Group means, counts, sums.
- 计算相关系数
corr/ Compute correlations. - 用
pivot_table做简单透视 / Build a simple pivot table.
理论要点 (20') / Theory
- 经济分析常问"按组比较":不同性别/地区/类别的均值差异。
df.groupby("day")["tip"].mean();.count(),.sum(),.agg([...])。- 相关性:
df[["total_bill","tip"]].corr(),区间 [-1,1] 的含义;相关 ≠ 因果。 pivot_table(values, index, columns, aggfunc)简介。
演示内容 (20') / Demo
- 改编自
ch10.ipynb(tips.csv):按day、smoker分组算小费均值;total_bill与tip的相关系数;一张小费率透视表。
课堂练习 (20') / In-class Practice
- 按
time(Lunch/Dinner)分组算total_bill均值。 - 计算
size与total_bill的相关系数并口头解读。
课后作业 (~30') / Homework
- 用
macrodata.csv:算realcons与realdpi的相关系数;按"是否高失业期"(自定义阈值布尔列) 分组比较infl均值。附答案。
参考素材 / References
references/pydata-book/ch10.ipynb(groupby / pivot_table,用 tips.csv)references/reproducible-data-science-python/notebooks/05_...ipynb(相关系数片段)
仅用语法 / Allowed syntax: 前述 + groupby、agg、corr、pivot_table。
学习目标 / Objectives
- 理解一元线性回归
y = β0 + β1·x + ε的含义 / Understand the model. - 用
statsmodels公式接口跑一元 OLS / Fit simple OLS viasmf.ols. - 读
summary()中的截距、斜率、R²、p 值 / Read intercept, slope, R², p-value. - 在散点图上叠加回归线 / Overlay the fitted line.
理论要点 (20') / Theory
- 从上节"相关"到"回归":回归给出斜率(x 变 1 单位,y 平均变多少)。
- 模型
y = β0 + β1 x;最小二乘直觉(让残差平方和最小)。 import statsmodels.formula.api as smf;results = smf.ols("y ~ x", data=df).fit();print(results.summary())。- 读表:
coef(斜率/截距)、R-squared(解释力 0–1)、P>|t|(显著性,<0.05 常视为显著)、t。
演示内容 (20') / Demo
- 用
tips.csv入门:smf.ols("tip ~ total_bill", data=tips).fit(),解读"账单每多 1 美元,小费平均多约 0.10 美元",看 R² 与 p 值。 - 用
macrodata.csv做经济版消费函数:smf.ols("realcons ~ realdpi", data=macro).fit(),解读边际消费倾向。 - 画散点 + 回归线(沿用 S9 绘图)。
课堂练习 (20') / In-class Practice
- 跑
tip ~ size,读斜率与 p 值,一句话解释。 - 自己说出某回归的 R² 含义。
课后作业 (~30') / Homework
- 用
macrodata.csv跑菲利普斯曲线infl ~ unemp:报告斜率、p 值、R²,并写两句中英解读。附答案。
参考素材 / References
references/pydata-book/ch12.ipynb(statsmodels OLS 框架,数据换成 macrodata.csv / tips.csv)references/reproducible-data-science-python/notebooks/05_...ipynb(sm.OLS/summary()/ regplot 片段)- 数据 / Data:
data/tips.csv,data/macrodata.csv(notebook 用../data/...读取)
仅用语法 / Allowed syntax: 前述 + smf.ols("y ~ x")、.fit()、.summary()、.params、回归线绘图。
学习目标 / Objectives
- 跑含多个自变量的多元 OLS / Fit multiple OLS.
- 加入类别变量作为虚拟变量并解读 / Add and interpret dummy variables.
- 比较一元与多元模型(系数变化、R²、调整 R²)/ Compare models.
- 独立完成"读数→清洗→画图→回归→解读"的完整闭环 / Run the full pipeline end-to-end.
理论要点 (20') / Theory
- 多元回归
y = β0 + β1 x1 + β2 x2 + ...:控制其他变量后某变量的效应("其他条件不变")。 - 虚拟变量:类别(如 Sex、smoker)用
C(col)自动生成 0/1,系数=相对基准组的差异。 - R² vs 调整 R²;多重共线性一句话提醒(不展开)。
- 解读规范:系数符号、大小、单位、p 值、整体 R²。
演示内容 (20') / Demo
- 用
tips.csv:smf.ols("tip ~ total_bill + size + C(smoker)", data=tips).fit(),解读虚拟变量C(smoker)系数(吸烟者小费差异)。 - 用
macrodata.csv:多元消费函数realcons ~ realdpi + realint,对比 S11 一元结果。 - 完整闭环演示:读 →
dropna→ 画散点 → 回归 → 读 summary。
课堂练习 (20') / In-class Practice
- 在
tips.csv跑tip ~ total_bill + C(day),找出哪天小费显著不同。 - 比较加入
size前后total_bill系数与 R² 的变化。
课后作业 / 综合小项目 (~30–45') / Capstone Homework
- 数据集二选一(
tips.csv或macrodata.csv):完成 (1) 读入并体检 (2) 处理缺失/选列 (3) 一张可视化 (4) 一元 OLS (5) 多元 OLS(含至少一个虚拟变量)(6) 用中英双语写 4–6 句结论,解读关键系数、p 值、R²。 - 提供评分要点 + 完整答案 notebook。
参考素材 / References
references/pydata-book/ch12.ipynb(多元 OLS +C()虚拟变量框架,换 macrodata/tips 数据)references/reproducible-data-science-python/notebooks/08_causal_inference.ipynb(smf.ols("wage ~ female + ...")性别工资差距,仅取 OLS 解读片段,丢弃因果概念)- 期末项目可选素材:
references/pydata-book/ch13.ipynb(FEC 政治献金等,教师预清洗后供学有余力者) - 数据 / Data:
data/tips.csv,data/macrodata.csv(notebook 用../data/...读取)
仅用语法 / Allowed syntax: 全部已学 + 多自变量公式 y ~ x1 + x2 + C(cat)、调整 R² 解读。
本周为综合实战周,不引入新语法,全程复用第 1–4 周技能。 数据:
data/gapminder.csv(全球各国 1952–2007 的预期寿命、人口、人均 GDP,真实数据)。 贯穿问题:人均 GDP 如何影响预期寿命?是否边际递减?洲别有何差异?
学习目标: 理解"可复现分析";为真实数据集提出可回答的研究问题;加载/体检/清洗 gapminder,得到 2007 横截面。
理论 (20'): 什么是可复现;如何框定研究问题;认识 gapminder 各变量。
演示 (20'): 加载 → 体检(dtypes/describe/缺失)→ 取 2007 横截面 → 看极值。
课堂练习 (20'): 取 1952 横截面统计;筛选 2007 高寿命国家。
作业 (~30'): 数据理解小结(行列/年份/各洲行数/describe)+ 选定 2007 横截面。
参考素材: references/reproducible-data-science-python/notebooks(项目化/可复现叙事,去 Colab 化)。
学习目标: 用分组统计与相关系数初步回答问题;选对图表讲故事;发现关系 非线性。 理论 (20'): EDA 是什么;分组/相关/形状三个角度;选图原则。 演示 (20'): 各洲平均寿命柱状图、某国寿命随时间折线、人均 GDP vs 寿命散点(看曲线)。 课堂练习 (20'): 按洲算人均 GDP 均值;画某国寿命折线。 作业 (~30'): 分组+相关 + 两张图 + 一句双语观察。
学习目标: 在项目数据上跑一元/多元 OLS 并解读;(进阶)理解边际递减时为何取对数;产出一份可复现双语报告。
理论 (20'): 从 EDA 到模型;(进阶)为什么 np.log;可复现报告的组成。
演示 (20'): 三步建模——朴素直线 → 取对数(R² 0.46→0.65)→ 加 C(continent)(AdjR² 0.76)→ 组装报告。
课堂练习 (20'): 跑 lifeExp ~ log(pop);比较 m2 与 m3 的调整 R²。
结课作业 (~40–45'): gapminder 完整可复现项目(问题→清洗→EDA→图→一元/多元 OLS→双语报告)。
结课寄语: 讲义末尾点名后续可学方向(逻辑回归、稳健/面板回归、因果推断、时间序列、机器学习、seaborn/git),只提方向不展开代码。
仅用语法 / Allowed syntax: 全部已学 + np.log(numpy,S4 已学)做数据变换;无新语法。
- 课堂练习 15 次(参与度)/ 15 in-class exercises (participation).
- 课后作业 15 份,每份附答案自评 / 15 homeworks with answer keys.
- 期末综合小项目(Session 15 作业)= gapminder 真实数据可复现分析报告 / Final capstone = reproducible report on gapminder.
- 通过标准:能独立完成真实数据的"读数→清洗→可视化→一元/多元 OLS"闭环,并正确解读系数、R²、p 值、虚拟变量 / Pass = independent, correct end-to-end analysis and interpretation.
- 不教 OOP(references 里的
dog.py/car.py/Simulated Exchange.py)、算法(爬楼梯/斐波那契/二分)、爬虫、时间序列(ch11)、ML(ch06-08 of reproducible repo, QMUL AI intro 全部) — 均超出经济学零基础 5 周目标(第 15 节讲义末尾会"点名"这些进阶方向供后续自学)。 - 裸代码改写:所有参考 notebook 是 IPython 自动回显风格,统一改成
print()+ 双语 markdown 讲解。 - 数据替换:ch12 原用随机数据跑 OLS,无经济含义 → 全部换成
macrodata.csv(消费函数/菲利普斯曲线)与tips.csv(小费回归),实现"pandas 处理 → OLS → 解读"闭环与课程目标对齐。
本大纲为教学计划框架;各 notebook 具体 cell 内容在对应 weekN/sessionM_*.ipynb 中实现。