Data-Science-For-Beginners 分布可视化课后实战:用直方图与密度图为新数据集编写数据故事 Notebook
2026/9/14 1:25:21 网站建设 项目流程

Data-Science-For-Beginners 分布可视化课后实战:用直方图与密度图为新数据集编写数据故事 Notebook

【免费下载链接】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 课程的「可视化分布」(Visualizing Distributions)课后作业,说明如何将课程中基于明尼苏达鸟类数据集掌握的直方图、二维直方图与 Seaborn 密度图技能,迁移到一个全新数据集上,完成一份「用数据讲故事」的 Jupyter Notebook。读完本文,你将获得一条从选数据集、搭建 Notebook 骨架,到产出符合「优秀」评分标准(含数据来源说明、至少 5 个直方图、完整注解)的可复用实战路径。

本指南对应的作业原文位于 translations/fa/3-Data-Visualization/10-visualization-distributions/assignment.md(英文版见 3-Data-Visualization/10-visualization-distributions/assignment.md),课程主文档为 3-Data-Visualization/10-visualization-distributions/README.md,仓库内还提供了完整的参考实现 solution/notebook.ipynb。

一、作业要求解读:Apply your skills

课程在第 10 课《可视化分布》中,带领学习者使用明尼苏达鸟类数据集(data/birds.csv)探索了鸟类数量与种群密度信息,并通过可视化异常值、比较不同鸟类类别的最大体长等方式发现了数据中的有趣事实。课后作业要求在此基础上「把技能用起来」(Apply your skills):

到目前为止,你已经用明尼苏达鸟类数据集发现了关于鸟类数量和种群密度的信息。请通过尝试另一个数据集(可以来自 Kaggle 等平台)来练习这些技术的应用。构建一个 Notebook,讲述这个数据集的故事,并确保在讨论它时使用直方图。

拆解任务可以得到三个明确的可交付物:

  1. 换一个数据集:不再使用课程自带的鸟类数据,而是自行寻找(如 Kaggle 平台)一个感兴趣的公共数据集;
  2. 构建一个 Notebook:用 Jupyter Notebook 组织代码、图表与文字说明,形成一条叙事线;
  3. 必须使用直方图:直方图(Histogram)是本次作业的核心可视化工具,是「讲故事」的主要手段。

二、评分表(Rubric):三个档次的判定标准

作业附带三档评分标准,是自查时最重要的依据,必须完整理解:

优秀(Exemplary)合格(Adequate)需要改进(Needs Improvement)
提交的 Notebook 包含对数据集的注解,包括数据来源,并且至少使用 5 个直方图来探索关于数据的发现。提交的 Notebook 注解不完整,或存在缺陷/错误。提交的 Notebook 没有注解,并且包含错误。

从中可以提炼出三条硬性指标:

  • 数据来源:必须说明数据集来自哪里(例如 Kaggle 的数据集页面链接或文件名、作者信息);
  • 至少 5 个直方图:这是可量化的要求,建议在写作时逐条计数核对;
  • 注解(annotations):Notebook 中要有 Markdown 单元格,记录你观察到的结论,而不是只有一串干巴巴的代码。

注意:「合格」与「优秀」的分界在于注解是否完整、图表是否可靠;「需要改进」则意味着既无说明又有 bug。因此,先写注释再写代码,边画图边记录发现,是拿高分的最稳妥策略。

三、技能清单:把课程里学过的东西带过来

作业要求「练习这些技术的应用」,而这些技术正是本课 README.md 中完整的教学内容。在做新数据集之前,先回顾这份技能清单,它们将一一对应到新作业的直方图数量与叙事结构上。

1. 加载数据并快速预览

课程第一步是导入 Pandas 与 Matplotlib,并读取鸟类数据:

import pandas as pd import matplotlib.pyplot as plt birds = pd.read_csv('../../data/birds.csv') birds.head()

鸟类数据集共 13 列,这是一个很典型的「数值字段 + 分类字段」混合结构,可作为新数据集字段评估的参考模板:

字段含义类型
Name / ScientificName名称 / 学名文本
Category / Order / Family / Genus类目 / 目 / 科 / 属分类
ConservationStatus保护状态分类
MinLength / MaxLength最小 / 最大体长数值
MinBodyMass / MaxBodyMass最小 / 最大体重数值
MinWingspan / MaxWingspan最小 / 最大翼展数值

在数据加载后,head()只能看到前几行,建议再补充df.info()df.describe(),快速确认字段是否有缺失值、数值范围是否合理——这也是「对数据集的注解」的起点。

2. 单变量直方图:认识 bins 参数

课程指出,散点图(如birds.plot(kind='scatter', x='MaxLength', y='Order', figsize=(12,8)))能给出分布的概貌,但展示「真正的分布」通常要交给直方图。直方图类似条形图,但通过将数据数组划分成更小的区间(bins),可以显示数据值的分布形态:

birds['MaxBodyMass'].plot(kind = 'hist', bins = 10, figsize = (12,12)) plt.show()

可以看到数据集中 400 多只鸟的最大体重大多集中在 2000 以下。将bins从 10 提高到 30,分布会被更细粒度地展现出来:

birds['MaxBodyMass'].plot(kind = 'hist', bins = 30, figsize = (12,12)) plt.show()

bins 参数是直方图最重要的调节旋钮:bins 过少会丢失细节,过多会放大噪声。在新数据集上,建议至少尝试 10 / 30 / 40 三档,观察分布形态的变化并记录结论。

3. 过滤数据,聚焦局部

如果分布严重偏向一侧,可以先用布尔条件过滤数据,再画直方图。课程中的示例是筛选出体重在 1 到 60 之间的鸟,并使用 40 个 bins:

filteredBirds = birds[(birds['MaxBodyMass'] > 1) & (birds['MaxBodyMass'] < 60)] filteredBirds['MaxBodyMass'].plot(kind = 'hist', bins = 40, figsize = (12,12)) plt.show()

这是很好用的技巧:当你发现整体分布被少数极端值主导时,过滤后往往能暴露出更精细的模式。课程还提示,试着去掉['MaxBodyMass']这一列筛选,用不同的数据点和过滤条件组合,可以看到带标签的完整分布。

4. 二维直方图:比较两个分布的收敛关系

Matplotlib 内置的hist2d用更亮的颜色表示数据收敛集中的区域,适合比较两个分布之间的关系。课程用MaxBodyMass对比MaxLength

x = filteredBirds['MaxBodyMass'] y = filteredBirds['MaxLength'] fig, ax = plt.subplots(tight_layout=True) hist = ax.hist2d(x, y)

从结果可以看出,两个变量沿预期轴存在相关性,并有一个特别强的收敛点。「二维直方图」和「单变量直方图」在计数时都可以计入 5 个直方图的要求(课程与参考实现均把它们当作直方图的一种)。

5. 文本分类字段:堆叠/叠加直方图

直方图默认对数值数据效果好,但数据集中往往还包含类别信息(鸟类数据集中的保护状态、目、科等)。课程以保护状态为例,演示了如何把分类字段转化为多条叠加的直方图:

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();

其中alpha=0.5让各直方图半透明叠加,bins=20控制区间数量,labelplt.legend()生成图例。结果发现最小翼展与保护状态之间没有明显的相关性——「没有相关」本身也是一条值得写进注解的发现

课程还解释了数据集中保护状态缩写来自 IUCN 红色名录分类:

缩写含义
CR极危(Critically Endangered)
EN濒危(Endangered)
EX灭绝(Extinct)
LC无危(Least Concern)
NT近危(Near Threatened)
VU易危(Vulnerable)

在作业里,如果新数据集有类似的多分类字段(国家、类别、等级等),这一招可以直接复用:每条分类画一条直方图,用颜色区分,叠加对比

6. 密度图(Seaborn KDE):平滑化收尾

直方图是「阶梯状」的,不够平滑。课程引入 Seaborn 库,用kdeplot画出连续的核密度估计曲线:

import seaborn as sns import matplotlib.pyplot as plt sns.kdeplot(filteredBirds['MinWingspan']) plt.show()

Seaborn 文档对 KDE 的评价是:相比直方图,KDE 在绘制多条分布时更简洁、更易解读,但如果底层分布有界或不平滑,也可能引入失真;与直方图一样,表示质量取决于平滑参数的选择。换言之,异常值始终会让图表表现异常——这条经验也要写进笔记。

针对之前那个「锯齿状」的 MaxBodyMass 直方图,可以用 KDE 很好地平滑:

sns.kdeplot(filteredBirds['MaxBodyMass']) plt.show()

如果想要「平滑但不过度平滑」的曲线,可调节bw_adjust参数:

sns.kdeplot(filteredBirds['MaxBodyMass'], bw_adjust=.2) plt.show()

课程还演示了用hue参数按类别分组绘制多条密度曲线,以及把两个变量映射到 x、y 轴的二维密度图:

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,正是「讲故事」的高级形态。

四、如何挑选一个合适的新数据集

作业建议的数据来源是 Kaggle。选择数据集时,建议按以下标准评估,保证课程技能可以顺利迁移:

  1. 有足够多的数值型字段:直方图需要数值数据,至少要有 2~3 个可画直方图的连续字段(如价格、销量、体重、长度、评分等);
  2. 有分类字段:最好有 1~2 个离散分类字段(国家、品类、状态、组别等),以便复用「叠加直方图」和 KDE 的hue分组技巧;
  3. 数据量适中:几百到几千行最合适,既能看出分布形态,又便于快速探索;
  4. 格式简单:优先选 CSV 格式,pd.read_csv()可直接加载;如果是 Excel 或 JSON,需要额外的读取步骤;
  5. 记录来源:第一时间把数据集名称、作者、下载链接、许可证记在 Notebook 的第一个 Markdown 单元格中——这直接对应评分表「包括数据来源」的要求。

课程自带数据是鸟类观测数据,题材类似的公共数据集(动物测量、植物分布、体育统计、电商销售等)都可以作为起点。

五、实战路径:从空 Notebook 到完整数据故事

结合课程内容与仓库中 solution/notebook.ipynb 的参考实现(该实现依次完成了:加载数据 → MaxBodyMass 直方图(bins=10)→ bins=30 实验 → 过滤后 bins=40 → MaxBodyMass 与 MaxLength 的二维直方图 → 按保护状态叠加直方图 → MinWingspan 的 KDE → MaxBodyMass 的 KDE → bw_adjust 平滑实验 → MinLength/MaxLength 的二维 KDE),建议按下面六步组织自己的 Notebook:

第 0 步:标题与数据来源(Markdown)说明数据集是什么、来自哪里(Kaggle 链接或文件名)、字段含义概览。这一格直接命中评分标准。

第 1 步:加载与概览(代码 + Markdown)

import pandas as pd import matplotlib.pyplot as plt import seaborn as sns df = pd.read_csv('你的数据文件.csv') df.head() df.info() df.describe()

写一两句观察:行数、列数、缺失值情况。

第 2 步:整体分布——直方图 #1 与 #2选取第一个感兴趣的数值字段,分别用bins=10bins=30(或 40)画两张直方图,记录分布形态(右偏?双峰?集中在哪里?)。

第 3 步:过滤聚焦——直方图 #3如果整体分布被极端值主导,仿照课程写法过滤数据再画一张:

filtered = df[(df['目标字段'] > 下界) & (df['目标字段'] < 上界)] filtered['目标字段'].plot(kind='hist', bins=40, figsize=(12,12)) plt.show()

此时已经达到 3 个直方图。

第 4 步:双变量关系——直方图 #4ax.hist2d(x, y)比较两个数值字段的收敛关系,并写一句结论(是否存在相关、收敛点在何处)。

第 5 步:分类对比——直方图 #5(及以上)选取一个分类字段,用plt.hist叠加或堆叠多条直方图(参考第三节第 5 点的代码模板),完成「至少 5 个直方图」的硬指标。如果还想追加,可以为多个数值字段各画一组分类叠加图。

第 6 步:KDE 平滑收尾(可选加分)sns.kdeplot平滑最关心的分布,尝试bw_adjust,必要时用hue画多组对比或二维 KDE,并总结整个数据集的故事主线与尚未解答的问题。

按照这个路径,每一步的代码单元格旁边都配一个 Markdown 注解单元格,最终自然产出「优秀」档要求的作品:来源清晰、注解完整、直方图不少于 5 个、无 bug。

六、自查清单与常见坑

提交前对照以下清单检查:

  • 第一个 Markdown 单元格是否写明了数据来源?
  • 是否每个代码块都有对应的文字注解(观察、推测、结论)?
  • 直方图数量是否 ≥ 5?(逐一数一下hist/hist2d的调用)
  • 每个单元格能否从上到下顺序执行(Restart & Run All 验证无报错)?
  • 图表是否有标题、坐标轴标签、必要时有图例(可参考plt.gca().set(...)plt.legend())?

常见坑提醒:

  • 忘记plt.show():在 Notebook 中有时能自动显示,但在脚本环境中会看不到图,养成显式调用的习惯;
  • loc筛选条件拼错:注意列名与数据中的实际取值完全一致(如ConservationStatus=='EX'),可以先df['列名'].unique()确认枚举值;
  • bins 数量与数据范围不匹配:过滤后数据范围变小,仍用默认 bins 可能颗粒过粗,记得同步调整;
  • 忽略异常值:课程特别强调异常值会让图表行为异常,发现极端值时应记录并考虑过滤处理;
  • 只画图不写结论:这是「合格」与「优秀」之间最常见的差距,宁可多写一句「这看起来符合预期」也不要留白。

七、延伸:直方图的高级用法探索

课程的挑战环节(🚀 Challenge)建议学习者到网上寻找直方图应用的优秀案例,思考它们被用在哪些领域、展示了什么、能说明什么问题。这也是本次作业的自然延伸——当你在新数据集上完成至少 5 个直方图之后,可以进一步思考:你的图表选对了图型吗?直方图之外,是否还需要散点图、箱线图或密度图来补充视角?

课程后续的「复习与自学」环节也建议深入研究 Seaborn 的kdeplot——它被官方定义为「一维或多维的连续概率密度曲线」。把密度图与直方图搭配使用,往往能让数据故事的结尾既严谨又直观。

【免费下载链接】Data-Science-For-Beginners10 Weeks, 20 Lessons, Data Science for All!项目地址: https://gitcode.com/GitHub_Trending/da/Data-Science-For-Beginners

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询