
Data Science for Beginners 分布可视化实战用直方图与核密度图讲好一个数据集的故事【免费下载链接】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」的实践作业展开在掌握明尼苏达鸟类数据集birds.csv的直方图、二维直方图与 Seaborn 核密度图KDE技法之后换一个全新数据集用不少于 5 张直方图搭建一个带注释的 Jupyter Notebook讲清楚这个数据集的故事。读完本文你将理解作业要求与评分标准掌握完整的分布可视化代码范式bins调参、数据过滤、按类别堆叠、KDE 平滑与多变量叠加并拿到一份可直接对照执行的实践路线图。作业原文位于 3-Data-Visualization/10-visualization-distributions/assignment.md另有保加利亚语翻译版本 translations/bg/3-Data-Visualization/10-visualization-distributions/assignment.md与之配套的完整课件见 3-Data-Visualization/10-visualization-distributions/README.md。一、作业要求解读从「跟随示例」到「独立应用」作业标题是「运用你的技能Apply your skills」其核心意图非常明确课程前几节一直在用明尼苏达鸟类数据集练习「数量quantities」与「种群密度population density」的可视化而本作业要求你脱离示例数据独立完成一次完整的数据探索。作业正文的要求可以拆解为三点换一个不同的数据集可以是 Kaggle 等公开数据集平台上的任意数据集只要它包含足够的数值型字段可供绘制直方图搭建一个 Notebook 讲述该数据集的故事Notebook 应包含注释annotations并且要说明数据集的来源讨论数据时务必使用直方图这是本作业对可视化手段的硬性约束也是本课技术主题的落点。对照课件可知作业所要求的「直方图技能」实际上覆盖了一个完整的技术链条用pandas加载数据并快速预览birds.head()用散点图做初步分布观察再过渡到直方图通过调整bins参数控制直方图的分箱粒度通过布尔过滤filter聚焦数据子集用ax.hist2d()绘制二维直方图对比两个分布的关系面对文本型类别字段如保护状态用多次plt.hist()叠加出分组分布引入 Seaborn 的kdeplot把「阶梯状」直方图平滑为密度曲线并支持按类别hue分组与二维密度图。这些能力正是完成作业的技术弹药。仓库中另附有完整可运行的答案版本 3-Data-Visualization/10-visualization-distributions/solution/notebook.ipynb建议先独立完成再对照参考答案查漏补缺。二、评分标准三个档位的差异点作业给出了明确的 Rubric评分表这是自检与打磨作品的重要依据优秀Exemplary合格Adequate需改进Needs Improvement提交的 Notebook 包含对该数据集的注释含数据集来源并至少使用 5 张直方图来发现数据中的事实。提交的 Notebook 注释不完整或存在 Bug。提交的 Notebook 没有注释且包含 Bug。由此可以提炼出三条硬性验收线数量线直方图数量 ≥ 5。这里的「直方图」建议宽泛理解为分布类图表普通直方图、二维直方图、KDE 密度图、分组叠加直方图均可计入只要确实服务于「发现数据事实」这一目的注释线每个可视化单元应有对应的 markdown 说明讲清楚「这张图回答了什么问题、发现了什么事实」来源线必须说明数据集的来源这是数据科学工作流中可复现性reproducibility的基本要求。三、技术底座先跑通课件里的分布可视化范式在动手做新数据集之前建议先完整运行一遍课件 Notebook 3-Data-Visualization/10-visualization-distributions/notebook.ipynb。下面按课件顺序梳理每一类图表的代码范式这些片段都可以直接迁移到你的作业 Notebook 中。3.1 加载数据与初步预览课件使用的数据位于仓库的 data/birds.csv包含鸟类名称、科属、保护状态以及体长、体重、翼展的最小/最大值等 13 个字段import pandas as pd import matplotlib.pyplot as plt birds pd.read_csv(data/birds.csv) birds.head()输出示例前 5 行NameScientificNameCategoryOrderFamilyGenusConservationStatusMinLengthMaxLengthMinBodyMassMaxBodyMassMinWingspanMaxWingspanBlack-bellied whistling-duckDendrocygna autumnalisDucks/Geese/WaterfowlAnseriformesAnatidaeDendrocygnaLC475665210207694Fulvous whistling-duckDendrocygna bicolorDucks/Geese/WaterfowlAnseriformesAnatidaeDendrocygnaLC455371210508593Snow gooseAnser caerulescensDucks/Geese/WaterfowlAnseriformesAnatidaeAnserLC647920504050135165Rosss gooseAnser rossiiAnseriformesAnatidaeAnserLC57.36410661567113116Greater white-fronted gooseAnser albifronsDucks/Geese/WaterfowlAnseriformesAnatidaeAnserLC648119303310130165加载之后先做一次全貌观察散点图能快速展示「每个目Order的体长分布」但它并不适合呈现真正的分布形态——那是直方图的专职birds.plot(kindscatter, xMaxLength, yOrder, figsize(12, 8)) plt.title(Max Length per Order) plt.ylabel(Order) plt.xlabel(Max Length) plt.show()3.2 直方图与 bins 参数控制分箱粒度直方图本质上是一种「分箱计数」的条形图它把数值数据切成若干区间bin以条柱的高低起伏呈现数据落在各区间的频数。绘制直方图的前提是数值型数据。先看全数据集MaxBodyMass最大体重的整体分布bins 10把数据切成 10 个区间birds[MaxBodyMass].plot(kindhist, bins10, figsize(12, 12)) plt.show()从图中可以读出第一个事实这个数据集中 400 多种鸟类绝大多数MaxBodyMass落在 2000 以下分布严重右偏。把bins从 10 提高到 30可以得到更细粒度的分布形态birds[MaxBodyMass].plot(kindhist, bins30, figsize(12, 12)) plt.show()bins是直方图最重要的调参旋钮bins 过少会丢失细节bins 过多会引入噪声。课件中给出了一个避免「左侧堆积、右侧拖尾」的实操技巧——先过滤数据再绘图只保留体重在 1 到 60 之间的个体并加大到 40 个分箱filteredBirds birds[(birds[MaxBodyMass] 1) (birds[MaxBodyMass] 60)] filteredBirds[MaxBodyMass].plot(kindhist, bins40, figsize(12, 12)) plt.show()建议你在作业中尝试多种过滤条件与多个bins取值并对比不同参数下的分布结论——这种「调参—观察—记录」的循环本身就是注释的素材。3.3 二维直方图同时观察两个分布的关系ax.hist2d(x, y)把平面切成网格用颜色亮度表示每个网格内的样本密度适合快速判断两个数值分布之间是否存在相关性x filteredBirds[MaxBodyMass] y filteredBirds[MaxLength] fig, ax plt.subplots(tight_layoutTrue) hist ax.hist2d(x, y)在鸟类数据上MaxBodyMass与MaxLength沿一条预期的轴呈现明显的正相关且存在一个特别强的汇聚点高密度区。在作业中可以用二维直方图去验证新数据集中任意两个数值字段的关系假设例如「价格与销量」「面积与价格」等并记录结论。3.4 文本类别如何画直方图按保护状态叠加鸟类数据还包含ConservationStatus保护状态这类文本字段它来自 IUCN 红色名录的分类体系常用缩写如下缩写含义CR极危Critically EndangeredEN濒危EndangeredEX灭绝ExtinctLC无危Least ConcernNT近危Near ThreatenedVU易危Vulnerable文本值本身不能直接分箱但可以用.loc[]按类别取出对应数值子序列再叠加到同一张图上。下面的代码将不同保护状态的鸟类按MinWingspan最小翼展绘制为六组半透明直方图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(alpha0.5, bins20) plt.hist(x1, **kwargs, colorred, labelExtinct) plt.hist(x2, **kwargs, colororange, labelCritically Endangered) plt.hist(x3, **kwargs, coloryellow, labelEndangered) plt.hist(x4, **kwargs, colorgreen, labelNear Threatened) plt.hist(x5, **kwargs, colorblue, labelVulnerable) plt.hist(x6, **kwargs, colorgray, labelLeast Concern) plt.gca().set(titleConservation Status, ylabelMin Wingspan) plt.legend();关键点在于kwargs dict(alpha0.5, bins20)alpha0.5让各层半透明叠加、重叠区域颜色加深可辨bins20统一各组的分箱粒度保证可比性。在鸟类数据上最小翼展与保护状态之间看不出强相关——「没有明显相关」本身也是一个值得写进注释的结论。参考答案版本将 y 轴换成了MaxBodyMass结论类似。四、进阶用 Seaborn 密度图平滑分布前面所有直方图都是「阶梯状」的曲线不够平滑。引入 Seaborn 的kdeplot核密度估计可以绘制连续的密度曲线。Seaborn 官方文档对 KDE 的定位是相对直方图KDE 在同时绘制多个分布时更少杂乱、更易解读但如果底层分布有界或不平滑它也可能引入失真和直方图一样表示质量依赖平滑参数的选取。加载 Seaborn先画一张基础密度图import seaborn as sns import matplotlib.pyplot as plt sns.kdeplot(filteredBirds[MinWingspan]) plt.show()它和上面的直方图形态呼应只是曲线更平滑。把上一节那张「锯齿状」的MaxBodyMass直方图重画为密度图sns.kdeplot(filteredBirds[MaxBodyMass]) plt.show()如果希望曲线「平滑但不过度平滑」调整bw_adjust参数——数值越小越贴合原始数据、曲线越毛糙sns.kdeplot(filteredBirds[MaxBodyMass], bw_adjust.2) plt.show()kdeplot的威力在于几行代码就能画出极具解释力的多变量图。比如按鸟的目Order分组展示最大体重的密度分布sns.kdeplot( datafilteredBirds, xMaxBodyMass, hueOrder, fillTrue, common_normFalse, palettecrest, alpha.5, linewidth0, )其中fillTrue填充曲线下方区域common_normFalse让每组分别归一化否则样本多的组会主导高度palettecrest指定配色alpha.5控制透明度linewidth0去掉轮廓线。还可以把两个变量放进同一张二维密度图并按类别着色例如对比MinLength与MaxLength并以色相区分保护状态sns.kdeplot(datafilteredBirds, xMinLength, yMaxLength, hueConservationStatus)对于图中出现的「易危Vulnerable」鸟类在体长上的聚类是否具有生态学意义值得进一步查证——把你的思考写进注释正是作业评分标准中「讲一个故事」的体现。五、作业实践路线五张直方图讲一个数据集的故事把课件的技术栈迁移到新数据集上可按以下六步完成作业保证同时满足「≥5 张直方图」「带注释」「含来源」三条验收线。第 1 步选择数据集并写明来源。从 Kaggle 等公开平台挑选一个你感兴趣的数据集在 Notebook 首个 markdown 单元写明数据集名称、来源、字段含义与下载时间。这是评分表「优秀」档对来源标注的要求。第 2 步数据加载与清洗0.5 张图额度内先不绘图。用 pandas 加载数据、head()/info()预览结构处理缺失值确认哪些字段是数值型、哪些是类别型。数据在仓库中可直接使用的参考格式见 data/birds.csv。第 3 步全局分布预览第 1 张直方图。对核心数值字段如价格、长度、评分用bins10绘制整体分布用一句话记录偏态、峰值区间等事实。第 4 步参数探索第 23 张直方图。把bins调到 30 观察细粒度形态再对数据做布尔过滤例如只看某一类别、某一数值区间用 40 个分箱聚焦子集分布并对比过滤前后的结论差异。第 5 步多维对比第 45 张直方图。至少完成两类对比一是用ax.hist2d(x, y)验证两个数值字段的关系二是参照第三节的模式把某个类别字段对应鸟类数据中的ConservationStatus拆成多组用alpha0.5的叠加直方图比较组间分布。第 6 步加分项Seaborn 密度图收尾。用sns.kdeplot()把最有信息量的 12 个分布平滑展示尝试bw_adjust与hue分组并在注释里引用 Seaborn 文档关于 KDE 局限性的说明体现你对方法适用边界的理解。完成初稿后可对照答案版本 3-Data-Visualization/10-visualization-distributions/solution/notebook.ipynb 逐单元格比对——参考答案包含直方图bins10/30/40、二维直方图、按保护状态叠加直方图、KDE 单变量/平滑参数/按目分组/二维 KDE 共 8 类分布图表可作为「5 张直方图」的结构参考。六、自检清单对照评分表逐项验收提交作业前逐项确认注释是否完整每个代码单元上方是否有 markdown 说明「这个图要回答什么问题、发现了什么事实」数据集来源是否在开头注明直方图数量全 Notebook 的分布类图表直方图、二维直方图、KDE是否不少于 5 张是否每张都服务于一个具体的分析问题而不是堆砌重复图表代码是否可运行从加载到绘图是否能在干净环境下按序跑通过滤条件的边界如 1与 60是否会导致空数据集对应运行时的警告信息结论是否有据每个写在注释里的「事实」是否都能从图中直接读出涉及类别字段时是否解释了缩写含义参照 IUCN 缩写表技术是否闭环是否同时用到了 Matplotlib 直方图与 Seaborn 密度图是否至少尝试了bins、alpha、bw_adjust等关键参数按此清单打磨你的作业即可从「合格」档迈入「优秀」档一份来源明确、注释翔实、用不少于 5 张分布图讲清一个全新数据集故事的完整 Notebook。【免费下载链接】Data-Science-For-Beginners10 Weeks, 20 Lessons, Data Science for All!项目地址: https://gitcode.com/GitHub_Trending/da/Data-Science-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考