自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

如何利用散點(diǎn)圖矩陣進(jìn)行數(shù)據(jù)可視化

大數(shù)據(jù) 數(shù)據(jù)可視化
本文,我們將介紹如何使用 Seaborn 可視化庫(https://seaborn.pydata.org/)在 Python 中啟動和運(yùn)行散點(diǎn)圖矩陣。我們將看到如何為快速檢查數(shù)據(jù)而創(chuàng)建默認(rèn)散點(diǎn)圖矩陣,以及如何為了更深入的分析定制可視化方案。

本文介紹了如何在 Python 中利用散點(diǎn)圖矩陣(Pairs Plots)進(jìn)行數(shù)據(jù)可視化。

如何快速構(gòu)建強(qiáng)大的探索性數(shù)據(jù)分析可視化

當(dāng)你得到一個(gè)很不錯(cuò)的干凈數(shù)據(jù)集時(shí),下一步就是探索性數(shù)據(jù)分析(Exploratory Data Analysis,EDA)。EDA 可以幫助發(fā)現(xiàn)數(shù)據(jù)想告訴我們什么,可用于尋找模式、關(guān)系或者異常來指導(dǎo)我們后續(xù)的分析。盡管在 EDA 中有很多種可以使用的方法,但是其中最有效的啟動工具之一就是散點(diǎn)圖矩陣(pairs plot,也叫做 scatterplot matrix)。散點(diǎn)圖矩陣允許同時(shí)看到多個(gè)單獨(dú)變量的分布和它們兩兩之間的關(guān)系。散點(diǎn)圖矩陣是為后續(xù)分析識別趨勢的很棒方法,幸運(yùn)的是,用 Python 實(shí)現(xiàn)也是相當(dāng)簡單的。

本文,我們將介紹如何使用 Seaborn 可視化庫(https://seaborn.pydata.org/)在 Python 中啟動和運(yùn)行散點(diǎn)圖矩陣。我們將看到如何為快速檢查數(shù)據(jù)而創(chuàng)建默認(rèn)散點(diǎn)圖矩陣,以及如何為了更深入的分析定制可視化方案。

代碼地址:https://github.com/WillKoehrsen/Data-Analysis/blob/master/pairplots/Pair%20Plots.ipynb

我們將探索一個(gè)現(xiàn)實(shí)世界數(shù)據(jù)集,它由***的社會經(jīng)濟(jì)數(shù)據(jù)組成,這些數(shù)據(jù)都是 Gapminder 收集的。

Seaborn 中的散點(diǎn)圖矩陣

我們需要先了解一下數(shù)據(jù),以便開始后續(xù)的進(jìn)展。我們可以 pandas 數(shù)據(jù)幀的形式加載這些社會經(jīng)濟(jì)數(shù)據(jù),然后我們會看到下面這些列:

 

每一行代表一個(gè)國家一年的觀察數(shù)據(jù),列代表變量(這種格式的數(shù)據(jù)被稱作整潔數(shù)據(jù),tidy data),其中有兩個(gè)類別列(國家和洲)和四個(gè)數(shù)值列。這些列簡單易懂:life_exp 是出生時(shí)的預(yù)期壽命,以年為單位,popis 是人口數(shù)量,gdp_per_cap 是人均 GDP(以國際元)為單位。

seaborn 中的默認(rèn)散點(diǎn)圖矩陣僅僅畫出數(shù)值列,盡管我們隨后也會使用類別變量來著色。創(chuàng)建默認(rèn)的散點(diǎn)圖矩陣很簡單:我們加載 seaborn 庫,然后調(diào)用 pairplot 函數(shù),向它傳遞我們的數(shù)據(jù)幀即可:

 

  1. # Seaborn visualization library 
  2. import seaborn as sns 
  3. Create the default pairplot 
  4. sns.pairplot(df) 

 

我仍舊大為吃驚,一行簡單的代碼就能夠讓我們得到整個(gè)圖。散點(diǎn)圖矩陣會構(gòu)建兩種基本圖形:直方圖和散點(diǎn)圖。位于對角線位置的直方圖讓我們看到了每一個(gè)變量的分布,而對角線上下的散點(diǎn)圖則展示了變量兩兩之間的關(guān)系。例如,第二行最左側(cè)的散點(diǎn)圖展示了 life_exp 和 year 之間的關(guān)系。

默認(rèn)的散點(diǎn)圖矩陣通常能夠提供有價(jià)值的洞見。我們可以看到 life-exp 和 gdp_per_cap 是正相關(guān)的,這表明較高收入國家的國民要活得更久一些(盡管這并不能表明二者存在因果關(guān)系)。令人欣慰的是,這也顯示出世界范圍內(nèi)的人口壽命隨著時(shí)間逐漸增長。我們可以從直方圖中了解到人口和 GDP 變量呈嚴(yán)重右偏態(tài)分布。為了在以后的圖中更好地展示這些變量,我們可以通過對列數(shù)值取對數(shù)來進(jìn)行列變換:

 

  1. # Take the log of population and gdp_per_capita 
  2. df['log_pop'] = np.log10(df['pop']) 
  3. df['log_gdp_per_cap'] = np.log10(df['gdp_per_cap']) 
  4. Drop the non-transformed columns 
  5. df = df.drop(columns = ['pop''gdp_per_cap']) 

盡管這一張圖在分析中就很有用,然而我們發(fā)現(xiàn)基于類別變量(例如洲)對圖進(jìn)行著色能夠讓它更有價(jià)值。這在 seaborn 中也是極其簡單的。我們唯一要做的就是在調(diào)用 sns.pairplot 函數(shù)的時(shí)候使用關(guān)鍵詞 hue。

  1. sns.pairplot(df, hue = 'continent'

 

現(xiàn)在我們發(fā)現(xiàn)大洋洲和歐洲趨向于擁有***的期望壽命,而亞洲擁有最多的人口量。注意我們對人口和 GDP 的對數(shù)變換使得這些變量呈正態(tài)分布,這提供了一個(gè)關(guān)于這些變量更加全面的表征。

這張圖具有更多的信息,但是還存在一些問題:正如對角線上看到的一樣,我認(rèn)為堆疊的直方圖可解釋性不是很好。展示來自多類別的單變量分布的一個(gè)更好方法就是密度圖(density plot)。我們可以通過調(diào)用函數(shù)將直方圖變成密度圖。向散點(diǎn)圖輸入一些關(guān)鍵詞,改變點(diǎn)的透明度、大小和邊緣顏色。

 

  1. Create a pair plot colored by continent with a density plot of the # diagonal and format the scatter plots. 
  2. sns.pairplot(df, hue = 'continent', diag_kind = 'kde'
  3. plot_kws = {'alpha': 0.6, 's': 80, 'edgecolor''k'}, 
  4. size = 4) 

 

對角線上的密度圖使得對比洲之間的分布相對于堆疊的直方圖更加容易。改變散點(diǎn)圖的透明度增加了圖的可讀性,因?yàn)檫@些圖存在相當(dāng)多的重疊(ovelapping)。

現(xiàn)在是默認(rèn)散點(diǎn)圖矩陣的***一個(gè)例子。為減少復(fù)雜度,我們僅畫出 2000 年以后的數(shù)據(jù)。我們?nèi)耘f把洲著色,但是不畫出「年」這一列。為了限制畫出的列的數(shù)量,我們給函數(shù)傳遞了一個(gè) vars 列表。為了更好的闡明這個(gè)圖,我們還加上了標(biāo)題。

 

  1. # Plot colored by continent for years 2000-2007 
  2. sns.pairplot(df[df['year'] >= 2000], 
  3. vars = ['life_exp''log_pop''log_gdp_per_cap'], 
  4. hue = 'continent', diag_kind = 'kde'
  5. plot_kws = {'alpha': 0.6, 's': 80, 'edgecolor''k'}, 
  6. size = 4); 
  7. # Title 
  8. plt.suptitle('Pair Plot of Socioeconomic Data for 2000-2007'
  9. size = 28); 

 

現(xiàn)在開始變得相當(dāng)好看了!如果繼續(xù)建模,我們可能會使用這些圖中的信息指導(dǎo)我們的選擇。例如,我們知道 log_gdp_per_cap 與 life_exp 是成正相關(guān)的,所以我們會創(chuàng)建一個(gè)線性模型來量化這種關(guān)系。本文主要集中在畫圖上面,如果希望更多地探索數(shù)據(jù),我們可以使用 PairGrid 類定制散點(diǎn)圖。

使用 PairGrid 的定制化

與 sns.pairplot 函數(shù)相反,sns.PairGrid 是一個(gè)類,這意味著它不能自動填充圖。我們創(chuàng)建一個(gè)類實(shí)例,然后為網(wǎng)格的不同部分匹配特定的函數(shù)。為了給數(shù)據(jù)創(chuàng)建 PairGrid 實(shí)例,我們使用了以下的代碼,這也限制了我們所展示的變量:

 

  1. Create an instance of the PairGrid class. 
  2. grid = sns.PairGrid(data= df_log[df_log['year'] == 2007], 
  3. vars = ['life_exp''log_pop'
  4. 'log_gdp_per_cap'], size = 4) 

如果我們要顯示內(nèi)容的話,則會得到一個(gè)空圖,因?yàn)槲覀冞€沒有為網(wǎng)格部分匹配任何函數(shù)。一個(gè) PairGrid 需要填充三個(gè)網(wǎng)格部分:上三角、下三角和對角線。為了給這些部分匹配圖,我們使用在這一部分使用 grid.map 方法。例如,為了給上三角匹配一個(gè)散點(diǎn)圖,我們使用:

 

  1. # Map a scatter plot to the upper triangle 
  2. grid = grid.map_upper(plt.scatter, color = 'darkred'

map_upper 方法采用任意接受兩個(gè)變量數(shù)組的函數(shù)(例如 plt.scatter),以及相關(guān)的關(guān)鍵詞(例如 color)。map_lower 方法幾乎與其相同,但是它填充的是網(wǎng)格的下三角。map_diag 與這兩者稍有不同,因?yàn)樗捎媒邮軉蝹€(gè)數(shù)組的函數(shù)(回想一下,對角線只顯示單個(gè)變量)。一個(gè)例子是 plt.hist,我們使用它來填充對角線部分:

 

  1. # Map a histogram to the diagonal 
  2. grid = grid.map_diag(plt.hist, bins = 10, color = 'darkred'
  3. edgecolor = 'k'
  4. # Map a density plot to the lower triangle 
  5. grid = grid.map_lower(sns.kdeplot, cmap = 'Reds'

在這個(gè)例子中,我們在下三角中使用二維核密度估計(jì)(即密度圖)。將上面的內(nèi)容合在一起,這段代碼就會給出下圖:

 

當(dāng)我們想要?jiǎng)?chuàng)建自定義函數(shù)將不同的信息匹配到該圖時(shí),使用 PairGrid 類的實(shí)際好處就會顯露出來。例如,我可能希望在散點(diǎn)圖上增加兩個(gè)變量的皮爾遜相關(guān)系數(shù)。為了做到這一點(diǎn),我會寫一個(gè)使用兩個(gè)數(shù)組的函數(shù),用它來計(jì)算統(tǒng)計(jì)數(shù)據(jù),然后畫在圖上。下面的代碼展示的就是如何做到這件事(來源:https://stackoverflow.com/questions/30942577/seaborn-correlation-coefficient-on-pairgrid)。

 

  1. Function to calculate correlation coefficient between two arrays 
  2. def corr(x, y, **kwargs): 
  3. # Calculate the value 
  4. coef = np.corrcoef(x, y)[0][1] 
  5. # Make the label 
  6. label = r'$\rho$ = ' + str(round(coef, 2)) 
  7. Add the label to the plot 
  8. ax = plt.gca() 
  9. ax.annotate(label, xy = (0.2, 0.95), size = 20, xycoords = ax.transAxes) 
  10. Create a pair grid instance 
  11. grid = sns.PairGrid(data= df[df['year'] == 2007], 
  12. vars = ['life_exp''log_pop''log_gdp_per_cap'], size = 4) 
  13. # Map the plots to the locations 
  14. grid = grid.map_upper(plt.scatter, color = 'darkred'
  15. grid = grid.map_upper(corr) 
  16. grid = grid.map_lower(sns.kdeplot, cmap = 'Reds'
  17. grid = grid.map_diag(plt.hist, bins = 10, edgecolor = 'k', color = 'darkred'); 

我們的新函數(shù)被匹配到上三角中了,因?yàn)槲覀冃枰獌蓚€(gè)數(shù)組來計(jì)算相關(guān)系數(shù)(還要注意到,我們可以將多個(gè)函數(shù)匹配到網(wǎng)格部分中)。這樣就得到了下圖:

 

現(xiàn)在相關(guān)系數(shù)已經(jīng)出現(xiàn)在上面的散點(diǎn)圖上了。這是一個(gè)比較直接的例子,但是我們可以使用 PairGrid 映射任何一個(gè)我們想要映射到圖上的函數(shù)。我們可以按照需要增加相關(guān)的信息,這可以幫助我們解決如何寫這個(gè)函數(shù)的問題!***一個(gè)例子,下圖對角線上展示了總結(jié)統(tǒng)計(jì)信息:

 

雖然還需要一些整理,但是它展示了一個(gè)通用的思想:除了使用庫中現(xiàn)有的函數(shù)將數(shù)據(jù)映射到圖上,例如 matplotlib,我們可以寫自己的函數(shù)來展示自定義信息。

總結(jié)

散點(diǎn)圖矩陣(pairs plots)是一款強(qiáng)大的工具,可以快速探索數(shù)據(jù)集中的分布和關(guān)系。為了讓散點(diǎn)圖矩陣可定制、可擴(kuò)展,Seaborn 通過 Pair Grid 類提供了一個(gè)簡單的默認(rèn)方法。在數(shù)據(jù)分析項(xiàng)目中,大部分的價(jià)值通常不是來自于酷炫的機(jī)器學(xué)習(xí),而是來自對數(shù)據(jù)的直接可視化。散點(diǎn)圖矩陣給我們提供了對數(shù)據(jù)的概覽,是數(shù)據(jù)分析項(xiàng)目很棒的起點(diǎn)。

責(zé)任編輯:未麗燕 來源: 網(wǎng)絡(luò)大數(shù)據(jù)
相關(guān)推薦

2017-02-22 13:48:49

Tableau可視化

2021-11-09 08:15:18

Grafana 數(shù)據(jù)可視化運(yùn)維

2023-02-15 08:24:12

數(shù)據(jù)分析數(shù)據(jù)可視化

2023-10-23 16:11:14

2020-12-17 09:40:01

Matplotlib數(shù)據(jù)可視化命令

2020-07-27 07:00:00

體測繪新冠肺炎數(shù)據(jù)可視化

2020-03-11 14:39:26

數(shù)據(jù)可視化地圖可視化地理信息

2022-06-29 09:54:17

Python數(shù)據(jù)可視化Altair

2024-10-24 16:43:15

2020-08-14 10:45:26

Pandas可視化數(shù)據(jù)預(yù)處理

2017-10-14 13:54:26

數(shù)據(jù)可視化數(shù)據(jù)信息可視化

2017-02-16 09:30:04

數(shù)據(jù)可視化信息

2022-06-29 08:28:58

數(shù)據(jù)可視化數(shù)據(jù)可視化平臺

2021-04-09 10:42:03

數(shù)據(jù)可視化框架大數(shù)據(jù)

2023-05-05 19:29:41

2016-11-18 09:42:49

可視化數(shù)據(jù)分析優(yōu)選算法

2016-12-04 09:06:33

算法可視化數(shù)據(jù)分析

2020-10-26 15:33:13

可視化數(shù)據(jù)項(xiàng)目

2016-11-17 10:54:07

優(yōu)選算法可視化數(shù)據(jù)分析
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號