(十八)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)
输出的结果如下: