数据挖掘与R语言

第9讲:统计基础

2026年04月24日

上讲回顾

  • 坐标轴精调xlim() / scale_x_continuous() 控制范围;scale_x_log10() 处理跨数量级数据;coord_cartesian() 缩放视图而不丢失数据
  • 分面进阶facet_wrap()nrow/ncol 控制布局,scales = "free" 放开坐标轴,labeller 自定义标签
  • 多图并列(patchwork)+ 左右、/ 上下、(p1 + p2) / p3 复杂布局;plot_annotation() 统一标题
  • 配色系统scale_*_manual() 手动配色;scale_*_brewer() 预设调色板;scale_*_viridis_c() 色盲友好的连续变量首选
  • 图形保存ggsave() 指定尺寸与 dpishowtext 解决中文字体问题

本讲内容

  • Part 1:描述统计 ——读懂数据的"底色"
  • Part 2:正态分布 ——线性模型的概率基础
  • Part 3:相关性 ——回归的"前传"
  • Part 4:统计推断 ——\(t\) 检验、\(F\) 检验与置信区间
  • Part 5:R语言实战 ——mtcars 综合演示

为什么先学统计基础?

下一讲我们将进入线性回归

在此之前,有三个问题必须先回答:

① 我的数据长什么样?(描述统计 + 正态分布)

② 变量之间有关系吗?(相关性)

③ 这个关系"可信"吗?(统计推断)

注记

回归分析本质上是对这三个问题的系统化回答。今天打好地基,下讲才能盖楼。

Part 1:描述统计

理解数据的"底色"

集中趋势:均值 vs 中位数

均值(Mean):所有观测值的算术平均

\[\bar{x} = \frac{1}{n}\sum_{i=1}^{n} x_i\]

▶️ 查看代码
mean(mtcars$mpg)

中位数(Median):排序后位于正中间的值

均值的弱点

  • 对极端值极度敏感
  • 一个富豪可以把整栋楼的"平均收入"拉高十倍

中位数的优势

  • 对极端值免疫(稳健 robust)
  • 更能代表"典型"水平
  • 房价、收入分析的首选
▶️ 查看代码
median(mtcars$mpg)

提示

实战技巧:均值与中位数差异悬殊 → 数据存在偏态 → 要警惕异常值!

偏态的直觉

注记

蓝色实线 = 均值,橙色虚线 = 中位数。右偏时均值被极大值"拉走"。

离散程度:方差与标准差

数据的"平均偏差"有多大?

方差(Variance)

\[\sigma^2 = {\sum_{i=1}^{n}(x_i - \bar{x})^2\over {n - 1}}\]

标准差(Standard Deviation)

\[\sigma = \sqrt{\sigma^2}\]

▶️ 查看代码
mtcars |> 
  mutate(diff = mpg - mean(mpg),
         diff_sq = diff^2) |> 
  summarise(var = sum(diff_sq)/(n()-1))
▶️ 查看代码
var(mtcars$mpg)
sd(mtcars$mpg)
  • 标准差与原数据单位相同,更直观
  • 方差在数学推导中更方便(求导等)
  • \(\sigma\) 小 → 数据集中,模型预测容易
  • \(\sigma\) 大 → 数据分散,模型需要更多解释

方差:回归的核心目标

重要

关键洞察:线性回归的本质,就是"解释方差"。

想象你面对 \(y\) 的数据(例如房价),它有一定的总变异

回归模型引入 \(x\)(面积、地段……)后:

\[\underbrace{\text{SS}_\text{Total}}_{\text{总变异}} = \underbrace{\text{SS}_\text{Regression}}_{\text{模型解释部分}} + \underbrace{\text{SS}_\text{Residual}}_{\text{残差/不可解释部分}}\]

\(R^2\)(决定系数) 就是"模型解释的比例":

\[R^2 = \frac{\text{SS}_\text{Regression}}{\text{SS}_\text{Total}} = 1 - \frac{\text{SS}_\text{Residual}}{\text{SS}_\text{Total}}\]

这个方差分解框架,正是 \(F\) 检验的数学基础——稍后 Part 4 详细展开。

Part 2:正态分布

线性模型的概率基础

什么是正态分布?

正态分布(Normal Distribution),又称高斯分布,是统计学中最重要的概率分布:

\[f(x) = \frac{1}{\sigma\sqrt{2\pi}} \exp\!\left(-\frac{(x-\mu)^2}{2\sigma^2}\right)\]

由两个参数完全决定:均值 \(\mu\)(位置)和标准差 \(\sigma\)(宽窄)

为什么它无处不在?

  • 身高、体重、测量误差……
  • 大量独立随机因素叠加的结果
  • 中心极限定理保证其普遍性

记号:

\[X \sim \mathcal{N}(\mu,\, \sigma^2)\]

标准正态分布(\(\mu=0,\,\sigma=1\)):

\[Z \sim \mathcal{N}(0, 1)\]

正态分布的形状

注记

所有正态分布的曲线形状相同,只是位置和宽度不同。改变 \(\mu\) 左右平移,改变 \(\sigma\) 胖瘦变化。

68-95-99.7 法则

标准化与 Z 分数

标准化(Standardization):将任意正态分布转换为标准正态 \(\mathcal{N}(0,1)\)

\[Z = \frac{x - \mu}{\sigma}\]

Z 分数的意义:

  • \(Z = 0\):恰好等于均值
  • \(Z = 1\):比均值高一个标准差
  • \(Z = -2\):比均值低两个标准差
  • \(|Z| > 2\):落在 95% 范围之外,属于"罕见值"

提示

实战价值:

不同量纲的变量标准化后可直接比较。

回归中的标准化系数(beta) 就基于此——用来比较不同自变量的相对重要性。

[1] 0.00998

正态分布与线性回归

为什么线性回归假设残差服从正态分布

回归模型:\(y_i = \beta_0 + \beta_1 x_i + \varepsilon_i\),其中 \(\varepsilon_i \sim \mathcal{N}(0, \sigma^2)\)

这个假设意味着:

  • 残差以 0 为中心——模型无系统性偏差
  • 小残差比大残差出现概率更高(钟形曲线)
  • OLS 估计量具有最优性质(BLUE 定理:Best Linear Unbiased Estimator)
  • 我们才能使用 \(t\) 分布和 \(F\) 分布进行假设检验

Part 3:相关性

回归的"前传"

散点图:数据挖掘的第一步

在计算任何系数之前,先看图

警告

Anscombe 四重奏的教训(第7讲):统计量相同,散点图可能完全不同。图永远先于数字。

Pearson 相关系数

衡量两个变量之间线性关系的强度与方向:

\[r = \frac{\sum_{i=1}^{n}(x_i - \bar{x})(y_i - \bar{y})}{\sqrt{\sum(x_i-\bar{x})^2} \cdot \sqrt{\sum(y_i-\bar{y})^2}}\]

\(r\) 的范围 解读
\(+1\) 完全正线性相关
\(0.7 \sim 0.9\) 强正相关
\(0.3 \sim 0.7\) 中等正相关
\(\approx 0\) 无线性关系
负值 反向关系

使用条件:

  • 两个变量均为连续型
  • 关系基本呈线性
  • 数据无严重异常值
  • (严格来说)近似正态分布

Spearman 相关系数

秩相关(Rank Correlation):先将数据转换为排名,再计算相关性

\[r_s = 1 - \frac{6\sum d_i^2}{n(n^2-1)}\]

其中 \(d_i\) 是第 \(i\) 个观测值在两变量中的排名之差

适用场景

  • 数据非正态分布
  • 存在异常值
  • 变量是有序分类(满意度、评级)
  • 关系是单调但非线性

与 Pearson 的区别

Pearson 问:"线性关系有多强?"

Spearman 问:"单调关系有多强?"

一个增大时另一个也增大,就算不是直线也能捕捉到。

相关性 ≠ 因果性

重要

这是统计学中最重要最常被忽略的警告。

经典案例:

  • 冰淇淋销量与溺水人数高度正相关 → 真正原因:夏天
  • 国家人均巧克力消费量与诺贝尔奖数量相关 → 真正原因:富裕程度
  • 消防员出动数量与火灾损失正相关 → 真正原因:火灾规模

三种混淆模式:

模式 描述
混淆变量(Confounding) 第三个变量同时影响 \(x\)\(y\)
反向因果(Reverse Causality) \(y\) 其实导致了 \(x\)
巧合相关(Spurious Correlation) 纯属偶然,无实质联系

提示

回归分析可以控制混淆变量,但无法根本解决因果推断——这需要实验设计或更高级的方法(断点回归、双重差分)。

共线性预警

如果两个自变量之间高度相关……

模型"分不清"到底是 \(X_1\) 还是 \(X_2\) 在起作用——系数估计变得不稳定、不可信

下讲元回归时,我们会详细处理这个问题(VIF 检验)。

Part 4:统计推断

\(t\) 检验、\(F\) 检验与置信区间

为什么需要统计推断?

我们研究的是总体,但只能观测样本

核心问题: 样本得到的回归系数 \(\hat{\beta}\)能代表真实的总体系数 \(\beta\) 吗?

中心极限定理(CLT) 给出理论保证:

意义: 这正是我们能对回归系数做 \(t\) 检验的理论根基。

\(t\) 检验:系数是否显著?

回归中每个系数都要回答:"这个变量真的有用吗?"

\[H_0: \beta_j = 0 \quad \text{(变量 } X_j \text{ 对 } Y \text{ 没有影响)}\] \[H_1: \beta_j \neq 0\]

注记

标准误(Standard Error): SE 标准误是样本均值 \(\bar{x}\) 围绕总体均值 \(\mu\) 波动程度的标准差。

\(t\) 统计量:

\[t = \frac{\hat{\beta}_j}{\text{SE}(\hat{\beta}_j)}\]

直觉:系数有多大(信号)除以估计的不确定性(噪声)。信噪比越高,越显著。

  • \(|t|\) 越大 → P 值越小 → 越倾向于拒绝 \(H_0\)
  • 通常以 \(p < 0.05\) 为显著性门槛
  • 自由度 \(df = n - k - 1\)\(k\) 为自变量个数)
  • \(n\) 足够大时,\(t\) 分布趋近标准正态

P 值图解

警告

P 值 = "假设 \(H_0\) 为真,观测到当前或更极端结果的概率"——不是 \(H_0\) 为真的概率!

\(F\) 检验:模型整体是否有用?

\(t\) 检验针对单个系数\(F\) 检验则问:整个模型有没有解释力?

\[H_0: \beta_1 = \beta_2 = \cdots = \beta_k = 0 \quad \text{(所有自变量都没用)}\]

\(F\) 统计量 基于 Part 1 的方差分解:

\[F = \frac{\text{SS}_\text{Regression} / k}{\text{SS}_\text{Residual} / (n-k-1)} = \frac{\text{模型解释的平均方差}}{\text{残差平均方差}}\]

直觉: 模型解释的方差越多(相对于残差),\(F\) 值越大,模型越有整体价值。

  • \(F\) 值大,\(p < 0.05\) → 模型整体显著
  • \(F\) 值接近 1 → 模型几乎没有解释力

注记

在 R 回归输出中:

F-statistic: 91.4 on 1 and 30 DF
p-value: 1.29e-10

\(F\) 检验通过 → 模型有意义,再去看各系数的 \(t\) 检验。

\(F\) 分布图解

\(t\) 检验 vs \(F\) 检验

\(t\) 检验 \(F\) 检验
检验对象 单个系数 \(\beta_j\) 所有系数(模型整体)
原假设 \(\beta_j = 0\) \(\beta_1 = \cdots = \beta_k = 0\)
统计量分布 \(t\) 分布(\(df = n-k-1\) \(F\) 分布(\(df_1=k,\; df_2=n-k-1\)
在 R 输出中 Pr(>|t|) 最后一行 F-statistic
关系 简单回归时 \(F = t^2\)

提示

实战流程:先看 \(F\) 检验。 若整体不显著,单个系数的 \(t\) 检验意义不大。\(F\) 通过后,再逐一检查各系数的 \(t\) 值和 P 值。

置信区间

回归的估计不是一个"点",而是一个"范围"。

95% 置信区间:

\[\hat{\beta}_j \pm t_{0.025,\, n-k-1} \times \text{SE}(\hat{\beta}_j)\]

正确解读: 如果用同样方法重复抽样 100 次,约 95 次构造的区间会包含真实参数 \(\beta_j\)

在 R 回归输出中:

Coefficients:
            Estimate Std. Error t value Pr(>|t|)
(Intercept)  37.885      1.878   20.18   <2e-16 ***
wt           -5.344      0.559   -9.56  1.3e-10 ***

F-statistic: 91.4 on 1 and 30 DF
p-value: 1.29e-10

提示

三个问题,三个输出:

  • 系数有意义吗?→ \(t\) 检验
  • 模型整体有用吗?→ \(F\) 检验
  • 估计有多精确?→ 置信区间

Part 5:R 语言实战

mtcars 综合演示

数据集介绍:mtcars

▶️ 查看代码
# mtcars:1974年《汽车趋势》杂志的32款车型测试数据
glimpse(mtcars)
Rows: 32
Columns: 11
$ mpg  <dbl> 21.0, 21.0, 22.8, 21.4, 18.7, 18.1, 14.3, 24.4, 22.8, 19.2, 17.8,…
$ cyl  <dbl> 6, 6, 4, 6, 8, 6, 8, 4, 4, 6, 6, 8, 8, 8, 8, 8, 8, 4, 4, 4, 4, 8,…
$ disp <dbl> 160.0, 160.0, 108.0, 258.0, 360.0, 225.0, 360.0, 146.7, 140.8, 16…
$ hp   <dbl> 110, 110, 93, 110, 175, 105, 245, 62, 95, 123, 123, 180, 180, 180…
$ drat <dbl> 3.90, 3.90, 3.85, 3.08, 3.15, 2.76, 3.21, 3.69, 3.92, 3.92, 3.92,…
$ wt   <dbl> 2.62, 2.88, 2.32, 3.21, 3.44, 3.46, 3.57, 3.19, 3.15, 3.44, 3.44,…
$ qsec <dbl> 16.5, 17.0, 18.6, 19.4, 17.0, 20.2, 15.8, 20.0, 22.9, 18.3, 18.9,…
$ vs   <dbl> 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0,…
$ am   <dbl> 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0,…
$ gear <dbl> 4, 4, 4, 3, 3, 3, 3, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 4, 4, 4, 3, 3,…
$ carb <dbl> 4, 4, 1, 1, 2, 1, 4, 2, 2, 4, 4, 3, 3, 3, 4, 4, 4, 1, 2, 1, 1, 2,…

第一步:summary() 查看描述统计

▶️ 查看代码
mtcars |>
  select(mpg, wt, hp, disp) |>
  summary()
      mpg             wt             hp             disp      
 Min.   :10.4   Min.   :1.51   Min.   : 52.0   Min.   : 71.1  
 1st Qu.:15.4   1st Qu.:2.58   1st Qu.: 96.5   1st Qu.:120.8  
 Median :19.2   Median :3.33   Median :123.0   Median :196.3  
 Mean   :20.1   Mean   :3.22   Mean   :146.7   Mean   :230.7  
 3rd Qu.:22.8   3rd Qu.:3.61   3rd Qu.:180.0   3rd Qu.:326.0  
 Max.   :33.9   Max.   :5.42   Max.   :335.0   Max.   :472.0  

提示

mpg 均值(20.09)与中位数(19.20)接近 → 分布较对称。 hp 均值(146.7)> 中位数(123.0)→ 右偏,少数高性能车拉高了均值。

第二步:直方图叠加正态曲线

▶️ 查看代码
p_mpg <- ggplot(mtcars, aes(x = mpg)) +
  geom_histogram(aes(y = after_stat(density)), bins = 12,
                 fill = "#4472C4", color = "white", alpha = 0.85) +
  stat_function(fun = dnorm,
                args = list(mean = mean(mtcars$mpg), sd = sd(mtcars$mpg)),
                color = "#e05c2a", linewidth = 1.2) +
  geom_vline(xintercept = mean(mtcars$mpg),   color = "#1a3a5c", linewidth = 1) +
  geom_vline(xintercept = median(mtcars$mpg), color = "#e8a838", linewidth = 1, linetype = "dashed") +
  labs(title = "mpg 分布", subtitle = "红线=正态拟合曲线", x = "mpg", y = "密度")

p_hp <- ggplot(mtcars, aes(x = hp)) +
  geom_histogram(aes(y = after_stat(density)), bins = 12,
                 fill = "#e05c2a", color = "white", alpha = 0.85) +
  stat_function(fun = dnorm,
                args = list(mean = mean(mtcars$hp), sd = sd(mtcars$hp)),
                color = "#1a3a5c", linewidth = 1.2) +
  geom_vline(xintercept = mean(mtcars$hp),   color = "#1a3a5c", linewidth = 1) +
  geom_vline(xintercept = median(mtcars$hp), color = "#e8a838", linewidth = 1, linetype = "dashed") +
  labs(title = "hp 分布", subtitle = "蓝线=正态拟合曲线", x = "hp", y = "密度")

p_mpg + p_hp

第三步:相关矩阵

▶️ 查看代码
mtcars |>
  select(mpg, wt, hp, disp, cyl) |>
  cor() |>
  round(2)
       mpg    wt    hp  disp   cyl
mpg   1.00 -0.87 -0.78 -0.85 -0.85
wt   -0.87  1.00  0.66  0.89  0.78
hp   -0.78  0.66  1.00  0.79  0.83
disp -0.85  0.89  0.79  1.00  0.90
cyl  -0.85  0.78  0.83  0.90  1.00

注记

mpgwt 相关系数 −0.87——强负相关,这正是下讲线性回归的核心案例 mpg ~ wt

注意 wtdispcyl 相互之间也高度相关(>0.85)——共线性预警!

第四步:散点图矩阵

▶️ 查看代码
mtcars |>
  select(mpg, wt, hp, disp) |>
  pairs(
    pch  = 19,
    col  = adjustcolor("#1a3a5c", alpha.f = 0.6),
    cex  = 0.9,
    main = "mtcars 变量散点图矩阵"
  )

第五步:核心散点图 + 相关系数

▶️ 查看代码
r_val <- cor(mtcars$wt, mtcars$mpg) |> round(3)

ggplot(mtcars, aes(x = wt, y = mpg)) +
  geom_point(size = 3, color = "#1a3a5c", alpha = 0.8) +
  geom_smooth(method = "lm", se = TRUE, color = "#e05c2a", linewidth = 1.2) +
  annotate("text", x = 4.8, y = 30,
           label = paste0("r = ", r_val),
           size = 6, color = "#1a3a5c", fontface = "bold") +
  labs(
    title    = "车重与油耗:强负线性相关",
    subtitle = "红线为线性拟合趋势线,灰色区域为 95% 置信区间",
    x = "车重(1000磅)", y = "油耗(英里/加仑)"
  )

第六步:cor.test() 假设检验

▶️ 查看代码
cor.test(mtcars$wt, mtcars$mpg)

    Pearson's product-moment correlation

data:  mtcars$wt and mtcars$mpg
t = -10, df = 30, p-value = 1e-10
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 -0.934 -0.744
sample estimates:
   cor 
-0.868 

注记

t = -9.56p-value < 2.2e-16——极度显著,拒绝"车重与油耗无关"的原假设。

95% CI: [-0.934, -0.744]——置信区间不包含 0,相关性真实存在。

第七步:正态性检验

▶️ 查看代码
shapiro.test(mtcars$mpg)

    Shapiro-Wilk normality test

data:  mtcars$mpg
W = 0.9, p-value = 0.1
▶️ 查看代码
qqnorm(mtcars$mpg, pch = 19, col = "#1a3a5c", main = "mpg 的 Q-Q 图")
qqline(mtcars$mpg, col = "#e05c2a", lwd = 2)

提示

p > 0.05 → 不拒绝正态假设,mpg 可视为近似正态。下讲拟合回归后,同样的检验将用于残差。

本讲小结

  • 描述统计:均值易受极端值影响,中位数更稳健;标准差衡量离散程度;回归的本质是解释方差\(\text{SS}_\text{Total} = \text{SS}_\text{Reg} + \text{SS}_\text{Res}\)

  • 正态分布:由 \(\mu\)\(\sigma\) 完全决定;68-95-99.7 法则;Z 分数标准化;残差正态假设是 OLS 最优性与后续检验的基础

  • 相关性:散点图先行;Pearson 衡量线性,Spearman 衡量单调;相关性 ≠ 因果性;自变量高度相关 → 多重共线性

  • 统计推断:CLT 保证抽样正态性;\(t\) 检验看单个系数;\(F\) 检验看模型整体;置信区间比点估计更诚实;先看 \(F\),再看 \(t\)

  • R实战summary() → 直方图+正态曲线 → cor()pairs()cor.test()shapiro.test() + Q-Q 图

课后练习

基础练习(必做)

  1. 使用 diamonds 数据集,对 pricecaratdepthtable 运行 summary(),绘制 price 的直方图并叠加正态曲线,标出均值和中位数,判断分布形态

  2. 计算上述四个变量的相关矩阵,找出与 price 相关性最强的变量,绘制散点图加趋势线,并用 cor.test() 检验显著性,解读 \(t\) 值、P 值和置信区间

  3. mtcars 中的 mpgshapiro.test() 和 Q-Q 图进行正态性检验,再对 hp 做同样检验,比较两者结论有何不同

进阶挑战(选做)

  1. 分别计算 mtcarswtmpg 的 Pearson 和 Spearman 相关系数(cor(..., method = "spearman")),比较差异,思考:什么情况下两者会相差很大?

  2. lm(mpg ~ wt, data = mtcars) 拟合一个简单回归,用 summary() 查看输出,找出其中的 \(t\) 值、P 值、\(F\) 统计量,对照本讲内容逐一解读——这就是下讲的预习

下讲预告

第10讲:线性回归

  • 简单线性回归\(y = \beta_0 + \beta_1 x + \varepsilon\),最小二乘法(OLS)求解原理
  • 模型评估\(R^2\)、残差标准误、\(F\) 统计量(今天已见过它了!)
  • 回归诊断:残差正态性(shapiro.test 再登场)、同方差性、影响点检测
  • 多元线性回归:引入多个自变量,控制混淆变量,VIF 检验共线性
  • R实战lm()summary(lm())confint()ggplot 可视化回归结果

提示

今天的所有概念——方差分解(\(R^2\))、正态分布(残差假设)、\(t\) 检验、\(F\) 检验、置信区间——下讲都会在 summary(lm()) 的输出中逐一现身

谢谢!

第9讲:统计基础


「所有的模型都是错的,但有些模型是有用的。」

—— George Box