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

这张图表以稍微更精细的方式显示了分布。通过确保只选择给定范围内的数据,可以创建一个不太偏左的图表:
过滤你的数据,只获取那些体重小于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的研究,这是一种“在一维或多维中连续概率密度曲线”。阅读文档,以了解它是如何工作的。
**声明**: 本文件灏天文库团队进行了翻译。尽管我们力求准确,但请注意,翻译可能包含错误或不准确之处。原文档以其原始语言为准。我们不对因使用此翻译而产生的任何误解或误译负责。