首页 > 其他分享 >seaborn的详解-线性关系04

seaborn的详解-线性关系04

时间:2023-08-02 19:31:42浏览次数:48  
标签:04 seaborn 线性关系 lmplot tip sns tips total data


线性关系可视化

许多数据集都有着众多连续变量。数据分析的目的经常就是衡量变量之间的关系,我们之前介绍了可以绘制双变量分布的函数。然而,使用统计模型来估计两个噪声观测组之间的简单关系可能是非常有帮助的。我们在这一章中讨论的函数功能将在线性回归的框架实现。 

请注意,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()


seaborn的详解-线性关系04_线性回归


绘制线性回归模型

regplot()lmplot()都可以绘制线性回归曲线。这两个函数非常相似,甚至共有一些核心功能。我将着力讲解二者的区别,这会帮助你选用恰当的工具。 
在最简单的调用中,两个函数都会画出双变量的散点图,然后以y~x拟合回归方程和预测值95%置信区间并将其画出。


regplot()和lmplot()都可以绘制回归关系,推荐regplot()  lmpplot约束条件多  库多

sns.regplot(x="total_bill", y="tip", data=tips)# 通过tips数据 去指定x与y轴

seaborn的详解-线性关系04_线性回归_02

sns.lmplot(x="total_bill", y="tip", data=tips);

seaborn的详解-线性关系04_子图_03

sns.lmplot(x="total_bill", y="tip", data=tips); #吃饭的钱与小费之间的线性关系

seaborn的详解-线性关系04_seaborn_04

我们可以通过给离散变量添加随机噪声(“jitter”)的方式使得这些值的分布更加清晰。注意!这些噪声只是改变了散点图,并不影响回归曲线。

sns.regplot(x="size", y="tip", data=tips, x_jitter=.05)  # x_jitter 代表偏离x轴0.05

seaborn的详解-线性关系04_子图_05

我们也可以使用每组数据的集中趋势和置信区间来代替离散点。

sns.lmplot(x="size", y="tip", data=tips, x_estimator=np.mean);

seaborn的详解-线性关系04_线性回归_06


拟合不同模型

上文使用的回归模型非常简单。不过其并不使用于某些数据集。 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代表圈的大小

(pd.DataFrame.query

在第二个数据集中,回归曲线相同,效果极差。

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);

seaborn的详解-线性关系04_子图_07

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

sns.lmplot(x="total_bill", y="tip", hue="smoker", data=tips,
           markers=["o", "x"], palette="Set1"); #markers 设置每种类型标记

seaborn的详解-线性关系04_子图_08

你可以通过绘制多个“facets”来添加更多的分类变量(col控制列区分属性 row控制行区分属性)

sns.lmplot(x="total_bill", y="tip", hue="smoker", col="time", data=tips) #col 更多分类变量进行平铺显示 变量名
  • 1

seaborn的详解-线性关系04_seaborn_09

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

相关文章

  • ubuntu20.04 的 jetson设备命令行设置静态ip
    参考:https://github.com/f1tenth/f1tenth_doc/blob/stable/getting_started/software_setup/optional_software_nx.rst查看网口设备ifconfig#查看ip地址nmclid#查看网口设备nmclicshow#展示网口设备对应的名字修改eth0的ipsudonmclicmodWired\co......
  • Educational Codeforces Round 104
    https://codeforces.com/contest/1487A.Arena统计与最小值不同的数字数量。#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongconstintM=(1<<15)-1;voidsolve(){intn;cin>>n;vector<int>a(n);for(......
  • 振弦传感器信号转换器(VTI104_DIN)应用岩土工程监测
    振弦传感器信号转换器(VTI104_DIN)应用岩土工程监测振弦传感器信号转换器(VTI104_DIN)是一种用于实现振弦传感器信号转换的设备,可将振弦传感器所采集到的振动信号转换成电信号,并通过模拟量输出或数字量输出的方式进行传输和记录。在岩土工程监测中,振弦传感器信号转换器广泛应用于地震......
  • 工程监测仪器振弦传感器信号转换器(VTI104_DIN)
    工程监测仪器振弦传感器信号转换器(VTI104_DIN)振弦传感器信号转换器,简称VTI104_DIN,是一种用于转换振弦传感器信号的电子设备。该设备可以将振弦传感器产生的模拟信号转换成标准的电压或电流输出,从而使其可以连接到PLC、DCS、PC等控制系统中,实现自动控制、数据采集和处理等功能。......
  • .Net Web API 004 Controller获取对象列表,传入数据以及对象
    1、返回UserEntityList这个服务接口的目的是分为用户列表,代码如下所示。///<summary>///得到用户列表///</summary>///<returns></returns>[HttpGet][Route("GetUserList")]publicActionResult<List<UserEntity>>GetUserList(){varmyUse......
  • ubuntu16.04编译安装nginx1.24.0
    环境:DistributorID: UbuntuDescription: Ubuntu16.04.7LTSRelease: 16.04Codename: xenial 安装包:pcre-8.45.tar.gznginx-1.24.0.tar.gz开始安装:安装pcretar-xzvfpcre-8.45.tar.gzcdpcre-8.45./configure--prefix=/usr/local/pcremake&&makeinstall......
  • 提供高达400MHz性能ADBF704WCCPZ411、ADBF705WCBCZ411嵌入式处理器(DSP)
    这些器件是ADSP-BF70xBlackfin数字信号处理器(DSP)产品系列中的一员。新款Blackfin+处理器内核将16位双MAC、32位MAC和16位复杂MAC结合为先进的信号处理引擎。它还将干净且正交的RISC式微处理器指令集的优势和单指令、多数据流(SIMD)多媒体能力结合为一个指令集架构。而且Blac......
  • 如何在Ubuntu 22.04中为Nginx创建自签名SSL证书
    介绍TLS,或传输层安全性,及其前身SSL,代表安全套接字层,是用于保护和加密计算机网络流量的web协议。有了TLS/SSL,服务器可以在服务器和客户端之间安全地发送通信,而不存在消息被外部方截获的可能性。证书系统还帮助用户验证他们连接的站点的身份。在本指南中,您将设置一个自签......
  • Ubuntu22.04LTS安装oh-my-cap
    使用oh-my-cap需要安装如下软件sac、taup、gmt,如需使用seed数据还需安装rdseed。下载oh-my-cap-2.0.0安装包并解压安装$tar-xvfoh-my-cap-2.0.0$mvoh-my-cap-2.0.0~/opt/oh-my-cap#安装fk$cd~/opt/oh-my-cap/src/fk$make#安装gcap$cd~/opt/oh-my-cap/src/g......
  • Angular F5重新加载进入404错误
     解决方法: 在app.module.ts中增加如下配置 参考......