第17讲:直方图、散点图与箱形图

数据挖掘与R语言

2026年10月28日

本讲目标

三种图,回答三类问题

  • 直方图:单个数值型变量的分布形态如何?
  • 散点图:两个数值变量之间是否有关联?
  • 箱形图:比较不同类别的数值变量分布是否有显著差异?

回顾:ggplot2 的基本结构

数据 + 映射 + 几何图形 + 标签

▶️ 查看代码
ggplot(mpg, aes(x = displ, y = hwy, color = class)) + # 数据 + 映射
  geom_point(size = 2) + # 几何对象(作什么图)
  labs(title = "汽车排量与高速公路油耗",  # 标签:标题 + 坐标轴 + 图例
       x = "排量(升)",
       y = "高速公路油耗(英里/加仑)",
       color = "车型")

  • ggplot():指定数据;aes():把变量映射到坐标或颜色。
  • geom_*():决定图形类型。
  • labs():添加标题、坐标轴名称和图例标题。

选图的两步判断法

  1. 数变量:一个,还是两个?
  2. 看类型:数值型,还是分类变量?
变量情况 常用图形 主要用途
一个分类变量 条形图 比较各类别的数量
一个数值变量 直方图 看分布、峰数、偏态
两个数值变量 散点图 看关系、方向、形状
一个数值+一个分类 箱形图 比较各组的中位数与离散程度

第一站 · 直方图:单个数值型变量的分布

绘图思路和步骤

  • 数据:airquality 记录纽约 1973 年 5—9 月的每日气象。
  • 问题:数据期间每日最高温度出现天数/次数的分布情况
  • 数变量、看类型:
    • 一个变量:Temp(温度)
    • 变量类型:数值型
  • 适合图形:直方图
▶️ 查看代码
library(ggplot2)
ggplot(airquality, aes(x = Temp)) + # 横坐标,纵坐标由R通过计数自动生成
  geom_histogram(bins = 15, # 几何图形为直方图
                 fill = "steelblue", color = "white") +
  labs(title = "纽约每日最高气温分布(1973年5—9月)",
       x = "气温(华氏度)",
       y = "天数")

  • bins = 10:把温度范围分成 10 组;每根柱子的高度表示该温度区间内的天数。
  • 同一份数据,分组过粗会掩盖细节(bins较小),过细(bins较多)则容易出现锯齿(binwidth也可以起到同样的调节作用,目前我们只需要掌握bins这一种调节),绘图时可以多选几个不同的bins值,比较图形,再说明选择(分组多或少)理由。
  • 作图后检查:标题、横纵坐标是否清楚?图形是否回答了我们的问题?

第二站 · 散点图:看两个数值变量的关系

绘图思路和步骤

  • 数据:faithful等待间隔与喷泉喷发时长数据
  • 问题:喷发时长与等待间隔之间有没有关联
  • 数变量、看类型:
    • 两个变量:eruptions(喷发时长) & waiting(等待间隔)
    • 变量类型:数值型 + 数值型
  • 适合图形:散点图
▶️ 查看代码
ggplot(faithful, aes(x = waiting, y = eruptions)) + # 增加了纵坐标数据
  geom_point(size = 2) +  # 几何图形变成散点图
  labs(title = "等待间隔与下次喷发时长关系图",
       x = "等待间隔(分钟)",
       y = "喷发持续时间(分钟)")

读散点图,主要看三件事:

  • 关系:两个变量之间是否能看出明显的关联?
  • 方向:如果有,整体向右上,还是向右下?
  • 强弱:点云集中,还是分散?
  • 形状:近似直线、弯曲,还是分成几群?

相关不等于因果,形状也很重要

▶️ 查看代码
ggplot(faithful, aes(x = waiting, y = eruptions)) + # 增加了纵坐标数据
  geom_point(size = 2, color = "purple") + # 可以加上颜色
  geom_smooth(method = "lm", se = TRUE) + # 加上趋势线
  labs(title = "等待间隔与下次喷发时长关系图",
       x = "等待间隔(分钟)",
       y = "喷发持续时间(分钟)")

  • geom_smooth(method = "lm"):添加线性拟合线;se = TRUE:显示置信带。
  • 相关系数约为 0.90,表示强正相关。
  • 相关关系不等于因果关系。此外,点云分成两群,提醒我们不要只看相关系数或一条拟合线。

第三站 · 箱形图:比较不同类别的分布

绘图思路和步骤

  • 数据:mtcars,记录多种汽车的性能指标。
  • 问题:不同气缸数汽车的燃油经济性(mpg)分布有什么差异?
  • 数变量、看类型:
    • 两个变量:气缸数 cyl & 每加仑英里数 mpg
    • 变量类型:cyl 在数据中存储为数值型,但实际代表气缸类别;mpg 为数值型
  • 适合图形:箱形图。用它比较不同气缸数汽车单位油耗行驶里程的中位数和分布范围。

把 cyl 转成因子,再画箱形图

▶️ 查看代码
class(mtcars$cyl)  # 原始类型是 numeric
[1] "numeric"
▶️ 查看代码
ggplot(mtcars, aes(x = cyl, y = mpg)) +
  geom_boxplot(aes(fill = factor(cyl))) + # 几何图形是箱形图
  labs(title = "不同气缸数汽车的油耗分布",
       x = "气缸数", y = "每加仑英里数(mpg)")

  • factor(cyl):把数值型的气缸数转换为分类变量,让 R 按 4、6、8 三组绘制箱形图。
  • 箱内横线是中位数;箱体表示中间 50% 数据的范围(IQR);须外的点可能是离群值。
  • mpg 越高,表示每加仑汽油行驶的英里数越多,也就是越省油。

总结:先判断,再作图

研究问题 变量类型 图形
一个数值变量的分布如何? 一个数值变量 直方图
两个数值变量是否一起变化? 数值+数值 散点图
不同类别的分布有什么差异? 数值+分类 箱形图
各类别分别有多少个? 分类变量 条形图

最后记住三句话:

  • 直方图看形态,留意组距。
  • 散点图看关系,也看点云的形状。
  • 箱形图看中位数与离散程度;先确认分类变量是否真的按类别处理。

课后作业

完整题目与评分标准见《第17讲作业题目与评分标准》。

作业

  • 第1题:longley,分析国民生产总值与就业人数的关系。
  • 第2题:Default.csv,比较违约与未违约客户的未还余额。
  • 第3题:economics,分析个人储蓄率的分布。
  • 第4题(高阶):比较 2008—2015 年各年的房屋中位价。
  • 第5题(高阶):分析信用额度与持卡人余额的关系。

要求

  • 1~3题每个人都必须独立完成,课堂上随机抽三位同学上台演示讲解,其他同学点评纠错
  • 第4、5题分别由第一组和第二组集中讨论完成,并推选一位代表在课堂上演示讲解,另一组点评纠错。

谢谢!

第17讲:直方图、散点图与箱形图

先看清变量类型,再决定画什么图;先让图说话,再下结论。

朱 奇 | 财会学院