title: 学习 seaborn [03]: 线性回归图 slug: lmplot date: 2020-12-9 tags:

  • seaborn
  • python category: 数据分析 link: description: type: text

线性关系可视化

此线性可视化并非统计关系中的折线图,而是excel做图中的趋势线概念,对x、y关系进行线性拟合得到关系式,对关系式的绘图。

seaborn的线性可视化不直接提供拟合关系式的各具体参数,只绘制出趋势线和置信区间,从而引导和帮助进行数据关系探索。

主要用到两个函数:

  • lmplot():FacetGrid级函数,可绘制多子图;将data作为必须参数,x和y变量必须被指定为字符串。
  • regplot():轴级函数。x和y可以是简单的 numpy 数组,pandas Series对象,或者作为对传递给data的 pandas DataFrame对象。
1
2
3
4
5
6
7
8
import seaborn as sns
import pandas as pd
import numpy as np
%matplotlib inline

sns.set()
tips = pd.read_csv('seaborn-data-master/tips.csv')
display(tips)
total_billtipsexsmokerdaytimesize
016.991.01FemaleNoSunDinner2
110.341.66MaleNoSunDinner3
221.013.50MaleNoSunDinner3
323.683.31MaleNoSunDinner2
424.593.61FemaleNoSunDinner4
........................
23929.035.92MaleNoSatDinner3
24027.182.00FemaleYesSatDinner2
24122.672.00MaleYesSatDinner2
24217.821.75MaleNoSatDinner2
24318.783.00FemaleNoThurDinner2

244 rows × 7 columns

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


添加散点分布的抖动

当一个变量采用离散值,也可以拟合线性回归,但生成的简单散点图中点元素会互相重叠,视觉上类似直线。可以给离散量添加随机抖动,以使点分布更清晰。这种抖动只影响散点分布,不影响趋势线。

x_jitter控制x轴方向的随机抖动

1
g = sns.lmplot(x="size", y="tip", x_jitter=0.05, data=tips)


或者绘制每个离散组中的观测值。

x_estimator转递一个函数来控制选择哪种方法进行观测值的估计,可以用平均值、中位数等。

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

高阶关系拟合

有些数据的趋势线并非一次线性函数,可能是二次或多次函数,绘图时候需要指明趋势线的阶数。

order制定阶数

1
2
anscombe = pd.read_csv('seaborn-data-master/anscombe.csv')
display(anscombe)
datasetxy
0I10.08.04
1I8.06.95
2I13.07.58
3I9.08.81
4I11.08.33
5I14.09.96
6I6.07.24
7I4.04.26
8I12.010.84
9I7.04.82
10I5.05.68
11II10.09.14
12II8.08.14
13II13.08.74
14II9.08.77
15II11.09.26
16II14.08.10
17II6.06.13
18II4.03.10
19II12.09.13
20II7.07.26
21II5.04.74
22III10.07.46
23III8.06.77
24III13.012.74
25III9.07.11
26III11.07.81
27III14.08.84
28III6.06.08
29III4.05.39
30III12.08.15
31III7.06.42
32III5.05.73
33IV8.06.58
34IV8.05.76
35IV8.07.71
36IV8.08.84
37IV8.08.47
38IV8.07.04
39IV8.05.25
40IV19.012.50
41IV8.05.56
42IV8.07.91
43IV8.06.89
1
2
g = sns.lmplot(x='x', y='y', data=anscombe.query("dataset == 'II'"),
           ci=None, order=2)

去除异常值绘制趋势线

数据集若存在异常值,使拟合的趋势线偏离数据的主要关系,绘图时候需要去除异常值的影响。

robust参数控制是否剔除异常值。如果取值True则采用稳健回归,剔除异常值。

1
2
g = sns.lmplot(x='x', y='y', data=anscombe.query("dataset == 'III'"),
           ci=None, robust=True)


绘制多子图

因为lmplot()是FacetGrid级别的函数,所以可以绘制多子图。

使用rowcol参数控制行列数。

使用hue控制不同子集的颜色。

1
2
g = sns.lmplot(x='total_bill', y='tip', hue='smoker',
           col='time', row='sex', data=tips)