10.可视化分布


文档摘要

可视化分布 草图笔记由@sketchthedocs绘制 :---: 可视化分布 - 草图笔记由@nitya绘制 在上一课中,你了解了一些关于明尼苏达州鸟类数据集的有趣事实。通过可视化异常值,你发现了错误数据,并通过它们的最大长度比较了鸟类类别的差异。 课前测验 探索鸟类数据集 另一种深入数据的方法是查看其分布,即数据沿轴的组织方式。例如,你可能想了解这个数据集中鸟类的最大翼展或最大体重的一般分布。 让我们发现这个数据集中一些有关分布的事实。在本课程文件夹根目录下的notebook.

可视化分布

草图笔记由@sketchthedocs绘制
可视化分布 - 草图笔记由@nitya绘制

在上一课中,你了解了一些关于明尼苏达州鸟类数据集的有趣事实。通过可视化异常值,你发现了错误数据,并通过它们的最大长度比较了鸟类类别的差异。

课前测验

探索鸟类数据集

另一种深入数据的方法是查看其分布,即数据沿轴的组织方式。例如,你可能想了解这个数据集中鸟类的最大翼展或最大体重的一般分布。

让我们发现这个数据集中一些有关分布的事实。在本课程文件夹根目录下的_notebook.ipynb_文件中,导入Pandas、Matplotlib和你的数据:

import pandas as pd import matplotlib.pyplot as plt birds = pd.read_csv('data/birds.csv') birds.head()
名称 科学名称 类别 保护状况 最小长度 最大长度 最小体重 最大体重 最小翼展 最大翼展
0 黑腹啸鸭 Dendrocygna autumnalis 鸭子/鹅/水禽 雁形目 鸭科 Dendrocygna LC 47 56 652 1020 76 94
1 棕喉啸鸭 Dendrocygna bicolor 鸭子/鹅/水禽 雁形目 鸭科 Dendrocygna LC 45 53 712 1050 85 93
2 雪雁 Anser caerulescens 鸭子/鹅/水禽 雁形目 鸭科 Anser LC 64 79 2050 4050 135 165
3 罗斯雁 Anser rossii 鸭子/鹅/水禽 雁形目 鸭科 Anser LC 57.3 64 1066 1567 113 116
4 大白额雁 Anser albifrons 鸭子/鹅/水禽 雁形目 鸭科 Anser LC 64 81 1930 3310 130 165

一般而言,你可以像我们在上一课中所做的那样,通过散点图快速查看数据的分布方式:

birds.plot(kind='scatter',x='MaxLength',y='Order',figsize=(12,8)) plt.title('Max Length per Order') plt.ylabel('Order') plt.xlabel('Max Length') plt.show()

每种鸟目的最大长度

这给出了每个鸟类目的身体长度的一般分布概览,但这并不是显示真实分布的最佳方法。通常,这种任务通过创建直方图来完成。

使用直方图

Matplotlib提供了很好的方法来使用直方图可视化数据分布。这种图表类似于条形图,可以通过条形的上升和下降来观察分布。要构建直方图,你需要数值数据。要构建直方图,可以定义图表类型为'hist'来绘制直方图。这张图表显示了整个数据集中最大体重的分布。通过将给定的数据数组分成更小的区间,它可以显示数据值的分布:

birds['MaxBodyMass'].plot(kind = 'hist', bins = 10, figsize = (12,12)) plt.show()

整个数据集的分布

如你所见,在这个包含400多只鸟的数据集中,大多数鸟的最大体重都在2000以下。通过将bins参数改为更高的数字(例如30),你可以获得更多关于数据的见解:

birds['MaxBodyMass'].plot(kind = 'hist', bins = 30, figsize = (12,12)) plt.show()

整个数据集的分布,更大的bins参数

这张图表以稍微更精细的方式显示了分布。通过确保只选择给定范围内的数据,可以创建一个不太偏左的图表:

过滤你的数据,只获取那些体重小于60的鸟,并显示40个bins

filteredBirds = birds[(birds['MaxBodyMass'] > 1) & (birds['MaxBodyMass'] < 60)] filteredBirds['MaxBodyMass'].plot(kind = 'hist',bins = 40,figsize = (12,12)) plt.show()

过滤后的直方图

✅ 尝试其他过滤器和数据点。为了看到完整的数据分布,请移除['MaxBodyMass'] filter to show labeled distributions.

The histogram offers some nice color and labeling enhancements to try as well:

Create a 2D histogram to compare the relationship between two distributions. Let's compare MaxBodyMass vs. MaxLength。Matplotlib提供了一种内置方法,通过更亮的颜色来显示收敛:

x = filteredBirds['MaxBodyMass'] y = filteredBirds['MaxLength'] fig, ax = plt.subplots(tight_layout=True) hist = ax.hist2d(x, y)

似乎有一个预期的相关性沿着预期的轴分布,有一个特别强的点:

二维图

直方图默认适用于数值数据。如果你需要根据文本数据查看分布怎么办?

使用文本数据探索数据集的分布

这个数据集还包括关于鸟类类别及其属、物种和科以及其保护状况的好信息。让我们深入研究这些保护信息。根据保护状况,鸟类的分布情况如何?

✅ 在数据集中,使用了一些缩写词来描述保护状况。这些缩写来自IUCN红色名录分类,这是一个对物种状况进行分类的组织。

  • CR:极度濒危
  • EN:濒危
  • EX:灭绝
  • LC:低关注
  • NT:近危
  • VU:易危

这些都是基于文本的值,因此你需要进行转换才能创建直方图。使用filteredBirds数据框,显示其保护状况与其最小翼展的关系。你看到了什么?

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(alpha=0.5, bins=20) plt.hist(x1, **kwargs, color='red', label='Extinct') plt.hist(x2, **kwargs, color='orange', label='Critically Endangered') plt.hist(x3, **kwargs, color='yellow', label='Endangered') plt.hist(x4, **kwargs, color='green', label='Near Threatened') plt.hist(x5, **kwargs, color='blue', label='Vulnerable') plt.hist(x6, **kwargs, color='gray', label='Least Concern') plt.gca().set(title='Conservation Status', ylabel='Min Wingspan') plt.legend();

翼展和保护状况的合并

似乎最小翼展与保护状况之间没有良好的相关性。尝试用这种方法测试数据集中的其他元素。你也可以尝试不同的过滤器。你找到任何相关性了吗?

密度图

你可能已经注意到我们看过的直方图都是“阶梯状”的,并不流畅地呈弧线。为了显示更平滑的密度图,你可以尝试密度图。

要处理密度图,熟悉一个新的绘图库,Seaborn

加载Seaborn,尝试一个基本的密度图:

import seaborn as sns import matplotlib.pyplot as plt sns.kdeplot(filteredBirds['MinWingspan']) plt.show()

密度图

你可以看到这个图表与之前显示的最小翼展数据的图表非常相似;只是更平滑了一些。根据Seaborn的文档,“相对于直方图,KDE可以产生一个更少杂乱且更可解释的图表,特别是在绘制多个分布时。但它有可能在底层分布有界或不光滑的情况下引入失真。就像直方图一样,其质量也取决于平滑参数的选择。”来源换句话说,异常值总是会使得图表表现不佳。

如果你想重新审视你在第二个图表中构建的锯齿状最大体重线,可以使用这种方法非常平滑地重新创建它:

sns.kdeplot(filteredBirds['MaxBodyMass']) plt.show()

平滑的体重线

如果你想得到一条既平滑但又不过于平滑的线,编辑bw_adjust参数:

sns.kdeplot(filteredBirds['MaxBodyMass'], bw_adjust=.2) plt.show()

略微平滑的体重线

✅ 阅读这种图可用的参数,并进行实验!

这种类型的图表提供了极富说明性的可视化效果。例如,通过几行代码,你可以显示每种鸟目的最大体重密度:

sns.kdeplot( data=filteredBirds, x="MaxBodyMass", hue="Order", fill=True, common_norm=False, palette="crest", alpha=.5, linewidth=0, )

按鸟目的最大体重

你还可以在一个图表中映射多个变量的密度。测试鸟类的最大长度和最小长度与其保护状况之间的关系:

sns.kdeplot(data=filteredBirds, x="MinLength", y="MaxLength", hue="ConservationStatus")

叠加的多个密度

也许值得研究那些长度上的“易危”鸟类集群是否有意义。

挑战

直方图比基本散点图、条形图或折线图更复杂。在网上搜索一下,寻找一些好的直方图示例。它们是如何使用的?它们展示了什么?它们通常在哪些领域或研究领域被使用?

课后测验

复习与自学

在这节课中,你使用了Matplotlib并开始使用Seaborn展示更复杂的图表。做一些关于Seaborn中kdeplot的研究,这是一种“在一维或多维中连续概率密度曲线”。阅读文档,以了解它是如何工作的。

作业

应用你的技能

**声明**: 本文件灏天文库团队进行了翻译。尽管我们力求准确,但请注意,翻译可能包含错误或不准确之处。原文档以其原始语言为准。我们不对因使用此翻译而产生的任何误解或误译负责。

发布者: 作者: 转发
评论区 (0)
U