(十九)Seaborn知识学习6-python数据分析与机器学习
文章原创,最近更新:2018-05-14
1.分类散点图
2.盒图
3.小提琴图
4.条形图
5.点图
6.绘制“宽格式”数据
7.绘制多层面板分类图
课程来源: python数据分析与机器学习实战-唐宇迪
学习参考链接:
1、Seaborn(sns)官方文档学习笔记(第五章 分类数据的绘制))
2、Seaborn官方0.8.1版本
引言:seaborn关于分类数据的绘制
1.分类散点图
显示分类变量级别中某些定量变量的值的一种简单方法使用stripplot(),它会将分散图概括为其中一个变量是分类的:
import seaborn as sns
sns.set(style="whitegrid",color_codes=True)
tips=sns.load_dataset("tips")
sns.stripplot(x="day",y="total_bill",data=tips)
输出的结果如下:
从输出的结果我们可以看出,是个散点图.会帮我们把指定好的指标,比如x,y轴分别指定的数据列,然后把这些点都画在数据集上.
但是这个图并不推荐大家使用,因为有以下的问题:
比如x轴对应的"sat"上的点都是很密集的堆在一起,假设数据量特别大的情况下,会看起来像一条线连在一起.通常数据量都是非常大的,这样数据的一个浮动区间都不会特别的大,但是数据都堆在一起了,应该怎么办呢?这个就是需要我们去解决的一个问题.
在做可视化展示的时候,出现这样的问题,我们应该怎么办呢?我们来看以下的解决方案
第一个解决方案是在sns.stripplot()函数中增加一个参数jitter=True,在做回归的时候加一个jitter=True,相当于让数据往左偏或往右偏一些.而这里的jitter=True,让数据发生随机偏移,可以让数据更加清晰的看出有多少个特征属性值.对于属性值的分布情况是怎么样的?加了jitter,可以看出数据哪部分分布是比较多,哪部分分布是比较少?如不加jitter则是一条线,看不出效果.
sns.stripplot()加了jitter=True属性,可以让数据随机的“抖动”调整位置(仅沿着分类轴).
案例代码如下:
import seaborn as sns
sns.set(style="whitegrid",color_codes=True)
tips=sns.load_dataset("tips")
sns.stripplot(x="day",y="total_bill",data=tips,jitter=True)
输出的结果如下:
第二个解决方案是使用swarmplot()函数,它同样能避免重叠点的算法将分类轴上的每个散点图点定位:
案例代码如下:
import seaborn as sns
sns.set(style="whitegrid",color_codes=True)
tips=sns.load_dataset("tips")
sns.swarmplot(x="day",y="total_bill",data=tips)
输出的结果如下:
个人觉得第二种方法画类别比较好.
在画其他图的时候,很多参数都是通用的.在sns.swarmplot()函数,我们还可以增加一个属性hue,传入hue参数添加多个嵌套的分类变量.
增加hue属性后,我们来看看案例代码,如下:
import seaborn as sns
sns.set(style="whitegrid",color_codes=True)
tips=sns.load_dataset("tips")
sns.swarmplot(x="day",y="total_bill",data=tips,hue="sex")
输出的结果如下:
画图的时候,我们有时候也在想,是竖着画呢?还是横着画呢?那就需要看自己的整体布局了.如果可以让布局看起来更加舒服一些,就按什么样的布局进行绘制.
将x,y轴的数据互调一下,就可以横着画.
横着画的案例代码如下:
import seaborn as sns
sns.set(style="whitegrid",color_codes=True)
tips=sns.load_dataset("tips")
sns.swarmplot(y="day",x="total_bill",data=tips,hue="sex")
输出的结果如下:
2.盒图
IQR = Q3-Q1,即上四分位数与下四分位数之间的差,也就是盒子的长度。N=1.5IQR如果一个值> Q3+N或<Q1-N,则为离群点
在收集数据的时候,数据集并非是非常纯净的,可能在数据集中有一些离群点.什么叫离群点呢?比如,就是在正常的情况下,统计的一个指标叫身高,正常的值是1.60m-1.9m之间,比如有个值2.1m,是不是有可能是统计错误或者,或者是是个异常的值呢?或者有个值是1.1m,那么这个值是不是也是离群点呀?
在这个盒图当中我们可以统计当前的指标而言,离群点的个数,就可以在盒图中一眼看出来.比如有100个人,第四分之一的人数即是第25个人,第四分之三的人数即是第75个人,算这两者之间的距离,我们把它叫做四分位距.用IQR来表示,而这里的N值指的是不同的算法离群点是不一样的.需要从数据的维度进行衡量离群点与正常值的差异.离群点是不太符合正常的逻辑的.
关于盒图的介绍可以查看百度百科盒图介绍
案例代码如下;
import seaborn as sns
sns.set(style="whitegrid",color_codes=True)
tips=sns.load_dataset("tips")
sns.boxplot(x="day",y="total_bill",hue="time",data=tips)
输出结果如下:
从输出的结果可以看出,统计了几天关于周几的账单情况,每个盒图的最大值以及最小值情况,平均数,四分之一以及四分之三的数据,都可以根据以下截图的方式对数据分布有个大致的了解.
3.小提琴图
可以用violinplot()函数画小提琴图,小提琴图也是类似的,越胖的位置出现的次数越多,越瘦出现的次数越少,都是普通符合中间胖两边瘦.
用盒图同样的数据绘制小提琴图,案例代码如下:
import seaborn as sns
sns.set(style="whitegrid",color_codes=True)
tips=sns.load_dataset("tips")
sns.violinplot(x="total_bill",y="day",hue="time",data=tips)
输出的结果如下:
可以在violinplot()函数增加split属性,这个属性的作用是围绕小提琴图,可以在左边和右边分布各指定一个属性.比如在左边指定一个属性叫Male,右边边指定一个属性叫Femal
与之前的小提琴图的区别是,属性都是画在同一个小提琴图上,对于小提琴图来说不太清晰的看出数据的分别.因此指定split=True属性,将同一个小提琴图分别绘制hue属性的数据.
案例代码如下:
import seaborn as sns
sns.set(style="whitegrid",color_codes=True)
tips=sns.load_dataset("tips")
sns.violinplot(y="total_bill",x="day",hue="sex",data=tips,split=True)
输出的结果如下:
可以从输出的结果可以看出,split=True,蓝色等于Male,绿色等于Female,可以很清晰的看出某一天Male与Female性别上的差异.
将swarmplot()或者swarmplot()与violinplot()或boxplot()结合使用可以显示每个观察结果以及分布的摘要:
swarmplot()中的参数alpha指的是参数的透明程度.
案例代码如下:
import seaborn as sns
sns.set(style="whitegrid",color_codes=True)
tips=sns.load_dataset("tips")
sns.violinplot(y="total_bill",x="day",data=tips,inner=None)
sns.swarmplot(y="total_bill",x="day",data=tips,color="w",alpha=0.5)
输出结果如下:
说实话,并不推荐这么做,分布用swarmplot()与violinplot()都可以看出数据的分布,用过多的信息除了炫技没有什么实际用处.
这里涉及到的知识点:
sns.violinplot()函数有个属性叫inner=None.
- inner:{“box”,“quartile”,“point”,“stick”,None},可选
- 小提琴内部数据点的表示。如果是“box”,画一个微型箱子。
- 如果“quartile”,画出四分位数分配。
- 如果使用
point
或stick
,显示每个底层数据点。 - 使用
None
会画出未加工的小提琴。
4.条形图
最熟悉的方式完成这个目标是一个条形图。 在Seaborn中barplot()函数在完整数据集上运行,并显示任意估计,默认情况下使用均值。 当在每个类别中有多个观察值时,它还使用引导来计算估计周围的置信区间,并绘制使用误差条.
统计条形图换了一个数据集,这个数据集是titanic,"class"
指的是每个顾客住的船舱的等级,first表示一等舱,second表示二等舱,third表示三等舱.
这里想获取的是一等舱/二等舱/三等舱的平均获救率是多少?并且查看不同性别的获救率有什么区别?
案例代码如下:
import seaborn as sns
sns.set(style="whitegrid",color_codes=True)
titanic = sns.load_dataset("titanic")
sns.barplot(x="sex",y="survived",hue="class",data=titanic )
输出结果如下:
从输出结果可以看出x轴是性别,而y轴是survived是平均获救的可能性是多大的.比如男性的一等舱比二等舱三等舱获救的可能性高一些,这些都可以很明显的看出条形图的变化.
5.点图
pointplot()函数提供了可视化相同信息的另一种风格。该函数还对另一轴的高度估计值进行编码,而不是显示一个完整的柱型,它只绘制点估计和置信区间。另外,点图连接相同hue类别的点。这使得很容易看出主要关系如何随着第二个变量的变化而变化,因为你的眼睛很好地收集斜率的差异:
相看单个值比如first,second,third不想看其中的集中趋势,相看各自的变化,我们就可以用点图.
我们来看一下不同等级的船舱(first,second,third),男女之间的差异性?
案例代码如下:
import seaborn as sns
sns.set(style="whitegrid",color_codes=True)
titanic = sns.load_dataset("titanic")
sns.pointplot(x="sex",y="survived",hue="class",data=titanic )
输出结果如下:
从输出结果可以看出,在同一等级船舱,男女之间存活的差异度还是很大的.
绘制点图的时候,我们可以将点图绘制得更加好看一些,比如使用palette设置颜色属性.使用markeres设置点的样子,linestyles设置线型,设置为一条直线or设置为虚线.
案例代码如下:
import seaborn as sns
sns.set(style="whitegrid",color_codes=True)
titanic = sns.load_dataset("titanic")
sns.pointplot(x="class",y="survived",hue="sex",data=titanic,palette={"male": "g", "female": "m"},markers=["^", "o"], linestyles=["-", "--"])
输出结果如下:
6.绘制“宽格式”数据
虽然使用“长格式”或“整洁”数据是优选的,但是这些功能也可以应用于各种格式的“宽格式”数据,包括pandas DataFrame或二维numpy数组阵列。这些对象应该直接传递给数据参数:
如果想把盒图由竖着画改成横着画,将boxplot()函数设置orient="h".
案例代码如下:
import seaborn as sns
sns.set(style="whitegrid",color_codes=True)
iris=sns.load_dataset("iris")
sns.boxplot(data=iris,orient="h")
输出结果如下:
7.绘制多层面板分类图
factorplot()函数可以画很多的图,用法与其他图型的绘制类似.
在不设置factorplot()函数任何参数的情况下,它是怎么样的呢?
案例代码如下:
import seaborn as sns
sns.set(style="whitegrid",color_codes=True)
tips=sns.load_dataset("tips")
sns.factorplot(x="day",y="total_bill",hue="smoker",data=tips)
输出结果如下:
从输出结果来看,是类似于折线图,
factorplot()函数增加一个属性kind="bar"
案例代码如下:
import seaborn as sns
sns.set(style="whitegrid",color_codes=True)
tips=sns.load_dataset("tips")
sns.factorplot(x="day",y="total_bill",hue="smoker",data=tips,kind="bar")
输出结果如下:
出输出结果可以看出是条形图,用factorplot()函数可以画各种图,只需要设置kind属性就可以了.
factorplot()函数,增加col属性,以此增加数据的维度.另外增加kind="swarm",使图形绘制成树形图.
案例代码如下:
import seaborn as sns
sns.set(style="whitegrid",color_codes=True)
tips=sns.load_dataset("tips")
sns.factorplot(x="day",y="total_bill",hue="smoker",col="time",data=tips,kind="swarm")
输出结果如下:
factorplot()函数相当于把以前的操作进行整合,整合到一个大函数当中.
将数据集绘制成kind="box",即是盒图.指定col="day",即按照维度day这个指标分别画这个图,指定size=4,设置每个维度图形的大小.aspect=.5
案例代码如下:
import seaborn as sns
sns.set(style="whitegrid",color_codes=True)
tips=sns.load_dataset("tips")
sns.factorplot(x="day",y="total_bill",hue="smoker",col="day",data=tips,kind="box",size=4,aspect=.5)
输出结果如下:
涉及sns.factorplot()函数知识点
- "kind":{
point
,bar
,count
,box
,violin
,`strip``}绘制的类型。 - "size":可选.每个面的高度(以英寸为单位)。
- "aspect``,可选每个面的纵横比,以便“aspect * size”给出宽度,每英寸面积。
拓外:
seaborn.factorplot(x=None, y=None, hue=None, data=None, row=None, col=None, col_wrap=None, estimator=<function mean>, ci=95, n_boot=1000, units=None, order=None, hue_order=None, row_order=None, col_order=None, kind='point', size=4, aspect=1, orient=None, color=None, palette=None, legend=True, legend_out=True, sharex=True, sharey=True, margin_titles=False, facet_kws=None, **kwargs)
Parameters:
x,y,hue 数据集变量 变量名
- date 数据集 数据集名
- row,col 更多分类变量进行平铺显示 变量名
- col_wrap 每行的最高平铺数 整数
- estimator 在每个分类中进行矢量到标量的映射 矢量
- ci 置信区间 浮点数或None
- n_boot 计算置信区间时使用的引导迭代次数 整数
- units 采样单元的标识符,用于执行多级引导和重复测量设计 数据变量或向量数据
- order, hue_order 对应排序列表 字符串列表
- row_order, col_order 对应排序列表 字符串列表
- kind : 可选:point 默认, bar 柱形图, count 频次, box 箱体, violin 提琴, strip 散点,swarm 分散点(具体图形参考文章前部的分类介绍)
- size 每个面的高度(英寸) 标量
- aspect 纵横比 标量
- orient 方向 "v"/"h"
- color 颜色 matplotlib颜色
- palette 调色板 seaborn颜色色板或字典
- legend hue的信息面板 True/False
- legend_out 是否扩展图形,并将信息框绘制在中心右边 True/False
- share{x,y} 共享轴线 True/False
- facet_kws FacetGrid的其他参数 字典