数据挖掘与R语言
2026年11月04日
项目五的开篇:只用一条直线写出两个变量的数量关系。
一个我们在初中就会的公式,反过来问就不容易了
一次函数 \(y = a + bx\):已知 \(a\) 和 \(b\),任意给定 \(x\),就能轻易算出 \(y\)。
点严丝合缝地落在直线上——因为规律是我们已知的完全线性关系。
现实里反过来:我们看不到规律本身,只看到一次次观测。\(a\) 和 \(b\) 是多少?图上没有现成答案,要我们找出来。
重要
回归要解决的问题:已知观测值 \((x, y)\),反推 \(a\) 和 \(b\)——这就是回归分析。
Francis Galton(1822—1911),英国统计学家、达尔文的表弟。他收集了数百个家庭的父母与成年子女身高,结果让他惊讶:
注记
1886 年论文标题:"Regression towards Mediocrity in Hereditary Stature"(《遗传身高向均值的回归》)—— "回归"(Regression) 一词由此进入统计学,后来泛指"用一个变量预测另一个变量"。
提示
父母每高 1 英寸,子女平均只高 0.65 英寸——偏离均值的程度在缩小,"回归"由此得名。今天的"回归分析"指用 x 解释 y 的统计方法。
先看图,再谈逻辑,最后才建模
#| echo: true
#| eval: false
set.seed(2026)
ad_noise <- round(rnorm(40, 0, 3.5), 1) # 随机波动:±3.5 万件量级
ad_data <- data.frame(
月份 = 1:40,
广告费 = round(runif(40, 8, 60), 1)
) %>%
mutate(销量 = round(6 + 0.8 * 广告费 -
0.004 * pmax(广告费 - 40, 0)^2 + ad_noise, 1)) %>%
mutate(销量 = ifelse(广告费 == max(广告费), 销量 - 9, 销量), # 供货中断
销量 = ifelse(rank(广告费) == 6, 销量 + 10, 销量)) # 平台大促
ad_data %>% slice(1:6) 月份 广告费 销量
1 1 14.4 29.3
2 2 57.5 47.0
3 3 48.6 45.1
4 4 58.0 50.8
5 5 13.9 14.8
6 6 58.8 33.8
注记
警告
统计只能说"二者是否相关",不能说"x 导致了y"。\(r\) 即使相关系数高达 0.779,二者可能只是同一个原因(旺季)造成的同升同降——虚假相关。建模前先问:业务逻辑讲得通吗?
广告费增加 → 客户更了解产品 → 产品知名度、影响力扩大 → 促进销售,收入上升。
提示
结论:广告费与销量讲得通,图形近似直线——这时用线性回归去量化它,才站得住脚。
注记
逻辑关系让我们放心去量化,但回归数字本身不能证明因果。
lm()
把"关系"写成一条可以计算的直线
\[y = \underbrace{\beta_0}_{\text{截距}} + \underbrace{\beta_1}_{\text{斜率}} x + \underbrace{\varepsilon}_{\text{误差项}}\]
| 符号 | 名称 | 含义 | 本例 |
|---|---|---|---|
| \(y\) | 因变量 | 想解释/预测的量 | 销量(万件) |
| \(x\) | 自变量 | 用来解释的量 | 广告费(万元) |
| \(\beta_0\) | 截距 | \(x=0\) 时 \(y\) 的水平 | 基础销量 |
| \(\beta_1\) | 斜率 | \(x\) 增 1,\(y\) 平均变化 | 每万元广告的平均增量 |
| \(\varepsilon\) | 误差项 | 模型解释不了的波动 | 季节、促销、偶发 |
回归的目标:用观测数据估计 \(\hat{\beta}_0\)、\(\hat{\beta}_1\),写出 \(\hat{y} = \hat{\beta}_0 + \hat{\beta}_1 x\),就能预测销量。
直线有无数条,R 为什么选那一条?
提示
残差 \(e_i = y_i - \hat{y}_i\);OLS 让 \(\sum e_i^2\) 最小。不用手算,lm() 自动完成。
lm() 一行搞定(Intercept) 广告费
9.878 0.671
提示
建议暂停视频,跟敲一遍:把上面三行敲进 RStudio——不要复制粘贴,~ 的位置、data = 的参数名都要过一遍手。coef() 吐出的两个数字,就是从数据里估出的规律。
summary() 的结果五组数字,一个故事
Call:
lm(formula = 销量 ~ 广告费, data = ad_data)
Residuals:
Min 1Q Median 3Q Max
-15.522 -1.531 0.299 2.186 9.762
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 9.8779 1.6477 6.0 5.8e-07 ***
广告费 0.6708 0.0456 14.7 < 2e-16 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 4.5 on 38 degrees of freedom
Multiple R-squared: 0.851, Adjusted R-squared: 0.847
F-statistic: 217 on 1 and 38 DF, p-value: <2e-16
提示
输出从上到下五段:Call(公式)、Residuals(残差分布)、Coefficients(系数表)、R² 与 F(整体质量)。今天重点读系数表和最后两行。
| 输出列 | 含义 | 本例 |
|---|---|---|
Estimate |
系数估计值 | 截距 9.88、斜率 0.67 |
Std. Error |
标准误(不确定性) | 0.046 |
t value |
离 0 有几个标准误 | 14.7 |
Pr(>|t|) |
真无关时的概率 |
< 2e-16 → 极显著
|
*** |
显著性星号 | 三颗 = p < 0.001 |
斜率的读法:广告费每多投 1 万元,销量平均多 0.67 万件。
重要
统计显著 ≠ 实际重要:p 值管"可信吗",效应大小看 Estimate。
Residual standard error: 4.5 on 38 degrees of freedom
Multiple R-squared: 0.851
\[R^2 = 1 - \frac{\text{SS}_\text{Residual}}{\text{SS}_\text{Total}}\]
广告费解释了销量 85.1% 的波动,剩下约 15% 由季节、促销、偶发事件决定。
注记
R² = 0.851 算高还是算低? 没有统一标准。
F-statistic: 217 on 1 and 38 DF p-value: < 2e-16
F 检验回答的是另一个问题:整个模型有没有预测价值?p < 0.05 → 模型整体显著,这条线不是"碰巧画出来的"。
注记
一元回归里 F 检验的 p 值与斜率 t 检验相同;多元回归时分工不同:F 看整体,t 看单个系数。
下个月广告费 45 万,销量大概多少? 找到规律以后,这类问题就退回成了初中数学——把新值代进回归方程即可:
\[\hat{y} = 9.88 + 0.67 \times 45 \approx 40.1\ \text{万件}\]
提示
代入法谁都会,初中生就能完成。但数据量一大就不行了:几十个月的历史值要逐一回算、换个方案再算一遍——手算费时,还容易出错。这种重复劳动,交给 R 的 predict() 函数,一次算完:
1 2 3
30.0 36.7 40.1
本讲只解决了一个问题
提示
本讲的练习,就在这两个作业里——课堂上演示评比
mtcars(32 辆车)—— 找一个数值型变量解释油耗 mpg
wage2(wooldridge,935 人)—— 找一个数值型变量解释 wage
注记
高阶要求:不给提示变量,自己挑选;⚠️ 不要用分类变量。只问三件事:讲得通、跑得出、读得对。
重要
评分导向:考核的不是"算得对不对",而是能不能用统计语言把一个业务问题讲清楚。其他同学可补充。
第19讲:简单线性回归模型 —— 项目五开篇
"All models are wrong, but some are useful." —— George Box
朱 奇 | 锦城大学 · 财会学院