查看全课大纲(第 69 / 101 节)
  1. 1.数据分析基本概念
  2. 2.学习数据分析的一般路线
  3. 3.数据分析的流程
  4. 4.数据类型
  5. 5.环境部署(1)
  6. 6.环境部署(2)
  7. 7.课程介绍
  8. 8.TXT文件操作
  9. 9.JSON文件操作
  10. 10.CSV文件操作
  11. 11.Excel文件操作
  12. 12.数据库及SQL常用语法
  13. 13.数据库基本操作
  14. 14.数据库多表连接
  15. 15.实战:欧洲职业足球数据库分析
  16. 16.爬虫简介
  17. 17.URL管理模块
  18. 18.网页下载模块
  19. 19.网页解析模块(1)
  20. 20.网页解析模块(2)
  21. 21.Scrapy简介
  22. 22.Scrapy使用步骤(1)
  23. 23.Scrapy使用步骤(2)
  24. 24.Scrapy使用步骤(3)
  25. 25.Scrapy使用步骤(4)
  26. 26.实战:获取国内城市空气质量指数数据
  27. 27.NumPy和SciPy介绍
  28. 28.多维数组
  29. 29.多维数组操作
  30. 30.NumPy的常用方法
  31. 31.向量化介绍
  32. 32.向量化及通用函数
  33. 33.实战:2016美国大选分析
  34. 34.数据结构-Series
  35. 35.数据结构-DataFrame
  36. 36.数据结构-Index
  37. 37.Series的索引操作
  38. 38.DataFrame的索引操作
  39. 39.索引操作总结
  40. 40.运算与对齐
  41. 41.函数应用操作(1) -- map
  42. 42.函数应用操作 (2) -- apply applymap
  43. 43.文件读写操作
  44. 44.排序操作
  45. 45.数据清洗--处理缺失数据
  46. 46.数据清洗--处理重复数据
  47. 47.数据清洗--替换数据
  48. 48.常用统计方法(1) -- describe quantile
  49. 49.常用统计方法(2) -- sum mean median count
  50. 50.常用统计方法(3) -- max min idxmax idxmin
  51. 51.常用统计方法(4) -- mad var std cumsum
  52. 52.实战:全球食品数据分析
  53. 53.层级索引
  54. 54.分组与聚合介绍
  55. 55.分组操作(1) -- GroupBy对象及常用聚合操作
  56. 56.分组操作(2) -- 自定义分组及聚合操作
  57. 57.透视表介绍
  58. 58.透视表操作
  59. 59.数据规整(1) -- 数据合并concat
  60. 60.数据规整(2) -- 数据连接merge
  61. 61.数据重构(3) -- 数据重构stack unstack
  62. 62.实战:互联网电影资料库分析
  63. 63.探索性数据分析EDA介绍
  64. 64.EDA的目的
  65. 65.EDA常用工具
  66. 66.Matplotlib绘图基本介绍
  67. 67.Matplotlib画布
  68. 68.散点图和柱状图的绘制
  69. 69.直方图的绘制
  70. 70.矩阵绘图
  71. 71.子图的使用
  72. 72.Matplotlib颜色、标记、线型
  73. 73.Matplotlib坐标刻度、标签、图例、标题
  74. 74.Seaborn介绍
  75. 75.数据集分布可视化(1) -- 单变量分布、双变量分布
  76. 76.数据集分布可视化(2) -- 变量关系可视化
  77. 77.类别数据可视化 -- 类别散布图、类别内数据分布、类别内统计图
  78. 78.交互式数据可视化工具Bokeh介绍
  79. 79.Bokeh绘制散点图、柱状图、盒子图、弦图
  80. 80.Bokeh绘制常用图形元素
  81. 81.3D绘图 -- mplot3d
  82. 82.3D曲线可视化
  83. 83.3D散点图可视化
  84. 84.3D柱状图可视化
  85. 85.Pandas绘图
  86. 86.实战:Lending Club借贷数据探索性分析及可视化
  87. 87.机器学习介绍及应用场景
  88. 88.机器学习建模介绍 (1) -- 分类
  89. 89.机器学习建模介绍 (2) -- 回归
  90. 90.机器学习建模介绍 (3) -- 聚类
  91. 91.机器学习分类
  92. 92.机器学习工具scikit-learn
  93. 93.使用scikit-learn的流程
  94. 94.数据集准备及划分
  95. 95.模型选择
  96. 96.数据预处理及特征工程
  97. 97.过拟合与欠拟合
  98. 98.模型调参介绍
  99. 99.模型调参方法
  100. 100.模型测试及评价
  101. 101.实战:通过移动设备行为数据预测性别和年龄

直方图的绘制

约 7 分钟

📺 正在播放小象学院官方高清录播(支持倍速与清晰度调节)

小象实战讲义 · Python数据分析实战

在数据分析中,我们不仅关心数据的集中趋势,更希望了解数据的分布情况。直方图(Histogram)正是这样一种强大的可视化工具,它能将连续或离散的数值数据分组,并以柱子的高低直观展示每个分组内数据的频数,从而揭示数据的整体分布形态。本节我们将学习如何使用 Matplotlib 绘制直方图,掌握其核心参数,并理解其与普通柱状图的区别。

💡 核心导读

  • 直方图的作用:用于展示连续数据的分布情况,通过分组(bin)统计频数。
  • 核心参数 plt.hist:掌握 x(数据)、bins(分组规则)和 rwidth(柱子宽度)的用法。
  • 分组边界规则:理解 bins 参数传入列表时,默认的“左闭右开”分组规则。
  • 实战演练:通过年龄分布数据,动手绘制并解读直方图。

直方图:洞察数据分布的利器

直方图在外观上与柱状图(Bar Chart)相似,都是通过柱子的高度来表示数值大小。然而,它们的核心目的不同:柱状图通常用于比较不同类别的数据,而直方图则用于展示单一变量在不同数值区间(即“分组”或“桶”)内的分布。

想象一下,你是一家公司的人力资源分析师,手头有21位员工的年龄数据。你不仅想知道平均年龄,更想了解员工年龄的构成:是年轻团队为主,还是经验丰富的老员工居多?这时,你可以将年龄划分为几个区间(例如20-30岁、30-40岁等),然后统计每个区间内有多少员工。最后,用直方图将这种分布可视化出来。

在直方图的术语中,每个数据区间被称为一个“bin”(桶)。数据就像小球,被扔进不同的桶里,绘图时,每个桶对应一根柱子,柱子的高度代表落入该桶的数据个数(频数)。

使用 Matplotlib 绘制直方图

Matplotlib 提供了 plt.hist() 函数来绘制直方图,其核心参数如下:

  • x: 输入的数据序列(列表、数组等)。
  • bins: 定义如何分组。可以是一个整数(指定分组数量),也可以是一个列表(指定具体的分组边界)。
  • rwidth: 柱子的相对宽度,默认为1(即柱子之间没有间隙)。通常设置为0.8或0.9,使柱子之间略有间隔,图形更清晰。

下面我们通过代码来具体学习。

示例1:指定分组数量

当 bins 传入一个整数(如5)时,Matplotlib 会自动将数据范围均匀地分成指定数量的组,并计算频数。

import matplotlib.pyplot as plt
import matplotlib
# 使用非交互式后端,确保代码在任何环境都能运行
matplotlib.use('Agg')

# 准备一份员工年龄数据
ages = [22, 55, 62, 45, 21, 22, 34, 42, 42, 4, 89, 82, 80, 80, 75, 65, 54, 44, 43, 42, 48]

# 绘制直方图,指定分成5个组
plt.figure(figsize=(8, 5))
plt.hist(ages, bins=5, edgecolor='black')
plt.title('员工年龄分布 (自动分组)')
plt.xlabel('年龄')
plt.ylabel('人数')
# 在实际环境中,可以使用 plt.show() 显示图形
# 此处为讲义演示,我们选择不显示,避免依赖图形界面
plt.close()
# 代码执行后,会生成一个直方图。
# 图形显示:Matplotlib 自动将数据范围(约4岁到89岁)平分为5个区间,并绘制了柱子。
# 从图形中可以直观看到年龄的大致分布情况。

示例2:指定明确的分组边界

有时我们需要按照业务逻辑进行特定分组,例如按年龄段统计。这时,可以向 bins 传入一个边界值列表。

import matplotlib.pyplot as plt
import matplotlib
matplotlib.use('Agg')

# 使用同样的年龄数据
ages = [22, 55, 62, 45, 21, 22, 34, 42, 42, 4, 89, 82, 80, 80, 75, 65, 54, 44, 43, 42, 48]

# 明确指定分组边界:0-10, 10-20, ..., 80-90
custom_bins = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]

plt.figure(figsize=(8, 5))
# 设置 rwidth=0.8,让柱子有间隙,图形更清晰
plt.hist(ages, bins=custom_bins, rwidth=0.8, edgecolor='black', color='skyblue')
plt.title('员工年龄分布 (自定义分组)')
plt.xlabel('年龄组')
plt.ylabel('人数')
plt.xticks(custom_bins) # 将刻度设置为边界值
plt.close()
# 代码执行后,生成按自定义边界分组的直方图。
# 例如,柱子会严格对应 [0,10), [10,20), ..., [80,90] 这些区间。
# 可以清晰看到,大多数员工年龄集中在20-50岁之间。

关键规则:分组边界是“左闭右开”的 当 bins=[20, 30, 40, 50, 60] 时,形成的分组是:

  • [20, 30):包含20岁,不包含30岁。
  • [30, 40):包含30岁,不包含40岁。
  • [40, 50):包含40岁,不包含50岁。
  • [50, 60]:注意:最后一组是包含右边界60岁的。

这个规则对于准确理解每个柱子所代表的数据范围至关重要。

直方图 vs. 柱状图:概念辨析

为了加深理解,我们用一个简单的对比来区分两者:

import matplotlib.pyplot as plt
import matplotlib
matplotlib.use('Agg')

# 数据准备:模拟三类产品的季度销售额(柱状图数据)
categories = ['产品A', '产品B', '产品C']
sales = [120, 150, 90]

# 绘制柱状图
plt.figure(figsize=(10, 4))
plt.subplot(1, 2, 1)
plt.bar(categories, sales, color=['red', 'green', 'blue'])
plt.title('柱状图:不同产品销售额对比')
plt.ylabel('销售额(万)')

# 绘制直方图:模拟产品A单日销售额的分布
plt.subplot(1, 2, 2)
# 假设产品A连续30天的每日销售额(集中在100-140之间)
daily_sales_A = [105, 118, 122, 110, 135, 128, 115, 140, 125, 130,
                 108, 132, 120, 138, 112, 126, 119, 134, 121, 129,
                 102, 137, 124, 116, 133, 109, 127, 131, 114, 123]
plt.hist(daily_sales_A, bins=6, rwidth=0.9, edgecolor='black', color='orange')
plt.title('直方图:产品A日销售额分布')
plt.xlabel('销售额区间')
plt.ylabel('天数')

plt.tight_layout()
plt.close()
# 生成的对比图清晰展示了差异:
# 左图(柱状图):横轴是离散的类别(产品A/B/C),柱子用于比较各类别的数值。
# 右图(直方图):横轴是连续的数值区间(销售额),柱子用于展示数据在不同区间内的频数分布。

📝 动手练一练

  1. 概念辨析:假设你有一份班级学生的身高数据,你想展示“身高在160-165cm的学生有多少人”。你应该使用柱状图还是直方图?为什么?
👉 点击查看参考答案

应该使用直方图。 原因:身高是连续型数值数据。我们关心的是身高落在特定数值区间(160-165cm)内的学生频数,这正是直方图的核心用途——展示连续数据在不同区间内的分布情况。柱状图则更适合比较不同类别(例如,男生 vs 女生)的平均身高。

  1. 代码实战:以下代码意图绘制一组考试成绩的直方图,并将其分为“不及格(<60)”、“及格(60-70)”、“中等(70-80)”、“良好(80-90)”、“优秀(90-100)”五个等级。请补全 plt.hist 的 bins 参数(先自己动手填,再看答案)。
# 练习框架(请把下方 hist 一行的 bins 补全后,取消注释运行)
# import matplotlib.pyplot as plt
# import matplotlib
# matplotlib.use('Agg')
#
# scores = [45, 78, 92, 65, 88, 55, 95, 72, 81, 63, 70, 85, 58, 98, 76]
# 提示:bins 需要给出每个区间的边界点,五个分组需要六个边界值
# plt.hist(scores, bins=<在此填写>, rwidth=0.85, edgecolor='black')
# plt.title('考试成绩分布')
# plt.xlabel('分数段')
# plt.ylabel('人数')
# plt.close()
👉 点击查看参考答案
# 完整答案:把下面这一行的 bins 填回上面练习框架的 hist 语句中,取消注释运行
# plt.hist(scores, bins=[0, 60, 70, 80, 90, 100], rwidth=0.85, edgecolor='black')

解释:bins 列表定义了分组的边界点。根据“左闭右开”规则,这将创建以下分组:

  • [0, 60):不及格(包含0分,不包含60分)
  • [60, 70):及格
  • [70, 80):中等
  • [80, 90):良好
  • [90, 100]:优秀(最后一组包含右边界100分) 参数 rwidth=0.85 使柱子宽度为默认宽度的85%,产生视觉上的间隙。

本章小结

本节我们深入学习了数据可视化中的重要图表——直方图。它不仅是探索性数据分析(EDA)的必备工具,更是理解数据底层分布规律的窗口。

📋 行动清单

  • 动手绘制:用你手头的一组数据(如每月开销、运动步数)尝试绘制直方图,分别体验自动分组(bins=整数)和自定义分组(bins=列表)的效果。
  • 解读图形:观察你绘制的直方图,尝试用语言描述数据的分布特点(例如:“数据主要集中在…区间”,“呈现左偏/右偏形态”)。
  • 对比区分:在下次看到柱状图时,有意识地思考:如果将其数据转换为连续变量的区间分布,对应的直方图会是什么样子?这能有效强化你对两者区别的理解。

—— 小象教研组

配套资料 · 直接下载

课件、代码、数据集等配套资料全部免费,点击即可直接下载,无需分享或解锁。

  • 本节课件:直方图的绘制
    PDF · 202KB
    下载
  • 全套课件打包(第1-5章)
    ZIP · 12.8MB
    下载
  • 全套课件打包(第6-8章)
    ZIP · 15MB
    下载
  • 实战数据集:AppleStore 应用商城分析
    ZIP · 329KB
    下载
  • 实战数据集:女性服装电商分析
    ZIP · 2.8MB
    下载
  • Python 数据分析环境搭建指南
    PDF · 2MB
    下载
  • Scrapy 安装教程
    PDF · 12.7MB
    下载
  • 附加实战项目:AppleStore 应用商城数据分析
    ZIP · 0.3MB · ipynb + CSV 数据
    下载
  • 附加实战项目:银行电话营销数据分析
    ZIP · 0.4MB · ipynb + CSV 数据
    下载
  • 附加实战项目:女性服装电商评论数据分析
    ZIP · 2.7MB · ipynb + CSV 数据
    下载
  • 附加实战项目:美国化学学会杂志数据分析
    ZIP · 34.2MB · ipynb + SQLite 数据库
    下载