Skip to content

Latest commit

 

History

History
576 lines (421 loc) · 32.9 KB

File metadata and controls

576 lines (421 loc) · 32.9 KB

Python 数据分析课程大纲 / Python for Data Analysis — Course Syllabus

对象 / 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


1. 课程简介与总目标 / Course Introduction & Goals

中文: 本课程面向零基础初学者(尤其适合经济学/社会科学方向),目标是让你在 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.

总目标(可检验)/ Learning Outcomes (assessable)

完成课程后,你应能 / After this course, you will be able to:

  1. 独立用 pandas 读取 CSV、筛选行列、处理缺失值、分组聚合 / Independently load CSVs, filter rows/columns, handle missing values, and do group-by aggregation with pandas.
  2. 用 matplotlib / pandas 绘制折线图、柱状图、散点图、直方图并加标注 / Produce annotated line, bar, scatter, and histogram plots.
  3. 计算描述统计量与相关系数,判断变量关系 / Compute descriptive statistics and correlations to assess relationships.
  4. statsmodels 跑一元与多元 OLS(含虚拟变量),并解读 summary() 中的 coef、R²、p 值、t 值 / Run simple and multiple OLS (incl. dummies) and read coef, , p-value, t from summary().

2. 课前准备 / Before the Course

完整《Anaconda 安装指南》单独成文(SETUP_GUIDE.md,课前发放)。此处仅列要点。 A full Anaconda Setup Guide (SETUP_GUIDE.md) is distributed separately before class. Key points only here.

安装要点 / Setup Checklist

  1. 下载 Anaconda / Download Anaconda (Python 3.x) from the official site — 选择对应操作系统 (Windows / macOS)。
  2. 创建独立环境 / Create an isolated environment so versions stay stable:
    conda create -n pycourse python=3.12
    conda activate pycourse
    conda install pandas numpy matplotlib statsmodels jupyter openpyxl
    说明 / Note: 本课程在 Python 3.12 + pandas 2.x + statsmodels 下编写并逐个 notebook 执行验证。详细安装与排障见 SETUP_GUIDE.md
  3. 启动 Jupyter Notebook / Launch Jupyter: jupyter notebook,浏览器自动打开。
  4. 验证环境 / Verify: 在一个 cell 里运行 import pandas, numpy, matplotlib, statsmodels 不报错即成功 / no error means success.
  5. 第 1 节课预留 5–10 分钟环境排障 / Session 1 reserves 5–10 min for setup troubleshooting (PATH issues, conda not found, kernel errors). 建议课前已完成安装。

数据准备 / Data

课程数据集已放在 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.

3. 难度递进总原则 / Progressive Difficulty Rule

关键约束:每节课只能使用之前节次已教过的语法。 严格单向递进,绝不"超前引用"。 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.


4. 文件产出结构约定 / File & Naming Conventions

每节产出三份 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 use print(), never rely on auto-echo.
  • 代码与变量名用英文,注释中英对照 / Code in English, comments bilingual.
  • 例子尽量经济学语境(GDP、通胀、工资、价格),降低认知距离 / Prefer economics framing.

5. 逐节课计划 / Session-by-Session Plan


Week 1 — Python 基础 / Python Foundations


Week 1 · Session 1 — 你的第一行 Python:环境、变量与数据类型 / Your First Line of Python: Setup, Variables & Types

学习目标 / Objectives

  • 在本机成功启动 Jupyter 并运行一个 cell / Launch Jupyter and run a cell.
  • 用变量保存数字与文本,并用 print() 输出 / Store numbers/text in variables and print them.
  • 区分 intfloatstr 三种基本类型 / Distinguish int, float, str.
  • + - * / ** 做算术,理解 Python 是"高级计算器" / Do arithmetic.

理论要点 (20') / Theory

  • 课程地图 + 为什么经济学家学 Python(数据科学项目长什么样)/ Course map; why economists code.
  • Jupyter 界面:cell、运行 (Shift+Enter)、Markdown vs Code。
  • 变量赋值 =int / float / strtype();算术运算符与运算顺序。
  • print() 与 f-string:print(f"GDP = {gdp}")

演示内容 (20') / Demo

  • 改编自 hello_word.pyname.pygdp = 21000country = "China",用 f-string 输出一句经济陈述。
  • 改编自 QMUL Part 1:算术表达式 (3 - 5*1.8)/1.2np.sqrt 暂不用,纯内置运算。
  • 顺带演示 1 条魔法命令 %timeit(来自 appb,仅提一句)。

课堂练习 (20') / In-class Practice

  • 填空式(fill-in-the-blank,借鉴 QMUL 形式):定义 pricequantity,计算 revenue 并打印。
  • 把一段老式字符串拼接改写成 f-string。

课后作业 (~30') / Homework

  • 用变量计算"名义 GDP 增长率":给定两年 GDP,输出增长率百分比字符串。
  • 改三处类型错误(如把 "100" + 5 修正)。附答案。

参考素材 / References

  • references/Python-Crash-Course/hello_word.py, name.py
  • references/QMULSBM_PhDWorkshop/SBM_PhD_python_workshop_part1.ipynb(算术/变量/类型段)
  • references/pydata-book/ch02.ipynb(精选标量类型 cell)

仅用语法 / Allowed syntax: 变量、int/float/str、算术、print、f-string。


Week 1 · Session 2 — 列表与循环:处理一组数据 / Lists & Loops: Working with a Group of Numbers

学习目标 / Objectives

  • 创建列表,按索引/切片访问元素 / Create lists; index and slice.
  • for 循环遍历列表 / Iterate with for.
  • range() 生成数字序列 / Generate sequences with range().
  • 用列表方法 appendsortlen / 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.pyfoods.pymagicians.pynumber.pyeven_numbers.py: 用 inflation = [2.1, 3.4, 1.9, ...] 列表,循环打印每年通胀,求平均(sum()/len())。
  • 保留 cars.pyprint(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.py
  • references/QMULSBM_PhDWorkshop/...part1.ipynb(list 段)
  • references/pydata-book/ch03.ipynb(list 精选 cell)

仅用语法 / Allowed syntax: 前述 + 列表、索引/切片、for、range、len/append/sort/sum/max/min。


Week 1 · Session 3 — 字典、条件与函数:组织数据与逻辑 / Dictionaries, Conditionals & Functions

学习目标 / 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.pymany_users.pyadmin.pypizza.pyname_function.pygdp = {"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.py
  • references/QMULSBM_PhDWorkshop/...part1.ipynb(dict / zip 段)+ answers 版
  • references/pydata-book/ch03.ipynb(dict / function 精选)

仅用语法 / Allowed syntax: 前述 + 字典、if/elif/else、def/return、zip。


Week 2 — NumPy 入门 + pandas 核心 / NumPy Basics + pandas Core


Week 2 · Session 4 — NumPy:向量化的数组运算 / NumPy: Vectorized Array Computing

学习目标 / 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 * 2array + 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、向量化运算、布尔索引、数组聚合。


Week 2 · Session 5 — pandas 入门:Series 与 DataFrame / Intro to pandas: Series & DataFrame

学习目标 / 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、列选择。


Week 2 · Session 6 — pandas 索引与筛选 / pandas Indexing & Filtering

学习目标 / 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[行标签, 列名] vs df.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。


Week 3 — 数据清洗 + 可视化 / Data Cleaning + Visualization


Week 3 · Session 7 — 读写真实数据:read_csv / read_excel / Reading Real Data

学习目标 / Objectives

  • pd.read_csv 读取真实 CSV 文件 / Load real CSVs.
  • 用参数处理表头、分隔符、缺失标记 / Use key parameters.
  • 读 Excel read_excel;写出 to_csv / Read Excel; write CSV.
  • 第一次接触真实数据集 tips.csv / Meet tips.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。


Week 3 · Session 8 — 数据清洗:缺失值与替换 / Data Cleaning: Missing Values & Replacement

学习目标 / 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() vs fillna(value)(均值填充)。
  • drop_duplicates()replace({...})map() 把类别映射成数字(为 S12 虚拟变量埋伏笔,但此处只讲 map,不讲回归 dummy)。

演示内容 (20') / Demo

  • 改编自 ch07.ipynb(改用简单数据):造一个含 NaN 的小经济 DataFrame,演示检测→填充→去重→map 把 "Yes/No" 映射为 1/0。
  • 也可在 tips.csvsmoker 列演示 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。


Week 3 · Session 9 — matplotlib 可视化 / Visualization with matplotlib

学习目标 / 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 inlineimport matplotlib.pyplot as plt
  • 折线(时间趋势)、柱状(分类比较)、散点(两变量关系)、直方图(分布)各自何时用。
  • plt.title/xlabel/ylabel/legenddf.plot(kind="scatter", x=..., y=...)

演示内容 (20') / Demo

  • 改编自 ch09.ipynb(用 tips.csv):total_bill vs tip 散点图;total_bill 直方图;按 day 的小费均值柱状图(均值用上周已学的列运算,分组留到 S10,这里先手动或用 value_counts)。
  • 散点图引出:"看起来 bill 越高 tip 越高——下周我们用回归量化它。"

课堂练习 (20') / In-class Practice

  • tips.csvsize(人数)的直方图,加标题与轴标签。
  • tip vs total_bill 散点并加标题。

课后作业 (~30') / Homework

  • macrodata.csvrealgdpyear 的折线图,加标签;再画 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。


Week 4 — 描述统计 → 回归 → 实战 / Stats → Regression → Capstone


Week 4 · Session 10 — 分组聚合与描述统计 / Group-by & Descriptive Statistics

学习目标 / 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.ipynbtips.csv):按 daysmoker 分组算小费均值;total_billtip 的相关系数;一张小费率透视表。

课堂练习 (20') / In-class Practice

  • time(Lunch/Dinner)分组算 total_bill 均值。
  • 计算 sizetotal_bill 的相关系数并口头解读。

课后作业 (~30') / Homework

  • macrodata.csv:算 realconsrealdpi 的相关系数;按"是否高失业期"(自定义阈值布尔列) 分组比较 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。


Week 4 · Session 11 — 一元 OLS 回归 / Simple OLS Regression

学习目标 / Objectives

  • 理解一元线性回归 y = β0 + β1·x + ε 的含义 / Understand the model.
  • statsmodels 公式接口跑一元 OLS / Fit simple OLS via smf.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 smfresults = 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_...ipynbsm.OLS / summary() / regplot 片段)
  • 数据 / Data:data/tips.csv, data/macrodata.csv(notebook 用 ../data/... 读取)

仅用语法 / Allowed syntax: 前述 + smf.ols("y ~ x").fit().summary().params、回归线绘图。


Week 4 · Session 12 — 多元 OLS、虚拟变量与综合实战 / Multiple OLS, Dummies & Capstone

学习目标 / 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.csvsmf.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.csvtip ~ total_bill + C(day),找出哪天小费显著不同。
  • 比较加入 size 前后 total_bill 系数与 R² 的变化。

课后作业 / 综合小项目 (~30–45') / Capstone Homework

  • 数据集二选一tips.csvmacrodata.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.ipynbsmf.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² 解读。


Week 5 — 真实数据可复现实战项目 / Real-world Reproducible Project

本周为综合实战周,不引入新语法,全程复用第 1–4 周技能。 数据:data/gapminder.csv(全球各国 1952–2007 的预期寿命、人口、人均 GDP,真实数据)。 贯穿问题:人均 GDP 如何影响预期寿命?是否边际递减?洲别有何差异?


Week 5 · Session 13 — 项目启动:提出问题、获取与理解数据 / Project Kickoff

学习目标: 理解"可复现分析";为真实数据集提出可回答的研究问题;加载/体检/清洗 gapminder,得到 2007 横截面。 理论 (20'): 什么是可复现;如何框定研究问题;认识 gapminder 各变量。 演示 (20'): 加载 → 体检(dtypes/describe/缺失)→ 取 2007 横截面 → 看极值。 课堂练习 (20'): 取 1952 横截面统计;筛选 2007 高寿命国家。 作业 (~30'): 数据理解小结(行列/年份/各洲行数/describe)+ 选定 2007 横截面。 参考素材: references/reproducible-data-science-python/notebooks(项目化/可复现叙事,去 Colab 化)。

Week 5 · Session 14 — 探索性数据分析与可视化讲故事 / EDA & Visual Storytelling

学习目标: 用分组统计与相关系数初步回答问题;选对图表讲故事;发现关系 非线性理论 (20'): EDA 是什么;分组/相关/形状三个角度;选图原则。 演示 (20'): 各洲平均寿命柱状图、某国寿命随时间折线、人均 GDP vs 寿命散点(看曲线)。 课堂练习 (20'): 按洲算人均 GDP 均值;画某国寿命折线。 作业 (~30'): 分组+相关 + 两张图 + 一句双语观察。

Week 5 · Session 15 — 建模与可复现报告(结课项目)/ Modeling & Reproducible Report

学习目标: 在项目数据上跑一元/多元 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 已学)做数据变换;无新语法。


6. 评估方式 / Assessment

  • 课堂练习 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.

7. 设计取舍说明 / Design Notes

  • 不教 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 中实现。