ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Data Science for Beginners 分布可视化实战:用 Matplotlib 直方图与 Seaborn 密度图分析明尼苏达鸟类数据集

Data Science for Beginners 分布可视化实战:用 Matplotlib 直方图与 Seaborn 密度图分析明尼苏达鸟类数据集 Data Science for Beginners 分布可视化实战用 Matplotlib 直方图与 Seaborn 密度图分析明尼苏达鸟类数据集【免费下载链接】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 讲的完整技术指南。上一讲我们通过散点图发现了明尼苏达鸟类数据集中的异常值、并比较了不同鸟目的最大体长本文则换一个角度研究数据的分布distribution——即数据沿某个坐标轴如何展开。你将在 notebook.ipynb 的基础上系统掌握用 Pandas 加载数据、用 Matplotlib 绘制一维与二维直方图、再用 Seaborn 绘制平滑 KDE 密度图最终独立完成一份用至少 5 张直方图讲述数据集故事的实战作业。准备加载鸟类数据集并理解字段含义本讲使用仓库中的 data/birds.csv明尼苏达鸟类数据实测共 443 行。在 notebook.ipynb 中从导入 Pandas、Matplotlib 和读取数据开始import pandas as pd import matplotlib.pyplot as plt birds pd.read_csv(../../data/birds.csv) birds.head()数据集的 13 个字段中与分布分析直接相关的是 6 个数值型指标MinLength/MaxLength、MinBodyMass/MaxBodyMass、MinWingspan/MaxWingspan和 1 个分类型字段ConservationStatus索引NameScientificNameCategoryOrderFamilyGenusConservationStatusMinLengthMaxLengthMinBodyMassMaxBodyMassMinWingspanMaxWingspan0Black-bellied whistling-duckDendrocygna autumnalisDucks/Geese/WaterfowlAnseriformesAnatidaeDendrocygnaLC4756652102076941Fulvous whistling-duckDendrocygna bicolorDucks/Geese/WaterfowlAnseriformesAnatidaeDendrocygnaLC4553712105085932Snow gooseAnser caerulescensDucks/Geese/WaterfowlAnseriformesAnatidaeAnserLC6479205040501351653Rosss gooseAnser rossiiDucks/Geese/WaterfowlAnseriformesAnatidaeAnserLC57.364106615671131164Greater white-fronted gooseAnser albifronsDucks/Geese/WaterfowlAnseriformesAnatidaeAnserLC648119303310130165在动手画图之前可以先对自己要回答的问题做一次量化摸底可用birds.describe()或birds[MaxBodyMass].min()/max()快速验证实测本数据集MaxBodyMass的取值区间约为 314300其中约 405 只鸟的最大体重低于 2000ConservationStatus的分布高度不均衡LC 402 条、NT 27 条、VU 10 条、EN 2 条、EX 1 条、CR 1 条这些数字在后面的直方图中都会得到直观印证。用散点图快速概览分布分析的起点在进入直方图之前课程沿用上一讲的散点图方法对分布做一次快速扫描——把每个鸟目的最大体长按Order展开birds.plot(kindscatter, xMaxLength, yOrder, figsize(12, 8)) plt.title(Max Length per Order) plt.ylabel(Order) plt.xlabel(Max Length) plt.show()散点图能给出每个鸟目的体长大致落在哪一区段的概览但正如课程所强调的散点图不是展示真实分布的最佳方式——它难以精确表达某一取值区间内聚集了多少样本。这个任务通常交给直方图Histogram。直方图Matplotlib 分布可视化基础Matplotlib 提供了一流的直方图工具。直方图形似柱状图但横轴是连续数值的区间bin柱子的高低起伏即代表数据在各区间的密度。绘制直方图要求数值型数据只需把图表类型指定为histbirds[MaxBodyMass].plot(kindhist, bins10, figsize(12, 12)) plt.show()上图清晰显示400 多只鸟中的绝大多数最大体重都落在 2000 以下——这与我们前面量化得到的约 405 只 2000完全吻合。调整 bins让分布更精细直方图的精细度由bins参数控制它决定数据被切分成多少个区间。把bins提高到 30可以观察到更细粒度的形状birds[MaxBodyMass].plot(kindhist, bins30, figsize(12, 12)) plt.show()bin 越多柱子越多分布曲线的轮廓越清晰但也越容易暴露噪声bin 过少则会丢失细节。bins的取值需要根据数据量443 条样本和分析目标反复试验——这也是本讲✅ 动手实验环节希望你去做的。过滤数据消除左偏上面的直方图严重左偏大部分样本挤在低值端。为了观察特定区段的形态可以对 DataFrame 做布尔过滤只保留体重在 (1, 60) 范围内的鸟并用 40 个 bin 绘制filteredBirds birds[(birds[MaxBodyMass] 1) (birds[MaxBodyMass] 60)] filteredBirds[MaxBodyMass].plot(kindhist, bins40, figsize(12, 12)) plt.show()过滤后数据量实测为 193 条直方图不再被少数巨鸟如天鹅体重可达上万拉偏小体形鸟类的分布形态得以显现。✅ 动手实验试着换用其他过滤条件或数据点例如MaxLength、MinWingspan如果想看带标签的完整分布去掉[MaxBodyMass]这一层过滤即可。二维直方图比较两个分布的关系直方图还可以扩展为二维直方图用来比较两个分布之间的关系。例如同时考察MaxBodyMass与MaxLengthMatplotlib 提供了内置的hist2d方法用更亮的颜色标示数据高度聚集收敛的区域x filteredBirds[MaxBodyMass] y filteredBirds[MaxLength] fig, ax plt.subplots(tight_layoutTrue) hist ax.hist2d(x, y)可以看到两个变量沿一条预期轴呈可预测的相关关系并存在一个特别强的收敛点——这正是二维直方图相对散点图的优势它能直接以颜色亮度呈现样本密度而非只显示样本位置。文本数据分布按保护状态叠加直方图直方图默认面向数值数据。如果要按文本类别分析分布例如鸟的保护状态就需要先用布尔索引按类别把数据切片再逐类叠加直方图。数据集中的保护状态使用 IUCN 红色名录的缩写CR极危Critically EndangeredEN濒危EndangeredEX灭绝ExtinctLC无危Least ConcernNT近危Near ThreatenedVU易危Vulnerable基于filteredBirds把每个类别的MinWingspan分别取出用不同的颜色叠加绘制并通过共享的kwargsalpha0.5半透明、bins20让重叠区域可见x1 filteredBirds.loc[filteredBirds.ConservationStatusEX, MinWingspan] x2 filteredBirds.loc[filteredBirds.ConservationStatusCR, MinWingspan] x3 filteredBirds.loc[filteredBirds.ConservationStatusEN, MinWingspan] x4 filteredBirds.loc[filteredBirds.ConservationStatusNT, MinWingspan] x5 filteredBirds.loc[filteredBirds.ConservationStatusVU, MinWingspan] x6 filteredBirds.loc[filteredBirds.ConservationStatusLC, 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();结论与课程一致最小翼展与保护状态之间没有明显的强相关这与前面统计到的类别样本量极端不均衡也有关——LC 占 402 条而 EX/CR 各只有 1 条。✅ 动手实验用同样的方法测试数据集的其他指标如MaxLength、MaxBodyMass或尝试不同的过滤条件看看能否发现任何相关关系。需要提醒的是样本量悬殊时叠加直方图更容易反映的是数量而非比例解读时要格外谨慎。密度图用 Seaborn KDE 平滑分布曲线到目前为止的直方图都是阶梯状的不够平滑。要得到平滑的密度曲线本讲引入新的绘图库Seaborn使用其kdeplot核密度估计函数。基本 KDE 曲线import seaborn as sns import matplotlib.pyplot as plt sns.kdeplot(filteredBirds[MinWingspan]) plt.show()与前面MinWingspan的直方图相比KDE 曲线保持了相同的形状但平滑得多。正如 Seaborn 官方文档所警告的相对于直方图KDE 生成的图更简洁、更易解读尤其适合同时绘制多个分布但如果底层分布有界或不平滑KDE 也可能引入失真。与直方图一样表示质量还取决于平滑参数的选择。 换句话说异常值依然会干扰图表——平滑并不等于去除噪声。用 bw_adjust 控制平滑程度前面 30 个 bin 的MaxBodyMass直方图呈锯齿状用 KDE 可以把它熨平sns.kdeplot(filteredBirds[MaxBodyMass]) plt.show()如果你希望曲线平滑但不过度平滑可以调整bw_adjust参数它是带宽的缩放因子越小越贴近原始数据、细节越多越大越平滑sns.kdeplot(filteredBirds[MaxBodyMass], bw_adjust.2) plt.show()✅ 动手实验查阅kdeplot文档中bw_adjust、cut、clip等参数并逐一实验理解带宽对曲线形状的影响。按分组变量着色一行代码展示多维分布KDE 的威力在于它天然支持分组与多维数据。只需几行代码就能按鸟目Order分别绘制最大体重的密度曲线并通过fillTrue填充、common_normFalse让各组的曲线独立归一化不按总样本量共享归一化便于比较形状而非数量、palettecrest指定渐变色系、alpha.5半透明、linewidth0去掉描边sns.kdeplot( datafilteredBirds, xMaxBodyMass, hueOrder, fillTrue, common_normFalse, palettecrest, alpha.5, linewidth0, )还可以把多个变量映射到同一张图上。例如用x、y同时传入MinLength和MaxLength并以ConservationStatus作为hue得到一张二维 KDE 等高线图sns.kdeplot(datafilteredBirds, xMinLength, yMaxLength, hueConservationStatus)图中易危Vulnerable鸟类在体长维度上形成的聚集簇是否具有生态学意义值得进一步探究——这也正是探索性数据分析的价值所在图表用于提出好问题而非直接给出答案。实践与自测 挑战直方图比基础散点图、柱状图、折线图更进阶。去搜集现实中直方图的应用案例它们通常被用于哪些领域能说明什么问题为什么在这些场景中直方图优于其他图表复习与自学本讲你在 Matplotlib 基础上开始使用 Seaborn。深入研究seaborn.kdeplot——它生成一维或多维的连续概率密度曲线——通读官方文档理解其工作原理、参数语义与适用边界。课后测验完成本讲的前置/后置测验检验对分布、bin 与密度估计概念的理解。作业将技能迁移到新数据集按照 assignment.md 的要求把本讲技术迁移到另一个数据集例如从公开数据平台自行获取的数据集构建一个 notebook用至少 5 张直方图讲述该数据集的故事。评分维度包括是否带完整的注释与数据来源说明Exemplary 标准、是否包含未加注释或存在 bug 的代码Adequate 与 Needs Improvement 的区分点。可参考本讲官方解答 solution/notebook.ipynb 中数据加载 → 直方图 → bins 实验 → 过滤 → 二维直方图 → 按类别叠加 → KDE 平滑 → 多维 KDE的完整推进路线同时结合自己的数据集特点组织叙事。课程还提供了本讲的完整草图笔记 sketchnotes/10-Visualizing-Distributions.png 作为速览参考。小结本讲围绕数据分布给出了完整的工具链散点图概览→ 一维直方图bins 控制粒度、过滤消除偏斜→ 二维直方图双变量收敛点→ 按类别叠加直方图文本分组→ KDE 密度图平滑曲线、bw_adjust 调优、hue 分组、多维映射。从 notebook.ipynb 到 solution/notebook.ipynb课程完整演示了如何从看到分布进阶到解释分布这既是后续统计推断的基础也是数据讲故事Data Storytelling的核心能力。【免费下载链接】Data-Science-For-Beginners10 Weeks, 20 Lessons, Data Science for All!项目地址: https://gitcode.com/GitHub_Trending/da/Data-Science-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进