查看全课大纲(第 69 / 101 节)
- 1.数据分析基本概念
- 2.学习数据分析的一般路线
- 3.数据分析的流程
- 4.数据类型
- 5.环境部署(1)
- 6.环境部署(2)
- 7.课程介绍
- 8.TXT文件操作
- 9.JSON文件操作
- 10.CSV文件操作
- 11.Excel文件操作
- 12.数据库及SQL常用语法
- 13.数据库基本操作
- 14.数据库多表连接
- 15.实战:欧洲职业足球数据库分析
- 16.爬虫简介
- 17.URL管理模块
- 18.网页下载模块
- 19.网页解析模块(1)
- 20.网页解析模块(2)
- 21.Scrapy简介
- 22.Scrapy使用步骤(1)
- 23.Scrapy使用步骤(2)
- 24.Scrapy使用步骤(3)
- 25.Scrapy使用步骤(4)
- 26.实战:获取国内城市空气质量指数数据
- 27.NumPy和SciPy介绍
- 28.多维数组
- 29.多维数组操作
- 30.NumPy的常用方法
- 31.向量化介绍
- 32.向量化及通用函数
- 33.实战:2016美国大选分析
- 34.数据结构-Series
- 35.数据结构-DataFrame
- 36.数据结构-Index
- 37.Series的索引操作
- 38.DataFrame的索引操作
- 39.索引操作总结
- 40.运算与对齐
- 41.函数应用操作(1) -- map
- 42.函数应用操作 (2) -- apply applymap
- 43.文件读写操作
- 44.排序操作
- 45.数据清洗--处理缺失数据
- 46.数据清洗--处理重复数据
- 47.数据清洗--替换数据
- 48.常用统计方法(1) -- describe quantile
- 49.常用统计方法(2) -- sum mean median count
- 50.常用统计方法(3) -- max min idxmax idxmin
- 51.常用统计方法(4) -- mad var std cumsum
- 52.实战:全球食品数据分析
- 53.层级索引
- 54.分组与聚合介绍
- 55.分组操作(1) -- GroupBy对象及常用聚合操作
- 56.分组操作(2) -- 自定义分组及聚合操作
- 57.透视表介绍
- 58.透视表操作
- 59.数据规整(1) -- 数据合并concat
- 60.数据规整(2) -- 数据连接merge
- 61.数据重构(3) -- 数据重构stack unstack
- 62.实战:互联网电影资料库分析
- 63.探索性数据分析EDA介绍
- 64.EDA的目的
- 65.EDA常用工具
- 66.Matplotlib绘图基本介绍
- 67.Matplotlib画布
- 68.散点图和柱状图的绘制
- 69.直方图的绘制
- 70.矩阵绘图
- 71.子图的使用
- 72.Matplotlib颜色、标记、线型
- 73.Matplotlib坐标刻度、标签、图例、标题
- 74.Seaborn介绍
- 75.数据集分布可视化(1) -- 单变量分布、双变量分布
- 76.数据集分布可视化(2) -- 变量关系可视化
- 77.类别数据可视化 -- 类别散布图、类别内数据分布、类别内统计图
- 78.交互式数据可视化工具Bokeh介绍
- 79.Bokeh绘制散点图、柱状图、盒子图、弦图
- 80.Bokeh绘制常用图形元素
- 81.3D绘图 -- mplot3d
- 82.3D曲线可视化
- 83.3D散点图可视化
- 84.3D柱状图可视化
- 85.Pandas绘图
- 86.实战:Lending Club借贷数据探索性分析及可视化
- 87.机器学习介绍及应用场景
- 88.机器学习建模介绍 (1) -- 分类
- 89.机器学习建模介绍 (2) -- 回归
- 90.机器学习建模介绍 (3) -- 聚类
- 91.机器学习分类
- 92.机器学习工具scikit-learn
- 93.使用scikit-learn的流程
- 94.数据集准备及划分
- 95.模型选择
- 96.数据预处理及特征工程
- 97.过拟合与欠拟合
- 98.模型调参介绍
- 99.模型调参方法
- 100.模型测试及评价
- 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),柱子用于比较各类别的数值。
# 右图(直方图):横轴是连续的数值区间(销售额),柱子用于展示数据在不同区间内的频数分布。📝 动手练一练
- 概念辨析:假设你有一份班级学生的身高数据,你想展示“身高在160-165cm的学生有多少人”。你应该使用柱状图还是直方图?为什么?
👉 点击查看参考答案
应该使用直方图。 原因:身高是连续型数值数据。我们关心的是身高落在特定数值区间(160-165cm)内的学生频数,这正是直方图的核心用途——展示连续数据在不同区间内的分布情况。柱状图则更适合比较不同类别(例如,男生 vs 女生)的平均身高。
- 代码实战:以下代码意图绘制一组考试成绩的直方图,并将其分为“不及格(<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 数据库