拓冰建站拓冰建站
首页 / 资讯中心 / 正文

Data-Science-For-Beginners 第 10 课实战:用 Matplotlib 与 Seaborn 绘制直方图、2D 直方图与 KDE 密度图分析数据分布

Data-Science-For-Beginners 第 10 课实战用 Matplotlib 与 Seaborn 绘制直方图、2D 直方图与 KDE 密度图分析数据分布【免费下载链接】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的文档整理而成围绕如何查看数据沿某条轴线的组织方式这一核心问题以仓库内置的密苏里-明尼苏达鸟类数据集443 行、13 列的 CSV为载体完整讲解散点总览、直方图含bins参数调优与数据过滤、hist2d二维直方图、基于文本字段的分组直方图以及 Seabornkdeplot密度图的单变量/双变量/多变量用法。读完本文你可以直接复制其中的代码在 Pandas Matplotlib Seaborn 环境下复现全部图表并掌握直方图与 KDE 的适用边界及bw_adjust、hue、common_norm等关键参数的含义。数据集birds.csv 的结构与取值本课程的实操数据是仓库根目录下 data/birds.csv共 443 行记录不含表头每行一只明尼苏达州的鸟类包含 13 个字段字段类型说明Name文本英文俗名如 Black-bellied whistling-duckScientificName文本学名如 Dendrocygna autumnalisCategory文本类别如 Ducks/Geese/WaterfowlOrder文本目Taxonomic Order如 Anseriformes共 21 个取值Family文本科如 AnatidaeGenus文本属如 DendrocygnaConservationStatus文本IUCN 保护状态缩写LC/NT/VU/EN/CR/EXMinLength / MaxLength数值体长范围cmMinBodyMass / MaxBodyMass数值体重范围gMinWingspan / MaxWingspan数值翼展范围cm用 Pandas 载入并预览的前 5 行对应课程 notebook 的第一个代码单元格import pandas as pd import matplotlib.pyplot as plt birds pd.read_csv(../../data/birds.csv) # 在课程 notebook 中相对 lection 目录的两级路径 birds.head()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需要注意pd.read_csv(../../data/birds.csv)是相对 notebook 自身所在目录的路径课程用的 notebook.ipynb 位于二级目录下而参考解答 solution/notebook.ipynb 中写的是../../../data/birds.csv。如果你在自己的工作目录运行请相应调整相对路径或改用绝对路径。用散点图快速建立分布直觉在深入分布图之前可以像第 9 课那样先用散点图快速查看数据的组织方式这里展示每个目的最大体长birds.plot(kindscatter, xMaxLength, yOrder, figsize(12, 8)) plt.title(Max Length per Order) plt.ylabel(Order) plt.xlabel(Max Length) plt.show()这张图给出了体长在 21 个目上的总体分布概览但它并不是展示真实分布true distributions的最优方式——这正是本课要解决的沿单条轴线看数据如何组织的问题标准工具是直方图。直方图Histogrambins参数与左偏校正Matplotlib 的kindhist直方图把数值区间切分成若干个 bin箱用每根柱子的高度表示落在该区间内的数据量从而以柱子的升降呈现分布形态。构建直方图的前提是数值型数据。下面对全部 443 只鸟的MaxBodyMass画 10 个 bin 的直方图birds[MaxBodyMass].plot(kindhist, bins10, figsize(12, 12)) plt.show()关键参数说明参数本文取值作用kindhist告诉 Pandasplot方法绘制直方图而非折线/散点bins10 → 30 → 40区间划分数量数值越大柱子越细、分布颗粒度越高figsize(12, 12)画布尺寸宽, 高单位英寸保证柱子不被压缩变形从 10 bin 的图中可以看到数据集中绝大多数400 只鸟类的最大体重落在 2000 以下。把bins提高到 30 可以获得更细的分布细节birds[MaxBodyMass].plot(kindhist, bins30, figsize(12, 12)) plt.show()上图为下文二维直方图结果此处示意提高 bins 后分布形态更可见的递进关系。当直方图整体向左偏斜左偏/长尾拖向右上方时一种实用校正手段是先按数值范围过滤再在更小的取值域上画更多 bin。课程示例只保留体重在(1, 60)区间内的鸟类画 40 个 binfilteredBirds birds[(birds[MaxBodyMass] 1) (birds[MaxBodyMass] 60)] filteredBirds[MaxBodyMass].plot(kindhist, bins40, figsize(12, 12)) plt.show()课程建议继续尝试其他过滤条件若想恢复全量分布视图去掉[MaxBodyMass]过滤条件重新绘制即可。按当前仓库的 data/birds.csv 实际核验上述过滤条件保留了 193 行记录即后续密度图示例均基于这 193 只轻量级鸟类子集filteredBirds。二维直方图hist2d比较两条数值分布的关系直方图默认服务于单变量数值数据。若要同时比较两个数值维度的联合分布可以用 Matplotlib 内建的hist2d把数据按二维网格分箱并用颜色深浅表达收敛convergence——颜色越亮落点越密集。课程示例比较MaxBodyMass与MaxLengthx filteredBirds[MaxBodyMass] y filteredBirds[MaxLength] fig, ax plt.subplots(tight_layoutTrue) hist ax.hist2d(x, y)从渲染结果看两个维度之间存在沿预期主轴的弱相关并且有一个特别强的收敛点高密度色块。参考解答 solution/notebook.ipynb 还额外导入了matplotlib.colors与matplotlib.ticker.PercentFormatter说明该单元格的完整形态是为色标配置百分比刻度可打开该 notebook 查看配色与坐标格式化的细节。基于文本字段的分布保护状态 × 最小翼展直方图要求数值输入但数据集中还有大量文本字段Category、Genus、Family、ConservationStatus 等。查看文本分组下的数值分布做法是先按文本值切分出若干数值序列再叠画多个直方图。本数据集的ConservationStatus使用 IUCN 红色名录Red List Categories分类体系的缩写缩写含义本数据集数量按 CSV 核验CRCritically Endangered极危1ENEndangered濒危2EXExtinct灭绝1LCLeast Concern无危402NTNear Threatened近危27VUVulnerable易危10可见数据高度集中在 LC其余状态是长尾——这本身就是一个值得先知道的分布事实。在filteredBirds上把六种保护状态对应的MinWingspan分别取出用alpha0.5半透明叠加绘制以观察最小翼展 × 保护状态是否相关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[条件, 列]完成文本 → 数值序列的转换再用共享kwargsalpha0.5让重叠区域可辨、bins20统一分箱叠画六个plt.hist。渲染结果提示最小翼展与保护状态之间并不存在强相关课程鼓励你换用数据集中的其他字段如体重、长度与其他过滤条件重复这一流程自行寻找存在相关性的组合。密度图KDE从阶梯到平滑曲线前面所有直方图都是阶梯状的不能平滑地流过一条弧线。要获得更平滑的密度曲线可以引入 Seaborn 的核密度估计KDE图。最基本的单变量密度图import seaborn as sns import matplotlib.pyplot as plt sns.kdeplot(filteredBirds[MinWingspan]) plt.show()KDE 曲线与同数据的直方图形态一致只是更平滑。Seaborn 官方文档对 KDE 与直方图的权衡有这样的表述引自文档含义转述相比直方图KDE 在绘制多条分布时更整洁、更易解读但当底层分布有界或不够光滑时KDE 可能引入失真和直方图一样其表现质量同样取决于平滑参数的选择。换句话说离群值依然会让曲线表现不佳——这正是为什么所有示例都基于过滤后的filteredBirds。把前面锯齿状的MaxBodyMass直方图重绘为 KDEsns.kdeplot(filteredBirds[MaxBodyMass]) plt.show()如果觉得默认平滑度过高可以通过bw_adjust参数调低带宽bw 即 bandwidth带宽越小曲线越贴近原始数据、越毛糙sns.kdeplot(filteredBirds[MaxBodyMass], bw_adjust.2) plt.show()KDE 的真正威力在少量代码 多变量着色。用hueOrder把 21 个目的MaxBodyMass密度全部填充叠画在同一张图上common_normFalse让每条曲线各自归一化sns.kdeplot( datafilteredBirds, xMaxBodyMass, hueOrder, fillTrue, common_normFalse, palettecrest, alpha.5, linewidth0, )还可以做二维条件密度xMinLength、yMaxLength、hueConservationStatus一次在一张图上映射多个变量的密度结构。渲染结果中Vulnerable易危鸟类在长度维度上的聚簇是否有意义值得进一步查证——这也是课程留下的开放性分析问题。练习与延伸阅读课程练习见 assignment.md要求换一个数据集例如 Kaggle 上的公开数据集构建 notebook用至少 5 个直方图讲述该数据集的故事并对 notebook 的来源注释与图表数量给出评分标准优秀注明来源且至少 5 个直方图合格注释不完整或含错误需改进无注释且含错误。自学部分建议围绕 Seaborn 的kdeplot展开它绘制的是一维或更高维的连续概率密度曲线。可对照仓库中的两个 notebook 逐单元格核对本文代码课程主文件 notebook.ipynb仅含标题供你自己补全与参考解答 solution/notebook.ipynb含全部 11 个代码单元格从载入数据、bins 实验、过滤、hist2d 到三种 kdeplot。本篇涉及的仓库文件清单原文档丹麦语课程页translations/da/3-Data-Visualization/10-visualization-distributions/README.md练习说明translations/da/3-Data-Visualization/10-visualization-distributions/assignment.md课程 notebook 与参考解答notebook.ipynb、solution/notebook.ipynb数据集data/birds.csv443 行 × 13 列结果图目录3-Data-Visualization/10-visualization-distributions/images含 scatter-wb.png、dist1~3-wb.png、2D-wb.png、histogram-conservation-wb.png、density1~4.png、multi.png 等渲染结果【免费下载链接】Data-Science-For-Beginners10 Weeks, 20 Lessons, Data Science for All!项目地址: https://gitcode.com/GitHub_Trending/da/Data-Science-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门