數(shù)據(jù)可視化可深入了解數(shù)據(jù)集中變量之間的分布和關(guān)系。
此洞察力有助于選擇在建模之前應(yīng)用的數(shù)據(jù)準(zhǔn)備以及最適合數(shù)據(jù)的算法類型。
Seaborn 是 Python 的數(shù)據(jù)可視化庫(kù),它在流行的 Matplotlib 數(shù)據(jù)可視化庫(kù)之上運(yùn)行,并且提供了簡(jiǎn)單的界面和美觀的圖形。
本文對(duì)機(jī)器學(xué)習(xí)中的 Seaborn 數(shù)據(jù)可視化作了簡(jiǎn)要介紹。
看完本文,你將知道:
- 如何使用條形圖,直方圖以及箱形圖來總結(jié)變量的分布。
- 如何使用線圖和散點(diǎn)圖總結(jié)關(guān)系。
- 如何比較同一圖上不同類別值的變量的分布和關(guān)系。
概述
本教程分為六個(gè)部分:
- Seaborn數(shù)據(jù)可視化庫(kù)
- 線圖
- 條形圖
- 直方圖
- 箱形圖
- 散點(diǎn)圖
Seaborn數(shù)據(jù)可視化庫(kù)
Python 的主要繪圖庫(kù)稱為 Matplotlib 。
Seaborn 是一個(gè)繪圖庫(kù),它不僅提供了一個(gè)更簡(jiǎn)單的界面,為機(jī)器學(xué)習(xí)所需的繪圖提供了合理的默認(rèn)值,而且最重要的是,這些繪圖在外觀上比 Matplotlib 更好。
Seaborn 要求首先安裝 Matplotlib。
我們可以使用 pip 直接安裝 Matplotlib ,如下所示:
sudo pip install matplotlib
安裝后,可以通過輸出版本號(hào)來確認(rèn)可以加載和使用該庫(kù),如下所示:
# matplotlib
import matplotlib
print('matplotlib: %s' % matplotlib.__version__)
我們可以得到 Matplotlib 庫(kù)的當(dāng)前版本。
matplotlib: 3.1.2
接下來,也可以使用 pip 安裝 Seaborn 庫(kù):
sudo pip install seaborn
安裝好后,我們還可以通過打印版本號(hào)來確認(rèn)可以加載和使用該庫(kù),如下所示:
# seaborn
import seaborn
print('seaborn: %s' % seaborn.__version__)
運(yùn)行示例將打印Seaborn庫(kù)的當(dāng)前版本。
seaborn: 0.10.0
要?jiǎng)?chuàng)建 Seaborn 可視化圖形,必須導(dǎo)入 Seaborn 庫(kù)并調(diào)用函數(shù)來創(chuàng)建圖。
重要的是,Seaborn 繪圖功能希望將數(shù)據(jù)作為 Pandas 數(shù)據(jù)幀提供。這意味著,如果你要從CSV文件加載數(shù)據(jù),則必須使用 read_csv()之類的 Pandas 函數(shù)將數(shù)據(jù)作為數(shù)據(jù)幀加載。繪制時(shí),可以通過數(shù)據(jù)幀名稱或列索引指定列。
要顯示該圖,可以在 Matplotlib 庫(kù)上調(diào)用 show()函數(shù)。
...
# 顯示圖表
pyplot.show()
或者,可以將圖保存到文件,例如 PNG 格式的圖像文件。savefig()函數(shù) Matplotlib 可用于保存圖像。
...
# 保存圖表
pyplot.savefig('my_image.png')
現(xiàn)在我們已經(jīng)安裝好 Seaborn 了,讓我們看一下使用機(jī)器學(xué)習(xí)數(shù)據(jù)時(shí)可能需要的一些常見可視化圖表。
線圖
我們一般使用線圖來呈現(xiàn)定期收集的數(shù)據(jù)觀察結(jié)果。
x 軸表示規(guī)則間隔,例如時(shí)間。y 軸顯示觀測(cè)值,按 x 軸排序并通過一條線連接。
可以通過調(diào)用 lineplot()函數(shù)并在常規(guī)間隔中傳遞 x 軸數(shù)據(jù)和觀察值的 y 軸來在 Seaborn 中創(chuàng)建線圖。
我們可以使用每月汽車銷售的時(shí)間序列數(shù)據(jù)集來演示折線圖。
Github數(shù)據(jù)集鏈接:https://raw.githubusercontent.com/jbrownlee/Datasets/master/monthly-car-sales.csv
數(shù)據(jù)集有兩列:“ 月 ”和“ 銷售”。月將用作 x 軸,銷售量將繪制在 y 軸上。
...
# 創(chuàng)建線圖
lineplot(x='Month', y='Sales', data=dataset)
完整示例如下:
#時(shí)間序列數(shù)據(jù)集的線圖
from pandas import read_csv
from seaborn import lineplot
from matplotlib import pyplot
# 加載數(shù)據(jù)集
url = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/monthly-car-sales.csv'
dataset = read_csv(url, header=0)
# 創(chuàng)建線圖
lineplot(x='Month', y='Sales', data=dataset)
# 顯示線圖
pyplot.show()
首先運(yùn)行示例將加載時(shí)間序列數(shù)據(jù)集并創(chuàng)建數(shù)據(jù)的折線圖,以清楚地顯示銷售數(shù)據(jù)中的趨勢(shì)和季節(jié)性。
時(shí)間序列數(shù)據(jù)集的線圖
條形圖
條形圖通常用于顯示多個(gè)類別的相對(duì)數(shù)量。
x 軸代表均勻分布的類別。y 軸代表每種類別的數(shù)量,并以條形圖從基線到 y 軸上的適當(dāng)水平繪制。
可以通過調(diào)用 countplot()函數(shù)并傳遞數(shù)據(jù)來在 Seaborn 中創(chuàng)建條形圖。
我們將展示條形圖,其中包含來自乳腺癌分類數(shù)據(jù)集的變量,該變量由分類輸入變量組成。
乳腺癌分類數(shù)據(jù)集鏈接:https://raw.githubusercontent.com/jbrownlee/Datasets/master/breast-cancer.csv
我們只繪制一個(gè)變量,在這種情況下,第一個(gè)變量是年齡段。
...
# 創(chuàng)建線圖
countplot(x=0, data=dataset)
完整示例代碼如下:
#分類變量的條形圖
from pandas import read_csv
from seaborn import countplot
from matplotlib import pyplot
#加載數(shù)據(jù)集
url = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/breast-cancer.csv'
dataset = read_csv(url, header=None)
# 創(chuàng)建條形圖
countplot(x=0, data=dataset)
# 顯示條形圖
pyplot.show()
首先運(yùn)行示例將加載乳腺癌數(shù)據(jù)集并創(chuàng)建數(shù)據(jù)的條形圖,以顯示每個(gè)年齡組以及可及范圍內(nèi)的個(gè)體(樣本)數(shù)量。
年齡范圍分類變量的條形圖
此外,如果我們還想針對(duì)類標(biāo)簽繪制變量(例如第一個(gè)變量)的每個(gè)類別的計(jì)數(shù)。
可以通過使用 countplot()函數(shù)并通過“ hue ”參數(shù)指定類變量來實(shí)現(xiàn),如下所示:
...
# 創(chuàng)建條形圖
countplot(x=0, hue=9, data=dataset)
完整示例代碼如下:
# 分類變量與類變量的條形圖
from pandas import read_csv
from seaborn import countplot
from matplotlib import pyplot
# 加載數(shù)據(jù)集
url = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/breast-cancer.csv'
dataset = read_csv(url, header=None)
# 創(chuàng)建條形圖
countplot(x=0, hue=9, data=dataset)
# 顯示條形圖
pyplot.show()
首先運(yùn)行示例將加載乳腺癌數(shù)據(jù)集,并創(chuàng)建數(shù)據(jù)的條形圖,以顯示每個(gè)年齡組以及屬于每個(gè)組的個(gè)體(樣本)數(shù)量(由數(shù)據(jù)集的兩個(gè)類別標(biāo)簽分隔)。
按類別標(biāo)簽劃分的年齡范圍分類變量的條形圖
直方圖
直方圖通常用于總結(jié)數(shù)值數(shù)據(jù)樣本的分布。
x 軸表示觀測(cè)值的離散區(qū)間或間隔。例如,值介于 1 到 10 之間的觀測(cè)值可以分為五個(gè) bin,值 [1,2] 將分配給第一個(gè) bin,[3,4] 將分配給第二個(gè) bin,依此類推。
y 軸表示數(shù)據(jù)集中屬于每個(gè) bin 的觀測(cè)值的頻率或計(jì)數(shù)。
本質(zhì)上,數(shù)據(jù)樣本被轉(zhuǎn)換為條形圖,其中 x 軸上的每個(gè)類別都代表觀察值的間隔。
可以通過調(diào)用 distplot()函數(shù)并傳遞變量來在 Seaborn 中創(chuàng)建直方圖。
我們將展示一個(gè)帶有糖尿病分類數(shù)據(jù)集中數(shù)值變量的箱線圖。我們只繪制一個(gè)變量,在這種情況下,是第一個(gè)變量,即患者懷孕的次數(shù)。
糖尿病分類數(shù)據(jù)集:https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.csv
...
# 創(chuàng)建直方圖
distplot(dataset[[0]])
完整示例代碼如下:
# 數(shù)值變量的直方圖
from pandas import read_csv
from seaborn import distplot
from matplotlib import pyplot
# 加載數(shù)據(jù)集
url = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.csv'
dataset = read_csv(url, header=None)
# 創(chuàng)建直方圖
distplot(dataset[[0]])
# 顯示直方圖
pyplot.show()
首先運(yùn)行示例將加載糖尿病數(shù)據(jù)集并創(chuàng)建變量的直方圖,以硬截止值為零的形式顯示值的分布。
該圖顯示了直方圖(bin的數(shù)量)以及概率密度函數(shù)的平滑估計(jì)。
懷孕次數(shù)直方圖
箱形圖
通常使用箱形圖來概括數(shù)據(jù)樣本的分布。
x 軸用于表示數(shù)據(jù)樣本,如果需要,可以在 x 軸上并排繪制多個(gè)箱形圖。
y 軸表示觀測(cè)值。繪制一個(gè)方框來匯總數(shù)據(jù)集中的中間 50%數(shù)據(jù),從觀察值的第 25 個(gè)百分位數(shù)開始,到第 75 個(gè)百分位數(shù)為止。這稱為四分位間距或 IQR。用一條線繪制中位數(shù)或第 50 個(gè)百分位數(shù)。
從盒子的兩端開始繪制稱為須狀的線,計(jì)算公式為(1.5 * IQR),以顯示分布中合理值的預(yù)期范圍。晶須外的觀測(cè)值可能是異常值,并用小圓圈繪制。
可以通過調(diào)用 boxplot()函數(shù)并傳遞數(shù)據(jù)來在 Seaborn 中創(chuàng)建一個(gè)箱線圖。
我們將展示一個(gè)帶有糖尿病分類數(shù)據(jù)集中數(shù)值變量的箱線圖。我們只繪制一個(gè)變量,在這種情況下,是第一個(gè)變量,即患者懷孕的次數(shù)。
...
# 創(chuàng)建箱形圖
boxplot(x=0, data=dataset)
完整示例代碼如下:
# 數(shù)值變量的箱型圖
from pandas import read_csv
from seaborn import boxplot
from matplotlib import pyplot
# 加載數(shù)據(jù)集
url = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.csv'
dataset = read_csv(url, header=None)
# 創(chuàng)建箱形圖
boxplot(x=0, data=dataset)
# 顯示箱形圖
pyplot.show()
首先運(yùn)行示例,加載糖尿病數(shù)據(jù)集,并創(chuàng)建第一個(gè)輸入變量的箱形圖,以顯示患者懷孕次數(shù)的分布。
我們可以看到中位數(shù)略高于2.5倍,一些離群值上升了15倍左右。
懷孕次數(shù)箱形圖
此外,如果我們還想針對(duì)類別標(biāo)簽針對(duì)類別變量(例如第一個(gè)變量)的每個(gè)值繪制數(shù)字變量的分布。
可以通過調(diào)用 boxplot()函數(shù)并將 class 變量作為 x 軸和數(shù)值變量作為 y 軸來實(shí)現(xiàn)。
...
# 創(chuàng)建箱形圖
boxplot(x=8, y=0, data=dataset)
完整示例代碼如下:
#數(shù)值變量與類標(biāo)簽的箱形圖
from pandas import read_csv
from seaborn import boxplot
from matplotlib import pyplot
# 加載數(shù)據(jù)集
url = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.csv'
dataset = read_csv(url, header=None)
# 創(chuàng)建箱形圖
boxplot(x=8, y=0, data=dataset)
# 顯示箱形圖
pyplot.show()
首先運(yùn)行示例將加載糖尿病數(shù)據(jù)集并創(chuàng)建數(shù)據(jù)的箱形圖,將懷孕次數(shù)的分布作為兩個(gè)類標(biāo)簽的數(shù)值變量。
分類標(biāo)簽的懷孕次數(shù)箱形圖
散點(diǎn)圖
散點(diǎn)圖或散點(diǎn)圖通常用于總結(jié)兩個(gè)配對(duì)數(shù)據(jù)樣本之間的關(guān)系。
配對(duì)的數(shù)據(jù)樣本意味著針對(duì)給定的觀察記錄了兩個(gè)度量,例如一個(gè)人的體重和身高。
x 軸代表第一樣品的觀察值,y 軸代表第二樣品的觀察值。圖上的每個(gè)點(diǎn)代表一個(gè)觀察值。
可以通過調(diào)用 scatterplot()函數(shù)并傳遞兩個(gè)數(shù)值變量來在 Seaborn 中創(chuàng)建散點(diǎn)圖。
我們將展示一個(gè)散點(diǎn)圖,其中包含來自糖尿病分類數(shù)據(jù)集的兩個(gè)數(shù)值變量。我們將繪制第一個(gè)變量與第二個(gè)變量的關(guān)系圖,在這種情況下,第一個(gè)變量是患者懷孕的次數(shù),第二個(gè)變量是口服糖耐量測(cè)試兩小時(shí)后的血漿葡萄糖濃度。
糖尿病分類數(shù)據(jù)集:https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.csv
...
# 創(chuàng)建散點(diǎn)圖
scatterplot(x=0, y=1, data=dataset)
完整示例代碼如下:
# 兩個(gè)數(shù)值變量的散點(diǎn)圖
from pandas import read_csv
from seaborn import scatterplot
from matplotlib import pyplot
#加載數(shù)據(jù)集
url = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.csv'
dataset = read_csv(url, header=None)
#創(chuàng)建散點(diǎn)圖
scatterplot(x=0, y=1, data=dataset)
# 顯示散點(diǎn)圖
pyplot.show()
首先運(yùn)行示例將加載糖尿病數(shù)據(jù)集并創(chuàng)建前兩個(gè)輸入變量的散點(diǎn)圖。
我們可以看到兩個(gè)變量之間的關(guān)系有些統(tǒng)一。
懷孕次數(shù)與血漿葡萄糖數(shù)值變量散點(diǎn)圖
我們可能還想針對(duì)類標(biāo)簽繪制一對(duì)數(shù)字變量的關(guān)系。
這可以使用 scatterplot()函數(shù)并通過“ hue ”參數(shù)指定類變量來實(shí)現(xiàn),如下所示:
...
# 創(chuàng)建散點(diǎn)圖
scatterplot(x=0, y=1, hue=8, data=dataset)
完整示例代碼如下:
# 兩個(gè)數(shù)值變量與類標(biāo)簽的散點(diǎn)圖
from pandas import read_csv
from seaborn import scatterplot
from matplotlib import pyplot
# 加載數(shù)據(jù)集
url = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.csv'
dataset = read_csv(url, header=None)
# 創(chuàng)建散點(diǎn)圖
scatterplot(x=0, y=1, hue=8, data=dataset)
# 顯示散點(diǎn)圖
pyplot.show()
首先運(yùn)行示例將加載糖尿病數(shù)據(jù)集,并創(chuàng)建前兩個(gè)變量與類標(biāo)簽的散點(diǎn)圖。
按類別標(biāo)簽劃分的懷孕次數(shù)與血漿葡萄糖數(shù)值變量散點(diǎn)圖