Seaborn:可视化线性回归关系regplot

许多数据集包含多个定量变量,分析的目标通常是将这些变量相互关联。我们之前讨论过可以通过显示两个变量的联合分布来实现此目的的函数。但是,使用统计模型来估计两组噪声观察之间的简单关系可能会非常有用。本章讨论的功能将通过线性回归的共同框架来实现。

在Tukey的精神中,seaborn中的回归图主要用于添加视觉指南,有助于在探索性数据分析期间强调数据集中的模式。也就是说,seaborn本身并不是统计分析的一揽子方案。要获得与回归模型拟合相关的定量度量,您应该使用statsmodels。然而,seaborn的目标是通过可视化快速简便地探索数据集,因为这样做(如果不是更重要)比通过统计表探索数据集更重要。

import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
sns.set(color_codes=True)
tips = sns.load_dataset(“tips”)
绘制线性回归模型的函数
seaborn中的两个主要功能用于可视化通过回归确定的线性关系。这些功能regplot()并且lmplot()密切相关,并且共享其核心功能。但是,了解它们的不同之处非常重要,这样您就可以快速为特定工作选择正确的工具。

在最简单的调用,这两个函数绘制两个变量的散点图,x和y,然后拟合回归模型并绘制得到的回归直线和该回归一个95%置信区间:y ~ x

sns.regplot(x=“total_bill”, y=“tip”, data=tips);
…/_images/regression_7_0.png
sns.lmplot(x=“total_bill”, y=“tip”, data=tips);
…/_images/regression_8_0.png
您应该注意,结果图是相同的,除了图形形状不同。我们将在短期内解释原因。目前,要了解的另一个主要区别是regplot()接受各种格式的变量x和y变量,包括简单的numpy数组,pandas Series对象,或者作为对DataFrame传递给pandas 对象的变量的引用data。相反,lmplot()具有data必需参数,x并且y必须将变量指定为字符串。该数据格式称为“长形式”或“整齐”数据。除了这种输入灵活性之外,还regplot()拥有一部分lmplot()功能,因此我们将使用后者来演示它们。

当其中一个变量采用离散值时,可以拟合线性回归,但是,这种数据集生成的简单散点图通常不是最优的:

sns.lmplot(x=“size”, y=“tip”, data=tips);
…/_images/regression_10_0.png
一种选择是向离散值添加一些随机噪声(“抖动”),以使这些值的分布更清晰。请注意,抖动仅应用于散点图数据,并且不会影响回归线拟合:

sns.lmplot(x=“size”, y=“tip”, data=tips, x_jitter=.05);
…/_images/regression_12_0.png
第二种选择是折叠每个离散箱中的观测值,以绘制集中趋势的估计值以及置信区间:

sns.lmplot(x=“size”, y=“tip”, data=tips, x_estimator=np.mean);
…/_images/regression_14_0.png
适合不同种类的模型
上面使用的简单线性回归模型非常容易拟合,但是它不适合某些类型的数据集。该安斯库姆四重奏数据集示出了简单的线性回归提供的关系的相同的估计,其中简单的视觉检查清楚地显示出差异的几个例子。例如,在第一种情况下,线性回归是一个很好的模型:

anscombe = sns.load_dataset(“anscombe”)
sns.lmplot(x=“x”, y=“y”, data=anscombe.query(“dataset == ‘I’”),
ci=None, scatter_kws={“s”: 80});
…/_images/regression_17_0.png
第二个数据集中的线性关系是相同的,但是图表清楚地表明这不是一个好的模型:

sns.lmplot(x=“x”, y=“y”, data=anscombe.query(“dataset == ‘II’”),
ci=None, scatter_kws={“s”: 80});
…/_images/regression_19_0.png
在这些类型的高阶关系的存在,lmplot()并regplot()能适应多项式回归模型,探索简单类型的数据集中的非线性趋势:

sns.lmplot(x=“x”, y=“y”, data=anscombe.query(“dataset == ‘II’”),
order=2, ci=None, scatter_kws={“s”: 80});
…/_images/regression_21_0.png
“异常值”观察引起的另一个问题是出于某种原因而不同于研究中的主要关系:

sns.lmplot(x=“x”, y=“y”, data=anscombe.query(“dataset == ‘III’”),
ci=None, scatter_kws={“s”: 80});
…/_images/regression_23_0.png
在存在异常值的情况下,拟合稳健回归可能是有用的,该回归使用不同的损失函数来减轻相对较大的残差:

sns.lmplot(x=“x”, y=“y”, data=anscombe.query(“dataset == ‘III’”),
robust=True, ci=None, scatter_kws={“s”: 80});
…/_images/regression_25_0.png
当y变量是二元变量时,简单线性回归也“有效”但提供了难以置信的预测:

tips[“big_tip”] = (tips.tip / tips.total_bill) > .15
sns.lmplot(x=“total_bill”, y=“big_tip”, data=tips,
y_jitter=.03);
…/_images/regression_27_0.png
在这种情况下的解决方案是拟合逻辑回归,使得回归线显示给定值的估计概率:y = 1x

sns.lmplot(x=“total_bill”, y=“big_tip”, data=tips,
logistic=True, y_jitter=.03);
…/_images/regression_29_0.png
请注意,逻辑回归估计比简单回归计算密集程度更高(稳健回归也是如此),并且由于使用引导程序计算回归线周围的置信区间,您可能希望更快地关闭它迭代(使用ci=None)。

一种完全不同的方法是使用低平滑度拟合非参数回归。这种方法的假设最少,尽管它是计算密集型的,因此目前的置信区间根本没有计算:

sns.lmplot(x=“total_bill”, y=“tip”, data=tips,
lowess=True);
…/_images/regression_31_0.png
该residplot()函数可用作检查简单回归模型是否适合数据集的有用工具。它适合并删除简单的线性回归,然后绘制每个观察的残差值。理想情况下,这些值应随机分散:y = 0

sns.residplot(x=“x”, y=“y”, data=anscombe.query(“dataset == ‘I’”),
scatter_kws={“s”: 80});
…/_images/regression_33_0.png
如果残差中存在结构,则表明简单的线性回归不合适:

sns.residplot(x=“x”, y=“y”, data=anscombe.query(“dataset == ‘II’”),
scatter_kws={“s”: 80});
…/_images/regression_35_0.png
调整其他变量
上面的图显示了探索一对变量之间关系的许多方法。然而,通常,一个更有趣的问题是“这两个变量之间的关系如何随第三个变量的变化而变化?”这就是regplot()和之间的区别lmplot()。虽然regplot()总是显示单一关系,但lmplot()结合regplot()使用FacetGrid可提供一个简单的界面,以显示“刻面”图上的线性回归,使您可以探索与最多三个其他分类变量的交互。

分离关系的最佳方法是在同一轴上绘制两个级别并使用颜色来区分它们:

sns.lmplot(x=“total_bill”, y=“tip”, hue=“smoker”, data=tips);
…/_images/regression_37_0.png
除了颜色之外,还可以使用不同的散点图标记来使图表更好地再现为黑色和白色。您还可以完全控制使用的颜色:

sns.lmplot(x=“total_bill”, y=“tip”, hue=“smoker”, data=tips,
markers=[“o”, “x”], palette=“Set1”);
…/_images/regression_39_0.png
要添加另一个变量,您可以绘制多个“facet”,其中每个级别的变量出现在网格的行或列中:

sns.lmplot(x=“total_bill”, y=“tip”, hue=“smoker”, col=“time”, data=tips);
…/_images/regression_41_0.png
sns.lmplot(x=“total_bill”, y=“tip”, hue=“smoker”,
col=“time”, row=“sex”, data=tips);
…/_images/regression_42_0.png
控制图的大小和形状
之前我们注意到默认情节图regplot()和lmplot()看起来相同但在具有不同尺寸和形状的轴上。这是因为regplot()“轴级”功能会绘制到特定的轴上。这意味着您可以自己制作多面板图形并精确控制回归图的位置。如果没有明确提供轴对象,它只使用“当前活动”轴,这就是默认图与大多数其他matplotlib函数具有相同大小和形状的原因。要控制大小,您需要自己创建一个图形对象。

f, ax = plt.subplots(figsize=(5, 6))
sns.regplot(x=“total_bill”, y=“tip”, data=tips, ax=ax);
…/_images/regression_44_0.png
相比之下,lmplot()图形的大小和形状是通过FacetGrid界面使用size和aspect参数控制的,这些参数适用于绘图中的每个面,而不是整个图形本身:

sns.lmplot(x=“total_bill”, y=“tip”, col=“day”, data=tips,
col_wrap=2, height=3);
…/_images/regression_46_0.png
sns.lmplot(x=“total_bill”, y=“tip”, col=“day”, data=tips,
aspect=.5);
…/_images/regression_47_0.png
在其他上下文中绘制回归
一些其他的seaborn函数regplot()在更大,更复杂的情节中使用。第一个是jointplot()我们在发行版教程中引入的函数。除了之前讨论的绘图样式,jointplot()还可以regplot()通过传递来显示关节轴上的线性回归拟合kind=“reg”:

sns.jointplot(x=“total_bill”, y=“tip”, data=tips, kind=“reg”);
…/_images/regression_49_0.png
使用pairplot()带有kind="reg"combine 的函数regplot()并PairGrid显示数据集中变量之间的线性关系。注意注意这是如何不同的lmplot()。在下图中,两个轴在第三个变量的两个级别上没有显示相同的关系; 相反,PairGrid()用于显示数据集中变量的不同配对之间的多个关系:

sns.pairplot(tips, x_vars=[“total_bill”, “size”], y_vars=[“tip”],
height=5, aspect=.8, kind=“reg”);
…/_images/regression_51_0.png
喜欢lmplot(),但不同的是jointplot(),pairplot()使用hue参数内置了一个额外的分类变量的条件:

sns.pairplot(tips, x_vars=[“total_bill”, “size”], y_vars=[“tip”],
hue=“smoker”, height=5, aspect=.8, kind=“reg”);
…/_images/regression_53_0.png
回到顶部
©版权所有2012-2018,Michael Waskom。
使用Sphinx 1.7.4 创建。

你可能感兴趣的:(Seaborn:可视化线性回归关系regplot)