Seaborn繪圖入門實踐

Seaborn是Python基於matplotlib的數據可視化工具。它提供了很多高層封裝的函數,幫助數據分析人員快速繪製美觀的數據圖形,而避免了許多額外的參數配置問題。 本案例中,我們以波士頓房價數據集為例,演示如何使用seaborn繪製常見的圖形。包括散點圖、柱狀圖、餅圖、直方圖、盒圖、概率密度圖、小提琴圖和點對圖等。

波士頓房價數據集中每一列數據對應的含義如下表所示:

1 數據準備

首先我們可以使用pandas將數據文件讀取,數據類型為DataFrame。

import pandas as pd boston = pd.read_csv("./input/boston_house_prices.csv") boston.head(10)

%matplotlib inlineimport seaborn as sns

2 散點圖

散點圖能夠同時將兩個數值型特徵可視化,從散點圖中我們可以直觀地觀察兩個特徵之間的關係。例如是否存在線性關係等。 seaborn中可以使用 jointplot 函數繪製散點圖。jointplot函數通常由三個參數需要設置,x和y分別代表需要橫軸和縱軸顯示的特徵名稱。data為數據,可以為DataFrame類型。例如在房價數據中,我們需要繪製犯罪率(CRIM)與房價(MEDV)之間的散點圖,可以使用以下代碼:

sns.jointplot(x="CRIM" , y = "MEDV" ,data = boston)

從上圖可以發現,我們不僅得到了兩個特徵的散點圖,對於每一個單獨的特徵,jointplot函數默認將其直方圖進行了繪製。同時,也將特徵之間的皮爾遜相關係數計算出來。皮爾遜相關係數能夠用來判斷特徵之間的線性關係,其取值範圍為[-1,1]。取值為0表示兩個特徵沒有相關性。越接近1說明特徵之間越存在正相關性。越接近-1表示特徵之間越存在負的線性相關性。在我們的上述例子中,皮爾遜相關係數為-0.39,說明犯罪率與房價之間存在一定的負相關性。

我們可以進一步使用 lmplot 方法將兩個特徵之間的線性回歸直線也畫出來。

sns.lmplot(x="CRIM" , y = "MEDV" ,data = boston)

3 直方圖

對於連續型特徵,我們可以使用直方圖來觀察特徵取值的分布情況。在seaborn中,直方圖可以使用 distplot 函數進行繪製。例如,我們繪製出單位財產稅(TAX)特徵的直方圖。

sns.distplot(boston["TAX"])

distplot 函數默認同時繪製直方圖和KDE(核密度圖),如果不需要核密度圖,可以將kde參數設置成False。

sns.distplot(boston["TAX"], kde = False)

同樣,我們可以繪製房間數的直方圖。

sns.distplot(boston["RM"], kde = False)

可見,房間數近似服從正態分布。我們可以通過bins參數設置分段數量,例如我們觀察房價(MEDV)特徵,將bins設置成100。

sns.distplot(boston["MEDV"], bins = 100, kde = False)

4 盒圖

盒圖可以直觀地將連續型特徵的中位數、上下四分位數顯示出來。通常也作為一種單特徵離群值檢測的定性方法。在seaborn中,可以使用 boxplot 函數繪製盒圖。參數orient設置盒圖的朝向。

sns.boxplot(boston["MEDV"],orient = "v")

我們可以先對數據進行分組,然後對比不同組數據的分布(盒圖表示)。我們只需要給 boxplot 函數制定x和y兩個參數。其中,x為分組特徵,需要為離散型。y為對比的特徵。例如我們查看不同的房間數下,房價的分布情況,可以使用以下代碼:

import math boston["RM_int"] = boston["RM"].map(math.floor) #對RM取整 sns.boxplot(x="RM_int", y = "MEDV",data = boston, orient="v")

通過上圖可以看出,隨著房間數目的增大,房價呈現先下降後上升的變化趨勢。

進一步地,我們可以通過hue參數制定第二個分組特徵。例如我們希望進一步觀察房子是否在河邊(CHAS)對房價的影響。

sns.boxplot(x="RM_int", y = "MEDV", hue = "CHAS",data = boston, orient="v")

通過上述盒圖,我們可以得出兩個基本觀察結論。首先,房間數小於5的房子都不在河邊。其次,在房間數量相同的情況下,河邊的房子比非河邊的房子價格要高。以上兩點與我們日常生活經驗也是相符合的。

5 柱狀圖

對於離散型特徵,我們可以使用柱狀圖繪製其每一種取值的樣本數量。例如,對於房間數(RM_int),可以通過seaborn的 countplot 函數畫出不同房間數量的房子的數量。

sns.countplot(x = "RM_int", data = boston)

同樣地,我們可以進一步制定一個分組特徵繪製不同分組下的柱狀圖。

sns.countplot(x = "RM_int", hue = "CHAS", data = boston)

6 核密度圖

與直方圖類似,核密度圖也是一種研究特徵分布的工具。在seaborn中,通過 kdeplot 函數繪製核密度圖。

sns.kdeplot(boston["CRIM"])

sns.kdeplot(boston["ZN"])

我們可以繪製兩個特徵的核密度圖。例如,繪製一氧化碳和低收入人群佔比兩個特徵的核密度圖。

sns.kdeplot(boston["NOX"], boston["LSTAT"])

7 小提琴圖

核密度圖是一種結合了盒圖和核密度圖的圖。它將盒圖和密度圖展示在同一個圖上,因長相通常類似小提琴而得名。在seaborn中,可以使用 violinplot 函數繪製小提琴圖。

sns.violinplot(x="RM_int", y = "MEDV",data = boston)

與盒圖類似,我們可以在小提琴圖中制定額外的分組特徵。

sns.violinplot(x="RM_int", y = "MEDV", hue = "CHAS",data = boston, orient="v")

將上圖的分組分別繪製在盒圖的兩邊, 使用split=True參數設置。

sns.violinplot(x="RM_int", y = "MEDV", hue = "CHAS",split = True, data = boston)

8 點對圖

點對圖可以同時將多個特徵兩兩之間的散點圖等通過一條命令進行繪製。點對圖的繪製函數為 pairplot。為了顯示美觀,我們只選取數據找那個特徵的一個子集進行繪製。

sns.pairplot(boston[["CRIM","NOX","RM","LSTAT","MEDV"]])

9 熱力圖

import matplotlib.pyplot as plt corr = boston.corr()#特徵的相關係數矩陣 f, ax = plt.subplots(figsize=(10, 10)) cmap = sns.diverging_palette(220, 10, as_cmap=True) sns.heatmap(corr, cmap=cmap, vmax=1.0, square=True, xticklabels=2, yticklabels=2, linewidths=.3, cbar_kws={"shrink": .5}, ax=ax) plt.show()

通過以上熱力圖我們可以直觀地觀察特徵之間的相關性強弱。


注意:本案例可以通過數據嗨客平台在線運行和數據分析,案例地址為:數據嗨客, 數據科學家的搖籃!


推薦閱讀:

基於Python的信用評分卡模型分析
數據分析基礎過程
泰坦尼克號倖存者特徵分析
推開數據分析的大門 (含2018年學習計劃)
大數據時代的小人物

TAG:數據分析 | 數據可視化 | 大數據 |