可視化非常棒。然而,很難形成良好的可視化。
此外,將這些可視化呈現給更多的觀眾需要花費時間和精力。
我們都知道如何製作Bar-Plots,Scatter Plots和Histograms,但我們並沒有太注意美化它們。
這會傷害我們 – 我們與同行和經理的信譽。你現在感覺不到,但它發生了。
此外,我發現重用我的代碼至關重要。我每次訪問新數據集時都需要重新開始嗎?一些可重複使用的圖表,可以幫助我們找到有關數據FAST的信息。
在這篇文章中,我還將討論3種很酷的可視化工具:
- 與圖形的分類相關,
- Pairplots,
- 使用Seaborn的Swarmplots和Graph Annotations。
簡而言之,這篇文章是關於有用和可呈現的圖表。
我將使用來自FIFA 19完整播放器數據集的數據來討論kaggle - 在最新版FIFA 19數據庫中註冊的每個玩家的詳細屬性。
由於數據集有很多列,因此我們只關注分類和連續列的子集。
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_df = player_df[numcols+ catcols]
# Few rows of data
player_df.head(5)
這是一個格式很好的數據,但我們需要對Wage和Value列進行一些預處理(因為它們在Euro中並包含字符串),以使它們成為我們後續分析的數字。
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))
與圖形的分類相關
簡單來說,相關性是兩個變量如何一起移動的度量。
例如,在現實世界中,收入和支出是正相關的。如果一個增加另一個也增加。
學業表現和視頻遊戲的使用是負相關的。增加一個預測另一個減少。
因此,如果我們的預測變量與我們的目標變量正相關或負相關,那麼它是有價值的。
當我們試圖理解我們的數據時,不同變量之間的相關性是一件非常好的事情。
我們可以輕鬆地使用Seaborn創建一個非常好的相關圖。
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()
但是你注意到有什麼問題嗎?
是的,此圖僅計算數列之間的相關性。
如果我的目標變量是或者怎麼辦?Club
Position?
我希望能夠在三種不同的情況下獲得相關性,並且我們使用以下相關度量來計算這些:
1.數值變量
我們已經以Pearson的相關性的形式得到了這個,它是兩個變量如何一起移動的度量。這個範圍從[-1,1]
2.分類變量
我們將使用Cramer的V作為分類 – 分類案例。它是兩個離散變量的相互關係,並與具有兩個或更多個級別的變量一起使用。它是一個對稱的度量,因為變量的順序無關緊要。Cramer(A,B)== Cramer(B,A)。
例如:在我們的數據集,Club
並且Nationality
必須以某種方式相關。
讓我們使用堆疊圖檢查這一點,這是理解分類變量和分類變量之間分配的絕佳方法。我們使用一部分數據,因為這些數據中有很多國籍和俱樂部。
我們只保留最好的團隊(保持FC波爾圖只是為了更加多樣化的樣本)和最常見的國籍。
俱樂部的偏好相當於國籍:了解前者對預測後者有很大幫助。
我們可以看出一名球員是否屬於英格蘭隊,他更有可能在切爾西隊或曼聯隊比賽,而不是在巴塞羅那隊或拜仁慕尼黑隊或波爾圖隊。
所以這裡有一些信息。Cramer’s V捕獲相同的信息。
如果所有俱樂部擁有來自各個國家的球員比例相同,那麼Cramer的V就是0。
例如,如果每個俱樂部都喜歡單一國籍Cramer’s V == 1,那麼所有英格蘭球員都會在曼聯,拜仁慕尼黑的全德國球員等等。
在所有其他情況下,其範圍為[0,1]
3.數值和分類變量
我們將相關比率用於分類連續案例。
沒有太多的數學,它是分散的衡量標準。
鑒於一個數字,我們可以找出它屬於哪個類別?
例如:
假設我們的數據集中有兩列:SprintSpeed
和Position
:
- GK: 58(De Gea),52(T。Courtois),58(M.Neuer),43(G。Buffon)
- CB: 68(D。Godin),59(V。Kompany),73(S.Umtiti),75(M.Benatia)
- ST: 91(C.Ronaldo),94(G.Bale),80(S.Aguero),76(R.Lewandowski)
正如您所看到的,這些數字可以預測它們所涉及的桶,因此相關比率很高。
如果我知道衝刺速度超過85,我肯定可以說這個玩家在ST玩。
該比率也在[0,1]的範圍內
執行此操作的代碼取自dython包。我不會在代碼中寫太多,你可以在我的Kaggle內核中找到它。最終結果如下:
player_df = player_df.fillna(0)
results = associations(player_df,nominal_columns=catcols,return_results=True)
不是很漂亮嗎?
通過查看這些數據,我們可以了解足球。例如:
- 球員的位置與運球能力高度相關。你不會在後面打梅西。對?
- 與傳球和球控制相比,價值與運球相關性更高。規則是始終傳球。內馬爾我在看着你。
- 俱樂部和工資有很高的相關性。可以預料。
- 身體類型和首選腳是高度相關的。這是否意味着如果你是精益,你很可能是左腳?沒有多大意義。人們可以進一步調查。
此外,我們可以通過這個簡單的圖表找到這麼多信息,這在沒有分類變量的典型相關圖中是不可見的。
我把它放在這裡 人們可以更多地了解圖表並找到更有意義的結果,但重點是這使得生活更容易找到模式。
Pairplots
雖然我談了很多相關性,但這是一個變化無常的指標。
要理解我的意思,讓我們看一個例子。
Anscombe的四重奏包括四個數據集,它們具有幾乎相同的1的相關性,但具有非常不同的分布,並且在繪製時看起來非常不同。
因此,有時繪製相關數據變得至關重要。並單獨查看分布。
現在我們的數據集中有很多列。將它們全部繪製成圖形會非常費力。
不,這是一行代碼。
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']])
非常好。我們在這張圖中可以看到這麼多。
- 工資和價值高度相關。
- 大多數其他值也是相關的。然而,潛在與價值的趨勢是不尋常的。我們可以看到當我們達到特定的潛在閾值時,價值如何呈指數級增長。此信息可能有助於建模。可以對潛力進行一些轉換以使其更具相關性嗎?
警告:沒有分類列。
我們可以做得更好嗎?我們永遠都可以。
g = sns.pairplot(filtered_player_df[['Value','SprintSpeed','Potential','Wage','Club']],hue = 'Club')
更多信息。只需將hue
參數添加為分類變量即可Club
。
- 波爾圖的工資分布過於偏向下方。
- 我不認為波爾圖球員的價值分布很大。波爾圖的球員總是在尋找機會。
- 看看很多粉紅點(切爾西)如何在潛力與工資圖上形成一個集群。切爾西有很多高潛力球員,工資較低。需要更多的關注。
我已經知道工資/價值子圖中的一些要點。
工資500k的藍點是梅西。此外,比梅西更有價值的橙色點是內馬爾。
雖然這個hack仍然無法解決分類問題,但我有一些很酷的東西來研究分類變量分布。雖然個別。
SwarmPlots
如何查看分類數據和數值數據之間的關係?
進入圖片Swarmplots,就像他們的名字一樣。為每個類別繪製一組點,在y軸上稍微分散,以便更容易看到。
他們是我目前最喜歡繪製這種關係的人。
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()
為什麼我不使用Boxplots?中位數在哪裡?我能描繪一下嗎?明顯。在頂部覆蓋條形圖,我們有一個很好看的圖形。
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()
非常好。我們可以在圖表上看到各個點,查看一些統計數據並明確地了解工資差異。
梅西是最右邊的一點。但是,我不應該在圖表下方的文字中告訴你。對?
該圖將在演示文稿中進行。你的老闆說。我想在這張圖上寫下梅西。進入圖片注釋。
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()
- 在那裡看波爾圖。與如此小的工資預算的巨頭競爭。
- 真實和巴塞羅那的這麼多高薪球員。
- 曼徹斯特城的工資中位數最高。
- 曼聯和切爾西相信平等。許多球員聚集在大致相同的工資水平。
- 我很高興雖然內馬爾比梅西更有價值,但梅西和內馬爾的工資差別很大。
在這個瘋狂的世界中,似乎是正常的。
結論
所以回顧一下,在這篇文章中,我們討論了計算和讀取不同變量類型之間的相關性,繪製數值數據之間的相關性以及使用Swarmplots繪製分類數據和數值數據。我喜歡我們如何在Seaborn中將圖表元素疊加在一起。
此外,如果您想了解有關可視化的更多信息,我想提供一個關於數據可視化的優秀課程,並應用密歇根大學的繪圖,這是一個非常好的數據科學專業化的一部分,本身就是Python。看看吧
原文轉自towardsdatascience,原文地址
Comments