Pandas數據可視化的備忘錄

做者|Rashida Nasrin Sucky
編譯|VK
來源|Towards Data Sciencehtml

咱們使用python的pandas庫主要用於數據分析中的數據操做,但咱們也可使用Pandas進行數據可視化。你甚至不須要爲此導入Matplotlib庫。python

Pandas自己能夠在後端使用Matplotlib併爲你呈現可視化效果。它使得使用數據幀列繪製圖變得很是容易。Pandas使用比Matplotlib更高級別的API。所以,它能夠用更少的代碼行來繪製繪圖。git

我將從使用隨機數據從基本的繪圖開始,而後轉到更高級的帶有真實數據集的繪圖。github

在本教程中,我將使用Jupyter Notebook環境。若是你沒有安裝,你能夠簡單地使用谷歌Colab Notebook。你甚至不須要在上面安裝Pandas。它已經爲咱們安裝好了。bootstrap

若是你想安裝一個Jupyter Notebook,那也是個好主意。後端

對於數據科學家來講,這是一個很好的軟件包,並且是免費的。api

安裝pandas使用:bash

pip install pandas

或者在你的anaconda上less

conda install pandas

這樣就準備好了機器學習

pandas可視化

咱們將從最基本的開始。

直線圖

首先導入pandas。而後,讓咱們用pandas作一個基本的系列,畫一個直線圖。

import pandas as pd
a = pd.Series([40, 34, 30, 22, 28, 17, 19, 20, 13, 9, 15, 10, 7, 3])
a.plot()

最基本最簡單的圖準備好了!看,這是多麼容易。咱們能夠改進一下。

我將補充:

更改一個圖形大小,使圖表更大,

更改的默認藍色

顯示標題

更改軸上這些數字的默認字體大小

a.plot(figsize=(8, 6), color='green', title = 'Line Plot', fontsize=12)

在本教程中,咱們將學習更多的樣式技巧。

面積圖

我會用相同的數據a在這裏畫一個面積圖,

我可使用.plot方法並傳遞一個參數類型來指定我想要的繪圖類型,例如:

a.plot(kind='area')

或者我能夠這樣寫

a.plot.area()

我上面提到的兩種方法都將建立此圖:

面積圖更有意義,並且當其中有多個變量時看起來也更好。因此,我將製做更多Series,製做一個數據框,並從中繪製一個面積圖。

b = pd.Series([45, 22, 12, 9, 20, 34, 28, 19, 26, 38, 41, 24, 14, 32])
c = pd.Series([25, 38, 33, 38, 23, 12, 30, 37, 34, 22, 16, 24, 12, 9])
d = pd.DataFrame({'a':a, 'b': b, 'c': c})

讓咱們把這個數據框「d」畫成面積圖,

d.plot.area(figsize=(8, 6), title='Area Plot')

你沒必要接受這些默認顏色。讓咱們把這些顏色換一下,再加些樣式。

d.plot.area(alpha=0.4, color=['coral', 'purple', 'lightgreen'],figsize=(8, 6), title='Area Plot', fontsize=12)

「alpha」參數爲繪圖添加了一些半透明的外觀。

當咱們有重疊的面積圖、直方圖或密集的散點圖時,它彷佛很是有用。

plot()能夠執行11種類型的繪圖:

  1. line
  2. area
  3. bar
  4. barh
  5. pie
  6. box
  7. hexbin
  8. hist
  9. kde
  10. density
  11. scatter

我想展現全部這些不一樣圖的用法。爲此,我將使用疾病控制和預防中心的NHANES數據集。我下載了這個數據集,並把它和這個Jupyter Notebook放在同一個文件夾裏。請隨時下載該數據集並跟隨:https://github.com/rashida048/Datasets/blob/master/nhanes_2015_2016.csv

在這裏導入數據集:

df = pd.read_csv('nhanes_2015_2016.csv')
df.head()

這個數據集有30列5735行。

在開始繪製繪圖以前,檢查數據集的列很重要:

df.columns

輸出:

Index(['SEQN', 'ALQ101', 'ALQ110', 'ALQ130', 'SMQ020', 'RIAGENDR', 'RIDAGEYR', 'RIDRETH1', 'DMDCITZN', 'DMDEDUC2', 'DMDMARTL', 'DMDHHSIZ', 'WTINT2YR', 'SDMVPSU', 'SDMVSTRA', 'INDFMPIR', 'BPXSY1', 'BPXDI1', 'BPXSY2', 'BPXDI2', 'BMXWT', 'BMXHT', 'BMXBMI', 'BMXLEG', 'BMXARML', 'BMXARMC', 'BMXWAIST', 'HIQ210', 'DMDEDUC2x', 'DMDMARTLx'], dtype='object')

列的名稱可能看起來很奇怪。但別擔憂。我將繼續解釋列的含義。咱們不會使用全部列。咱們將用其中的一些來練習這些圖表。

直方圖

我將使用人口的權重來製做一個基本的直方圖

df['BMXWT'].hist()

做爲提醒,直方圖提供了頻率分佈。上圖顯示大約1825人體重75。最大的體重在49到99之間。

若是我想把幾個柱狀圖放在一個圖上呢?

我將使用體重、身高和體重指數(BMI)在一個圖中繪製三個直方圖。

df[['BMXWT', 'BMXHT', 'BMXBMI']].plot.hist(stacked=True, bins=20, fontsize=12, figsize=(10, 8))

可是若是你想要三個不一樣的直方圖,也能夠只使用一行代碼,像這樣:

df[['BMXWT', 'BMXHT', 'BMXBMI']].hist(bins=20,figsize=(10, 8))

它能夠更具活力!

咱們在' BPXSY1 '列中有血壓數據,在' DMDEDUC2 '列中有教育程度數據。若是咱們想檢查每一個教育水平人羣的血壓分佈,也能夠用一行代碼完成。

但在此以前,我想用更有意義的字符串值替換'DMDEDUC2'列的數值:

df["DMDEDUC2x"] = df.DMDEDUC2.replace({1: "less than 9", 2: "9-11", 3: "HS/GED", 4: "Some college/AA", 5: "College", 7: "Refused", 9: "Don't know"})

如今作直方圖

df[['DMDEDUC2x', 'BPXSY1']].hist(by='DMDEDUC2x', figsize=(18, 12))

看!咱們只需一行代碼就能夠獲得每一個教育水平的血壓水平分佈!

條形圖

如今讓咱們看看血壓是如何隨婚姻情況而變化的。此次我要作一個條形圖。與前面同樣,我將用更有意義的字符串替換「DMDMARTL」列的數值。

df["DMDMARTLx"] = df.DMDMARTL.replace({1: "Married", 2: "Widowed", 3: "Divorced", 4: "Separated", 5: "Never married", 6: "Living w/partner", 77: "Refused"})

爲了繪製條形圖,咱們須要對數據進行預處理。即根據不一樣的婚姻情況對數據進行分組,並取每組的平均值。這裏我用同一行代碼處理數據和繪圖。

df.groupby('DMDMARTLx')['BPXSY1'].mean().plot(kind='bar', rot=45, fontsize=10, figsize=(8, 6))

這裏咱們使用「rot」參數將x記號旋轉45度。不然,他們會太混亂。

若是你願意,你也能夠把它弄平,

df.groupby('DMDEDUC2x')['BPXSY1'].mean().plot(kind='barh', rot=45, fontsize=10, figsize=(8, 6))

我想用多個變量繪製條形圖。咱們有一個列,裏面有人口的民族血統。看看人們的體重、身高和體重指數是否會隨民族血統而變化,這將是一件有趣的事。

爲了繪製這個圖,咱們須要將這三列(體重、身高和體重指數)按民族血統分組並取平均值。

df_bmx = df.groupby('RIDRETH1')['BMXWT', 'BMXHT', 'BMXBMI'].mean().reset_index()

這一次我沒有改變民族血統的數據。我保持數值不變。咱們如今就開始吧,

df_bmx.plot(x = 'RIDRETH1', 
            y=['BMXWT', 'BMXHT', 'BMXBMI'], 
            kind = 'bar', 
            color = ['lightblue', 'red', 'yellow'], 
            fontsize=10)

看來第四種族比其餘種族高一點。但他們都無顯著性差別。

咱們也能夠將不一樣的參數(體重、身高和體重指數)疊加在一塊兒。

df_bmx.plot(x = 'RIDRETH1', 
            y=['BMXWT', 'BMXHT', 'BMXBMI'], 
            kind = 'bar', stacked=True,
            color = ['lightblue', 'red', 'yellow'], 
            fontsize=10)

餅圖

我想看看婚姻情況和受教育程度有沒有關係。

我須要按教育程度對婚姻情況進行分組,並按教育程度統計每一個婚姻情況組中的人口。聽起來太羅嗦了,對吧?讓咱們看看:

df_edu_marit = df.groupby('DMDEDUC2x')['DMDMARTL'].count()
pd.Series(df_edu_marit)

使用此Series能夠很容易地繪製餅圖:

ax = pd.Series(df_edu_marit).plot.pie(subplots=True, label='',
     labels = ['College Education', 'high school', 
     'less than high school', 'Some college',
     'HS/GED', 'Unknown'],
     figsize = (8, 6),
     colors = ['lightgreen', 'violet', 'coral', 'skyblue', 'yellow', 'purple'], autopct = '%.2f')

這裏我添加了一些樣式參數。請隨時嘗試更多的樣式參數。

箱線圖

例如,我將使用體重指數、腿和臂長數據製做一個箱線圖。

color = {'boxes': 'DarkBlue', 'whiskers': 'coral', 
         'medians': 'Black', 'caps': 'Green'}
df[['BMXBMI', 'BMXLEG', 'BMXARML']].plot.box(figsize=(8, 6),color=color)

散點圖

對於一個簡單的散點圖,我想看看體重指數(「BMXBMI」)和血壓(「BPXSY1」)之間是否存在任何關係。

df.head(300).plot(x='BMXBMI', y= 'BPXSY1', kind = 'scatter')

我只使用了300個數據,由於若是我使用全部的數據,散點圖變得過於密集,沒法理解。但可使用alpha參數使其半透明。

如今,讓咱們用一樣的一行代碼畫出一個稍微高級的散點圖。

此次我將添加一些顏色的陰影。我將繪製一個散點圖,把重量放在x軸上,把高度放在y軸上。

我還要加上腿的長度。但腿的長度會以陰影顯示。若是腿的長度較長,則陰影將較暗,不然陰影將較淺。

df.head(500).plot.scatter(x= 'BMXWT', y = 'BMXHT', c ='BMXLEG', s=50, figsize=(8, 6))

它顯示了體重和身高之間的關係。你能夠看到腿的長度與身高和體重之間是否有任何關係。

另外一種添加第三個參數的方法是增長粒子的大小。在這裏,我把高度放在x軸上,重量在y軸上,體重指數做爲粒子大小的指標。

df.head(200).plot.scatter(x= 'BMXHT', y = 'BMXWT', 
                          s =df['BMXBMI'][:200] * 7, 
                          alpha=0.5, color='purple',
                         figsize=(8, 6))

這裏的小點表示BMI較低,較大的圓點表示BMI較高。

六邊形

這是另外一種漂亮的視覺效果,點是六邊形。當數據太密集時,把它們放在箱子裏是頗有用的。如你所見,在前兩個圖中,我只使用了500和200個數據,由於若是我將全部數據放入數據集中,則繪圖變得過於密集,沒法理解或從中獲取任何信息。

在這種狀況下,使用空間分佈是很是有用的。我使用的是hexbin,數據將以六邊形表示。每個六邊形都是一個表明箱子密度的箱子。下面是一個最基本的hexpin示例。

df.plot.hexbin(x='BMXARMC', y='BMXLEG', gridsize= 20)

在這裏,較深的顏色表示較高的數據密度,而較淺的顏色表示較低的數據密度。

聽起來像直方圖嗎?是的,對吧?它用顏色表示,而不是直方圖。

若是咱們增長一個額外的參數'C',分佈會改變。它再也不像直方圖了。

參數「C」指定每一個(x, y)座標的位置,對每一個六邊形箱子進行累加,而後使用reduce_C_function進行reduce。若是沒有指定reduce_C_function,默認狀況下它使用np.mean。你能夠把它定義爲np.mean, np.max, np.sum, np.std等等

有關更多信息,請參閱文檔:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.plot.hexbin.html

下面是一個例子:

df.plot.hexbin(x='BMXARMC', y='BMXLEG', C = 'BMXHT',
                         reduce_C_function=np.max,
                         gridsize=15,
                        figsize=(8,6))

六邊形的深色意味着,np.max有一個更高的值,你能夠看到我使用np.max做爲reduce_C_function。咱們可使用顏色貼圖代替顏色的着色:

df.plot.hexbin(x='BMXARMC', y='BMXLEG', C = 'BMXHT',
                         reduce_C_function=np.max,
                         gridsize=15,
                        figsize=(8,6),
                        cmap = 'viridis')

看起來很漂亮,對吧?並且信息量很大。

一些高級可視化

我在上面解釋了人們在平常生活中處理數據時使用的一些基本繪圖。但數據科學家還須要更多。pandas庫也有一些更高級的可視化。它能夠在一行代碼中提供更多信息。

散點矩陣

散點矩陣很是有用。它在一個圖中提供了大量的信息。它能夠用於通常的數據分析或機器學習中的特徵工程。讓咱們先看一個例子。以後我再解釋。

from pandas.plotting import scatter_matrix

scatter_matrix(df[['BMXWT', 'BMXHT', 'BMXBMI', 'BMXLEG', 'BMXARML']], alpha = 0.2, figsize=(10, 8), diagonal = 'kde')

我在這裏使用了五個特徵。我獲得了全部五個變量之間的關係。在對角線中,它給出了每一個單獨特徵的密度圖。在個人下一個例子中,咱們將進一步討論密度圖。

KDE或密度圖

構建KDE圖或核密度圖是爲了提供數據幀中序列或列的機率分佈。讓咱們看看權重變量(「BMXWT」)的機率分佈。

df['BMXWT'].plot.kde()

你能夠在一個圖中看到幾個機率分佈。在這裏,我在同一個圖中給出了身高、體重和BMI的機率分佈:

df[['BMXWT', 'BMXHT', 'BMXBMI']].plot.kde(figsize = (8, 6))

你也可使用前面描述的其餘樣式參數。我喜歡保持簡單。

Parallel_coordinates

這是一種顯示多維數據的好方法。它清楚地顯示了簇(若是有)。例如,我想看看男性和女性在身高、體重和體重指數上是否有什麼不一樣。讓咱們檢查一下。

from pandas.plotting import parallel_coordinates

parallel_coordinates(df[['BMXWT', 'BMXHT', 'BMXBMI', 'RIAGENDR']].dropna().head(200), 'RIAGENDR', color=['blue', 'violet'])

你能夠看到男性和女性在體重、身高和BMI上的明顯差別。這裏,1是男人,2是女人。

Bootstrap_plot

這是一個很是重要的研究和統計分析圖。這將節省大量的統計分析時間。Bootstrap_plot用於評估給定數據集的不肯定性。

此函數獲取指定大小的隨機樣本。而後計算該樣本的平均值、中位數和中位數。此過程重複指定次數。

這裏我用BMI數據建立了一個Bootstrap_plot

from pandas.plotting import bootstrap_plot

bootstrap_plot(df['BMXBMI'], size=100, samples=1000, color='skyblue')

這裏,樣本量是100,樣本數是1000。因此,咱們隨機抽取100個數據樣原本計算平均值、中位數和中位數。這個過程重複1000次。

對於統計學家和研究人員來講,這是一個極其重要的過程,也是一個節省時間的過程。

結論

我想爲pandas的數據可視化製做一份備忘單。不過,若是使用matplotlib和seaborn,則有更多的選項或可視化類型。可是若是你處理數據,咱們在平常生活中使用這些基本類型的可視化。將pandas用於此可視化將使你的代碼更簡單,並節省大量代碼。

原文連接:https://towardsdatascience.com/an-ultimate-cheat-sheet-for-data-visualization-in-pandas-4010e1b16b5c

歡迎關注磐創AI博客站:
http://panchuang.net/

sklearn機器學習中文官方文檔:
http://sklearn123.com/

歡迎關注磐創博客資源彙總站:
http://docs.panchuang.net/

相關文章
相關標籤/搜索