探索性数据分析,Seaborn必会的几种图

时间:2022-07-22
本文章向大家介绍探索性数据分析,Seaborn必会的几种图,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

探索性数据分析(Exploratory Data Analysis,简称EDA),是指对已有的数据在尽量少的先验假设下进行探索,通过作图、制表、方程拟合、计算特征量等手段探索数据的结构和规律的一种数据分析方法。EDA强调让数据自身“说话”,通过EDA可以最真实、最直接的观察到数据的结构特征,发现数据变量之间的联系与区别,它是机器学习工作者挖掘关键特征的重要手段。

EDA的探索阶段一般需要通过绘制大量的数据分布图、关联图来得到隐藏的信息暗示。Seaborn作为一种流行的Python可视化库,提供了基于Matplotlib的更高级的API封装,而且针对EDA做了专门的优化,从而使得数据探索分析更加简单,功能也非常强大。

本文从实际需求出发,重点放在数据中多个变量关联性的探索上,依据探索的数据类型为连续型或是离散型,将Seaborn常见的图进行简单分组,既方便记忆,又可以从多种图的比较中意识到何时何地该该使用何种图。

本文目录:

  • 数据加载
  • 离散变量VS连续变量
  • 连续变量VS连续变量
  • 高阶绘图
  • 总结

数据加载

import seaborn as sns
import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
import matplotlib
%matplotlib inline

# 加载自带的三种数据集
tips = sns.load_dataset("tips")
iris = sns.load_dataset("iris")
fmri = sns.load_dataset("fmri")

tips.sample(10)

离散变量VS连续变量

boxplot

箱形图,用作显示一组数据的分散情况。

绘制方法是:先找出一组数据的上边缘、下边缘、中位数和两个四分位数;然后, 连接两个四分位数画出箱体;再将上边缘和下边缘与箱体相连接,中位数在箱体中间。

fig,ax = plt.subplots(2,2,figsize=(10,10))

sns.boxplot(x=tips["tip"], ax=ax[0][0])
sns.boxplot(x="time", y="tip", data=tips, ax=ax[0][1])
sns.boxplot(x="time", y="tip", hue="smoker", data=tips, ax=ax[1][0])
sns.boxplot(x="time", y="tip", hue="smoker", data=tips, palette="Set2", linewidth=2.5, order=["Dinner", "Lunch"], hue_order = ["No","Yes"], ax=ax[1][1])

参数说明:

  • 这里我们传入的data是DataFrame格式,x,y,hue是其中的col_name。
  • x列需要是离散变量,y列需要是连续变量。
  • hue列需要是离散变量,含义是将x列(离散变量)的每个组别根据类别变量hue,再次进行分组,分组后用不同的颜色来表示。
  • palette:调色板名称,支持列表或字典,用于hue变量的不同级别的颜色。
  • order, hue_order:字符串列表,用于控制分类变量(对应的条形图)的绘制顺序,默认系统推断顺序。

绘图说明:

  • 图1:单变量tip的箱型图;
  • 图2:按类别变量time分组后的箱型图;
  • 图3:根据smoker类别变量,对图2中每组再次分组的结果,共有4组箱型图。
  • 图4:调整了图3中的调色板、线宽、一级分组顺序和二级分组顺序。

violinplot

小提琴图,结合箱型图与核密度估计绘图,功能与箱型图类似,不同点是其所有绘图单元都与实际数据点相对应,描述了基础数据分布的核密度估计,但请记住,估计过程受样本大小的影响,小样本估计具有误导性,因此,一般用于较大数据集。

fig,ax = plt.subplots(1,2,figsize=(10,6))

sns.violinplot(x="time", y="tip", data=tips, ax=ax[0])
sns.violinplot(x="time", y="tip", hue="smoker", data=tips, ax=ax[1])

参数说明:

  • 与箱型图完全一致,代码部分只把绘图函数由boxplot改为violinplot。

boxenplot

增强箱型图,适用于大数据集,相对于普通的箱型图,绘制出了更多的百分位点分布情况。

fig,ax = plt.subplots(1,2,figsize=(10,6))

sns.boxenplot(x="time", y="tip", data=tips, ax=ax[0])
sns.boxenplot(x="time", y="tip", hue="smoker", data=tips, ax=ax[1])

参数说明:

  • 与箱型图完全一致,代码部分只把绘图函数由boxplot改为boxenplot。

swarmplot 与 stripplot

箱型图或小提琴图的补充,以类似散点图的形式,展示数据的分布。

  • stripplot :draw a categorical scatterplot with non-overlapping points.
  • swarmplot :draw a categorical scatterplot with non-overlapping points.
fig,ax = plt.subplots(2,2,figsize=(10,10))

sns.boxplot(x="time", y="tip", data=tips, ax=ax[0][0])
sns.stripplot(x="time", y="tip",  data=tips, ax=ax[0][1])
sns.swarmplot(x="time", y="tip", data=tips, ax=ax[1][0])
sns.violinplot(x="time", y="total_bill", data=tips, inner=None, ax=ax[1][1])
sns.swarmplot(x="time", y="total_bill", data=tips, color="white", ax=ax[1][1])

绘图说明:

  • 图1:普通箱型图;
  • 图2:分类分布图:stripplot
  • 图3:无重叠分类分布图:swarmplot;
  • 图4:小提琴图与swarmplot的结合效果;

连续变量VS连续变量

scatterplot

散点图,表示的是因变量随自变量变化而变化的大致趋势。

fig,ax = plt.subplots(2,2,figsize=(10,10))

sns.scatterplot(x="total_bill", y="tip", data=tips, ax=ax[0][0])
sns.scatterplot(x="total_bill", y="tip", hue="smoker", data=tips, ax=ax[0][1])
sns.scatterplot(x="total_bill", y="tip", hue="smoker", style = "smoker", data=tips,  ax=ax[1][0])
sns.scatterplot(x="total_bill", y="tip", hue="size", size="size",  data=tips,  legend="full", ax=ax[1][1])

参数说明:

  • x,y 都需要是连续型变量。
  • hue,style和size最好是传入类别型变量,因为要根据这些分类字段对前面的每个组进行更细粒度的分组表示。
  • hue是指,用不同的颜色来表示再次分组后的样本。
  • style是指,用不同的线型来表示再次分组后的样本,如“*”,“-”。
  • size是指,用不同的尺寸来表示再次分组后的样本大小。
  • legend有两种不同的情况,"brief"(默认):如果传入的hue或size参数为连续变量,则采样其中的几个值进行绘图,而不是每个不同的连续点都看做不同的组;“full”:与“brief”相反,如果hue或size参数是连续型的,则每个不同的连续点都会看做不同的组绘制出来;
  • style_order, size_order, hue_order 可以根据这三个参数来设置展示顺序。

绘图说明:

  • 图1:两个连续变量:total_bill与tips的散点图;
  • 图2:按smoker : 是否吸烟 对客户进行细分,用不同的颜色展示是否吸烟的人群;
  • 图3:新增style设置,smoker字段同时用颜色和样本点尺寸来区分。
  • 图4:新增size设置,样本点展示尺寸依据数据列“size”的变化而大小变化,legend=“full”,是让所有size值1-6都展示出来,否则展示不全。

lineplot

线图,将自变量和因变量生成的点用线连接起来。

fig,ax = plt.subplots(2,2,figsize=(10,10))

sns.lineplot(x="timepoint", y="signal", data=fmri, ax=ax[0][0])
sns.lineplot(x="timepoint", y="signal", data=fmri, hue="event", ax=ax[0][1])
sns.lineplot(x="timepoint", y="signal", data=fmri, hue="event",  style="event", ax=ax[1][0])
sns.lineplot(x="timepoint", y="signal", data=fmri, hue="region", style="event", markers=True,ax=ax[1][1])

绘图说明:

  • 图1:两个连续变量:"timepoint"和"signal"的线性图,线两侧的带宽指的是置信区间,可以通过参数:err_style:“band” or “bars”来设置类型;
  • 图2:新增hue设置;
  • 图3:新增style设置;
  • 图4:修改style变量与hue不同,相当于再次分组,新增设置markers=True,将标记点也绘制出来。

高阶绘图函数

catplot

seaborn.catplot 是一个将分类图绘制到FacetGrid上图级别接口。

通过kind 参数可以选择的基础函数有:

  • stripplot() (with kind="strip"; the default)
  • swarmplot() (with kind="swarm")
  • boxplot() (with kind="box")
  • violinplot() (with kind="violin")
  • boxenplot() (with kind="boxen")
  • pointplot() (with kind="point")
  • barplot() (with kind="bar")
  • countplot() (with kind="count")

catplot提供了row和 col两个可选参数,输入值为data中的变量名称, 作用是按照分类变量划分整个网格为多行或多列。

# 按照smoker拆分为多行,按照sex拆分多多列,类型选择swarm
sns.catplot(x="time", y="tip", data=tips, row="smoker", col="sex", kind="swarm")

relplot

连续型变量关系图,继承了上面的scatterplot(默认)和lineplot(需要设置参数kind="line"),保持原有参数,新增col, row等新参数。row和 col两个可选参数,输入值为data中的变量名称, 作用是按照分类变量划分整个网格为多行或多列。

sns.relplot(x="total_bill", y="tip", hue="smoker", row="sex", col="time", data=tips)
lmplot

线性拟合绘图函数,用于建立两个连续型变量的线性关系,参数order>1时,可以高阶拟合,默认是线性拟合。

sns.lmplot(x="total_bill", y="tip", col="smoker", data=tips)
sns.lmplot(x="total_bill", y="tip", col="sex", data=tips, order=3)
jointplot

快速绘制两个连续变量的关系图。

sns.jointplot("total_bill", "tip", data=tips, kind="reg")

pairplot

快速绘制数据集中几个连续变量之间的两两关系。

  • 对角线上是该变量自己的分布图;
  • 非对象线上是两两关系图,支持hue等分类展示。
sns.pairplot(iris, hue="species", vars=["sepal_width", "sepal_length"])
heatmap

热力图,将矩形数据绘制为颜色编码矩阵,也就是,通过数据透视表,将数据拆分为多个组别(格子),最终每个格子的value用颜色进行展示。

这是一个坐标轴级的函数,如果没有提供给ax参数,它会将热力图绘制到当前活动的轴中。

flights = sns.load_dataset("flights")
flights = flights.pivot("month", "year", "passengers")
ax = sns.heatmap(flights)

总结

本文将Seaborn中常见的函数分为3大类,前两类为低阶函数,根据输入变量类型分为“离散变量VS连续变量”和“连续变量VS连续变量”,最后一类为高阶绘图函数,它集成了前面两类中的低阶函数,通过kind参数可以指定使用哪种具体的低阶函数进行绘图,同时还扩展了row、col等常用的绘图参数。

离散变量VS连续变量

连续变量VS连续变量

高阶绘图函数