十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

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 课程「3-Data-Visualization」第 10 课可视化分布的完整技术指南围绕明尼苏达州鸟类数据集data/birds.csv展开。你将掌握一套可复用的分布分析工作流先借助散点图建立总体直觉再用 Matplotlib 直方图观察数值分布并理解bins参数的粒度控制随后用hist2d探查两个变量的相关性最后引入 Seaborn 的kdeplot绘制平滑密度曲线与多维密度对比。读完本文你可以独立完成「数据加载 → 过滤 → 分布直方图 → 密度图」的完整分析链条并将这套方法迁移到任意数据集。数据准备加载明尼苏达州鸟类数据集本课所有代码均围绕仓库根目录下的data/birds.csv展开。在动手之前先确认数据规模与结构该文件共 443 行1 行表头 442 条鸟类记录列名如下列名含义Name / ScientificName常用名 / 学名Category / Order / Family / Genus分类学层级类别、目、科、属ConservationStatus保护状态IUCN 缩写见下文MinLength / MaxLength最小 / 最大体长MinBodyMass / MaxBodyMass最小 / 最大体重MinWingspan / MaxWingspan最小 / 最大翼展在课程配套的 notebook.ipynb 中位于3-Data-Visualization/10-visualization-distributions/目录首先导入 Pandas 与 Matplotlib 并读取数据import pandas as pd import matplotlib.pyplot as plt birds pd.read_csv(../../data/birds.csv) birds.head()注意相对路径../../data/birds.csv是从课程目录3-Data-Visualization/10-visualization-distributions/出发向上两级正好指向仓库根目录下的data/。若你直接使用仓库根目录作为工作目录则应写为pd.read_csv(data/birds.csv)。前 5 行示例输出如下名称学名类别目科属保护状态最小体长最大体长最小体重最大体重最小翼展最大翼展Black-bellied whistling-duckDendrocygna autumnalisDucks/Geese/WaterfowlAnseriformesAnatidaeDendrocygnaLC475665210207694Fulvous whistling-duckDendrocygna bicolorDucks/Geese/WaterfowlAnseriformesAnatidaeDendrocygnaLC455371210508593Snow gooseAnser caerulescensDucks/Geese/WaterfowlAnseriformesAnatidaeAnserLC647920504050135165Rosss gooseAnser rossiiDucks/Geese/WaterfowlAnseriformesAnatidaeAnserLC57.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()从这张图可以大致看出不同目之间体长的整体区间差异但它并不是展示「真实分布」的最优方式散点会把大量重叠的点挤在一起难以回答「大多数样本落在哪个区间」「分布是集中还是分散」这类问题。这正是直方图的用武之地。直方图用 bins 控制分布观察的粒度直方图是观察数值分布的标准工具。它把数值轴切分成若干等宽的区间bin用柱子的高低表示每个区间内的样本数量——柱子的起伏就是分布的形状。Matplotlib 中只需把kind设为histbirds[MaxBodyMass].plot(kind hist, bins 10, figsize (12,12)) plt.show()可以看到数据集中 400 多种鸟类里绝大多数个体的最大体重落在 2000 克以下直方图呈现明显的右偏长尾形态。这里的关键参数是bins它决定把数据切分成多少个区间bins 取值效果适用场景较小如 10柱子少、形状粗糙但趋势一目了然快速总览较大如 30区间更细能看到更多局部细节深入分析过大区间过碎柱子起伏剧烈、噪声明显谨慎使用把bins提高到 30 再画一次birds[MaxBodyMass].plot(kind hist, bins 30, figsize (12,12)) plt.show()这张图呈现了更细粒度的分布细节但由于长尾的存在左侧主峰依然被压缩得很矮——数据仍然「偏向左」。数据过滤让分布不再被长尾淹没要得到更均衡的分布视图可以先用布尔条件过滤数据只保留关注范围内的样本。课程给出的例子是只保留最大体重大于 1 且小于 60 的鸟类并展示 40 个区间filteredBirds birds[(birds[MaxBodyMass] 1) (birds[MaxBodyMass] 60)] filteredBirds[MaxBodyMass].plot(kind hist, bins 40, figsize (12,12)) plt.show()过滤后生成的直方图不再严重偏左分布形态清晰可辨。这一步同时演示了 Pandas 布尔索引在分析流程中的典型用法先圈定子集filteredBirds再对子集做可视化。后续的 2D 直方图与密度图都将复用这个filteredBirds数据框。✅ 动手练习尝试更换过滤条件与数据字段例如用MaxWingspan或MinLength并观察直方图形状的变化。若想去掉[MaxBodyMass]字段过滤、查看带标签的完整分布可以构造多字段的数据框后再绘图。2D 直方图用 hist2d 观察两个分布的收敛关系直方图只能展示单个变量而hist2d可以把两个变量的分布叠加到一张二维网格上每个格子的颜色亮度代表落在该格子内的样本密度颜色越亮说明样本越集中。课程用它对比MaxBodyMass与MaxLength的关系x filteredBirds[MaxBodyMass] y filteredBirds[MaxLength] fig, ax plt.subplots(tight_layoutTrue) hist ax.hist2d(x, y)从结果可以看到这两个变量沿一条预期的对角线方向呈现出明显的相关趋势并存在一个特别强的收敛点——即体重与体长同时落在中低区间的样本高度集中。这正是「分布」视角下发现变量关联的高效手段。文本数据的分布按保护状态分组绘制直方图直方图默认面向数值数据。当你想观察「文本类别下的数值分布」时需要先按类别切分数据再为每个类别分别绘制直方图并叠加。本例关注的问题是不同保护状态的鸟类其最小翼展MinWingspan分布如何首先理解数据集中保护状态字段的取值它们来自 IUCN世界自然保护联盟红色名录的分级体系缩写含义CR极度濒危Critically EndangeredEN濒危EndangeredEX灭绝ExtinctLC无危Least ConcernNT近危Near ThreatenedVU易危Vulnerable用loc按保护状态切分出六个子序列再用plt.hist叠加绘制通过alpha透明度、bins与自定义颜色区分不同分组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();观察叠加后的直方图可以发现最小翼展与保护状态之间并没有明显的相关性——各状态分组大致重叠未呈现「濒危鸟翼展更小/更大」之类的系统性规律。这也提示我们不是每个分组变量都一定与数值变量存在关联可视化恰恰是用来验证而非预设这些关系的工具。✅ 动手练习把MinWingspan换成其他字段如MaxBodyMass、MaxLength或调整过滤条件继续寻找可能存在相关性的组合。密度图用 Seaborn 的 kdeplot 平滑分布曲线细心的读者可能已经注意到直方图是「阶梯状」的柱顶并不平滑。当你想得到一条连续、平滑的密度曲线时可以改用核密度估计KDE绘制密度图。这一步需要引入新的绘图库 Seaborn。import seaborn as sns import matplotlib.pyplot as plt sns.kdeplot(filteredBirds[MinWingspan]) plt.show()从输出可以看到密度曲线完整呼应了前面MinWingspan直方图的形状只是更平滑。Seaborn 官方文档对 KDE 的评价值得牢记相比直方图KDE 在同时绘制多个分布时更整洁、更易解读但如果底层分布有界或不平滑它也可能引入失真而且与直方图一样表示质量严重依赖平滑参数的选取。换句话说离群值永远是图表的敌人。用 bw_adjust 调节平滑程度之前绘制的MaxBodyMass直方图呈现明显的锯齿状。用 KDE 重建这条曲线时默认的平滑参数已经能让它变得顺滑sns.kdeplot(filteredBirds[MaxBodyMass]) plt.show()如果你想要一条平滑但不至于过度抹平细节的曲线可以调整bw_adjust参数。该参数是一个缩放因子值越小带宽越小曲线对局部细节越敏感更「毛糙」值越大带宽越大曲线越平滑但细节越少。sns.kdeplot(filteredBirds[MaxBodyMass], bw_adjust.2) plt.show()当bw_adjust0.2时曲线明显变得更「贴」数据、保留了更多局部起伏。实践中应针对数据分布反复试验该参数找到信息量与平滑度的平衡点。✅ 动手练习查阅kdeplot支持的其它参数如cut、clip、cumulative、multiple并逐一试验效果。多维密度图hue、fill 与 2D KDEKDE 的真正威力在于它可以用很少的代码生成极具解释力的多维可视化。下面这段代码用data指定完整数据框用x指定数值字段用hue按鸟类的「目」分组着色并配合fill填充区域、common_norm是否对多条曲线共享归一化、palette调色板、alpha透明度与linewidth描边宽度美化输出sns.kdeplot( datafilteredBirds, xMaxBodyMass, hueOrder, fillTrue, common_normFalse, palettecrest, alpha.5, linewidth0, )参数作用说明hue按某列分组着色每个类别一条密度曲线fillTrue填充曲线下方区域便于比较面积与形状common_normFalse每条曲线独立归一化避免样本量差异造成曲线高低失真palette指定调色板如crest为连续渐变色系alpha.5设置透明度多条曲线叠加时避免互相遮挡linewidth0关闭描边纯填充风格KDE 还支持二维密度映射把两个数值字段分别赋给x与y再用hue叠加第三个分类维度即可在平面上同时观察「长度分布」与「保护状态」的关系sns.kdeplot(datafilteredBirds, xMinLength, yMaxLength, hueConservationStatus)这张图把最小体长与最大体长的联合密度按保护状态分别着色。值得留意的是在仓库的配套 solution/notebook.ipynb 中运行该单元格第 13 个代码单元时 Seaborn 输出了UserWarning: Dataset has 0 variance; skipping density estimate的提示——这是 KDE 面对零方差子组时的正常降级行为说明「易危Vulnerable」等分组的样本可能在长度字段上取值过于集中。这本身就是一个值得进一步研究的问题按体长来看「易危」鸟类的聚集是否有统计意义样本量是否足以支撑结论进阶练习与作业动手挑战直方图比基础散点图、柱状图、折线图更复杂。去网上搜集直方图的优秀应用案例思考它们被用在哪些领域、回答了什么问题、又是如何设计区间与标注的。把这套「分布思维」迁移到自己的数据上是最快的进阶路径。课程作业assignment.md 要求你脱离鸟类数据集另选一个你感兴趣的数据集例如来自公开数据竞赛平台的资源构建一个 Notebook 讲述该数据集的故事并确保在讲解过程中至少使用直方图。评价标准如下优秀合格待改进Notebook 包含数据集来源与注释并使用至少 5 张直方图挖掘数据事实Notebook 注释不完整或存在 BugNotebook 没有注释且包含 Bug运行环境与仓库证据本课所有可执行代码都沉淀在仓库的以下位置可作为复现与深挖的依据数据文件data/birds.csv442 条鸟类记录字段含长度、体重、翼展及分类学与保护状态信息空白练习 Notebook3-Data-Visualization/10-visualization-distributions/notebook.ipynb完整参考答案3-Data-Visualization/10-visualization-distributions/solution/notebook.ipynb其中的输出结果证实上述全部代码在 Python 3.7 环境下可实际运行kdeplot输出伴随的 FutureWarning 与 UserWarning 均为旧版库的兼容提示不影响结果课程图例3-Data-Visualization/10-visualization-distributions/images/直方图、密度图、散点图与 2D 图共 17 张环境依赖运行本课代码需要pandas、matplotlib与seaborn三个 Python 库。若使用新版 Seaborn建议将sns.kdeplot(series)的传参方式升级为sns.kdeplot(datadf, xcolumn)以消除弃用警告。分析顺序上推荐始终遵循「散点总览 → 直方图定粒度 → 过滤聚焦 → 密度图平滑」的递进路径这样既能快速发现问题数据也能获得最准确的分布结论。【免费下载链接】Data-Science-For-Beginners10 Weeks, 20 Lessons, Data Science for All!项目地址: https://gitcode.com/GitHub_Trending/da/Data-Science-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表