Seaborn绘图——displot(distribution plot)

记录利用 Seaborn 中关于 displot 的相关用法

1 前言

因为需要用到seaborn相关的绘图工具,因此记录一下学习笔记,方便后续自己查阅。

2 变量分布

变量分布是指查看数据中某一个或者几个变量的分布情况,查看:

  • 是否有异常值
  • 是服从正态分布,还是双峰分布,或是其他分布,是否有偏移
  • 依据类别变量对数据进行划分,各子集上的变量分布是否有很大差异

2.1 boxplot 箱式图

1
2
3
4
5
6
7
8
9
10
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

penguin_df = sns.load_dataset("penguins")
print(penguin_df.describe())
sns.boxplot(data=penguin_df, x="bill_length_mm")
plt.show()
sns.boxplot(data=penguin_df, y="bill_length_mm")
plt.show()
box-x
box-y

第二幅图中的五条横线从上到下依次表示:嘴巴长度的最大值、数据量小于75%的分界线、平均值、数据量小于25%的分界线、最小值。查看数据集中对应的变量分布:
describe

多组数据的绘制

1
2
3
4
5
tips_df = sns.load_dataset("tips")
sns.boxplot(data=tip_df)
plt.show()
sns.boxplot(data=tip_df, y="total_bill")
plt.show()

box-x
box-y

这种方式会将超过最大值的一些数据认为是异常点,但在实际中是否是异常值,还需要经过进一步地确认才行。

2.2 displot 查看变量分布

2.2.1 数值变量直方图

1
2
3
4
5
6
7
8
9
# 数值变量的分布
sns.displot(penguin_df, x="bill_length_mm")
plt.show()
sns.displot(penguin_df, x="bill_length_mm", bins=50)
plt.show()
sns.histplot(penguin_df, x="bill_length_mm")
plt.show()
sns.histplot(penguin_df, x="bill_length_mm", bins=50) # bins即分为几格
plt.show()

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

box-x
box-y

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

box-x
box-y

可以看到,这两个函数绘制的直方图除了大小不一样以及边框不一样外,没有什么区别。当然边框也是可以调整的。

2.2.2 类别变量直方图

1
2
3
4
5
6
7
8
9
# 类别变量的分布
sns.histplot(penguin_df, x="species")
plt.show()
sns.histplot(penguin_df, x="species", hue="species") # 颜色区分
plt.show()
sns.histplot(penguin_df, x="species", hue="species", shrink=0.7) # 分开距离
plt.show()
sns.countplot(data=penguin_df, x="species") # countplot 可用来绘制类别变量
plt.show()

使用histplot绘制的结果如下:

box-x
box-y
box-y

使用countplot绘制的结果如下:
countplot

2.2.3 kdeplot

kde曲线默认是用高斯核函数(kernel)。

1
2
3
4
sns.displot(x="bill_length_mm", data=penguin_df, kind="kde")
plt.show()
sns.kdeplot(x="bill_length_mm", data=penguin_df)
plt.show()

运行结果如下:
box-x
box-y

1
2
3
4
5
6
sns.displot(x="bill_length_mm", data=penguin_df, kind="kde", rug=True)
plt.show()
sns.displot(x="bill_length_mm", data=penguin_df, kind="kde", cut=0)
plt.show()
sns.displot(x="bill_length_mm", data=penguin_df, kde=True, rug=True)
plt.show()
box-x
box-y
box-y

上述三幅图中,第一幅图添加了rug;第二幅图仅保留kde曲线中和数据集对应的部分,超出最大最小的部分未在图中显示;第三幅图则是将直方图与kde曲线叠加在一起。

从上图看出,仅对企鹅嘴长单一数值变量进行分析,得到的是一个双峰分布,接下来引入企鹅种类做进一步分析。

1
2
sns.displot(x="bill_length_mm", data=penguin_df, kind="kde", hue="species")
plt.show()

spec

从上图可以看出,实际上不同种类的企鹅的嘴长是各自服从正态分布的,叠加后才会出现双峰分布。

1
2
3
4
5
6
# 有明显偏移的数据处理
diamond_df = sns.load_dataset("diamonds")
sns.displot(data=diamond_df, x="price")
plt.show()
sns.displot(data=diamond_df, x="price", log_scale=True) # 取对数
plt.show()

绘制结果如下:

box-x
box-y

上图第一幅图表明,钻石的价格集中分布在几百到几千的范围,有明显偏移,将横坐标价格取对数后,看出整体的分布更趋向于正态分布。

利用kde曲线比较训练集和测试集变量分布是否一致。

1
2
3
4
5
from 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()

spec

Note: 只能用一次displot,第二次再用displot会导致两个曲线分开绘制于两张图上。

2.2.4 ecdfplot

ecdf是经验累积分布函数,与箱式图有相似之处,表达的方式不一样。

1
2
sns.displot(penguin_df, x="bill_length_mm", kind="ecdf")
plt.show()

spec

2.3 displot 具有的 FacetGrid 特性

displot 是图绘制函数,具有FacetGrid特性,即会将图形按照行和列设置为类别变量,依据类别变量可以再将数据集划分为子集,进而对子集的分布进行分析,亦即对变量的条件概率分布进行了绘制。

1
2
3
4
sns.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曲线,第二幅图则在第一幅图基础上增加了企鹅种类作为另一个类别变量。
spec
spec

------ 本文结束感谢您的阅读------
Donate a cup of cola?