(十八)Seaborn知识学习5-python数据分析与机器学习实战(学习笔记)

文章原创,最近更新:2018-05-12

1.绘制线性回归模型的函数
2.不同类型的模型拟合(参考学习)
3.调节其他变量(参考学习)
4.控制绘制的大小和形状(参考学习)

课程来源: python数据分析与机器学习实战-唐宇迪

学习参考链接:
1、Seaborn(sns)官方文档学习笔记(第四章 线性关系的可视化))
2、Seaborn官方0.8.1版本

1.绘制线性回归模型的函数

使用Seaborn中的两个主要功能可视化通过回归确定的线性关系。这些函数regplot()和lmplot()是密切相关的,并且共享了大部分的核心功能。然而,了解他们不同的方式很重要,以便您可以快速为特定工作选择正确的工具。

在最简单的调用中,两个函数绘制了两个变量x和y的散点图,然后拟合回归模型y〜x并绘制了该回归线的结果回归线和95%置信区间:

sns.load_dataset("tips")中的tips是seaborn库自带的一个数据集.

import seaborn as sns
import numpy as np

sns.set(color_codes=True)
np.random.seed(sum(map(ord, "regression")))
tips = sns.load_dataset("tips")
print(tips.head())

输出的结果如下:

   total_bill   tip     sex smoker  day    time  size
0       16.99  1.01  Female     No  Sun  Dinner     2
1       10.34  1.66    Male     No  Sun  Dinner     3
2       21.01  3.50    Male     No  Sun  Dinner     3
3       23.68  3.31    Male     No  Sun  Dinner     2
4       24.59  3.61  Female     No  Sun  Dinner     4

通过输出的结果可以看出,以上数据包含几个关键信息,主要讲的是一个顾客去饭店消费的表,第一列讲的是总的消费费用,第二列讲的是小费,第三列当前顾客的性别,第四列顾客是否抽烟,第五列讲的是周几,第五列讲的是吃中午饭还是晚饭?size指的是用餐人数.

regplot()和lmplot()都可以绘制回归关系,推荐regplot(),因为regplot()比lmplot()的参数支持的类型更多一些.

怎么利用上面的数据画回归关系呢?

首先将regplot()函数调出来,必须指定的参数有x轴是哪个指标,y轴是个指标.比如x轴的指标是total_bill 的总的消费费用,y轴的指标是tip消费,这里的回归指的是total_bill 与tip之间的关系.这里的data指的是当前的dataframe传进去.这里指的是tips这个dataframe.

如下代码:

import seaborn as sns
import numpy as np

sns.set(color_codes=True)
np.random.seed(sum(map(ord, "regression")))
tips = sns.load_dataset("tips")
sns.regplot(x="total_bill",y="tip",data=tips)

输出的结果如下:



从输出的结果可以很清晰的看到一条拟合直线拟合当前的数据.我们就可以把这样的直线画出来了.通过结果可以分析total_bill与tip之间的关系,以及数据的大致分步情况.

这里同样也可以用lmplot()函数画回归关系.

代码如下:

import seaborn as sns
import numpy as np

sns.set(color_codes=True)
np.random.seed(sum(map(ord, "regression")))
tips = sns.load_dataset("tips")
sns.lmplot(x="total_bill",y="tip",data=tips)

输出结果如下:



regplot()函数与lmplot()函数,很显然,所得到的的图的结果是相同的,除了图形形状略有些不同,这里会简短的解释。

regplot()函数与regplot()函数之间有什么区别呢?

  • 主要区别是regplot()以各种格式接受x和y变量,包括numpy数组、Pandas的Series列或DataFrame对象的变量引用.
  • 不一样的是,lmplot()将数据集作为一个必需的参数,而x和y变量必须指定为字符串。这种数据格式称为“长格式”或“整洁”数据。
  • 除了这种输入灵活性,regplot()可以看做是拥有lmplot()特征的子集,所以后面将使用后者进行演示。

当其中一个变量取值为离散型的时候,可以拟合一个线性回归。然而,这种数据集生成的简单散点图通常不是最优的:

相看一下"size"与"tip"之间的关系,可以通过regplot()函数画出这样的图.

案例代码如下:

import seaborn as sns
import numpy as np

sns.set(color_codes=True)
np.random.seed(sum(map(ord, "regression")))
tips = sns.load_dataset("tips")
sns.regplot(x="size",y="tip",data=tips)

输出的结果如下:



当前的size是1,2,3,4,5不是一些连续的值,所以说不太时候去做这样的回归分析,如果数据不太满足的情况下,一个常用的方法是为离散值添加一些随机噪声的“抖动”(jitter),使得这些值的分布更加明晰。

值得注意的是,抖动仅适用于散点图数据,且不会影响拟合的回归线本身.

size是类别数据,要么是1,2,3,4,不可能发生小数值,但是不适合建立一个回归模型.

这里的抖动在sns.regplot()函数中加x_jitte这个参数.x_jitte这个参数的意思是在原有的数据的点上加上一个小范围的浮动,这个浮动的范围可以自己定义.

案例代码如下:

import seaborn as sns
import numpy as np

sns.set(color_codes=True)
np.random.seed(sum(map(ord, "regression")))
tips = sns.load_dataset("tips")
sns.regplot(x="size",y="tip",data=tips,x_jitter=.05)

输出的结果如下:


从数据的结果来看,数据都有发生一点偏移,要么往左点要么往右点,对原始的点进行了一些随机改变.可以使离散点变得稍微有那么一丁丁点连续.,使回归模型建立起来更加准确一些.

对于类别的问题,比如这里的size问题,建模的时候,可以考虑增加regplot()参数中增加x_jitter这个参数,相当于增加了一个小范围的浮动操作.

2.不同类型的模型拟合(参考学习)

上面使用的简单线性回归模型非常简单,但是,它不适用于某些种类的数据集。 Anscombe's quartet数据集显示了一些简单线性回归提供了简单目视检查清楚显示差异的关系估计的例子。 例如,在第一种情况下,线性回归是一个很好的模型:

对于类别值比如

import seaborn as sns
import numpy as np

sns.set(color_codes=True)
np.random.seed(sum(map(ord, "regression")))
anscombe = sns.load_dataset("anscombe")
sns.lmplot(x="x", y="y", data=anscombe.query("dataset == 'I'"),
           ci=None, scatter_kws={"s": 80});

输出结果如下:



第二个数据集中的线性关系是一样的,但是基本清楚地表明这不是一个好的模型:
代码如下:

import seaborn as sns
import numpy as np

sns.set(color_codes=True)
np.random.seed(sum(map(ord, "regression")))
anscombe = sns.load_dataset("anscombe")
sns.lmplot(x="x", y="y", data=anscombe.query("dataset == 'II'"),
           ci=None, scatter_kws={"s": 80})

输出的结果如下:


在存在这些高阶关系的情况下,lmplot()和regplot()可以拟合多项式回归模型来拟合数据集中的简单类型的非线性趋势:
代码如下:

import seaborn as sns
import numpy as np

sns.set(color_codes=True)
np.random.seed(sum(map(ord, "regression")))
anscombe = sns.load_dataset("anscombe")
sns.lmplot(x="x", y="y", data=anscombe.query("dataset == 'II'"),
           order=2, ci=None, scatter_kws={"s": 80});

输出的结果如下:


3.调节其他变量(参考学习)

上面的图表显示了许多方法来探索一对变量之间的关系。然而,通常,一个更有趣的问题是“这两个变量之间的关系如何作为第三个变量的函数而变化?”这是regplot()和lmplot()之间的区别。 虽然regplot()总是显示单个关系,lmplot()将regplot()与FacetGrid结合在一起,提供了一个简单的界面,可以在“faceted”图上显示线性回归,从而允许您探索与多达三个其他类别变量的交互。

分类关系的最佳方式是绘制相同轴上的两个级别,并使用颜色来区分它们:
代码如下:

import seaborn as sns
import numpy as np

sns.set(color_codes=True)
np.random.seed(sum(map(ord, "regression")))
tips = sns.load_dataset("tips")
sns.lmplot(x="total_bill", y="tip", hue="smoker", data=tips)

输出的结果如下:


除了颜色之外,还可以使用不同的散点图标记来使黑色和白色的图像更好地绘制。 您还可以完全控制所用的颜色.

import seaborn as sns
import numpy as np

sns.set(color_codes=True)
np.random.seed(sum(map(ord, "regression")))
tips = sns.load_dataset("tips")
sns.lmplot(x="total_bill", y="tip", hue="smoker", data=tips,
           markers=["o", "x"], palette="Set1")

输出的结果如下:


要添加另一个变量,您可以绘制多个“facet”,每个级别的变量出现在网格的行或列中:
代码如下:

import seaborn as sns
import numpy as np

sns.set(color_codes=True)
np.random.seed(sum(map(ord, "regression")))
tips = sns.load_dataset("tips")
sns.lmplot(x="total_bill", y="tip", hue="smoker", col="time", data=tips)

输出的结果如下:


代码如下:

import seaborn as sns
import numpy as np

sns.set(color_codes=True)
np.random.seed(sum(map(ord, "regression")))
tips = sns.load_dataset("tips")
sns.lmplot(x="total_bill", y="tip", hue="smoker",
           col="time", row="sex", data=tips)

输出的结果如下:


4.控制绘制的大小和形状(参考学习)

在我们注意到由regplot()和lmplot()创建的默认绘图看起来是一样的,但在轴上却具有不同大小和形状。 这是因为func:regplot是一个“轴级”功能绘制到特定的轴上。 这意味着您可以自己制作多面板图形,并精确控制回归图的位置。 如果没有提供轴,它只需使用“当前活动的”轴,这就是为什么默认绘图与大多数其他matplotlib函数具有相同的大小和形状的原因。要控制大小,您需要自己创建一个图形对象。

代码如下:

import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt

sns.set(color_codes=True)
np.random.seed(sum(map(ord, "regression")))
tips = sns.load_dataset("tips")
f, ax = plt.subplots(figsize=(5, 6))
sns.regplot(x="total_bill", y="tip", data=tips, ax=ax)

输出的结果如下:


相反,lmplot()图的大小和形状通过FacetGrid界面使用size和aspect参数进行控制,这些参数适用于每个图中的设置,而不是整体图形:

代码如下:

import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt

sns.set(color_codes=True)
np.random.seed(sum(map(ord, "regression")))
tips = sns.load_dataset("tips")
f, ax = plt.subplots(figsize=(5, 6))
sns.lmplot(x="total_bill", y="tip", col="day", data=tips,
           col_wrap=2, size=3)

输出的结果如下:


代码如下:

import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt

sns.set(color_codes=True)
np.random.seed(sum(map(ord, "regression")))
tips = sns.load_dataset("tips")
f, ax = plt.subplots(figsize=(5, 6))
sns.lmplot(x="total_bill", y="tip", col="day", data=tips,
           aspect=.5)

输出的结果如下:


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

推荐阅读更多精彩内容