同时你也会学习到一些足球相关的内容。
本文为自己个人翻译文档3 Awesome Visualization Techniques for every dataset的.Part1,如有侵权或者哪里翻译不到位的请在下方评论指出或者联系stdcoutzrh@gmail.com 。?
原文地址:[3 Awesome Visualization Techniques for every dataset]
PDF下载:[PDF DOWNLOAD]
1.综述
可视化的效果是很棒的,然而一个好的可视化是非常难做的。此外,要对更多的观众呈现这些可视化内容需要花费时间和精力。
我们都知道如何绘制条形图、散点图和柱状图,但是我们并没有花太多心思去美化它们。这降低了我们在同行和管理者心目中的可信度。你可能现在感觉不到,但是它确实发生了。
此外,我发现重用我们的代码很重要。难道每次我使用一个新的数据集时都需要重新编写代码吗?图的一些可重用思想在这可以帮助我们快速找到有关数据的信息。
在本文中,我还将讨论3个很酷的可视化工具:
- 图的类别相关性(Categorical Correlation with Graphs)
- 矩阵散点图(Pairplots)
- 使用Seaborn制作分簇散点图和图形注释(Swarmplots and Graph Annotations using Seaborn)
简而言之,这篇文章是关于有用的和可展示的图形的。
2.数据集
我将使用来自Kaggle上FIFA 19的完整选手数据集,每个选手的详细属性都登记在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)
这是一个格式良好的数据,但是我们需要对工资和值列(因为它们是欧元的,并且包含字符串)进行一些预处理,使它们成为数值,以便我们随后的分析。
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))
3.图的类别相关性
简单来说,相关性是两个变量如何一起变化的度量。例如,在现实世界中,收入和支出是正相关的。如果一个增加,另一个也增加。学习成绩和电子游戏使用率呈负相关。一个增加,另一个减少。
因此,如果我们的预测变量与我们的目标变量正相关或负相关,相关性是很有价值的。当我们试图去理解数据时研究不同变量之间的相关性是一件很有帮助的事情。
我们可以很容易地使用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()
但是你注意到什么问题了吗?
是的,此图只计算数值列之间的相关性。如果我的目标变量是俱乐部名字或职位名字呢?
我希望能够在三种不同的案例之间获得相关性,我们使用以下相关性度量来计算这些相关性:
-
1.数值变量:我们已经有了Pearson’s Correlation的形式,这是两个变量如何一起移动的一个度量。范围为[-1,1]。
-
2.类别变量:我们将用Cramér’s V来描述分类案例。它是两个离散变量之间的相互关系,用于具有两个或更多层次的变量。它是一个对称的度量,因为按变量的顺序并不重要。Cramer(A,B)==Cramer(B,A)。
例如:在我们的数据集中,俱乐部和国籍必须以某种方式相互关联。
让我们用一个叠加图来检查这一点,这是理解类别和类别变量之间分布的一个很好的方法。我们使用数据的一个子集,因为在这些数据中有许多国家和俱乐部。我们只保留最好的球队(保留波尔图只是为了样本的多样性)和最常见的国家。
俱乐部对国籍有很大的影响:了解前者会对预测后者有很大帮助。
我们可以看到一个球员如果属于英格兰,那么他更有可能在切尔西或曼联踢 球,而不是在巴塞罗那、拜仁、门臣或波尔图。
所以这里呈现了一些信息。Cramér’s V捕获了同样的信息。
如果所有的俱乐部都有相同比例的来自不同国家的球员,那么Cramér’s V值是0。如果每个俱乐部都喜欢一个单一国籍的那么Cramér’s V值是1。例如,所有的英格兰球员都在曼联踢球,所有的德国人都在拜仁慕尼黑等等。
在所有其他情况下,其范围为[0,1]。 -
3.数值变量和类别变量
我们将使用相关比来分析连续类别的案例。这是在不进行太多数学运算的情况下一种对离散度的度量。
给定一个数字,我们能找出它属于哪个类别吗?
例如:
假设我们的数据集中有两列:冲刺速度和球员位置:
守门员: 58(De Gea),52(T. Courtois), 58(M. Neuer), 43(G. Buffon)
中后卫: 68(D. Godin), 59(V. Kompany), 73(S. Umtiti), 75(M. Benatia)
前锋: 91(C.Ronaldo), 94(G. Bale), 80(S.Aguero), 76(R. Lewandowski)
如您所见,这些数字对它们落入的存储桶具有很好的预测性,因此具有很高的相关性。
如果我知道一名球员的冲刺速度超过85,我可以肯定地说这名球员是一名前锋。该数值也在[0,1]范围内。
下面的代码取自Dython包。我不会在代码中写太多东西,你可以在我的内核中找到。
player_df = player_df.fillna(0)
results = associations(player_df,nominal_columns=catcols,return_results=True)
最终结果如下:
它是不是很漂亮?
我们只需看看这些数据就可以对足球有如此多的了解。例如:
- 球员的位置与运球能力高度相关。你不会在自家后场和梅西搭档一起踢球。对吗?
- 与运球相比,传球和控球权相关的时候价值更高。规律是永远传球。内马尔,我正看着你。
- 俱乐部与工资有很高的相关性,期待一下吧。
- 体型与首选脚高度相关。这是否意味着如果你很瘦你就很可能是左脚型选手?这没多大意义。我们可以进一步调查。
此外,我们可以从这个简单的图中找到很多没有类别变量的典型相关图体现不出来的信息。我把它留在这里,人们可以更深入地观察图表并找到更有意义的结果,但关键是这使得我们更容易找到生活的方式。
第一部分完。