您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“Python數(shù)據(jù)集的可視化技巧是什么”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“Python數(shù)據(jù)集的可視化技巧是什么”吧!
本文涉及三個(gè)實(shí)用的可視化工具:
圖形分類相關(guān)性
散點(diǎn)圖矩陣
使用Seaborn的分類散點(diǎn)圖注釋和圖注釋
總的來說,本文會(huì)教大家制作一些好看又中用的圖表。
本文將使用kaggle上的國際足聯(lián)2019年完整的球員數(shù)據(jù)集,其***版數(shù)據(jù)庫包括了每個(gè)注冊(cè)在內(nèi)的球員的詳細(xì)信息。
由于該數(shù)據(jù)集有許多列,因此我們只關(guān)注分類列和連續(xù)列的子集。
import numpy as np import pandas as pd import seaborn as sns import matplotlib.pyplot as plt %matplotlib inline # We dont Probably need the Gridlines. Do we? If yes comment this line sns.set(style="ticks") player_df = pd.read_csv("../input/data.csv") numcols = [ 'Overall', 'Potential', 'Crossing','Finishing', 'ShortPassing', 'Dribbling','LongPassing', 'BallControl', 'Acceleration', 'SprintSpeed', 'Agility', 'Stamina', 'Value','Wage'] catcols = ['Name','Club','Nationality','Preferred Foot','Position','Body Type'] # Subset the columns player_dfplayer_df = player_df[numcols+ catcols] # Few rows of data player_df.head(5)
球員數(shù)據(jù)
雖然該數(shù)據(jù)格式良好,但是因?yàn)楣べY和值列是以歐元為單位,并包含字符串,需要進(jìn)行一些預(yù)處理,才能使它們?yōu)楹罄m(xù)分析提供數(shù)值。
def wage_split(x): try: return int(x.split("K")[0][1:]) except: return 0 player_df['Wage'] = player_df['Wage'].apply(lambda x : wage_split(x)) def value_split(x): try: if 'M' in x: return float(x.split("M")[0][1:]) elif 'K' in x: return float(x.split("K")[0][1:])/1000 except: return 0 player_df['Value'] = player_df['Value'].apply(lambda x : value_split(x))
圖形分類相關(guān)性
簡單來說,相關(guān)性是衡量兩個(gè)變量如何一起運(yùn)動(dòng)的指標(biāo)。
例如,在現(xiàn)實(shí)生活中,收入與支出呈正相關(guān),其中一個(gè)變量隨著另一個(gè)變量的增加而增加。
學(xué)習(xí)成績和電子游戲的使用呈負(fù)相關(guān),其中一個(gè)變量的增加意味著另一個(gè)變量的減少。
因此如果預(yù)測(cè)變量與目標(biāo)變量呈正相關(guān)或負(fù)相關(guān),那么該變量就有研究價(jià)值。
研究不同變量之間的相關(guān)性對(duì)于理解數(shù)據(jù)非常有意義。
使用Seaborn即可輕松創(chuàng)建出相當(dāng)不錯(cuò)的關(guān)系圖。
corr = player_df.corr() g = sns.heatmap(corr, vmax=.3, center=0, square=True, linewidths=.5, cbar_kws={"shrink": .5}, annot=True, fmt='.2f', cmap='coolwarm') sns.despine() g.figure.set_size_inches(14,10) plt.show()
所有的分類變量都去哪了?
你有注意到什么問題嗎?
有問題,因?yàn)樵搱D僅計(jì)算了數(shù)值列之間的相關(guān)性。
如果目標(biāo)變量是club或position,會(huì)出現(xiàn)什么情況?
如果想得到三種不同情況之間的相關(guān)性,可使用以下相關(guān)性度量來計(jì)算。
1. 數(shù)值變量
該變量可通過Pearson相關(guān)性的方式得到,用于度量兩個(gè)變量如何一起運(yùn)動(dòng),范圍為[-1,1]。
2. 分類變量
使用克萊姆V系數(shù)來分類案例。該系數(shù)是兩個(gè)離散變量之間的相互關(guān)聯(lián),并與具有兩個(gè)或多層次的變量一起使用。它也是一個(gè)對(duì)稱的度量,因?yàn)樽兞康捻樞驘o關(guān)緊要,即克萊姆(A,B)==克萊姆(B,A)。
例如,在數(shù)據(jù)集中,Club和Nationality一定有某種關(guān)聯(lián)。
可用堆疊圖來驗(yàn)證這一點(diǎn),這是理解分類變量和分類變量間分布的一個(gè)***方法,因?yàn)樵谠摂?shù)據(jù)中有很多國籍和俱樂部,所以使用數(shù)據(jù)的子集。
只保留***的球隊(duì)(保留波爾圖足球俱樂部只是為了讓樣本更加多樣化)和最常見的國籍。
俱樂部偏好在很大程度上反映了“國籍”:了解前者有助于預(yù)測(cè)后者。
由圖可知,英國球員更可能效力于切爾西隊(duì)或曼聯(lián)隊(duì),而不是在巴塞羅那隊(duì)、拜仁慕尼黑隊(duì)或波爾圖隊(duì)。
同理,克萊姆V系數(shù)也也捕獲到了同樣的信息。
如果所有俱樂部擁有的球員的國籍比例相同,那么克萊姆V系數(shù)則為0。
如果每個(gè)俱樂部偏好單一國籍的球員,則克萊姆系數(shù)V==1,例如,所有的英國球員在曼聯(lián)隊(duì)效力,所有的德國球員在拜仁慕尼黑隊(duì)效力等等。
在所有其他情況下,范圍則為[0,1]。
3. 數(shù)值變量和分類變量
對(duì)連續(xù)分類案例使用相關(guān)比率。
在不涉及太多數(shù)學(xué)的情況下,該變量用于離散程度的衡量。
如果給定一個(gè)數(shù)字,就能找出它的類別嗎?
例如,假設(shè)數(shù)據(jù)集中有“SprintSpeed”和“Position”兩列分類,那么:
守門員:58(De Gea)、52(T. Courtois)、58(M. Neuer)、 43(G. Buffon)
中后衛(wèi):68(D. Godin)、59(V. Kompany)、73(S. Umtiti)、 75(M. Benatia)
前鋒:91(C.Ronaldo)、94(G. Bale)、80(S.Aguero)、 76(R. Lewandowski)
由上可知,這些數(shù)字很好地預(yù)測(cè)了他們所處的位置,因此相關(guān)性很高。
如果某球員沖刺速度超過85,那么該球員肯定是前鋒。
這個(gè)比率也在[0,1]之間。
執(zhí)行此操作的代碼取自dython包,代碼不會(huì)很多,最終結(jié)果如下:
player_dfplayer_df = player_df.fillna(0) results = associations(player_df,nominal_columns=catcols,return_results=True)
分類vs.分類、分類vs.數(shù)值、數(shù)值vs.數(shù)值,這些使圖表更為有趣。
很美,不是嗎?
只要看看數(shù)據(jù),就能對(duì)足球有如此多的了解,例如:
球員的位置與運(yùn)球能力高度相關(guān)??偛荒茏屆肺魈吆笮l(wèi)吧!
值與傳球和控球的相關(guān)性比運(yùn)球更高。規(guī)則是永遠(yuǎn)傳球,正如內(nèi)馬爾的傳球。
“俱樂部”和“收入”有很高的相關(guān)性并且可預(yù)測(cè)。
“體型”與“踢球偏好的腳”高度相關(guān)。這是否意味著如果某球員是瘦子,就很可能喜歡用左腳踢球?這可能沒啥實(shí)際意義,需要進(jìn)一步調(diào)查。
此外,通過這個(gè)簡單的圖表,就能找到上述這么多信息,這在沒有分類變量的典型相關(guān)圖中是見不到的。
大家可深入研究這張圖表,得到更多有意義的結(jié)果,但關(guān)鍵是圖表能讓大家在現(xiàn)實(shí)生活中更容易找到某種規(guī)律。
散點(diǎn)圖矩陣
雖然前文談到了很多相關(guān)性,但它是一個(gè)變幻無常的指標(biāo),為了讓大家理解,我們來看一個(gè)例子。
“Anscombe四重奏”由四個(gè)相關(guān)性幾乎近似于1的數(shù)據(jù)集組成,但具有非常不同的數(shù)據(jù)分布,并且在繪制時(shí)呈現(xiàn)出非常不同的效果。
Anscombe四重奏:相關(guān)性變化無常
因此,有時(shí)繪制相關(guān)數(shù)據(jù)變得至關(guān)重要,并且需要單獨(dú)查看分布。
現(xiàn)在數(shù)據(jù)集中有很多列,把它們?nèi)祭L制成圖形會(huì)很費(fèi)力。
其實(shí)只需幾行代碼就可以解決。
filtered_player_df = player_df[(player_df['Club'].isin(['FC Barcelona', 'Paris Saint-Germain', 'Manchester United', 'Manchester City', 'Chelsea', 'Real Madrid','FC Porto','FC Bayern München'])) & (player_df['Nationality'].isin(['England', 'Brazil', 'Argentina', 'Brazil', 'Italy','Spain','Germany'])) ] # Single line to create pairplot g = sns.pairplot(filtered_player_df[['Value','SprintSpeed','Potential','Wage']])
非常好,在該圖中可看到很多信息。
工資和價(jià)值高度相關(guān)。
大多數(shù)其它值也是相關(guān)的,然而“潛力”與“價(jià)值”的比的趨勢(shì)是不尋常的??梢钥吹?,當(dāng)?shù)竭_(dá)特定的潛在閥值時(shí),價(jià)值如何呈指數(shù)增長。這些信息對(duì)建模很有幫助,可以對(duì)“潛力”進(jìn)行轉(zhuǎn)換使其更具有相關(guān)性嗎?
警告:沒有分類列!
在此基礎(chǔ)上能做得更好嗎?總能做到。
g = sns.pairplot(filtered_player_df[['Value','SprintSpeed','Potential','Wage','Club']],hue = 'Club')
圖上的信息很多,只需添加“hue”參數(shù)到分類變量“club”中即可。
波爾圖隊(duì)的工資分配趨向于工資少的那一端。
該圖無法看出波爾圖隊(duì)球員價(jià)值的急劇分布,波爾圖隊(duì)的球員們總是在尋求機(jī)會(huì)。
許多粉紅點(diǎn)(代表切爾西隊(duì))在“潛力”和“工資”圖上形成了一個(gè)集群。切爾西隊(duì)有很多工資較低的高潛力球員,需要更多關(guān)注。
還可從工資/價(jià)值子圖中獲取一些信息。
年薪50萬的藍(lán)點(diǎn)是梅西。此外,比梅西更有價(jià)值的橙點(diǎn)是內(nèi)馬爾。
盡管該技巧仍然不能解決分類問題,但還有一些其它方法來研究分類變量分布,雖然是個(gè)例。
分類散點(diǎn)圖
如何查看分類數(shù)據(jù)和數(shù)字?jǐn)?shù)據(jù)之間的關(guān)系?
就像輸入名字一樣,輸入分類散點(diǎn)圖的圖片。為每個(gè)類別繪制一組點(diǎn),在y軸上稍微分散,以便于查看。
這是我們目前繪制這種關(guān)系的***方法。
g = sns.swarmplot(y = "Club", x = 'Wage', data = filtered_player_df, # Decrease the size of the points to avoid crowding size = 7) # remove the top and right line in graph sns.despine() g.figure.set_size_inches(14,10) plt.show()
分類散點(diǎn)圖
為什么不用箱形圖呢?中位數(shù)在哪?可以繪制出來嗎?當(dāng)然可以。在頂部覆蓋一個(gè)條形圖,就得到了一個(gè)好看的圖形。
g = sns.boxplot(y = "Club", x = 'Wage', data = filtered_player_df, whis=np.inf) g = sns.swarmplot(y = "Club", x = 'Wage', data = filtered_player_df, # Decrease the size of the points to avoid crowding size = 7,color = 'black') # remove the top and right line in graph sns.despine() g.figure.set_size_inches(12,8) plt.show()
有趣的分類散點(diǎn)圖+箱形圖
很好,在圖表上可看出各個(gè)點(diǎn)的分布和一些統(tǒng)計(jì)數(shù)據(jù),并能明確地了解工資差異。
圖中最右邊的點(diǎn)是梅西,這樣一來,就不用通過圖表下方的文字來說明。
該圖可用來做演示,如果老板要求把梅西寫在這張圖上,那么就可加上圖片注釋。
max_wage = filtered_player_df.Wage.max() max_wage_player = filtered_player_df[(player_df['Wage'] == max_wage)]['Name'].values[0] g = sns.boxplot(y = "Club", x = 'Wage', data = filtered_player_df, whis=np.inf) g = sns.swarmplot(y = "Club", x = 'Wage', data = filtered_player_df, # Decrease the size of the points to avoid crowding size = 7,color='black') # remove the top and right line in graph sns.despine() # Annotate. xy for coordinate. max_wage is x and 0 is y. In this plot y ranges from 0 to 7 for each level # xytext for coordinates of where I want to put my text plt.annotate(s = max_wage_player, xy = (max_wage,0), xytext = (500,1), # Shrink the arrow to avoid occlusion arrowprops = {'facecolor':'gray', 'width': 3, 'shrink': 0.03}, backgroundcolor = 'white') g.figure.set_size_inches(12,8) plt.show()
帶注釋的統(tǒng)計(jì)信息和點(diǎn)群,可用于演講中。
看看該圖下方的波爾圖隊(duì),工資預(yù)算如此之小,難以和其它高收入的球隊(duì)們競(jìng)爭。
皇馬和巴塞羅那有許多高薪球員。
曼聯(lián)的工資中位數(shù)***。
曼聯(lián)和切爾西注重平等,許多球員的工資水平都差不多。
雖然內(nèi)馬爾比梅西更受重視,但梅西和內(nèi)馬爾的工資差距巨大。
由此可知,在這個(gè)瘋狂的世界中,有些正常只是表面的。
到此,相信大家對(duì)“Python數(shù)據(jù)集的可視化技巧是什么”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。