Data-Science-For-Beginners 第10课实战:用直方图与密度曲线可视化数据分布(Matplotlib + Seaborn 详解)
发布时间:2026/9/6 23:11:14来源:尧图网络
Data-Science-For-Beginners 第10课实战用直方图与密度曲线可视化数据分布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-visualization-distributions 一课展开以密歇根州鸟类数据集birds.csv为例系统讲解如何用 Matplotlib 直方图刻画数值型分布、用分组叠加直方图刻画分类变量分布、再用 Seaborn 的 KDE 密度曲线做平滑可视化。读完本文你将能独立完成从bins调参、数据过滤去偏到kdeplot分组密度绘图的完整分布分析流程并理解每个关键参数的作用。1. 课程背景birds 数据集本课承接第 9 课用散点图发现 Minnesota 鸟类数据中的异常值、对比不同目鸟类的最大体长。分布distribution回答的是数据沿某个坐标轴如何组织的问题例如400 多种鸟的最大翼展或最大体重的整体分布是什么样的课程使用仓库根目录下的 birds.csv共 443 条鸟类记录、13 个字段名称、学名、类别Category、目Order、科Family、属Genus、保护状态ConservationStatus以及体长/体重/翼展的上下限MinLength、MaxLength、MinBodyMass、MaxBodyMass、MinWingspan、MaxWingspan。在课程文件夹下的 notebook.ipynb 中导入 Pandas 与 Matplotlib 并加载数据代码从课程文件夹运行故数据路径为../../data/birds.csvimport pandas as pd import matplotlib.pyplot as plt birds pd.read_csv(../../data/birds.csv) birds.head()前 5 行如下与原课程文档一致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/WaterfowlAnseriformesAnatidaeAnserLC6481193033101301652. 快速窥探分布散点图的局限课程先给出一个快速概览手段——散点图birds.plot(kindscatter, xMaxLength, yOrder, figsize(12,8)) plt.title(Max Length per Order) plt.ylabel(Order) plt.xlabel(Max Length) plt.show()它能给出各目鸟类最大体长的整体布局但并不是展示真实分布的最优方式——点的密集程度依赖肉眼估算。展示真实分布的任务通常由直方图Histogram完成。3. 直方图bins 参数、过滤与 2D 直方图直方图类似条形图但通过柱子的起伏rise and fall呈现分布形态它要求数值型数据。构建方式是把数据数组划分成若干更小的箱bins展示各区间内取值数量。3.1 基础直方图与 bins 调参展示整个数据集的MaxBodyMass分布birds[MaxBodyMass].plot(kindhist, bins10, figsize(12,12)) plt.show()可以看到数据集中 400 多种鸟的 MaxBodyMass 大多落在 2000 以下的区间左侧偏态明显由大型雁形目物种把整体范围拉高所致。把bins提高到 30可以获得更细粒度的分布birds[MaxBodyMass].plot(kindhist, bins30, figsize(12,12)) plt.show()bins是直方图最核心的参数过小会掩盖分布细节如 10 箱时只能看到大部分集中在低端过大会引入噪声。课程建议尝试其他过滤器与数据点若要查看完整分布可去掉[MaxBodyMass]的列过滤。3.2 用过滤消除偏态上面的图偏态skewed明显是因为少数超重型物种撑大了横轴范围。只筛选体重在 1g 到 60g 之间的小鸟、并使用 40 个 bins可以得到一个不那么偏态的图filteredBirds birds[(birds[MaxBodyMass] 1) (birds[MaxBodyMass] 60)] filteredBirds[MaxBodyMass].plot(kindhist, bins40, figsize(12,12)) plt.show()这里filteredBirds是一个用布尔掩码过滤出的子 DataFrame后续文本数据与 KDE 部分都复用它。3.3 2D 直方图观察两个分布的关系Matplotlib 还提供内置的 2D 直方图来比较两个变量的联合分布并用更亮的颜色标示汇聚点convergencex filteredBirds[MaxBodyMass] y filteredBirds[MaxLength] fig, ax plt.subplots(tight_layoutTrue) hist ax.hist2d(x, y)从图中可以看出体重与体长之间存在沿预期方向的相关性并且有一个特别强的汇聚点——这正是用颜色密度代替散点堆叠的价值所在。4. 文本分类数据的分布保护状态 × 最小翼展直方图默认面向数值数据那么按文本维度看分布怎么办birds 数据集中每个物种带有 IUCN 红色名录IUCN Red List Categories风格的保护状态缩写缩写含义CRCritically Endangered极危ENEndangered濒危EXExtinct灭绝LCLeast Concern无危NTNear Threatened近危VUVulnerable易危课程把过滤后的filteredBirds按 6 种保护状态分别取出MinWingspan用 6 条不同颜色、半透明alpha0.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()这里的技术要点用.loc[条件, 列]对分类字段做子集提取用kwargs字典统一传递alpha透明度使叠加时彼此可见与bins最后用plt.legend()显示标签。课程结论最小翼展与保护状态之间似乎没有明显的相关性并鼓励读者用同样方法测试数据集的其他字段、尝试不同过滤器看能否找到真正的相关性。5. 密度图KDE用 Seaborn 画平滑分布5.1 从直方图到密度曲线前面看到的直方图都是阶梯状的不会形成平滑弧线。要展示更平滑的密度图可以引入 Seabornimport seaborn as sns sns.kdeplot(filteredBirds[MinWingspan]) plt.show()曲线形态与前面最小翼展直方图对应只是更平滑。课程引用了 Seaborn 官方文档对 KDE 的定位相对于直方图KDE 能产生更不杂乱、更易于解读的图尤其是绘制多个分布时但当底层分布有界或不平滑时KDE 也可能引入失真——与直方图一样表现质量也依赖于好的平滑参数选择。换句话说离群值仍然会让你的图表现糟糕。5.2 bw_adjust控制平滑程度把第 3 节那张锯齿状的MaxBodyMass直方图用 KDE 重画sns.kdeplot(filteredBirds[MaxBodyMass]) plt.show()如果想要平滑但不过度平滑的曲线调整bw_adjust参数带宽调整因子取值越小带宽越窄、曲线越贴近原始波动sns.kdeplot(filteredBirds[MaxBodyMass], bw_adjust0.2) plt.show()课程要求读者阅读该类型图的全部可用参数并动手实验。5.3 分组密度按鸟类目展示体重密度只需几行代码就能展示按鸟类目Order分组的最大体重密度填充色块 各自归一化适合对比多个子群体的形状sns.kdeplot( datafilteredBirds, xMaxBodyMass, hueOrder, fillTrue, common_normFalse, palettecrest, alpha.5, linewidth0, )关键参数含义hue指定分组字段fillTrue填充曲线下区域common_normFalse表示各组独立归一化比较形状而非总量palette/alpha/linewidth分别控制配色板、透明度与轮廓线宽。5.4 双变量多密度叠加还可以在同一张图里映射多个变量的密度。例如把体长MinLength × MaxLength与保护状态叠加sns.kdeplot(datafilteredBirds, xMinLength, yMaxLength, hueConservationStatus)课程由此引出进一步思考按体长聚类的 Vulnerable易危鸟群聚集是否有生物学意义这正是一个从图表走向研究问题的入口。6. 仓库实现佐证solution notebook 中的真实运行证据以上全部代码在仓库内都有可直接运行的完整实现solution/notebook.ipynb 依次保存了基础直方图 → 调整 bins → 过滤后新直方图 → MaxBodyMass×MaxLength 的 2D 直方图 → 保护状态叠加直方图 → MinWingspan KDE → MaxBodyMass KDE → bw_adjust 实验 → MinLength×MaxLength 双变量 KDEhueConservationStatus全部单元格的执行输出可与本文各节逐一对应复现。从该 notebook 的运行记录还能得到两条实操层面的事实均来自其保存的 stderr/警告输出可推断为当时的运行环境特性在较早的 Matplotlib/Seaborn 组合下执行kdeplot会触发FutureWarning: Support for multi-dimensional indexing (e.g. obj[:, None]) is deprecated...属于版本过渡期告警不影响出图双变量 KDEMinLength×MaxLength运行时会提示UserWarning: Dataset has 0 variance; skipping density estimate.——说明某个小样本分组在某个方向上方差为 0 而被跳过。可以推断分组 KDE 对样本量极少的类别并不稳健这也是课程建议研究 VU 聚集是否有意义背后的方法论提醒。另请注意课程 README 中 2D 直方图小节还演示了from matplotlib import colors/PercentFormatter的可选导入见 solution notebook 对应单元格用于自定义 2D 直方图的颜色标尺。7. 关键参数速查参数所属函数作用与取值说明binsplot(kindhist)/plt.hist分箱数量本课用了 10、30、40、20越大粒度越细但越易引入噪声figsizeplot画布尺寸英寸本课统一使用 (12,12) 或默认alphaplt.hist柱条透明度0~1叠加多个直方图时 0.5 可保证层次可见label/plt.legend()plt.hist图例文字与显示用于区分分类分组colorplt.hist每条直方图的颜色本课按 6 种保护状态一一指定bw_adjustsns.kdeplot带宽调整因子正数越小越欠平滑越大越过平滑huesns.kdeplot按指定列分组绘制多条密度曲线fill/common_normsns.kdeplot是否填充是否共享归一化基准False 便于比较形状palette/linewidthsns.kdeplot分组配色板曲线轮廓线宽0 即无轮廓8. 作业、挑战与 R 语言版本课后作业assignment.md 要求换一个数据集例如来自 Kaggle 的数据源自建 notebook 讲一个故事且必须使用直方图评分标准Rubric为优秀 有完整注释含数据来源且至少使用 5 个直方图发现数据事实及格 注释不完整或有 bug待改进 无注释且含 bug。课堂挑战在网络上搜索直方图的良好使用案例思考它们如何用直方图展示分布、应用于哪些领域。课后自修阅读 Seabornkdeplot文档理解一个或多个维度上的连续概率密度曲线这一概念。R 语言版本仓库同时提供等价的 R/ggplot2 实现见 R 版课程其中用geom_histogram(bins10)与coord_flip()完成同样的分布可视化流程便于与 Python 版本对照学习。9. 小结本课在 Data-Science-For-Beginners 的3-Data-Visualization模块中承担从量quantity走向分布distribution的转折散点图能给分布一个粗略轮廓但刻画真实分布应使用直方图bins、布尔掩码过滤是控制直方图粒度与偏态的两个基本杠杆hist2d用颜色密度揭示双变量联合分布的汇聚点分类文本字段通过.loc逐类提取 半透明叠加直方图即可在一张图中对比多组分布Seabornkdeplot以平滑曲线替代阶梯bw_adjust控制平滑强度hue/fill/common_norm组合支持分组密度对比直至双变量多密度叠加——为第 11 课比例可视化与后续生命周期分析打好分布直觉基础。【免费下载链接】Data-Science-For-Beginners10 Weeks, 20 Lessons, Data Science for All!项目地址: https://gitcode.com/GitHub_Trending/da/Data-Science-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网