1. 程式人生 > >PYTHON資料視覺化(四)seaborn

PYTHON資料視覺化(四)seaborn

線性關係視覺化

許多資料集都有著眾多連續變數。資料分析的目的經常就是衡量變數之間的關係,我們之前介紹了可以繪製雙變數分佈的函式。然而,使用統計模型來估計兩個噪聲觀測組之間的簡單關係可能是非常有幫助的。我們在這一章中討論的函式功能將線上性迴歸的框架實現。
請注意,seaborn並不是一個統計分析庫,這裡所做的迴歸僅僅是粗略的。其目的是在探索性資料分析時,提供快捷的視覺化工具,便於人們瞭解變數間可能存在的關係。(statsmodels)

%matplotlib inline

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

繪製線性迴歸模型

regplot()lmplot()都可以繪製線性迴歸曲線。這兩個函式非常相似,甚至共有一些核心功能。我將著力講解二者的區別,這會幫助你選用恰當的工具。
在最簡單的呼叫中,兩個函式都會畫出雙變數的散點圖,然後以y~x擬合迴歸方程和預測值95%置信區間並將其畫出。

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

這裡寫圖片描述

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

這裡寫圖片描述
你應該已經注意到兩幅圖只有尺寸上的區別。我們在這裡只進行簡短的解釋。目前為止兩者間主要的區別是,regplot接受各種格式的x y,包括numpy arrays ,pandas series 或者pandas Dataframe物件。相比之下,lmplot()只接受字串物件。這種資料格式被稱為’long-form’或者’tidy’。除了輸入資料的便利性外,regplot()可以看做擁有

lmplot()特徵的一個子集,所以接來下我們將用lmplot()進行演示。

實際上官方手冊這裡解釋的並不直觀。兩者區別在於sns.regplot(x=tips[‘total_bill’], y=tips[‘tip’])可以執行,data=~這個引數不必要。但是sns.lmplot(x=tips[‘total_bill’], y=tips[‘tip’], data=tips)就必須傳入data=~引數

當一個數據為離散值時,也可以生成一個迴歸曲線,但是這種散點圖往往不是最優的。

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

233

我們可以通過給離散變數新增隨機噪聲(“jitter”)的方式使得這些值的分佈更加清晰。注意!這些噪聲只是改變了散點圖,並不影響迴歸曲線。

sns.lmplot(x="size", y="tip", data=tips, x_jitter=.05);

233
我們也可以使用每組資料的集中趨勢和置信區間來代替離散點。

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

2333

擬合不同模型

上文使用的迴歸模型非常簡單。不過其並不使用於某些資料集。 Anscombe’s quartet資料集便提供了一些例子。在這些例子中簡單線性模型結果之差,一看便知。

anscombe = sns.load_dataset("anscombe")

sns.lmplot(x="x", y="y", data=anscombe.query("dataset == 'I'"),
           ci=None, scatter_kws={"s": 80});

在第二個資料集中,迴歸曲線相同,效果極差。

sns.lmplot(x="x", y="y", data=anscombe.query("dataset == 'II'"),
           ci=None, scatter_kws={"s": 80});

233

當資料具有高階關係時,lmplot()regplot可以用多項式迴歸來來簡單探索資料間的非線性關係:

sns.lmplot(x="x", y="y", data=anscombe.query("dataset == 'II'"),
           order=2, ci=None, scatter_kws={"s": 80});

233

另一個問題便是異常值。

sns.lmplot(x="x", y="y", data=anscombe.query("dataset == 'III'"),
           ci=None, scatter_kws={"s": 80});

233

可以採用robust迴歸解決這一問題。

sns.lmplot(x="x", y="y", data=anscombe.query("dataset == 'III'"),
           robust=True, ci=None, scatter_kws={"s": 80});

233

當因變數(y)為分類變數時,線性迴歸將給出十分玄學的結果。

tips["big_tip"] = (tips.tip / tips.total_bill) > .15
sns.lmplot(x="total_bill", y="big_tip", data=tips,
    y_jitter=.03);

233

這種情況下下應該採用logistic迴歸。

sns.lmplot(x="total_bill", y="big_tip", data=tips,
           logistic=True, y_jitter=.03)

233
請注意 logistic迴歸和robust迴歸相較於簡單線性迴歸需要更大的計算量,其置信區間的產生也依賴於bootstrap取樣,你可以關掉置信區間估計來提高速度。(ci=None)

一個完全不同的方法是使用一個lowess smoother擬合非引數迴歸。 這種方法具有最少的假設,儘管它是計算密集型的,因此目前根本不計算置信區間。

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

233

sns.residplot(x="x", y="y", data=anscombe.query("dataset == 'I'"),
              scatter_kws={"s": 80});

233

下面這個就顯然有問題了。

sns.residplot(x="x", y="y", data=anscombe.query("dataset == 'II'"),
              scatter_kws={"s": 80});

233

考慮到其他變數時

上面的圖表展示了許多探索一對變數之間關係的方法。很多時候,我們更關心兩個變數變化是如何影響第三個變數的。這也是lmplot()regplot()的區別之一。regplot()只能顯示一對變數之間的關係,而lmplot()結合了regplot()FacetGrid,提供了一個簡單的介面,允許你探索最多其他三個分類變數的影響。

在同一子圖中畫出不同屬性的資料,並用顏色加以區分是就好的方式。

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

233

除了顏色之外,還可以使用不同的散點圖示記來使黑色和白色的影象更好地繪製。 您還可以完全控制所用的顏色

sns.lmplot(x="total_bill", y="tip", hue="smoker", data=tips,
           markers=["o", "x"], palette="Set1");

233

你可以通過繪製多個“facets”來新增更多的分類變數(col控制列區分屬性 row控制行區分屬性)

sns.lmplot(x="total_bill", y="tip", hue="smoker", col="time", data=tips)

233

sns.lmplot(x="total_bill", y="tip", hue="smoker",
           col="time", row="sex", data=tips);

233

控制影象的形狀與大小

之前我們提到過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);

233

相比之下,lmplot()建立的影象大小由FacetGrid介面控制。你可通過調整size 和aspect這兩個引數進行控制,這種調節只作用於當前影象,並不改變全域性設定。

sns.lmplot(x="total_bill", y="tip", col="day", data=tips,
           col_wrap=2,size=3);

233

sns.lmplot(x="total_bill", y="tip", col="day", data=tips,
           aspect=.5);

233

在其他背景下繪製迴歸線

一些seaborn函式可以在更復雜的影象中呼叫regplot()。首當其中便是jointplot()函式,我們在這裡介紹過, 除了前面討論的繪圖樣式之外,jointplot()可以使用regplot()通過傳遞kind =”reg”來顯示關鍵子圖的線性迴歸擬合。

sns.jointplot(x="total_bill", y="tip", data=tips, kind="reg");

233

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

233

類似lmplot(),但不同於jointplot(),使用hue引數在pairplot()中內建了一個附加分類變數的條件:

sns.pairplot(tips, x_vars=["total_bill", "size"], y_vars=["tip"],
             hue="smoker", size=5, aspect=.8, kind="reg");

233