python数据分析与机器学习实战我爱编程

(十九)Seaborn知识学习6-python数据分析与机器学习

2018-05-14  本文已影响64人  努力奋斗的durian

文章原创,最近更新: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.

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()函数知识点

拓外:
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 数据集变量 变量名

上一篇 下一篇

猜你喜欢

热点阅读