機器學習-數據可視化

如今天天產生的數據都是海量的,這些數據中既有高質量的也有不少垃圾,如何從這些海量的數據中洞察出這些數據的內在聯繫是咱們機器學習的核心內容。若是光把數據丟在你們的面前,我們確定是無感的,沒法獲取這些數據的意義。爲了可以更加直觀的瞭解這些數據的一些特徵,例如數據的分佈狀況,數據的趨勢和走勢,數據之間的對比等等。這些特性能夠很好的幫助咱們理解一些數據的內在特性,從而對咱們的特徵工程也有很大的輔助功能。還有最大的一個功能就是幫助我們作不少看起來很牛逼圖像,而後在報告上面裝B(你們都懂的,噓噓噓噓)。在數據科學的領域中,比較底層的數據可視化組件事matplotlib. 可是鑑於上一節我們已經說過pandas,pandas的可視化接口也都是基於matplotlib的,可是pandas的更加抽象,因此運用起來也更加簡單一點。另外我也會簡單的介紹一款專門用於數據可視化的組件叫作seaborn,它也是基於matplotlib的,可是seaborn也更加抽象,level也更加高,在可視化方面提供的接口也更加簡單豐富。具體要用哪個都同樣,你們隨便選擇,只要你們能在PPT或者報告中能成功在老闆面前把B裝起來,我們就成功了,無論黑貓白貓,能抓住老鼠的就是好貓。哈哈,那我們就開始我們的表演吧。程序員

  • categorical data type plot (univarate bar chart)

首先我們先要了解category data是什麼,category data一般也分兩種:nominal category和ordinal category。nominal category一般是一些名詞,而後對於這些category的順序並不care,例如省份,國家,品牌等等(地域黑除外,哈哈);ordinal category一般是一些對於順序很敏感的變量,而後對於趨勢和分佈比較重要的數據,例如:分數,月份,年份,人口,消費等等啦。對於category data一般的可視化操做都是bar chart 或者 pie chart.下面的主要以bar chart做爲例子來解釋。本文主要是講述數據的可視化,默認我們已經加載的數據哈,具體加載數據的過程,下面的代碼就不展現了。看下面的bar chart實例,而後我來解釋細節框架

reviews.points.value_counts().plot.bar()#sorting value from max to min(default)
reviews.points.value_counts().sort_index().plot.bar()#sorting index from min to max (can see the trend)

因爲value_counts()返回的是一個series,而且返回的series的排序是按照這個series的value值從大到小的順序,因此plot的結果就是隻有一個變量,就是這個series的index,那麼這個變量對應的值就是這個series的value值。第一句代碼的圖像結果以下:機器學習

 

從上圖能夠看出,上圖的變量是亂序的,縱座標(value)是按照從大到小的順序的。 上面的第二句代碼多了一句sort_index(), 直譯過來就是將原來series的index 排序了,那麼新的series的index是按照從小到大的順序排列的。它的結果以下:函數

 

 從上圖能夠很清晰的看出數據的分佈狀況,第二幅圖也能給咱們更加劇要的數據信息。學習

補充:對於ordinal category的數據,我們還有一種經常使用的繪圖方式,那就是hist()。hist()能自動將series中的index進行排序,而後分紅N個bins,每一個bins 對應的縱座標則是這個bin相對應的frequency(即出現的次數)。例以下面的代碼和圖片字體

reviews.points.plot.hist()

 

 從上面的代碼和圖片能夠看出,hist()函數不須要將現將points進行value_counts進行計算,它能夠直接自動將series中的value按照順序分紅N個bins,而後自動計算在每一個bin中的數量。從上面的代碼能夠看出,bar()是講series中的index做爲變量,而hist()是將series中的value做爲變量,而frequency(即出現的次數)做爲y. 這一點在初學者中常常弄混淆,甚至認爲二者是同樣的。其實二者是有本質區別的,bar()是從series中一條一條的取數據,而後分別將index和value做爲x,y進行繪製;而hist()則是一條一條的在series中取數據,只將series中的value做爲x, 而後一直count每個x。這兩種plot都是統計series中的value出現的次數,另外,不管hist()仍是bar(),series的value必須是numerical,不能是categorical。this

有的時候,另一種圖也能很好的反映index和value之間的關係,那就是line chart。這種圖片也能很是好的反映數據的趨勢,因此通常也是用在ordinal的category中。以下spa

reviews.points.value_counts().sort_index().plot.line()

 

  •  Biavariate

在不少狀況下,我們會遇到要展現2個自變量的圖片。例如經緯度,bmi等等。一般這種狀況下,這種圖都是反映的是出現的頻率,熱度等。一般展示兩個自變量的圖有scatter,hexbin.好了,下面我們就直接上代碼和結果給你們解釋一下3d

reviews[reviews.price<100].sample(100).plot.scatter(x='price',y='points')

 

 上面就是scatter圖的代碼和結果,我們能夠啃方便的看出數據的分佈狀況,不一樣於bar chart和histogram 它們都是展示一個維度的數據分佈狀況, scatter是展現的2個維度的數據分佈狀況。可是他有個致命的弱點,就是數據特別多而且它們不少的值都同樣的時候,它們是覆蓋在一塊兒的,我們就沒法用眼睛直觀的準確的分辨出它們的分佈狀況了。scatter適合那些數據不是特別多,而且重複數據不多的狀況。那麼我們怎麼解決這些問題呢?答案就是hexbin圖啦,前人已經幫我們把坑都填好啦,哈哈,下面我們看看hexbin是如何展示2個變量的分佈狀況吧code

#another plot method - Hex plot could perfectly deal with the scatter plot's drawbacks. Hex aggregatepoints in
#a hexagons, and the colors of the hexagons represent the values within them, which clearly conveys the meaningful
#results and view to us, such as: where does the examples cluster. in this case, it clusters around 87.5points and around 20 dollars
reviews[reviews.price<100].plot.hexbin(x='price',y='points',gridsize=15)

 

 上面的的註釋已經講得很清楚啦,hexbin圖中,顏色越深,出現的次數就越多。這樣我們就不怕數據重疊的問題啦,很是直觀的就能夠看出數據的分佈狀況。綜上所述,固然啦,對於bivariate的數據可視化確定還有不少其餘的API,不可能全在這講完,對於一名合格的程序員,我們最重要的品質就是看文檔的能力,具體我們看,大家直接去pandas的官網看哈。總之對於數據量不大,重複數據很少的狀況,我們能夠選擇scatter,對於數據量很大,而且不少重複數據的時候,就選hexbin,能夠更加簡單的看到數據的分佈狀況。

  • Subplotting

你們不少時候必定遇到過在同一個畫布上面同時畫出好幾個圖片的需求,可能用於對比,可能用於展現更加豐富的信息。這種時候,我們就想起了subplot了。下面先經過一個簡單的實例展現一個最簡單的subplot

fig,axarr = plt.subplots(2,2,figsize=(12,8))
first_150_reviews['points'].value_counts().sort_index().plot.bar(ax=axarr[0][0])
first_150_reviews['price'].value_counts().plot.hist(ax=axarr[0][1])
first_150_reviews['variety'].value_counts().head(20).plot.bar(ax=axarr[1][0])
first_150_reviews['province'].value_counts().head(20).plot.bar(ax=axarr[1][1])

 

 

上面的代碼展現了一個subplot的最簡單的方式,首先第一個參數是(2,2)表明着是有幾個subplot,第二個參數figsize表明着整個畫布的大小,因此第一行代碼是初始化一個畫布,而且設定一些畫布的初始值。後面的四行代碼則是繪圖的過程,每一行的參數ax表明着座標系,ax後面的index分別對應着subplot的row和column,例如ax[0][1]表明着第一行第二列。因此你們看看subplot是否是能夠展示出更加豐富的內容呢。固然啦,每個subplot ax[row][column] 也能夠有一些個性化的設置,這個我們後面慢慢說,上面只是一個最最最最簡單的繪畫subplot的一種方法。

  • 圖片個性化

固然啦,既然是圖嘛,免不了不少時候我們想着要美化一下下嘛,畢竟常常要給別人展現的,門面仍是很重要的。因此我們常常須要將圖形進行一些個性化設置,例如圖形的顏色,字體大小,圖形標題,圖形大小等等一系列的特性。首先我們看一下圖形的大小哈,我們能夠經過figsize的參數進行設定,以下

reviews.points.value_counts().sort_index().plot.bar(figsize=(20,6))

能夠經過設置tuple裏面的數據對圖片的大小進行設置。接下來我們能夠看看對圖形顏色的設置

#customerize the color of the bars
reviews.points.value_counts().sort_index().plot.bar(figsize = (12,6), color = 'green')

上面代碼就是將bar chart中的bar設置成綠色。接下來我們瞧一瞧座標系上字體大小的設置

#coustomerize font
reviews.points.value_counts().sort_index().plot.bar(figsize = (12,6), color = 'red', fontsize = 20)

上面代碼的fontsize能夠設置座標系字體的大小。最後我們來看看圖形標題的設置

reviews.points.value_counts().sort_index().plot.bar(
        figsize=(12,6),
        color='green', 
        fontsize = 16, 
        title='Rankings Given By Wine Magazine'
        )

上面的代碼能夠給這個圖片設置一個標題叫作「Rankings Given By Wine Magazine」,這裏我們有個小細節須要注意一下就是標題的字體大小也能夠設置,可是在pandas plot的框架上面無法設置,必須去更加底層的matplotlib去設置圖片標題的字體大小,代碼以下

import matplotlib.pyplot as plt
title_customerise_plot = reviews.points.value_counts().sort_index().plot.bar(
        figsize = (12,6),
        color = 'green',
        fontsize = 16
        )
title_customerise_plot.set_title("Ranking Given By Wine Magazine",fontsize = 20)

我們必須經過matplotlib.pyplot中的set_title()的方法來設置圖片標題的大小,而沒法直接在pandas中設置它。上面的結果以下

 

  • Seaborn 簡介

數據的可視化呢,除了pandas提供一些簡單易用的API以外,還有一個專門用於數據可視化的框架,那就是seaborn。它也是基於matplotlib的,可是用起來比matplotlib簡單,功能也比pandas的繪圖功能更加豐富,畢竟seaborn人家是專業的嘛,哈哈。關於seaborn我也就在這裏簡單的演示一下bar chart,line chart,scatter plot, kde 等等一些簡單的應用哈。仍是那句話,關於繪圖有無數個API,須要你們安靜下來去seaborn的documentation細細品味,嘻嘻. 下面的代碼分別展現了bar chart,line chart在seaborn中的應用

import matplotlib.pyplot as plt
import seaborn as sns
#data flight_delays
= pd.read_csv("C:\\Users\\tangx\\OneDrive\\Desktop\\DATA\\flight_delays.csv",index_col='Month',parse_dates = True) spotify_df = pd.read_csv("C:\\Users\\tangx\\OneDrive\\Desktop\\DATA\\spotify.csv",index_col="Date",parse_dates = True) #plotting
sns.lineplot(data
=spotify_df['Despacito'],label = "Despacito") sns.barplot(x=flight_delays.index,y= flight_delays.NK)

從上面的代碼能夠看出,series都是做爲參數(數據源)傳遞給函數的,而不像在pandas繪圖那樣,將繪圖的方法做爲series的方法。seaborn中也能夠傳遞不少的參數來個性化圖形,例如上面的label。你們有興趣能夠本身去看看哈。上面的結果以下

 

 我們能夠從上圖看出,對於數據源我們既能夠直接把series傳給data參數,也能夠分別將橫座標縱座標的值分別傳遞給x,y。並且若是你選擇第二種它還能自動給橫座標和縱座標命名,還挺智能。seaborn還有更加牛的功能,看看下面兩個個scatter plot,你去瞧一瞧那些牛逼的功能

sns.scatterplot(x=insurance.bmi,y=insurance.charges)
sns.scatterplot(x=insurance.bmi,y=insurance.charges,hue=insurance.smoker)

 

經過上面我們能夠看出,雖然是同一個scatter,可是它還能夠經過hue這個參數,將數據根據必定的條件(例如上面的是否是吸菸者)來分開,從而能夠幫助我們更加深入的理解數據。若是看到這裏大家就以爲seaborn牛逼,那麼只能說大家仍是太年輕,哈哈,它仍是有大招的,那就是它還能夠話擬合線,具體是什麼呢?看看下面的代碼

sns.regplot(x=insurance['bmi'], y=insurance['charges'])
sns.lmplot(x='bmi',y='charges',hue='smoker',data=insurance)

 

 

 regplot至關於直接畫一條regression line,而lmplot則可以根據不一樣條件下的子集畫出不一樣的regression line,這對於我們分析數據走勢,和一些數據的subset的趨勢都有很大的幫助。最後我們來看看seaborn的另一個大殺器,那就是KDE plot, 那麼很大同窗可能會有疑問了,什麼是kde呢? kde實際上是kernel density estimation的簡稱,它實際上是一種機率分佈的技術,像是一個小window從我們的圖形從左到右的走一遍,而後把那些偏離很大的值(outliers)和那些忽然變化很大的值(in-between values)刪除和變成一條更加順滑的線,而且將結果轉成機率。它既能夠用於univariate也能夠用於bivariate。注意:kde的y值(函數的變量)是機率(對於2d數據來講,是經過顏色的深淺來判斷的),而不是frequency!!!!!!!。那我們如今來看看kde的簡單應用

first_150_reviews[first_150_reviews['price']<200]['price'].value_counts().sort_index().plot.line()
sns.kdeplot(first_150_reviews.query('price<200').price)

 

 我們看看上面的兩個圖片,右邊的圖片應用了kde,是否是像給第一幅圖用了海飛絲同樣,瞬間順滑了不少,也更加直觀的展現了數據的分佈和趨勢。下面我們來看看kde用於bivariate的狀況

first_150_reviews[first_150_reviews.price<200][['price','points']].dropna().sample(5000).sort_index().plot.scatter(x='price',y='points')
sns.kdeplot(first_150_reviews[first_150_reviews.price<200][['price','points']].dropna().sample(5000))

 

 第一個圖片是通常的scatter,第二幅圖是kde,越靠近圖形中間的位置,出現的機率越大。 至於哪個好,那一牛逼,大家本身內心有一把尺,不用我說了吧。哈哈

  •  box plot and violin plot

如今介紹最後一種常見的圖形,實際上是兩種圖,可是他們本質同樣,分別是box plot和violin plot。我們先看建立它們的代碼和運行結果真後在分析這兩種圖形

df = first_150_reviews[first_150_reviews.variety.isin(first_150_reviews.variety.value_counts().head(5).index)]
sns.boxplot(
        x="variety",
        y = "points",
        data = df
        )


#violin plot
#violin plot cleverly replace the box in the boxplot with a kde for the data, it is more visually enticing
sns.violinplot(
        x='variety',
        y='points',
        data = df)

 

看到上面的五光十色的圖形,是否是內心一萬隻曹尼瑪,哈哈,心想什麼玩意兒。待我慢慢來分析,首先看看左邊的圖形box plot,最下面的一條線是每個variaty相對應points的最小值,中間box有三條橫線,分別對應着該variaty下面points的25%,median,75%的值,而後box上面的最頂上的一個橫線表明着該variaty下points的最大值。右邊的violin plot其實就是對box plot的kde,更能反映出數據的分佈狀況。他們之間的對比能夠看下面這個經典的圖

 

 

總結:這節的數據可視化的內容很雜,其實若是想把數據可視化玩的轉,最重要的的捷徑就是理解數據。關於可視化的API我我的認爲是最簡單的API,並且很少,建議你們都能理解透徹。雖然可視化的內容不難,可是有不少圖形很像,可是要知道他們的不一樣,例如bar chart 和histogram,box plot和violin plot 等等,雖然看着類似,但實際上是不一樣的。就像開頭說的,這裏主要是寫的是pandas和seaborn的可視化的方法,實際中還常常須要用到底層一點的matplotlib,這裏我就不細說了,若是上面的內容能消化,以你們的能力看matplotlib的API 應該也不是問題的。

相關文章
相關標籤/搜索