5-3 分析特征内部数据状态常用图形

🎯 教学目标与重难点…

【三维目标】

  • 📚 知识目标:掌握直方图、条形图、饼图和箱线图的作用;明确五数概括(最小值、Q1、中位数、Q3、最大值)与异常值(IQR 规则)的统计含义。
  • ⚙️ 能力目标:能够根据单变量特征的类型(数值型 vs 类别型),熟练运用 hist()bar()pie()boxplot() 绘制分布与占比图表。
  • 💡 素养目标:建立严谨的数据分布观察习惯,提升通过数据分布发现数据质量问题(如偏态、离群点)的洞察力。

【重点与难点】

  • 🟢 教学重点:直方图与条形图的区别;箱线图的结构特征及异常值识别;各种图表在探索性数据分析(EDA)中的应用。
  • 🟡 教学难点:直方图中组距(bins)选择对数据形态的影响;箱线图 IQR 离群点计算逻辑与图表呈现。

📌 一、 课程导入(5分钟)

拿出一个班级的“考试成绩”数据和“学生性别比例”数据。 提问:

  1. 怎么看成绩是集中在高分段、低分段还是呈正态分布?是否有“偏科”极端的异常值?
  2. 怎么直观表达不同性别或不同专业的比例关系? 引出单特征内部状态分析:我们需要分析单个变量的分布形态、频数统计、占比及离群数据。
  • 👨‍🏫 教师活动:提出问题,引导学生思考连续型数据与离散/类别型数据在分析方法上的本质不同。
  • 🧑‍🎓 学生活动:积极思考,指出成绩是连续数值,而性别/专业是离散类别。

区分数值型(Numerical)与类别型(Categorical)变量,引入单特征状态分析的四大图表工具。


📖 二、 解决问题过程(一):5.3.1 直方图 vs 条形图 & 5.3.2 饼图

  1. 直方图 (Histogram)
  • 对象:连续型数值变量(如身高、收入)。
  • 原理:将数据分成若干组(Bins),统计各组频数。柱子间无缝隙。
  1. 条形图 (Bar Chart)
  • 对象:离散型/类别型变量(如地区、类别)。
  • 原理:统计不同类别的数值大小,柱子间有缝隙。
  1. 饼图 (Pie Chart)
  • 对象:类别型变量的组成占比。
  • 建议:类别过多(>5个)时不推荐使用,避免视觉混乱。
  • 👨‍🏫 教师活动:用对比图展示直方图与条形图,特别强调“柱子是否有缝隙”背后的数据类型区别。
  • 🧑‍🎓 学生活动:总结直方图与条形图的差异,理解 bins 参数对直方图形态的影响。

纠正初学者极易混淆直方图与条形图的常见误区,规范图表使用习惯。


💻 三、 解决问题过程(二):5.3.3 箱线图与数据分布洞察代码实践

  1. 箱线图 (Boxplot) 统计学原理
  • 下四分位数 ($Q1$)、中位数 ($Q2$)、上四分位数 ($Q3$)。
  • 四分位距 $IQR = Q3 - Q1$。
  • 异常值判别线:$[Q1 - 1.5 \times IQR, Q3 + 1.5 \times IQR]$ 之外的点。
  1. 综合代码示范:在一个画布中比较 4 种图表展示数据内部状态的效果。
 1import matplotlib.pyplot as plt
 2import numpy as np
 3
 4# 1. 基础配置与数据生成
 5plt.rcParams['font.sans-serif'] = ['SimHei']
 6plt.rcParams['axes.unicode_minus'] = False
 7
 8np.random.seed(10)
 9# 模拟员工薪资数据(右偏分布,带少数高薪离群值)
10salaries = np.concatenate([np.random.normal(8000, 1500, 200), np.array([25000, 30000, 35000])])
11departments = ['技术部', '市场部', '人事部', '财务部']
12dept_counts = [45, 30, 15, 10]
13
14# 2. 创建 2x2 子图网格
15fig, axes = plt.subplots(2, 2, figsize=(11, 8))
16
17# A. 直方图:薪资分布形态
18axes[0, 0].hist(salaries, bins=20, color='skyblue', edgecolor='black', alpha=0.7)
19axes[0, 0].set_title("员工薪资分布直方图")
20axes[0, 0].set_xlabel("薪资 (元)")
21axes[0, 0].set_ylabel("频数")
22
23# B. 条形图:各部门人数
24axes[0, 1].bar(departments, dept_counts, color=['#4c72b0', '#55a868', '#c44e52', '#8172b2'])
25axes[0, 1].set_title("各部门人数条形图")
26axes[0, 1].set_ylabel("人数")
27
28# C. 饼图:部门人数占比
29axes[1, 0].pie(dept_counts, labels=departments, autopct='%1.1f%%', startangle=90, explode=[0.05, 0, 0, 0])
30axes[1, 0].set_title("各部门占比饼图")
31
32# D. 箱线图:薪资分布与离群值检测
33axes[1, 1].boxplot(salaries, vert=False, patch_artist=True, boxprops=dict(facecolor='lightgreen'))
34axes[1, 1].set_title("员工薪资箱线图 (含异常值检测)")
35axes[1, 1].set_xlabel("薪资 (元)")
36
37plt.tight_layout()
38plt.show()
  • 👨‍🏫 教师活动:结合代码生成的箱线图,现场推导 IQR 规则,指明图表上的红点/圆圈即为异常值。
  • 🧑‍🎓 学生活动:观察四种图表的侧重点,在代码中修改 binsautopct 等参数,观察渲染变化。

利用四合一综合画布,形成强烈对比,强化对数据内部状态分析全貌的掌握。


✍️ 四、 解决问题过程(三):课堂练习与巩固

📝 任务一:多组数据的箱线图对比分析…

背景与题目: 某高中对三个班级的数学期末成绩进行了统计,请使用分组箱线图在同一个坐标轴中对比三个班级的成绩分布情况。 数据如下:

  • 1班: [65, 78, 82, 85, 88, 90, 92, 95, 98, 100]
  • 2班: [50, 60, 72, 75, 78, 80, 85, 88, 90, 92]
  • 3班: [30, 45, 80, 82, 85, 86, 88, 90, 91, 93] (注意 3 班有低分离群值)

要求:填充箱体颜色,设置中位数线为红色,并为 X 轴加上班级标签。

🔍 查看参考代码与解析…
 1import matplotlib.pyplot as plt
 2
 3plt.rcParams['font.sans-serif'] = ['SimHei']
 4plt.rcParams['axes.unicode_minus'] = False
 5
 6class1 = [65, 78, 82, 85, 88, 90, 92, 95, 98, 100]
 7class2 = [50, 60, 72, 75, 78, 80, 85, 88, 90, 92]
 8class3 = [30, 45, 80, 82, 85, 86, 88, 90, 91, 93]
 9
10data = [class1, class2, class3]
11labels = ['一班', '二班', '三班']
12
13fig, ax = plt.subplots(figsize=(8, 5))
14
15# 绘制多组箱线图
16bp = ax.boxplot(data, labels=labels, patch_artist=True,
17                medianprops=dict(color='red', linewidth=2),
18                boxprops=dict(facecolor='lightblue', color='blue'))
19
20ax.set_title("三班数学期末成绩分布对比箱线图", fontsize=14)
21ax.set_ylabel("分数")
22ax.grid(True, linestyle=':', alpha=0.6)
23
24plt.show()

📝 五、 课堂小结(5 分钟)

flowchart LR
    root["📊 5.3 数据内部状态图形"]

    subgraph C1["连续型数据 (Continuous)"]
        direction TB
        A1["直方图 (hist):分布形态与偏态"]
        A2["箱线图 (boxplot):五数概括与异常值"]
    end

    subgraph C2["类别型数据 (Categorical)"]
        direction TB
        B1["条形图 (bar):分类频数对比"]
        B2["饼图 (pie):占比结构展示"]
    end

    subgraph C3["💡 图表选型准则"]
        direction TB
        C1_node["看分布 -> 直方图/箱线图"]
        C2_node["看对比 -> 条形图"]
        C3_node["看结构 -> 饼图"]
    end

    root --> C1
    root --> C2
    root --> C3

    style root fill:#4b6cb7,stroke:#253b6e,color:#fff,stroke-width:2px,rx:8px,ry:8px
    style C1 fill:#e3f2fd,stroke:#2196f3,stroke-width:1px
    style C2 fill:#fff3e0,stroke:#ff9800,stroke-width:1px
    style C3 fill:#e8f5e9,stroke:#4caf50,stroke-width:1px

✏️ 随堂检测与互动练习

点击展开:随堂测试题(带解析)

一、 单选题

  1. 在箱线图中,四分位距(IQR)的计算方式是?
  • A. 最大值 - 最小值
  • B. 上四分位数(Q3) - 下四分位数(Q1)
  • C. 平均值 - 标准差
  • D. Q2(中位数) - Q1
【答案】

【解析】B。IQR 是第三个四分位数(75% 分位数)与第一个四分位数(25% 分位数)的差值,反映了中间 50% 数据的离散程度。

  1. 针对“连续型数据”(例如用户的年龄分布),以下哪种图表不适合直接使用?
  • A. 直方图
  • B. 箱线图
  • C. 饼图
  • D. 核密度估计图(KDE)
【答案】

【解析】C。饼图适用于离散的类别比例展示,若直接用于未分组的连续数据会导致切片过多而失去可视化意义。

二、 代码填空题

题目:在绘制饼图时,若要将第一个切片(扇形)突显抽出,并显示百分比保留一位小数,补充代码:

1# 1. 抽出第一个扇形 0.1 的距离
2explode_config = [0.1, 0, 0, 0]
3
4# 2. 调用 pie 函数并配置参数
5ax.pie(values, labels=categories, explode=explode_config, autopct='_________________')
【答案】

%1.1f%%


📮 六、 课后作业与拓展

📮 课后作业…
  1. 生成包含 1000 个符合标准正态分布随机数的数组,绘制其直方图,并在同一图中叠加理论上的正态分布概率密度曲线。
  2. 收集某超市不同类型商品(食品、家电、服装、日用)的销售额数据,分别绘制水平条形图(ax.barh)和百分比饼图。
  3. 详细手动计算一组给定数据(如 [2, 5, 7, 8, 9, 10, 11, 13, 25])的 Q1、中位数、Q3 和 IQR,判断 25 是否为离群点,并用 Matplotlib 画箱线图验证你的计算结果。
  4. 探索 ax.violinplot()(小提琴图),对比小提琴图与箱线图在展示数据密度分布上的优缺点。
  5. 编写代码,绘制一个堆叠条形图(Stacked Bar Chart),展示不同季度各产品的销售额对比。

📋 七、 板书设计

🛠️ 板书设计…
 1=======================================================================
 2            5.3 分析特征内部数据状态常用图形
 3=======================================================================
 41. 连续变量分析:
 5   - 直方图 (ax.hist): 看分布形状 (偏态、峰度) -> 柱子相连
 6   - 箱线图 (ax.boxplot): 看离群点与四分位数 -> IQR = Q3 - Q1
 7
 82. 类别变量分析:
 9   - 条形图 (ax.bar): 看频数/数值大小对比 -> 柱子独立
10   - 饼图 (ax.pie): 看百分比占比结构 -> 类别 <= 5 个
11
123. 核心选型决策树:
13   数据类型? ---> [连续型] ---> 直方图 / 箱线图
14             ---> [类别型] ---> 条形图 / 饼图
15=======================================================================