探索性数据分析(Exploratory Data Analysis,简称EDA),是指对已有的数据在尽量少的先验假设下进行探索,通过作图、制表、方程拟合、计算特征量等手段探索数据的结构和规律的一种数据分析方法。EDA强调让数据自身“说话”,通过EDA可以最真实、最直接的观察到数据的结构特征,发现数据变量之间的联系与区别,它是机器学习工作者挖掘关键特征的重要手段。
EDA的探索阶段一般需要通过绘制大量的数据分布图、关联图来得到隐藏的信息暗示。Seaborn作为一种流行的Python可视化库,提供了基于Matplotlib的更高级的API封装,而且针对EDA做了专门的优化,从而使得数据探索分析更加简单,功能也非常强大。
本文从实际需求出发,重点放在数据中多个变量关联性的探索上,依据探索的数据类型为连续型或是离散型,将Seaborn常见的图进行简单分组,既方便记忆,又可以从多种图的比较中意识到何时何地该该使用何种图。
本文目录:
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连续变量
箱形图,用作显示一组数据的分散情况。
绘制方法是:先找出一组数据的上边缘、下边缘、中位数和两个四分位数;然后, 连接两个四分位数画出箱体;再将上边缘和下边缘与箱体相连接,中位数在箱体中间。
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])
参数说明:
绘图说明:
小提琴图,结合箱型图与核密度估计绘图,功能与箱型图类似,不同点是其所有绘图单元都与实际数据点相对应,描述了基础数据分布的核密度估计,但请记住,估计过程受样本大小的影响,小样本估计具有误导性,因此,一般用于较大数据集。
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])
参数说明:
增强箱型图,适用于大数据集,相对于普通的箱型图,绘制出了更多的百分位点分布情况。
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])
参数说明:
箱型图或小提琴图的补充,以类似散点图的形式,展示数据的分布。
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])
绘图说明:
散点图,表示的是因变量随自变量变化而变化的大致趋势。
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])
参数说明:
绘图说明:
线图,将自变量和因变量生成的点用线连接起来。
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])
绘图说明:
seaborn.catplot 是一个将分类图绘制到FacetGrid上图级别接口。
通过kind 参数可以选择的基础函数有:
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
快速绘制数据集中几个连续变量之间的两两关系。
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等常用的绘图参数。