记录利用 Seaborn 中关于 displot 的相关用法
1 前言
因为需要用到seaborn相关的绘图工具,因此记录一下学习笔记,方便后续自己查阅。
2 变量分布
变量分布是指查看数据中某一个或者几个变量的分布情况,查看:
- 是否有异常值
- 是服从正态分布,还是双峰分布,或是其他分布,是否有偏移
- 依据类别变量对数据进行划分,各子集上的变量分布是否有很大差异
2.1 boxplot 箱式图
1 | import pandas as pd |


第二幅图中的五条横线从上到下依次表示:嘴巴长度的最大值、数据量小于75%的分界线、平均值、数据量小于25%的分界线、最小值。查看数据集中对应的变量分布:
多组数据的绘制1
2
3
4
5tips_df = sns.load_dataset("tips")
sns.boxplot(data=tip_df)
plt.show()
sns.boxplot(data=tip_df, y="total_bill")
plt.show()


这种方式会将超过最大值的一些数据认为是异常点,但在实际中是否是异常值,还需要经过进一步地确认才行。
2.2 displot 查看变量分布
2.2.1 数值变量直方图
1 | # 数值变量的分布 |
使用displot绘制直方图,结果如下:


使用histplot绘制直方图,结果如下:


可以看到,这两个函数绘制的直方图除了大小不一样以及边框不一样外,没有什么区别。当然边框也是可以调整的。
2.2.2 类别变量直方图
1 | # 类别变量的分布 |
使用histplot绘制的结果如下:



使用countplot绘制的结果如下:

2.2.3 kdeplot
kde曲线默认是用高斯核函数(kernel)。1
2
3
4sns.displot(x="bill_length_mm", data=penguin_df, kind="kde")
plt.show()
sns.kdeplot(x="bill_length_mm", data=penguin_df)
plt.show()
运行结果如下:


1 | sns.displot(x="bill_length_mm", data=penguin_df, kind="kde", rug=True) |



上述三幅图中,第一幅图添加了rug;第二幅图仅保留kde曲线中和数据集对应的部分,超出最大最小的部分未在图中显示;第三幅图则是将直方图与kde曲线叠加在一起。
从上图看出,仅对企鹅嘴长单一数值变量进行分析,得到的是一个双峰分布,接下来引入企鹅种类做进一步分析。1
2sns.displot(x="bill_length_mm", data=penguin_df, kind="kde", hue="species")
plt.show()
从上图可以看出,实际上不同种类的企鹅的嘴长是各自服从正态分布的,叠加后才会出现双峰分布。
1 | # 有明显偏移的数据处理 |
绘制结果如下:


上图第一幅图表明,钻石的价格集中分布在几百到几千的范围,有明显偏移,将横坐标价格取对数后,看出整体的分布更趋向于正态分布。
利用kde曲线比较训练集和测试集变量分布是否一致。1
2
3
4
5from sklearn.model_selection import train_test_split
train_df, test_df = train_test_split(diamond_df, test_size=0.3, random_state=42)
sns.displot(data=train_df, x="depth", kind="kde", linewidth=5.0, color="r")
sns.kdeplot(data=test_df, x="depth", color="g")
plt.show()
Note: 只能用一次displot,第二次再用displot会导致两个曲线分开绘制于两张图上。
2.2.4 ecdfplot
ecdf是经验累积分布函数,与箱式图有相似之处,表达的方式不一样。1
2sns.displot(penguin_df, x="bill_length_mm", kind="ecdf")
plt.show()
2.3 displot 具有的 FacetGrid 特性
displot 是图绘制函数,具有FacetGrid特性,即会将图形按照行和列设置为类别变量,依据类别变量可以再将数据集划分为子集,进而对子集的分布进行分析,亦即对变量的条件概率分布进行了绘制。1
2
3
4sns.displot(data=penguin_df, x="bill_length_mm", row="sex", col="island", kind="kde")
plt.show()
sns.displot(data=penguin_df, x="bill_length_mm", row="sex", col="island", hue="species", kind="kde")
plt.show()
上图将企鹅按照性别(行)和岛屿(列)进行分类绘制其kde曲线,第二幅图则在第一幅图基础上增加了企鹅种类作为另一个类别变量。