Data Science For Beginners 第10课作业实战:用直方图与密度图讲好一个新数据集的故事
【免费下载链接】Data-Science-For-Beginners10 Weeks, 20 Lessons, Data Science for All!项目地址: https://gitcode.com/GitHub_Trending/da/Data-Science-For-Beginners
导读
本篇文章围绕 Data Science For Beginners 课程第 10 课《Visualizing Distributions(可视化数据分布)》的课后作业(Apply your skills)展开,该作业要求学习者在前几课使用明尼苏达鸟类数据集(Minnesota birds)掌握直方图与密度图技术之后,换一个全新的数据集,用 Jupyter Notebook 讲一个完整的数据故事,并且至少使用 5 个直方图来支撑你的分析。读完本文,你将获得一份可直接照做的作业路线图:从选数据集、写数据来源注释,到五种直方图/KDE 密度图的落地代码模板,再到对照评估量规的自检清单,全程紧扣本课讲义与参考解答中的真实代码。
一、先读懂作业要求:这是一道"应用型"实践题
作业原文位于 translations/en/3-Data-Visualization/10-visualization-distributions/assignment.md,核心指令只有两条,却规定了完整的交付物形态:
- 换数据集:此前几课你一直在用明尼苏达鸟类数据集研究鸟的数量与种群密度;现在请换一个不同的数据集(例如来自 Kaggle 等公开数据平台的真实数据),把已学会的分布可视化技术迁移过去。
- 交付一个会讲故事的 Notebook:新建一个 notebook,围绕该数据集讲一个完整的故事,并且务必在分析中使用直方图(histograms)。
与之配套的评估量规(Rubric)把"优秀"标准定义得很具体:
| 等级 | 要求 |
|---|---|
| 优秀(Exemplary) | 提供包含数据集注释(尤其要写明数据来源)的 notebook,并且至少使用 5 个直方图去发现数据事实 |
| 合格(Adequate) | 提供 notebook,但注释不完整或包含错误 |
| 待改进(Needs Improvement) | 提供 notebook,但没有任何注释且包含 bug |
不难看出,这份作业的评分维度实际上只有三个:注释(含来源)完整、直方图数量 ≥ 5、代码无错误。本文后面的所有内容,都是围绕如何同时满足这三点展开的。
二、作业背后的技术工具箱:本课讲义的分布可视化方法
作业要求"应用你已掌握的技巧",因此动手之前,先把第 10 课讲义 3-Data-Visualization/10-visualization-distributions/README.md 中的核心方法梳理成一张能力清单。你在新数据集上要复用的正是这些方法:
- 基础直方图(histogram):用
bins参数控制分箱数量,观察数据沿坐标轴的分布形态; - 数据过滤 + 直方图:先按条件筛选子集,再绘制直方图,消除极端值造成的"左偏"失真;
- 2D 直方图(hist2d):用颜色亮度同时展示两个分布之间的聚合与相关性;
- 分类变量叠加直方图:按类别(如保护状态)切分数据,用半透明叠加的多组直方图做对比;
- 核密度估计图(Seaborn KDE plot):用平滑曲线替代"阶梯状"直方图,并可通过
bw_adjust、hue、fill等参数做精细化控制。
下面逐一给出可在新数据集上直接改写的模板代码。这些代码的原始形态均来自讲义与参考解答(solution/notebook.ipynb),我们以仓库自带数据 data/birds.csv 作为演练样例,帮助你理解每一段代码的"意图",随后替换成你自己的数据即可。
2.1 加载数据(含来源注释的起点)
课程主笔记本 notebook.ipynb 以三行代码开始:
import pandas as pd import matplotlib.pyplot as plt birds = pd.read_csv('../../../data/birds.csv') birds.head()注:在仓库根目录下直接运行时可写作
pd.read_csv('data/birds.csv')。从讲义所在目录(3-Data-Visualization/10-visualization-distributions/)相对仓库根目录需要向上三级,因此是../../../data/birds.csv。
birds.csv的字段包括:Name(鸟名)、ScientificName(学名)、Category(类别)、Order(目)、Family(科)、Genus(属)、ConservationStatus(保护状态)、MinLength/MaxLength(最小/最大体长)、MinBodyMass/MaxBodyMass(最小/最大体重)、MinWingspan/MaxWingspan(最小/最大翼展)。
给新手的建议:在你自己的 notebook 里,第一个 Markdown 单元格就应写下"数据来自哪里、字段含义是什么、你想回答什么问题"。这正是量规中"注释(含来源)"要求的落点。
2.2 方法一:基础直方图 + 调节 bins 粒度
先对单个数值列绘制直方图,观察整体分布。讲义中依次使用bins=10与bins=30对比粒度:
birds['MaxBodyMass'].plot(kind='hist', bins=10, figsize=(12, 12)) plt.show()birds['MaxBodyMass'].plot(kind='hist', bins=30, figsize=(12, 12)) plt.show()从图中可以看到,数据集里 400 多种鸟的MaxBodyMass大多落在 2000 以下;把bins从 10 提高到 30 后,分布细节更加清晰。这就是"同一个问题、不同参数讲出不同层次"的典型示范——在你的新数据集上,请务必实验不同的bins取值(如 10、20、30、40),并在注释里写下一句话说明你观察到的形态变化。
2.3 方法二:先过滤、再画直方图
当数据整体偏斜时,可以先用布尔条件筛出感兴趣的子集,让直方图更聚焦:
filteredBirds = birds[(birds['MaxBodyMass'] > 1) & (birds['MaxBodyMass'] < 60)] filteredBirds['MaxBodyMass'].plot(kind='hist', bins=40, figsize=(12, 12)) plt.show()讲义里还留了一个小练习:去掉['MaxBodyMass']这一列过滤,直接对过滤后的filteredBirds调用.plot(kind='hist'),就能看到"带标签(按各数值列并排)的分布"——这也是多直方图的一种快速产出方式。
2.4 方法三:2D 直方图探索两个分布的关系
Matplotlib 提供hist2d,用颜色亮度(越亮代表该处数据越聚集)同时呈现两个变量的联合分布:
x = filteredBirds['MaxBodyMass'] y = filteredBirds['MaxLength'] fig, ax = plt.subplots(tight_layout=True) hist = ax.hist2d(x, y)讲义指出,两者沿一条预期的主轴呈现明显相关,且存在一个特别强的汇聚点。这种"二维直方图找相关性"的思路可以原样迁移到你的新数据集:挑两个你认为可能存在关联的数值列,先画 hist2d 验证直觉。
2.5 方法四:按分类变量叠加多组直方图
当需要按文本类字段(如保护状态)对比分布时,可以先按类别切片,再用半透明(alpha)叠加绘制。讲义用ConservationStatus对比各状态鸟的最小翼展:
x1 = filteredBirds.loc[filteredBirds.ConservationStatus=='EX', 'MinWingspan'] x2 = filteredBirds.loc[filteredBirds.ConservationStatus=='CR', 'MinWingspan'] x3 = filteredBirds.loc[filteredBirds.ConservationStatus=='EN', 'MinWingspan'] x4 = filteredBirds.loc[filteredBirds.ConservationStatus=='NT', 'MinWingspan'] x5 = filteredBirds.loc[filteredBirds.ConservationStatus=='VU', 'MinWingspan'] x6 = filteredBirds.loc[filteredBirds.ConservationStatus=='LC', 'MinWingspan'] kwargs = dict(alpha=0.5, bins=20) plt.hist(x1, **kwargs, color='red', label='Extinct') plt.hist(x2, **kwargs, color='orange', label='Critically Endangered') plt.hist(x3, **kwargs, color='yellow', label='Endangered') plt.hist(x4, **kwargs, color='green', label='Near Threatened') plt.hist(x5, **kwargs, color='blue', label='Vulnerable') plt.hist(x6, **kwargs, color='gray', label='Least Concern') plt.gca().set(title='Conservation Status', ylabel='Min Wingspan') plt.legend()需要说明的是,数据中的保护状态缩写来自 IUCN 红色名录分级:CR(极危)、EN(濒危)、EX(灭绝)、LC(无危)、NT(近危)、VU(易危)。讲义得出的结论是:最小翼展与保护状态之间看不出明显相关性——这本身就是一种"故事":有时直方图的结论是"没有显著关系",如实记录它同样是合格的分析。你可以继续用这套方法测试数据集里的其他字段,并尝试不同过滤条件,看能否找到相关性。
2.6 方法五:Seaborn 核密度估计图(KDE)
直方图是"阶梯状"的,不够平滑;Seaborn 的kdeplot能画出连续的概率密度曲线,让分布形态更直观:
import seaborn as sns import matplotlib.pyplot as plt sns.kdeplot(filteredBirds['MinWingspan']) plt.show()sns.kdeplot(filteredBirds['MaxBodyMass']) plt.show()如果觉得曲线过于平滑,可以用bw_adjust参数调节带宽(数值越小曲线越贴近原始起伏):
sns.kdeplot(filteredBirds['MaxBodyMass'], bw_adjust=.2) plt.show()Seaborn 官方文档提醒:相对于直方图,KDE 在多分布对比时更不易杂乱、更易解读;但如果底层分布有界或不平滑,KDE 也可能引入失真。换句话说,离群值依然会让图表失真——写进你的作业注释里,会是很加分的批判性思考。
更进一步,可以用hue按分类字段分组、用fill填充面积,几行代码就能画出"按鸟目分组的最大体重密度对比":
sns.kdeplot( data=filteredBirds, x="MaxBodyMass", hue="Order", fill=True, common_norm=False, palette="crest", alpha=.5, linewidth=0, )也可以同时映射多个变量,形成二维密度图并按类别着色:
sns.kdeplot(data=filteredBirds, x="MinLength", y="MaxLength", hue="ConservationStatus")讲义抛出的后续问题是:图中"Vulnerable(易危)"鸟群在体长上的聚集是否具有实际意义?——把这类"现象 → 问题 → 讨论"的链条写进 notebook,正是"讲好故事"的精髓。
三、按"至少 5 个直方图"的要求排布你的分析
把上面的方法映射成"直方图数量"的达成清单,你就不需要担心凑不够 5 个:
- 整体分布直方图:对核心数值列画一个基础直方图(方法一),并实验至少两种
bins; - 过滤后的直方图:对筛选后的子集再画一个(方法二),对比过滤前后形态差异;
- 2D 直方图:
hist2d探索两个数值列的关系(方法三); - 分类叠加直方图:按某个分类字段叠加多组直方图(方法四,一组
plt.hist循环内每次调用都算一个); - KDE 密度图:用
sns.kdeplot补充至少一张平滑密度图(方法五),必要时再用hue做分组对比。
建议的 notebook 结构(可直接照抄为 Markdown 标题):
- 标题与数据来源说明(谁发布的、何时、字段含义);
- 数据概览:
df.head()、df.describe()、df.info(); - 故事主线:你好奇的 2~3 个问题;
- 每个问题对应 1~2 个直方图/密度图,配一段"我看到了什么"的解读;
- 结论小节:汇总你从分布中发现的 3 个事实。
四、数据集选择建议:如何"换一个数据集"
作业明确要求换数据集。选数据的三个原则:
- 优先选有"故事感"的真实数据:人口、天气、电商订单、健康指标等自带业务背景的数据,比纯随机数更容易讲出结论;
- 优先选"数值 + 分类"混合的数据:因为作业方法同时覆盖数值直方图(
bins/hist2d)和分类叠加(hue/按类别切片),两类字段齐全的数据能让你完整复用五种方法; - 数据规模适中、无需清洗过度:几百到几万行、缺失值较少的数据最合适,把精力留给分析和写作。
公开数据可以来自 Kaggle、UCI 机器学习仓库等平台(作业原文点名了 Kaggle 作为示例来源)。在你 notebook 的第一格务必写明来源链接与下载日期——这是量规"Exemplary"等级的硬性要求。
五、对照评估量规做最终自检
提交前,逐条对照 assignment.md 中的量规自检:
- Notebook 已提供;
- 有关于数据集的注释,明确包含数据来源;
- 至少使用了5 个直方图(基础直方图、过滤直方图、2D 直方图、分类叠加直方图、KDE 密度图均计入);
- 每个直方图都有对应解读,构成完整的故事线;
- 代码可运行、无 bug(建议自上而下完整执行一遍 notebook,清空输出后重新 Run All 验证)。
满足以上全部条件即达到"优秀(Exemplary)"标准;若注释不完整或代码有错,则落入"合格";没有注释且含 bug 则是最低档。
六、进一步探索:直方图的"应用场景研究"
讲义末尾还留了一个挑战(Challenge):直方图比基础散点图、柱状图、折线图更高级,请上网搜索直方图的实际使用案例,思考它们被用在哪些领域、通常用来论证什么问题。完成作业后,这个问题值得认真做一次检索——它能把你的视野从"会画图"提升到"知道在什么业务问题里该画直方图",这也是数据科学家选图能力的核心。
参考资源索引
- 作业原文:translations/en/3-Data-Visualization/10-visualization-distributions/assignment.md
- 第 10 课讲义(含全部直方图与密度图代码):3-Data-Visualization/10-visualization-distributions/README.md
- 课程主笔记本:3-Data-Visualization/10-visualization-distributions/notebook.ipynb
- 参考解答笔记本:3-Data-Visualization/10-visualization-distributions/solution/notebook.ipynb
- 演示数据:data/birds.csv
依此路线执行,你交付的将不仅是一个"完成作业"的 notebook,更是一份具备数据来源、分析问题、可视化证据与结论的完整数据叙事作品。
【免费下载链接】Data-Science-For-Beginners10 Weeks, 20 Lessons, Data Science for All!项目地址: https://gitcode.com/GitHub_Trending/da/Data-Science-For-Beginners
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考