Python Seaborn綜合指南:成為數據可視化專家

概述

  • Seaborn是Python流行的數據可視化庫
  • Seaborn結合了美學和技術,這是數據科學項目中的兩個關鍵要素
  • 瞭解其Seaborn作原理以及使用它生成的不同的圖表

介紹

一個精心設計的可視化程序有一些特別之處。顏色突出,層次很好地融合在一起,整個輪廓流動,整個程序不僅有一個很好的美學質量,它也為我們提供了有意義的技術洞察力。

這在數據科學中非常重要,因為我們經常處理大量雜亂的數據。對於數據科學家來說,具有可視化的能力是至關重要的。我們的利益相關者或客戶將更多地依賴於視覺提示,而不是複雜的機器學習模型。

有大量優秀的Python可視化庫可用,包括內置的matplotlib。但Seaborn對我來說很重要。它將美學魅力與技術洞察力無縫地結合在一起,我們很快就會看到這一點。

Python Seaborn綜合指南:成為數據可視化專家

在本文中,我們將瞭解什麼是seaborn以及為什麼應該使用它而不是matplotlib。然後我們將使用seaborn在Python中為數據生成各種不同的可視化。

目錄

  • 什麼是Seaborn?
  • 為什麼應該使用Seaborn而不是matplotlib?
  • 搭建環境
  • 使用Seaborn進行數據可視化
  • 可視化統計關係
  • 用分類數據繪圖
  • 可視化數據集的分佈

什麼是Seaborn?

你曾經在R中使用過ggplot2庫嗎?它是任何工具或語言中最好的可視化包之一。Seaborn給了我同樣的感覺。

Seaborn是一個構建在matplotlib之上的一個非常完美的Python可視化庫。

它使我們能夠創建放大的數據視覺效果。這有助於我們理解數據,通過在可視上下文中顯示數據來發現變量或趨勢之間的任何隱藏相關性,而這些相關性最初可能並不明顯。與Matplotlib的低級接口相比,Seaborn具有高級接口。

為什麼應該使用Seaborn而不是matplotlib?

我一直在談論Seaborn是多麼的棒,所以你可能想知道我為什麼這麼大驚小怪。

當我們使用seaborn生成圖時,我將以實際的方式全面地回答這個問題。現在,讓我們快速討論一下seaborn為什麼在matplotlib之上。

Seaborn使我們的圖表和繪圖看起來很吸引人,並支持一些常見的數據可視化需求(比如將顏色映射到變量或使用分面(faceting))。從根本上說,它使數據可視化和探索變得很容易。相信我,這在數據科學中不是一件容易的事。

如果Matplotlib"試圖讓簡單的事情變得簡單,而讓困難的事情變得可能",那麼seaborn也嘗試讓一組定義良好的困難事情變得簡單。——邁克爾·瓦斯科姆(Seaborn的創始人)

在matplotlib中有幾個(很大的)限制是Seaborn已經修復的:

  1. Seaborn提供了大量的高級接口和自定義主題,而matplotlib沒有這些接口,因為很難確定哪些設置使圖表更吸引人
  2. Matplotlib函數不能很好地處理數據流,而seaborn可以

這第二點在數據科學中很突出,因為我們經常使用數據模型。

搭建環境

seaborn庫具有四個必需的必需依賴項:

  • NumPy (>= 1.9.3)
  • SciPy (>= 0.14.0)
  • matplotlib (>= 1.4.3)
  • Pandas (>= 0.15.2)

要安裝Seaborn並有效地使用它,首先需要安裝前面提到的依賴項。一旦這一步完成,我們都準備安裝Seaborn和享受其迷人的繪圖。要安裝Seaborn,可以使用以下代碼

要安裝最新版本的seaborn,你可以使用pip:

pip install seaborn

你也可以使用conda安裝最新版本的seaborn:

conda install seaborn

要在代碼中導入依賴項和seaborn本身,可以使用以下代碼

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

import pandas as pd
from scipy import stats

就是這樣!我們都準備好了詳細地探索seaborn。

用於數據可視化的數據集

我們將主要處理兩個數據集:

  • 人力資源分析(https://datahack.analyticsvidhya.com/contest/wns-analytics-hackathon-2018-1/)
  • 預測投票數(https://datahack.analyticsvidhya.com/contest/enigma-codefest-machine-learning-1/)

之所以選擇這兩個,是因為它們包含多個變量,因此我們有很多選擇可以使用。這兩個數據集還可以模擬現實情況,因此你將瞭解數據可視化和了解業內的數據可視化方式。

你可以在DataHack平臺上查看這個和其他高質量的數據集。因此,請在繼續之前下載上述兩個數據集。我們將一起使用它們。

使用Seaborn進行數據可視化

讓我們開始吧!我已將此實現部分分為兩類:

  • 可視化統計關係
  • 繪製分類數據

我們將研究每個類別的多個示例,以及如何使用seaborn對其進行繪製。

可視化統計關係

統計關係表示理解數據集中不同變量之間的關係以及這種關係如何影響或依賴於其他變量的過程。

在這裡,我們將使用seaborn生成以下圖:

  • Scatter plot (散點圖)
  • SNS.relplot
  • Hue plot (Hue圖)

我選擇了預測投票數數據集。所以,讓我們導入數據集:

df = pd.read_csv(r"train.csv")
df.head()
Python Seaborn綜合指南:成為數據可視化專家

使用Seaborn繪製散點圖

散點圖可能是可視化兩個變量之間關係的最常見的例子。每個點在數據集中顯示一個觀察值,這些觀察值用點狀結構表示。圖中顯示了兩個變量的聯合分佈。

為了繪製散點圖,我們將使用seaborn庫的relplot()函數。它是可視化統計關係的圖形級角色。默認情況下,使用relplot會生成散點圖:

sns.relplot(x="Views", y="Upvotes", data = df)
Python Seaborn綜合指南:成為數據可視化專家

Seaborn的SNS.relplot

SNS.relplot是來自SNS類的relplot函數,SNS類是我們在上面與其他依賴項一起導入的一個seaborn類。

這裡,參數是x、y數據有在X,Y軸上表示的變量和我們要分別畫出來的數據點,通過圖片,我們發現了viewsupvotes之間的關係。

接下來,如果我們想要看到與數據相關的標籤,我們可以使用下面的代碼:

sns.relplot(x="Views", y="Upvotes", hue = "Tag", data = df)
Python Seaborn綜合指南:成為數據可視化專家

Hue圖

我們可以在色調(Hue)的幫助下在我們的圖片中添加另一個維度,通過為點賦予顏色來實現,每種顏色都有一些附加的意義。

在上圖中,色調代表是樣本類別,這就是為什麼它有一個不同的顏色。如果色調代表的只是數字,那麼色調就應該是連續的(因為數字是連續的,樣本類別不是連續的)。

sns.relplot(x="Views", y="Upvotes", hue = "Answers", data = df);
Python Seaborn綜合指南:成為數據可視化專家

我們還可以更改每個點的大小:

sns.relplot(x="Views", y="Upvotes", size = "Tag", data = df);
Python Seaborn綜合指南:成為數據可視化專家

我們還可以手動更改大小,方法是使用另一個參數size=(15,200)

用分類數據繪圖

  • 抖動圖
  • Hue圖
  • 箱線圖
  • 小提琴圖
  • Pointplot

在上面的小節中,我們瞭解瞭如何使用不同的視圖表示來顯示多個變量之間的關係。我們繪製了兩個數值變量之間的關係圖。在本節中,我們將看到兩個變量之間的關係。例子中的數據是已分類的(分為不同的組)。

我們將使用seaborn庫的catplot()函數來繪製分類數據圖。就讓我們一探究竟吧

抖動圖

對於抖動圖,我們將使用另一個數據集人力資源分析來分析,讓我們現在導入該數據集。

df2 = pd.read_csv(r"train.csv")
df2.head()
Python Seaborn綜合指南:成為數據可視化專家

現在,我們將使用catplot()函數查看education列和avgtrainingscore列之間的關係。

sns.catplot(x="education", y="avg_training_score", jitter = False, data=df2)
Python Seaborn綜合指南:成為數據可視化專家

我們可以看到圖表是散開的,所以為了處理這個問題,我們可以將抖動設置為false。抖動是偏離真實值。因此,我們將使用另一個參數將抖動設置為false。

sns.catplot(x="education", y="avg_training_score", jitter = False, data=df2)
Python Seaborn綜合指南:成為數據可視化專家

Hue圖

接下來,如果我們想在我們的圖中引入另一個變量或另一個維度,我們可以使用hue參數,就像我們在上一節中使用的一樣。假設我們希望看到教育和avgtrainingscore圖中的性別分佈,為此,我們可以使用以下代碼

sns.catplot(x="education", y="avg_training_score", hue = "gender", data=df2)
Python Seaborn綜合指南:成為數據可視化專家

在上面的圖中,我們可以看到這些點是相互重疊的,為了消除這種情況,我們可以設置kind = "swarm", swarm使用一種算法來防止這些點重疊,並且沿著分類軸調整這些點。我們看看它是怎樣的

sns.catplot(x="education", y="avg_training_score", kind = "swarm", data=df2)
Python Seaborn綜合指南:成為數據可視化專家

很神奇,對吧?如果我們想要看到引入swarmed作為第三維的版本呢?讓我們將is_promoted作為一個新變量引入

sns.catplot(x="education", y="avg_training_score", hue = "is_promoted", kind = "swarm", data=df2)
Python Seaborn綜合指南:成為數據可視化專家

顯然,分數更高的人得到了提升。

使用Seaborn的箱線圖

我們可以繪製的另一種繪圖是箱線圖 ,它顯示了分佈的三個四分位值以及最終值。箱圖中的每個值都對應於數據中的實際觀察值。讓我們現在繪製箱線圖

sns.catplot(x="education", y="avg_training_score", kind = "box", data=df2)
Python Seaborn綜合指南:成為數據可視化專家

當我們將Hue與boxplot一起使用時,它會沿著分類軸對齊,因此它們不會重疊。帶有Hue的箱線圖看起來是

sns.catplot(x="education", y="avg_training_score", hue = "is_promoted", kind = "box", data=df2)
Python Seaborn綜合指南:成為數據可視化專家

使用seaborn繪製小提琴圖

我們也可以通過使用小提琴圖來不同地表示上述變量。讓我們嘗試一下

sns.catplot(x="education", y="avg_training_score", hue = "is_promoted", kind = "violin", data=df2)
Python Seaborn綜合指南:成為數據可視化專家

小提琴圖結合了箱線圖和核密度估計程序,以提供更豐富的值分佈描述。四分位數值顯示在小提琴內部。當色調語義參數是二值時,我們還可以拆分小提琴,這也可能有助於節省繪圖空間。讓我們看一下具有不同值色調的小提琴圖。

sns.catplot(x="education", y="avg_training_score", hue = "is_promoted", kind = "violin", split = True, data=df2)
Python Seaborn綜合指南:成為數據可視化專家

我開始使用seaborn的原因就是這些美妙的圖表。它為你提供了很多顯示數據的選項。另一個例子是

箱線圖

使用Seaborn繪製箱線圖

Boxplot對整個數據集進行操作,默認情況下獲取平均值。

sns.catplot(x="education", y="avg_training_score", hue = "is_promoted", kind = "bar", data=df2)
Python Seaborn綜合指南:成為數據可視化專家

使用Seaborn繪製Pointplot

另一種類型的圖是pointplot,這個圖指出估計值和置信區間。Pointplot連接來自相同色調類別的數據。這有助於識別特定色調類別中的關係如何變化。你可以查看pointplot如何顯示下面的信息。

sns.catplot(x="education", y="avg_training_score", hue = "is_promoted", kind = "point", data=df2)
Python Seaborn綜合指南:成為數據可視化專家

從上面的圖表可以明顯看出,得分高的人更容易升職。

這不是結束,seaborn是一個巨大的庫,有許多用於不同目的的繪圖函數。其中一個目的是引入多維度。我們也可以想象高維的關係。讓我們用群圖來檢驗一下。

使用Seaborn的群圖

sns.catplot(x="education", y="avg_training_score", hue="is_promoted",
col="gender", aspect=.9,
kind="swarm", data=df2);
Python Seaborn綜合指南:成為數據可視化專家

當我們將多個概念組合成一個概念時,我們很容易將這個概念形象化。這裡群圖將色調語義屬性和性別屬性作了分面處理。

可視化數據集的分佈

無論何時處理數據集,我們都想知道數據或變量是如何分佈的。數據的分佈可以告訴我們很多關於數據性質的信息,所以讓我們深入研究一下。

繪製單變量分佈

  • 柱狀圖

在研究變量分佈時,最常見的一個圖是柱狀圖。默認情況下,distplot()函數繪製柱狀圖並適合內核密度估計。讓我們看看年齡是如何分佈在數據中的。

sns.distplot(df2.age)
Python Seaborn綜合指南:成為數據可視化專家

這清楚地表明,大多數人都在二十多歲和三十多歲。

使用Seaborn的直方圖

另一種用於單變量分佈的圖是直方圖。

直方圖以箱子的形式表示數據的分佈,並使用條形圖來顯示每個箱子下的觀察次數。我們還可以在其中添加一個加固圖,而不是使用KDE(核密度估計),這意味著在每次觀察時,它都會畫一個小的垂直標尺。

sns.distplot(df2.age, kde=False, rug = True)
Python Seaborn綜合指南:成為數據可視化專家

繪製雙變量分佈

  • Hex圖
  • KDE 圖
  • Boxen 圖
  • Ridge 圖 (Joy圖)

除了可視化單個變量的分佈外,我們還可以看到兩個獨立變量是如何相互分佈的。雙變量表示關節,為了將其形象化,我們使用了seaborn庫的jointplot()函數。默認情況下,jointplot繪製散點圖。讓我們看看年齡和avgtrainingscore之間的二元分佈。

sns.jointplot(x="avg_training_score", y="age", data=df2);
Python Seaborn綜合指南:成為數據可視化專家

有多種方式可視化雙變量分佈。讓我們再看幾個。

使用Seaborn的Hexplot

Hexplot是一個雙變量的直方圖,因為它顯示了在六邊形區域內的觀察次數。這是一個非常容易處理大數據集的圖。為了繪製Hexplot,我們將把kind屬性設置為hex。我們現在就去看看。

sns.jointplot(x=df2.age, y=df2.avg_training_score, kind="hex", data = df2)
Python Seaborn綜合指南:成為數據可視化專家

使用Seaborn的KDE圖

這還不是結束,接下來是KDE繪圖。這是另一個很好的方法來可視化雙變量分佈。讓我們看看如何使用jointplot()函數並將屬性kind設置為KDE來實現上述觀察。

sns.jointplot(x="age", y="avg_training_score", data=df2, kind="kde");
Python Seaborn綜合指南:成為數據可視化專家

使用Seaborn繪製Heatmaps

現在讓我們來談談我最喜歡的圖表Heatmaps。Heatmaps中每個變量都表示為一種顏色。

讓我們來生成一個:

corrmat = df2.corr()
f, ax = plt.subplots(figsize=(9, 6))
sns.heatmap(corrmat, vmax=.8, square=True)
Python Seaborn綜合指南:成為數據可視化專家

使用Seaborn的Boxen圖

另一個我們可以用來表示二元分佈的圖是boxen圖。Boxen plot最初被命名為letter value plot(字母值圖),因為它顯示了一個變量大量的值,也稱為分位數。這些分位數也被定義為字母值。通過繪製大量的分位數,可以對分佈的形狀有更多的瞭解。這些類似於箱形圖,讓我們看看如何使用它們。

sns.catplot(x="age", y="avg_training_score", data=df2, kind="boxen",height=4, aspect=2.7, hue = "is_promoted")
Python Seaborn綜合指南:成為數據可視化專家

使用Seaborn繪製Ridge圖

下一個圖表相當引人入勝。叫做Ridge圖。它也被稱為joy圖。Ridge圖有助於可視化幾個組的數值分佈。這些分佈可以用KDE圖或直方圖來表示。現在,我們試著畫一個Ridge圖來表示年齡和性別的關係。

# 初始化FacetGrid對象
g = sns.FacetGrid(df2, row="gender", hue="gender", aspect=5, height=3)
# 畫出密度
g.map(sns.kdeplot, "age", shade=True, alpha=1, lw=3.5, bw=.2)
g.map(sns.kdeplot, "age", color="w", lw=2, bw=.2)
g.map(plt.axhline, y=0, lw=2)
# 定義並使用一個簡單的函數在座標軸座標中標記繪圖
def label(x, color, label):
ax = plt.gca()
ax.text(0, .2, label, color=color, ha="left", va="center", transform=ax.transAxes)
g.map(label, "age")
# 將子圖表設置為重疊
g.fig.subplots_adjust(hspace=-.25)
# 刪除軸的細節,不要讓細節影響到重疊
g.set_titles("")
g.set(yticks=[])
g.despine(bottom=True, left=True)
Python Seaborn綜合指南:成為數據可視化專家

可視化數據集中的成對關係

我們還可以使用seaborn庫的pairplot()函數來繪製數據集中的多個二元分佈。這顯示了數據庫中每一列之間的關係。並繪製各變量在對角線上的單變量分佈圖。讓我們看看它是什麼樣子。

sns.pairplot(df2)
Python Seaborn綜合指南:成為數據可視化專家

結尾

我們已經講了很多圖表了。我們看到了seaborn庫在可視化和研究數據(尤其是大型數據集)時是如何如此有效的。我們還討論瞭如何為不同類型的數據繪製seaborn庫的不同函數。

正如我前面提到的,學習seaborn的最佳方法是實踐它。你自己實踐產生的新的視圖越多,你就會變得越自信。


分享到:


相關文章: