探索性数据分析,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连续变量
高阶绘图函数
- 洛谷P1439 最长公共子序列(LCS问题)
- Leetcode-Easy 575. Distribute Candies
- 洛谷P2115 [USACO14MAR]破坏Sabotage
- 修改nw.js的exe文件使其请求管理员权限
- Leetcode-Easy 728. Self Dividing Numbers
- Leetcode-Easy 412. Fizz Buzz
- 洛谷P2678 跳石头
- 洛谷P2863 [USACO06JAN]牛的舞会The Cow Prom
- 洛谷P1908 逆序对(归并排序)
- 洛谷P1137 旅行计划
- 洛谷P1722 矩阵 II
- 洛谷P1976 鸡蛋饼
- 洛谷P1420 最长连号
- 各种读入方式速度比较
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 一文带你理解Spring Cloud高并发微服务架构核心理念的五脏六腑
- Ubuntu设置定时任务——每10秒钟执行一次命令(修改文件权限)
- 多线程爬虫入门及问题解决(爬取表情包)
- 10.带人机对战的五子棋程序
- Spring Boot、 Spring Cloud 、OAuth2 的RBAC 权限管理系统分享
- 完美解决个人微信音频amr文件与mp3格式互转
- 【学不动了系列】之 Deno 入门 什么是Deno安装DenoDeno运行时(Runtime)Deno标准库第三方模块
- SAUI-瀑布流改版(grid)
- 深入分析 Spring 基于注解的 AOP 实现原理
- 一连问了好几个大佬,竟然都不知道Redis为什么默认16个数据库?
- 03 Spring Boot 整合Druid
- 关于字符串切割空格
- CSS浮动知识
- 你敢信?四行Python代码就能知道你那的天气!
- Ribbon核心组件IRule及负载均衡算法