线性关系可视化
许多数据集都有着众多连续变量。数据分析的目的经常就是衡量变量之间的关系,我们之前介绍了可以绘制双变量分布的函数。然而,使用统计模型来估计两个噪声观测组之间的简单关系可能是非常有帮助的。我们在这一章中讨论的函数功能将在线性回归的框架实现。
请注意,seaborn并不是一个统计分析库,这里所做的回归仅仅是粗略的。其目的是在探索性数据分析时,提供快捷的可视化工具,便于人们了解变量间可能存在的关系。(statsmodels)
import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
import seaborn as sns
sns.set(color_codes=True)
np.random.seed(sum(map(ord, "regression")))
tips = sns.load_dataset("tips") #加载tips数据集
# total_bill 吃饭的money tip小费 sex 性别 smoker 是否抽烟 time 什么时候吃饭 size 几人吃饭
tips.head()
绘制线性回归模型
regplot()
和lmplot()
都可以绘制线性回归曲线。这两个函数非常相似,甚至共有一些核心功能。我将着力讲解二者的区别,这会帮助你选用恰当的工具。
在最简单的调用中,两个函数都会画出双变量的散点图,然后以y~x拟合回归方程和预测值95%置信区间并将其画出。
regplot()和lmplot()都可以绘制回归关系,推荐regplot() lmpplot约束条件多 库多
sns.regplot(x="total_bill", y="tip", data=tips)# 通过tips数据 去指定x与y轴
sns.lmplot(x="total_bill", y="tip", data=tips);
sns.lmplot(x="total_bill", y="tip", data=tips); #吃饭的钱与小费之间的线性关系
我们可以通过给离散变量添加随机噪声(“jitter”)的方式使得这些值的分布更加清晰。注意!这些噪声只是改变了散点图,并不影响回归曲线。
sns.regplot(x="size", y="tip", data=tips, x_jitter=.05) # x_jitter 代表偏离x轴0.05
我们也可以使用每组数据的集中趋势和置信区间来代替离散点。
sns.lmplot(x="size", y="tip", data=tips, x_estimator=np.mean);
拟合不同模型
上文使用的回归模型非常简单。不过其并不使用于某些数据集。 Anscombe’s quartet数据集便提供了一些例子。在这些例子中简单线性模型结果之差,一看便知。
anscombe的数据集:
dataset x y
0 I 10.0 8.04
1 I 8.0 6.95
2 I 13.0 7.58
3 I 9.0 8.81
4 I 11.0 8.33
5 I 14.0 9.96
6 I 6.0 7.24
7 I 4.0 4.26
8 I 12.0 10.84
9 I 7.0 4.82
10 I 5.0 5.68
11 II 10.0 9.14
12 II 8.0 8.14
13 II 13.0 8.74
14 II 9.0 8.77
15 II 11.0 9.26
16 II 14.0 8.10
17 II 6.0 6.13
18 II 4.0 3.10
19 II 12.0 9.13
20 II 7.0 7.26
21 II 5.0 4.74
22 III 10.0 7.46
23 III 8.0 6.77
24 III 13.0 12.74
25 III 9.0 7.11
26 III 11.0 7.81
27 III 14.0 8.84
28 III 6.0 6.08
29 III 4.0 5.39
30 III 12.0 8.15
31 III 7.0 6.42
32 III 5.0 5.73
33 IV 8.0 6.58
34 IV 8.0 5.76
35 IV 8.0 7.71
36 IV 8.0 8.84
37 IV 8.0 8.47
38 IV 8.0 7.04
39 IV 8.0 5.25
40 IV 19.0 12.50
41 IV 8.0 5.56
42 IV 8.0 7.91
43 IV 8.0 6.89
anscombe = sns.load_dataset("anscombe")
sns.lmplot(x="x", y="y", data=anscombe.query("dataset == 'I'"),
ci=None, scatter_kws={"s": 80});# s代表圈的大小
在第二个数据集中,回归曲线相同,效果极差。
sns.lmplot(x="x", y="y", data=anscombe.query("dataset == 'II'"),
ci=None, scatter_kws={"s": 80});
当数据具有高阶关系时,lmplot()
与regplot
可以用多项式回归来来简单探索数据间的非线性关系:
sns.lmplot(x="x", y="y", data=anscombe.query("dataset == 'II'"),
order=2, ci=None, scatter_kws={"s": 80});
另一个问题便是异常值。
sns.lmplot(x="x", y="y", data=anscombe.query("dataset == 'III'"),
ci=None, scatter_kws={"s": 80});
可以采用robust回归解决这一问题。
sns.lmplot(x="x", y="y", data=anscombe.query("dataset == 'III'"),
robust=True, ci=None, scatter_kws={"s": 80});
当因变量(y)为分类变量时,线性回归将给出十分玄学的结果。
tips["big_tip"] = (tips.tip / tips.total_bill) > .15
sns.lmplot(x="total_bill", y="big_tip", data=tips,
y_jitter=.03);
这种情况下下应该采用logistic回归。
sns.lmplot(x="total_bill", y="big_tip", data=tips,
logistic=True, y_jitter=.03)
请注意 logistic回归和robust回归相较于简单线性回归需要更大的计算量,其置信区间的产生也依赖于bootstrap采样,你可以关掉置信区间估计来提高速度。(ci=None)
一个完全不同的方法是使用一个lowess smoother拟合非参数回归。 这种方法具有最少的假设,尽管它是计算密集型的,因此目前根本不计算置信区间。
sns.lmplot(x="total_bill", y="tip", data=tips,
lowess=True);
- 1
- 2
residplot()
可以用来绘制残差分布。
sns.residplot(x="x", y="y", data=anscombe.query("dataset == 'I'"),
scatter_kws={"s": 80});
下面这个就显然有问题了。
sns.residplot(x="x", y="y", data=anscombe.query("dataset == 'II'"),
scatter_kws={"s": 80});
考虑到其他变量时
上面的图表展示了许多探索一对变量之间关系的方法。很多时候,我们更关心两个变量变化是如何影响第三个变量的。这也是lmplot()
与regplot()
的区别之一。regplot()
只能显示一对变量之间的关系,而lmplot()
结合了regplot()
与FacetGrid,提供了一个简单的接口,允许你探索最多其他三个分类变量的影响。
在同一子图中画出不同属性的数据,并用颜色加以区分是就好的方式。
hue="分类的参数"
sns.lmplot(x="total_bill", y="tip", hue="smoker", data=tips);
除了颜色之外,还可以使用不同的散点图标记来使黑色和白色的图像更好地绘制。 您还可以完全控制所用的颜色
sns.lmplot(x="total_bill", y="tip", hue="smoker", data=tips,
markers=["o", "x"], palette="Set1"); #markers 设置每种类型标记
你可以通过绘制多个“facets”来添加更多的分类变量(col控制列区分属性 row控制行区分属性)
sns.lmplot(x="total_bill", y="tip", hue="smoker", col="time", data=tips) #col 更多分类变量进行平铺显示 变量名
- 1
sns.lmplot(x="total_bill", y="tip", hue="smoker",
col="time", row="sex", data=tips);
控制图像的形状与大小
之前我们提到过lmplot()
与regplot()
默认条件下图形大小的区别。这是因为regplot()
是一个“子图等级(axes-level)”函数。
axes 与axis不是一个东西!!!!讲解
它将图像绘制进一个特定的子图, 这意味着您可以自己制作多面板图形,并精确控制回归图的位置。如果没有提供特定的子图对象,它会将图像绘进最近调用的子图中,这意味着图像将遵循matplotlib默认的尺寸大小。要控制大小,您需要自己创建一个图形对象。
f, ax = plt.subplots(figsize=(5, 6))
sns.regplot(x="total_bill", y="tip", data=tips, ax=ax);
相比之下,lmplot()
创建的图像大小由FacetGrid接口控制。你可通过调整size 和aspect这两个参数进行控制,这种调节只作用于当前图像,并不改变全局设置。
sns.lmplot(x="total_bill", y="tip", col="day", data=tips,
col_wrap=2,size=3); #col_wrap 每行的最高平铺数 整数
sns.lmplot(x="total_bill", y="tip", col="day", data=tips,
aspect=.5); #aspect 长宽的比例
在其他背景下绘制回归线
一些seaborn函数可以在更复杂的图像中调用regplot()
。首当其中便是jointplot()
函数,我们在这里介绍过, 除了前面讨论的绘图样式之外,jointplot()可以使用regplot()通过传递kind =”reg”来显示关键子图的线性回归拟合。
sns.jointplot(x="total_bill", y="tip", data=tips, kind="reg"); #kind指定图的类型 为reg
- 1
向pairplot
函数中传入 king=“reg”也可以画出回归线。这结合了regplot()
与FacetGrid,!!!不同之处!!!看下图你能看到,pairplot
花的是两个自变量对一个因变量;而lmplot()
画的是一对自变量 因变量在“不同第三者”条件下的图。 观察x轴就懂了
sns.pairplot(tips, x_vars=["total_bill", "size"], y_vars=["tip"],
size=5, aspect=.8, kind="reg");
类似lmplot(),但不同于jointplot(),使用hue参数在pairplot()中内置了一个附加分类变量的条件:
sns.pairplot(tips, x_vars=["total_bill", "size"], y_vars=["tip"],
hue="smoker", size=5, aspect=.8, kind="reg");
total_billtipsexsmokerdaytimesize016.991.01FemaleNoSunDinner2110.341.66MaleNoSunDinner3221.013.50MaleNoSunDinner3323.683.31MaleNoSunDinner2424.593.61FemaleNoSunDinner4
标签:04,seaborn,线性关系,lmplot,tip,sns,tips,total,data
From: https://blog.51cto.com/u_15955675/6942139