可視化非常棒。然而,很難形成良好的可視化。

此外,將這些可視化呈現給更多的觀眾需要花費時間和精力。

我們都知道如何製作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()
所有的分類變數在哪裡
所有的分類變數在哪裡?

但是你注意到有什麼問題嗎?

是的,此圖僅計算數列之間的相關性。

如果我的目標變數是或者怎麼辦?ClubPosition?

我希望能夠在三種不同的情況下獲得相關性,並且我們使用以下相關度量來計算這些:

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.數值和分類變數

我們將相關比率用於分類連續案例。

沒有太多的數學,它是分散的衡量標準。

鑒於一個數字,我們可以找出它屬於哪個類別?

例如:

假設我們的數據集中有兩列:SprintSpeedPosition

  • 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的相關性,但具有非常不同的分布,並且在繪製時看起來非常不同。

Anscombe四重奏 - 相關性可能是善變的。
Anscombe四重奏 – 相關性可能是善變的。

因此,有時繪製相關數據變得至關重要。並單獨查看分布。

現在我們的數據集中有很多列。將它們全部繪製成圖形會非常費力。

不,這是一行代碼。

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()
Swarmplot
Swarmplot …

為什麼我不使用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()
Swarmplot+Boxplot
Swarmplot + Boxplot,有趣

非常好。我們可以在圖表上看到各個點,查看一些統計數據並明確地了解工資差異。

梅西是最右邊的一點。但是,我不應該在圖表下方的文字中告訴你。對?

該圖將在演示文稿中進行。你的老闆說。我想在這張圖上寫下梅西。進入圖片注釋

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,原文地址