在上一節課程中,老師帶領大家一起學習了一個很強大的繪圖庫 Seaborn,它可以對連續型數值變量進行可視化。
那麼如果數據集中含有離散的分類變量,我們可以如何展示數據分布呢?
在今天的學習中,我們來一起學習類別數據的可視化方法。
知識結構我們來一起看一下今天的知識結構:
在國外的用餐消費情況是怎樣的呢?這一關,我們將對國外餐館的相關數據進行分析,了解下男性/女性的消費情況有什麼不同,每天的消費情況有什麼特點。
今天我們使用到的數據集來源於Seaborn模塊的內置數據集,我們可以通過sns.load_dataset( )來直接加載使用。數據集的名稱叫做'tips'。
我們先將數據集導入,看一下數據長什麼樣,使用以下代碼:
import seaborn as sns tips = sns.load_dataset('tips') tips.head()
dataAnalysis_10_1_1_讀取數據tips
# 讀取數據tipsimport seaborn as snstips=sns.load_dataset('tips')tips.head()我們看到數據中記錄了顧客信息、顧客消費信息和支付小費信息。
當我們需要對數據進行可視化時,需要根據具體分析選擇合適的繪圖方法,比如,當我們需要對兩個變量繪製圖形,其中,一個為類別型變量,另外一個可以是數值型變量,那麼就要選擇滿足此要求的繪圖方法,若是要使用的兩個變量均是類別型變量,那麼需要被計算的類別型變量轉化為數值型,比如將性別變量中的男女處理為0和1。
眾多繪圖函數中,stripplot()函數可以對類別型變量和數值型變量繪製圖形,繪製得到的圖像叫做條形散點圖。
條形散點圖是將自變量(也稱為特徵)中的每個不同值與相應的因變量組成的點聚集在一起,聚集點的分布類似於條形。
sns.stripplot( )的使用方法是:
sns.stripplot(x, y, data)stripplot中的第一個參數x為橫坐標方向上的特徵,第二個參數y為縱坐標方向上的特徵,參數 data 用於指定數據集。
我們來繪製一下每天的消費總數條形散點圖。
請大家完成以下代碼,按照老師的指引,在#TODO的部分填充所需的代碼即可。
dataAnalysis_10_1_2_單變量條形散點圖
# 單變量條形散點圖import numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport seaborn as sns%matplotlib inline
tips = sns.load_dataset('tips')
plt.figure(figsize=(10, 5))
# TODO# 繪製條形散點圖,x軸記錄day變量數據,y軸記錄total_bill數據sns.stripplot(x='day',y='total_bill',data=tips)
plt.title('每天消費總數條形散點圖')plt.show()來看一下老師的代碼:
import numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport seaborn as sns%matplotlib inline
tips = sns.load_dataset('tips')
plt.figure(figsize=(10, 5))
# TODO# 繪製條形散點圖,x軸記錄day變量數據,y軸記錄total_bill數據sns.stripplot(x = 'day', y = 'total_bill', data = tips)plt.title('每天消費總數條形散點圖')plt.show()數據按照星期變量分組繪製,每天的數據以散點的形式繪製在同一個條形中。散點對應的縱坐標位置表示相應的用餐消費金額。
我們可能會發現stripplot中點與點之間略有重疊。Seaborn中還有另外一個函數swarmplot,該函數利用一種特定算法使得我們的能更好看到數據的分布情況。
sns.swarmplot(x,y,data,color,alpha,[para])swarmplot中的x為坐標軸中橫軸上的數據,參數y為坐標軸中豎軸上的數據,參數data為可視化的數據集,color為數據繪製的點的顏色,alpha為數據繪製的點的透明度,取值範圍為[0,1],值越大,點的顏色越深,值越小,點的顏色越淺,[para]為其它參數,同學可以自行發現和嘗試。
函數swarmplot(),它使用避免重疊點的算法將分類軸上的每個散點分開定位。sns.swarmplot()的使用方法和stripplot類似,大家嘗試修改一下代碼,看看得到的圖像有什麼區別。
dataAnalysis_10_1_4_單變量條形散點圖不重疊
# 單變量條形散點圖不重疊import numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport seaborn as sns%matplotlib inline
tips = sns.load_dataset('tips')
plt.figure(figsize=(10, 5))
# TODO# 繪製swarmplot,x軸記錄day變量數據,y軸記錄total_bill數據sns.swarmplot(x='day',y='total_bill',data=tips,alpha=0.9999)
plt.title('每天消費總數條形散點圖')plt.show()來看一下老師的代碼:
import numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport seaborn as sns%matplotlib inline
tips = sns.load_dataset('tips')
plt.figure(figsize=(10, 5))
# TODO# 繪製swarmplotsns.swarmplot(x = 'day', y = 'total_bill', data = tips)plt.title('每天消費總數條形散點圖')plt.show()如果我們的數據集中含有另外一個分類變量,雙變量條形散點圖可在同一個條形柱中顯示另外一個特徵的分布。我們在繪製的時候傳入參數hue,設置為條形柱中將散點分類的另一個變量名即可。
請大家完成以下代碼,按照老師的指引,在#TODO的部分填充所需的代碼即可。
dataAnalysis_10_2_1_雙變量條形散點圖
# 雙變量條形散點圖import numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport seaborn as sns%matplotlib inline
tips = sns.load_dataset('tips')
plt.figure(figsize=(10, 5))
# TODO# 繪製swarmplot,x為day,y為total_bill,傳入hue參數為性別sns.swarmplot(x='day',y='total_bill',hue='sex',data=tips)plt.title('每天消費總數分性別條形散點圖')plt.show()來看一下老師的代碼:
# 雙變量條形散點圖 import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns %matplotlib inline
tips = sns.load_dataset('tips')
plt.figure(figsize=(10, 5))
# TODO # 繪製swarmplot,傳入hue參數為性別 sns.swarmplot(x = 'day', y = 'total_bill', data = tips, hue = 'sex') plt.title('每天消費總數分性別條形散點圖') plt.show()hue通過指定分組變量'sex',將自變量和因變量分為'Male'和'Female'兩組。數據點按照day變量分組,分為星期四、星期五、星期六、星期日,在橫軸的方向形成四個散點柱。
箱線圖對於分類變量和連續型變量組成的數據集來說,我們也可以使用Seaborn繪製boxplot,Seaborn繪製boxplot使用sns.boxplot( )。傳入的參數和條形散點圖類似。
請大家嘗試完成以下代碼,按照老師的指引,在#TODO的部分填充所需的代碼即可。
dataAnalysis_10_3_1_箱線圖
# 箱線圖import numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport seaborn as sns%matplotlib inline
tips = sns.load_dataset('tips')
plt.figure(figsize=(10, 5))
# TODO# 繪製箱線圖,每天消費總數分吸菸與否箱線圖sns.boxplot(x='day',y='total_bill',hue='smoker',data=tips)
plt.title('每天消費總數分吸菸與否箱線圖')plt.show()來看一下老師的答案:
# 箱線圖 import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns %matplotlib inline
tips = sns.load_dataset('tips')
plt.figure(figsize=(10, 5))
# TODO # 繪製箱線圖,每天消費總數分吸菸與否箱線圖 sns.boxplot(x = 'day', y = 'total_bill', hue = 'smoker',data = tips)
plt.title('每天消費總數分吸菸與否箱線圖') plt.show()
琴形圖接下來我們再來介紹一種圖像:琴形圖。
琴形圖也叫作小提琴圖,它是箱線圖和核密度圖的結合。回憶一下,直方圖和核密度圖的結合是distplot。
在學習Seaborn的開始,我們見到的下面這張圖,就是琴形圖:
圖像內部黑色的盒形範圍為下四分位數到上四分位數,外部曲線為兩個對稱的核密度圖,體現數據的密度高低:曲線曲率越大,數據的密度越大。
繪製琴形圖使用sns.violinplot( )函數。參數的使用方法與上面的函數類似。
請大家完成以下代碼,按照老師的指引,在#TODO的部分填充所需的代碼即可。
dataAnalysis_10_3_2_琴形圖
# 琴形圖import numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport seaborn as sns%matplotlib inline
tips = sns.load_dataset('tips')
plt.figure(figsize=(10, 5))
# TODO# 繪製'每天消費總數分吸菸與否琴形圖'sns.violinplot(x='day',y='total_bill',hue='smoker',data=tips)
plt.title('每天消費總數分吸菸與否琴形圖')plt.show()來看一下老師的代碼:
# 琴形圖import numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport seaborn as sns%matplotlib inline
tips = sns.load_dataset('tips')
plt.figure(figsize=(10, 5))
# TODO# 繪製'每天消費總數分吸菸與否琴形圖'sns.violinplot(x = 'day', y = 'total_bill', hue = 'smoker', data = tips)plt.title('每天消費總數分吸菸與否琴形圖')plt.show()琴形圖中數據按照day變量分組,分組信息顯示在x軸上,y軸記錄total_bill的數值。琴形柱內部的盒形為數據的箱線圖,白色的點記錄數據的中位數值。琴形的外邊緣是由兩條數據的核密度曲線圍成的,數據密度越大,琴形的腰部越寬。
我們還可以在繪製琴形圖的時候加入幾個參數:
sns.violinplot(x, y, hue, data, inner, split)inner參數用於設置琴形內部數據點的顯示類型,默認為box,表示琴形圖內顯示箱線圖,備選設置有:quartile表示顯示四分位數線、point表示顯示具體數據點、stick表示顯示具體數據棒,以及None表示琴形內部不顯示圖像。
split = True表示拆分小提琴圖,在同一個琴中左右兩邊分別顯示分類之後的數據,可比較經過hue拆分後的兩個變量。
下面我們加入這兩個參數,看看會得到什麼樣的圖像效果。
請大家完成以下代碼,按照老師的指引,在#TODO的部分填充所需的代碼即可。
dataAnalysis_10_3_3_多變量分類琴形圖
# 多變量分類琴形圖import numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport seaborn as sns%matplotlib inline
tips = sns.load_dataset('tips')
plt.figure(figsize=(10, 5))
# TODO# 繪製'每天消費總數分吸菸與否琴形圖',琴形內部顯示四分位數線,且拆分小提琴圖sns.violinplot(x='day',y='total_bill',hue='smoker',data=tips,inner='quartile',split=True)
plt.title('每天消費總數分吸菸與否琴形圖')plt.show()來看一下老師的答案:
import numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport seaborn as sns%matplotlib inline
tips = sns.load_dataset('tips')
plt.figure(figsize=(10, 5))
# TODO# 繪製'每天消費總數分吸菸與否琴形圖',琴形內部顯示四分位數線,且拆分小提琴圖sns.violinplot(x = 'day', y = 'total_bill', hue = 'smoker', inner = 'quartile', split= True, data = tips)plt.title('每天消費總數分吸菸與否琴形圖')plt.show()每個琴形柱按照中軸對稱線被分為左右兩個部分,左邊藍色的區域為吸菸人群的核密度曲線圖圍成的區域,右邊桔色的區域記錄不吸菸人群的核密度關係。
琴形圖與條形散點圖可以結合起來繪製在同一張畫布中。分別繪製兩次圖像,就可以得到兩者的結合圖。
運行一下老師的代碼,來看一下圖像的效果。
# 琴形圖和散點圖結合import numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport seaborn as sns%matplotlib inline
tips = sns.load_dataset('tips')
plt.figure(figsize=(10, 5))
sns.violinplot(x = 'day', y = 'total_bill', data = tips, inner = None)sns.swarmplot(x = 'day', y = 'total_bill', data = tips, color = 'w', alpha = 0.5)plt.title('每天消費總數琴形散點圖')plt.show()
dataAnalysis_10_3_4_琴形圖和散點圖結合
# 琴形圖和散點圖結合import numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport seaborn as sns%matplotlib inline
tips = sns.load_dataset('tips')
plt.figure(figsize=(10, 5))
sns.violinplot(x = 'day', y = 'total_bill', data = tips, inner = None)sns.swarmplot(x = 'day', y = 'total_bill', data = tips, color = 'w', alpha = 0.5)plt.title('每天消費總數琴形散點圖')plt.show()
Seaborn中有factorplot( )和PairGrid( )兩個更為高級的繪圖方法,可以將以上介紹的繪製方法封裝在同一個函數中,調用函數,factorplot( )通過'kind'參數即可切換,PairGrid使用map繪製圖形。
首先,我們來認識一下 factorplot(), 它的使用和琴形圖/箱線圖類似,但是,factorplot()添加了kind參數,這個參數允許factorplot()可以繪製各種圖,比如,點圖、柱狀圖、散點圖、箱線圖:
sns.factorplot(x, y, data, hue, kind)kind參數默認為點圖point,還可以選擇柱形圖bar, 箱線圖box, 琴形圖violin, 散點圖strip,分散點圖swarm。
點圖kind參數默認為點圖,點圖是用兩組數據構成多個坐標點,展示坐標點的分布。判斷兩個變量之間是否存在某種關聯。
請大家運行以下代碼:
import numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport seaborn as sns%matplotlib inline
tips = sns.load_dataset('tips')
plt.figure(figsize=(10, 5))
sns.factorplot(x='day', y='total_bill', hue='smoker', data=tips)plt.title('每天消費總數分吸菸與否點圖')plt.show()dataAnalysis_10_4_1_點圖
# 點圖import numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport seaborn as sns%matplotlib inline
tips = sns.load_dataset('tips')
plt.figure(figsize=(10, 5))
sns.factorplot(x='day', y='total_bill', hue='smoker', data=tips)plt.title('每天消費總數分吸菸與否點圖')plt.show()tips.head()/opt/conda/lib/python3.7/site-packages/seaborn/categorical.py:3669: UserWarning: The `factorplot` function has been renamed to `catplot`. The original name will be removed in a future release. Please update your code. Note that the default `kind` in `factorplot` (`'point'`) has changed `'strip'` in `catplot`. warnings.warn(msg)
<Figure size 720x360 with 0 Axes>數據按照day變量在橫軸的方向分組,每組中又通過設置hue參數為'smoker'分為吸菸或者不吸菸兩組。數據點表示每個分組中數據的均值,每個點垂直方向各有一條小線段,線段記錄均值的置信區間,通過參數ci可以設置置信水平,置信水平默認值為95。點與點之間用折線連接,反映數據的增長趨勢。可以看出,吸菸顧客在周五時支付的消費均值最少。
柱狀圖可以將參數kind設置為bar,即可使用factorplot繪製柱形圖。
請大家複製並運行以下代碼:
import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns %matplotlib inline
tips = sns.load_dataset('tips')
plt.figure(figsize=(10, 5)) sns.factorplot(x='day', y='total_bill', hue= 'smoker', kind = 'bar', data=tips) plt.title('每天消費總數分吸菸與否柱形圖') plt.show()dataAnalysis_10_4_2_柱形圖
# 柱形圖import matplotlib.pyplot as pltimport seaborn as sns%matplotlib inlinetips=sns.load_dataset('tips')plt.figure(figsize=(10,8))sns.factorplot(x='day',y='total_bill',kind='bar',data=tips)plt.show()/opt/conda/lib/python3.7/site-packages/seaborn/categorical.py:3669: UserWarning: The `factorplot` function has been renamed to `catplot`. The original name will be removed in a future release. Please update your code. Note that the default `kind` in `factorplot` (`'point'`) has changed `'strip'` in `catplot`. warnings.warn(msg)<Figure size 720x360 with 0 Axes>問:老師這個和柱狀圖不太一樣哈,每個柱子面有個黑色的豎條,那是什麼?
答:那個黑色的豎條表示置信區間,通過參數ci可以來設置,默認值為95。吸菸與不吸菸人群在不同day支付的消費數額以柱形圖的形式繪製,可以清楚地看出吸菸人群在周五支付的消費數額最低,周日最高。
條形散點圖將kind參數設置為swarm 可繪製條形散點圖,結合hue參數可做分類變量繪圖。
請大家複製並運行以下代碼:
import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns %matplotlib inline
tips = sns.load_dataset('tips')
plt.figure(figsize=(10, 5)) sns.factorplot(x='day', y='total_bill', hue='smoker', col='time', kind = 'swarm', data=tips) plt.title('每天消費總數分吸菸與否、用餐時間條形散點圖') plt.show()
dataAnalysis_10_4_3_條形散點圖# 條形散點圖import matplotlib.pyplot as pltimport seaborn as snsimport pandas as pd%matplotlib inlinetips=sns.load_dataset('tips')tips.to_csv('../../tmp/tips.csv')plt.figure(figsize=(10,8))sns.factorplot(x='day',y='total_bill',hue='smoker',col='time',kind='swarm',data=tips)plt.show()/opt/conda/lib/python3.7/site-packages/seaborn/categorical.py:3669: UserWarning: The `factorplot` function has been renamed to `catplot`. The original name will be removed in a future release. Please update your code. Note that the default `kind` in `factorplot` (`'point'`) has changed `'strip'` in `catplot`. warnings.warn(msg)<Figure size 720x576 with 0 Axes>
col參數可以根據變量值設置子圖。col參數設置為time,因此繪製結果會根據time變量的取值分別輸出子圖。time變量記錄用餐時間,也即用餐類型:午餐或者晚餐,所以運行結果分別輸出午餐和晚餐的消費條形散點圖。可以看出,周四時午餐消費的顧客數較多,周六日晚餐消費的顧客數較多。
箱線圖將kind參數設置為box可繪製箱線圖,並可調整圖形的大小和形狀。
請大家複製並運行以下代碼:
import numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport seaborn as sns%matplotlib inline
tips = sns.load_dataset('tips')
plt.figure(figsize=(10, 5))sns.factorplot(x='day', y='total_bill', hue='smoker',col='time', kind = 'box', data=tips)plt.title('每天消費總數分吸菸與否、用餐時間箱線圖')plt.show()dataAnalysis_10_4_4_箱線圖
# 箱線圖import pandas as pdimport numpy as npimport matplotlib.pyplot as pltimport seaborn as sns%matplotlib inline
plt.figure(figsize=(10,8))tips=sns.load_dataset('tips')sns.factorplot(x='day',y='total_bill',hue='smoker',col='time',kind='box',data=tips)plt.show()
/opt/conda/lib/python3.7/site-packages/seaborn/categorical.py:3669: UserWarning: The `factorplot` function has been renamed to `catplot`. The original name will be removed in a future release. Please update your code. Note that the default `kind` in `factorplot` (`'point'`) has changed `'strip'` in `catplot`. warnings.warn(msg)<Figure size 720x576 with 0 Axes>
吸菸與否的顧客被分為兩組,分別以箱線圖的形式展示消費數據的分布,可以看出周五晚餐吸菸與否的顧客消費數據的中位數相差較大。大家可能疑惑,周五不吸菸的人消費金額的中位數在圖中哪裡呀?這是因為消費金額的最大值和中位數幾乎相等,看起來是重疊的。
PairGrid最後,我們來一起看一下PairGrid。PairGrid可繪製多變量分類圖,在畫布上以幾行幾列的形式,將不同變量繪製的圖在不同位置上,這些位置的布局類似於一個矩陣。
sns.PairGrid( ) 的使用方法是:
sns.PairGrid(data, x_vars, y_vars)data參數用於設置繪圖所需的數據集,x_vars設置x軸上的分類變量,y_vars用於設置y軸方向上的分類變量。
我們在x軸的方向設置:'smoker','time', 'sex'變量,傳入變量時,使用列表的形式。y軸方向設置:'total_bill', 'tip'。
設置好矩陣的參數之後,我們使用map函數,傳入要繪製的圖像種類:琴形圖,就可以繪製出多變量琴形圖了。
現在請大家運行以下代碼:
import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns %matplotlib inline
tips = sns.load_dataset('tips')
plt.figure(figsize=(10, 5)) g = sns.PairGrid(tips, x_vars=['smoker', 'time', 'sex'], y_vars=['total_bill', 'tip'] ) g.map(sns.violinplot) plt.show()
dataAnalysis_10_4_5_PairGrid圖
import numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport seaborn as sns%matplotlib inline
tips = sns.load_dataset('tips')
plt.figure(figsize=(10, 5))g = sns.PairGrid(tips, x_vars=['smoker', 'time', 'sex'], y_vars=['total_bill', 'tip'] )g.map(sns.violinplot)plt.show()<Figure size 720x360 with 0 Axes>x軸上的3個變量與y軸上的2個變量兩兩對應,分別繪製琴形圖,其中,從男性/女性的琴形圖中可以看出,男性顧客相對比女性顧客的消費金額較大,並且男性顧客比女性顧客支付的消費也較大。
知識總結今天的內容就告一段落了。在今天的課程中,我們學習了如何繪製分類變量數據分布圖,包括:單變量條形散點圖、雙變量條形散點圖、箱線圖和琴形圖、多變量分類圖的繪製。我們來梳理一下知識點:
單雙變量條形散點圖:我們使用stripplot、swarmplot,結合hue參數,我們可以設置兩個分類變量,繪製雙變量條形散點圖。
箱線圖:我們使用Seaborn中的boxplot。
琴形圖:是一種箱線圖和密度圖的結合圖,繪製琴形圖使用violinplot。
factorplot:可以繪製點圖、柱形圖、條形散點圖和箱線圖等。
PairGrid: 可以繪製多變量分類圖,以矩陣的形式顯示。
最後我們把本關的知識點總結一下:
(完)
看完本文有收穫?
關注我們,一起學Python吧
點個 「分享、贊、在看」 和大家一起分享吧