同时学习一些关于足球的知识
可视化效果很棒。 但是,很难制作出良好的可视化效果。
此外,要将这些可视化呈现给更多的受众,需要花费时间和精力。
我们都知道如何制作条形图,散点图和直方图,但是我们并没有花太多精力来美化它们。
这伤害了我们-我们在同行和管理人员中的信誉。 您现在不会感觉到,但是它确实发生了。
另外,我发现重用代码非常重要。 每次访问新数据集时,我都需要重新开始吗? 图的一些可重用概念可以帮助我们快速找到有关数据的信息。
在这篇文章中,我还将讨论3种很酷的视觉工具:
- 与图的分类相关性
- 配对图 pairplot
- 使用Seaborn的Swarmplots和图注解。
简而言之,这篇文章是关于有用和可表达的图形的。
我将在kaggle上使用FIFA19完整球员数据集中的数据-最新FIFA19数据库中注册的每个球员的详细属性。
由于数据集有很多列,因此我们将只关注分类和连续列的子集。
import numpy as npimport pandas as pdimport seaborn as snsimport matplotlib.pyplot as plt%matplotlib inline# We dont Probably need the Gridlines. Do we? If yes comment this linesns.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 columnsplayer_df = player_df[numcols+ catcols]# Few rows of dataplayer_df.head(5)
这是一个格式良好的数据,但是我们需要对工资Wage和身价Value列(因为它们在欧元中并且包含字符串)进行一些预处理,以使其成为数字,以便我们进行后续分析。
def wage_split(x): try: return int(x.split("K")[0][1:]) except: return 0player_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 0player_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()
但是,您注意到任何问题吗?
是的,此图仅计算"数值"列之间的相关性。
如果我的目标变量是俱乐部或职位怎么办?
我希望能够获得三种不同情况之间的相关性,并且我们使用以下相关性度量来计算这些相关性:
1.数值变量
我们已经采用了Pearson的相关性形式,可以衡量两个变量如何一起移动。 范围是[-1,1]
2.类别变量
对于类别-类别案例,我们将使用Cramer’s V 。 它是两个离散变量的互相关,并与具有两个或多个级别的变量一起使用。 这是一个对称的度量,因为按变量顺序无所谓。 Cramer(A,B)== Cramer(B,A)。
例如:在我们的数据集中,俱乐部和国籍必须以某种方式关联。
让我们使用堆叠图进行检查,这是了解分类变量与分类变量之间分布的一种极好的方法。 我们使用数据的子集,因为此数据中有很多国籍和俱乐部。
我们只保留最好的团队(保留波尔图足球俱乐部只是为了获得更多样本和多样性)和最常见的国籍。
俱乐部的偏好在很大程度上和国籍相关:了解前者有助于预测后者。
我们可以看到一个球员是否属于英格兰,那么他更有可能在切尔西或曼联踢球,而不是在巴塞罗那足球俱乐部,拜仁慕尼黑或波尔图踢球。
所以这里有一些信息。 Cramer’s V 捕获相同的信息。
如果所有俱乐部的每个国籍的球员比例相同,那么Cramer’s 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)
它不漂亮吗?
仅通过查看这些数据,我们就可以对足球有很多了解。 例如:
- 运动员的位置与运球能力高度相关。 您不会在后面玩梅西。 对?
- 传球和控球相比,运球的价值更重要。 规则是总是传球。 内马尔,我在看着你。
- 俱乐部和工资具有较高的相关性。 可以预料的。
- 身体类型和首选脚部高度相关。 这是否意味着如果您是精益,那么您很可能是左撇子? 没什么意义。 人们可以进一步调查。
此外,我们可以通过这个简单的图表找到大量信息,而在没有分类变量的典型相关图中看不到该信息。
我把它留在这里。 人们可以更多地查看图表,并找到更有意义的结果,但重点是,这使生活变得更容易。
配对图 Pairplot
虽然我谈论了很多相关性,但这是一个善变的指标。
为了理解我的意思,让我们看一个例子。
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 pairplotg = 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
如何看待分类数据与数值数据之间的关系?
输入图片Swarmplot,就像它们的名字一样。 为每个类别绘制了大量的点,并在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 graphsns.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 graphsns.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 graphsns.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 textplt.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中将图表元素彼此叠加。
如果您喜欢这篇文章,请点赞。
(本文翻译自Rahul Agarwal的文章《3 Awesome Visualization Techniques for every dataset》,参考:https://towardsdatascience.com/3-awesome-visualization-techniques-for-every-dataset-9737eecacbe8)