(十九)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”,画出四分位数分配。
  • 如果使用pointstick,显示每个底层数据点。
  • 使用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":{pointbarcountboxviolin,`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的其他参数 字典
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350