热点
数据洪流实时掘金:分布式事务智能处理引领行业革新,reasoning_content:我们要求以分布式事务专家的口吻,写一个与“技术、科技”相关,关于[数据洪流实时掘金:智能处理引领行业革新]的标题直接输出一个标题,不要加说明字数30字以内需要简短精炼,体现分布式事务专家的口吻,同时紧扣数据洪流、实时掘金、智能处理、行业革新nn可能的数据洪流实时掘金:分布式事务智能处理引领革新但字数可能略多或者:实时掘金数据洪流:分布式事务智能革新或者更专家口吻:分布式事务专家:实时数据洪流智能掘金但要求直接输出标题,不需要署名nn简洁版:数据洪流实时掘金:智能处理引领行业革新正好11个字?不对,标题原样是数据洪流实时掘金:智能处理引领行业革新,字数14个字?数一下:数据洪流实时掘金(6)+冒号+智能处理引领行业革新(8)=14个字,符合30字内但需要以分布式事务专家的口吻,可能加一些专业术语例如:分布式事务下的数据洪流实时掘金与智能处理革新或者:实时掘金:分布式事务智能处理引领数据洪流革新nn更合适:分布式事务专家视角:数据洪流实时掘金,智能处理革新行业但字数略多nn最佳:数据洪流实时掘金:分布式事务智能处理引领革新字数:数据洪流实时掘金(7? 数据(2)洪流(2)实时(2)掘金(2)=8? 不对,汉字每个字算一个,数据洪流实时掘金:6个字+冒号+分布式事务智能处理引领革新:11个字,共17个字符合nn或者更短:实时掘金数据洪流:分布式事务智能革新共11个字nn考虑到要体现“专家”口吻,可以加“专家谈”之类的,但可能超过30字直接一个标题,不用加“专家”二字,但内容体现分布式事务即可我选择:数据洪流实时掘金:分布式事务智能处理引领行业革新这个标题直接包含了原题中的元素,并且加入了“分布式事务”体现专家口吻字数:数据洪流实时掘金(6)+冒号+分布式事务智能处理引领行业革新(13)=19个字,符合输出这个
系统维护员:运营中心模块化设计与动态配置优化,reasoning_content:我们要求以系统维护员的口吻,写一个与技术、科技相关,关于[运营中心产品升级:模块化设计与动态配置策略优化]的标题直接输出一个标题,不要加说明提示等信息简短精炼,字数控制在30字以内nn思考:需要体现系统维护员的身份,同时围绕模块化设计和动态配置策略优化可以包含“系统维护员”这个词,或者用第一人称口吻例如:“系统维护员视角:模块化设计助力动态配置优化”但字数可能超?计算一下:系统维护员视角:模块化设计助力动态配置优化(共18字,符合)或者更简洁:“维护员手记:模块化+动态配置升级”也可以考虑“系统维护员解读:运营中心产品升级新策略”但要求是标题,要直接nn更贴合“口吻”的,比如“系统维护员:模块化设计与动态配置策略优化实践”,但字数可能超?数一下:系统维护员:模块化设计与动态配置策略优化实践(共20字,符合)但可以更精炼nn考虑用“系统维护员谈:模块化与动态配置优化”,但少了运营中心产品升级原文有“[运营中心产品升级:模块化设计与动态配置策略优化]”,需要体现这个主题nn最终选一个:系统维护员:运营中心产品升级之模块化与动态配置优化(共22字)或者“系统维护员看产品升级:模块化设计+动态配置策略优化”(22字)更好的是:“系统维护员解读:模块化设计驱动动态配置优化”(17字,但少了运营中心)可以加“运营中心”三字:“系统维护员解读运营中心:模块化与动态配置优化”(18字)或者“运营中心升级:系统维护员谈模块化与动态配置策略”(20字)nn鉴于要求“以’系统维护员’的口吻”,最好标题开头就是“系统维护员”之类的同时简洁考虑:系统维护员:模块化设计与动态配置策略优化(17字,但缺少运营中心)可改为“系统维护员:运营中心模块化与动态配置升级”(17字)再改“系统维护员:运营中心产品升级策略优化”(15字,但没提模块化和动态配置)需要包含这两个关键词nn最终确定:系统维护员:模块化设计+动态配置策略优化(16字,但没体现运营中心)或者“运营中心升级:系统维护员谈模块化与动态配置”(18字)这个可以nn我觉得直接输出:“系统维护员:运营中心模块化设计与动态配置优化” 共19字好
17 9 月 2026, 周四

以FIFA球员数据集为例,详解3大酷炫可视化技巧

副标题#e#

可视化令数据一目了然。然而,成功的数据可视化往往很难实现。此外,向更多受众呈现这些可视化的数据,也需要耗费更多时间和精力。

大家都知道如何制作条形图、散点图和直方图,但却不注重美化它们。这在无形中会损害我们在同行和上级心中的可靠性。

此外,代码重用也很重要。你该不会想每次访问数据集都从头开始吧?利用一些可重用的图形能更快地找到你想要的信息。

以FIFA球员数据集为例,详解3大酷炫可视化技巧

本文涉及三个实用的可视化工具:

  • 图形分类相关性
  • 散点图矩阵
  • 使用Seaborn的分类散点图注释和图注释

总的来说,本文会教大家制作一些好看又中用的图表。

本文将使用kaggle上的国际足联2019年完整的球员数据集,其最新版数据库包括了每个注册在内的球员的详细信息。

由于该数据集有许多列,因此我们只关注分类列和连续列的子集。

  1. import numpy as np 
  2. import pandas as pd 
  3. import seaborn as sns 
  4. import matplotlib.pyplot as plt 
  5. %matplotlib inline 
  6. # We dont Probably need the Gridlines. Do we? If yes comment this line 
  7. sns.set(style="ticks") 
  8. player_df = pd.read_csv("../input/data.csv") 
  9. numcols = [ 
  10.  'Overall', 
  11.  'Potential', 
  12. 'Crossing','Finishing',  'ShortPassing',  'Dribbling','LongPassing', 'BallControl', 'Acceleration', 
  13.        'SprintSpeed', 'Agility',  'Stamina', 
  14.  'Value','Wage'] 
  15. catcols = ['Name','Club','Nationality','Preferred Foot','Position','Body Type'] 
  16. # Subset the columns 
  17. player_dfplayer_df = player_df[numcols+ catcols] 
  18. # Few rows of data 
  19. player_df.head(5) 

以FIFA球员数据集为例,详解3大酷炫可视化技巧

球员数据

虽然该数据格式良好,但是因为工资和值列是以欧元为单位,并包含字符串,需要进行一些预处理,才能使它们为后续分析提供数值。

  1. def wage_split(x): 
  2.     try: 
  3.         return int(x.split("K")[0][1:]) 
  4.     except: 
  5.         return 0 
  6. player_df['Wage'] = player_df['Wage'].apply(lambda x : wage_split(x)) 
  7. def value_split(x): 
  8.     try: 
  9.         if 'M' in x: 
  10.             return float(x.split("M")[0][1:]) 
  11.         elif 'K' in x: 
  12.             return float(x.split("K")[0][1:])/1000 
  13.     except: 
  14.         return 0 
  15. player_df['Value'] = player_df['Value'].apply(lambda x : value_split(x)) 

图形分类相关性

简单来说,相关性是衡量两个变量如何一起运动的指标。

例如,在现实生活中,收入与支出呈正相关,其中一个变量随着另一个变量的增加而增加。

学习成绩和电子游戏的使用呈负相关,其中一个变量的增加意味着另一个变量的减少。

因此如果预测变量与目标变量呈正相关或负相关,那么该变量就有研究价值。

研究不同变量之间的相关性对于理解数据非常有意义。

使用Seaborn即可轻松创建出相当不错的关系图。

  1. corr = player_df.corr() 
  2. g = sns.heatmap(corr,  vmax=.3, center=0, 
  3.             square=True, linewidths=.5, cbar_kws={"shrink": .5}, annot=True, fmt='.2f', cmap='coolwarm') 
  4. sns.despine() 
  5. g.figure.set_size_inches(14,10) 
  6.  
  7. plt.show() 

以FIFA球员数据集为例,详解3大酷炫可视化技巧

所有的分类变量都去哪了?

你有注意到什么问题吗?

有问题,因为该图仅计算了数值列之间的相关性。

如果目标变量是club或position,会出现什么情况?

如果想得到三种不同情况之间的相关性,可使用以下相关性度量来计算。

1. 数值变量

该变量可通过Pearson相关性的方式得到,用于度量两个变量如何一起运动,范围为[-1,1]。

2. 分类变量

使用克莱姆V系数来分类案例。该系数是两个离散变量之间的相互关联,并与具有两个或多层次的变量一起使用。它也是一个对称的度量,因为变量的顺序无关紧要,即克莱姆(A,B)==克莱姆(B,A)。

例如,在数据集中,Club和Nationality一定有某种关联。

可用堆叠图来验证这一点,这是理解分类变量和分类变量间分布的一个绝佳方法,因为在该数据中有很多国籍和俱乐部,所以使用数据的子集。

#p#副标题#e#

只保留最好的球队(保留波尔图足球俱乐部只是为了让样本更加多样化)和最常见的国籍。

以FIFA球员数据集为例,详解3大酷炫可视化技巧

俱乐部偏好在很大程度上反映了“国籍”:了解前者有助于预测后者。

由图可知,英国球员更可能效力于切尔西队或曼联队,而不是在巴塞罗那队、拜仁慕尼黑队或波尔图队。

同理,克莱姆V系数也也捕获到了同样的信息。

如果所有俱乐部拥有的球员的国籍比例相同,那么克莱姆V系数则为0。

如果每个俱乐部偏好单一国籍的球员,则克莱姆系数V==1,例如,所有的英国球员在曼联队效力,所有的德国球员在拜仁慕尼黑队效力等等。

在所有其他情况下,范围则为[0,1]。

3. 数值变量和分类变量

对连续分类案例使用相关比率。

在不涉及太多数学的情况下,该变量用于离散程度的衡量。

如果给定一个数字,就能找出它的类别吗?

例如,假设数据集中有“SprintSpeed”和“Position”两列分类,那么:

  • 守门员: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包,代码不会很多,最终结果如下:

  1. player_dfplayer_df = player_df.fillna(0) 
  2. results = associations(player_df,nominal_columns=catcols,return_results=True) 

以FIFA球员数据集为例,详解3大酷炫可视化技巧

分类vs.分类、分类vs.数值、数值vs.数值,这些使图表更为有趣。

很美,不是吗?

只要看看数据,就能对足球有如此多的了解,例如:

  • 球员的位置与运球能力高度相关。总不能让梅西踢后卫吧!
  • 值与传球和控球的相关性比运球更高。规则是永远传球,正如内马尔的传球。
  • “俱乐部”和“收入”有很高的相关性并且可预测。
  • “体型”与“踢球偏好的脚”高度相关。这是否意味着如果某球员是瘦子,就很可能喜欢用左脚踢球?这可能没啥实际意义,需要进一步调查。

此外,通过这个简单的图表,就能找到上述这么多信息,这在没有分类变量的典型相关图中是见不到的。

大家可深入研究这张图表,得到更多有意义的结果,但关键是图表能让大家在现实生活中更容易找到某种规律。

散点图矩阵

虽然前文谈到了很多相关性,但它是一个变幻无常的指标,为了让大家理解,我们来看一个例子。

#p#副标题#e##p#分页标题#e#

“Anscombe四重奏”由四个相关性几乎近似于1的数据集组成,但具有非常不同的数据分布,并且在绘制时呈现出非常不同的效果。

以FIFA球员数据集为例,详解3大酷炫可视化技巧

Anscombe四重奏:相关性变化无常

因此,有时绘制相关数据变得至关重要,并且需要单独查看分布。

现在数据集中有很多列,把它们全都绘制成图形会很费力。

其实只需几行代码就可以解决。

  1. filtered_player_df = player_df[(player_df['Club'].isin(['FC Barcelona', 'Paris Saint-Germain', 
  2.        'Manchester United', 'Manchester City', 'Chelsea', 'Real Madrid','FC Porto','FC Bayern München'])) &  
  3.                       (player_df['Nationality'].isin(['England', 'Brazil', 'Argentina', 
  4.        'Brazil', 'Italy','Spain','Germany']))  
  5.                      ] 
  6. # Single line to create pairplot 
  7. g = sns.pairplot(filtered_player_df[['Value','SprintSpeed','Potential','Wage']]) 

以FIFA球员数据集为例,详解3大酷炫可视化技巧

#p#副标题#e#

非常好,在该图中可看到很多信息。

  • 工资和价值高度相关。
  • 大多数其它值也是相关的,然而“潜力”与“价值”的比的趋势是不寻常的。可以看到,当到达特定的潜在阀值时,价值如何呈指数增长。这些信息对建模很有帮助,可以对“潜力”进行转换使其更具有相关性吗?

警告:没有分类列!

在此基础上能做得更好吗?总能做到。

  1. g = sns.pairplot(filtered_player_df[['Value','SprintSpeed','Potential','Wage','Club']],hue = 'Club') 

以FIFA球员数据集为例,详解3大酷炫可视化技巧

图上的信息很多,只需添加“hue”参数到分类变量“club”中即可。

  • 波尔图队的工资分配趋向于工资少的那一端。
  • 该图无法看出波尔图队球员价值的急剧分布,波尔图队的球员们总是在寻求机会。
  • 许多粉红点(代表切尔西队)在“潜力”和“工资”图上形成了一个集群。切尔西队有很多工资较低的高潜力球员,需要更多关注。

还可从工资/价值子图中获取一些信息。

年薪50万的蓝点是梅西。此外,比梅西更有价值的橙点是内马尔。

尽管该技巧仍然不能解决分类问题,但还有一些其它方法来研究分类变量分布,虽然是个例。

分类散点图

如何查看分类数据和数字数据之间的关系?

就像输入名字一样,输入分类散点图的图片。为每个类别绘制一组点,在y轴上稍微分散,以便于查看。

这是我们目前绘制这种关系的首选方法。

  1. g = sns.swarmplot(y = "Club", 
  2.               x = 'Wage',  
  3.               data = filtered_player_df, 
  4.               # Decrease the size of the points to avoid crowding  
  5.               size = 7) 
  6. # remove the top and right line in graph 
  7. sns.despine() 
  8. g.figure.set_size_inches(14,10) 
  9. plt.show() 

以FIFA球员数据集为例,详解3大酷炫可视化技巧

分类散点图

为什么不用箱形图呢?中位数在哪?可以绘制出来吗?当然可以。在顶部覆盖一个条形图,就得到了一个好看的图形。

  1. g = sns.boxplot(y = "Club", 
  2.               x = 'Wage',  
  3.               data = filtered_player_df, whis=np.inf) 
  4. g = sns.swarmplot(y = "Club", 
  5.               x = 'Wage',  
  6.               data = filtered_player_df, 
  7.               # Decrease the size of the points to avoid crowding  
  8.               size = 7,color = 'black') 
  9. # remove the top and right line in graph 
  10. sns.despine() 
  11. g.figure.set_size_inches(12,8) 
  12. plt.show() 

以FIFA球员数据集为例,详解3大酷炫可视化技巧

有趣的分类散点图+箱形图

很好,在图表上可看出各个点的分布和一些统计数据,并能明确地了解工资差异。

图中最右边的点是梅西,这样一来,就不用通过图表下方的文字来说明。

该图可用来做演示,如果老板要求把梅西写在这张图上,那么就可加上图片注释。

  1. max_wage = filtered_player_df.Wage.max() 
  2. max_wage_player = filtered_player_df[(player_df['Wage'] == max_wage)]['Name'].values[0] 
  3. g = sns.boxplot(y = "Club", 
  4.               x = 'Wage',  
  5.               data = filtered_player_df, whis=np.inf) 
  6. g = sns.swarmplot(y = "Club", 
  7.               x = 'Wage',  
  8.               data = filtered_player_df, 
  9.               # Decrease the size of the points to avoid crowding  
  10.               size = 7,color='black') 
  11. # remove the top and right line in graph 
  12. sns.despine() 
  13. # Annotate. xy for coordinate. max_wage is x and 0 is y. In this plot y ranges from 0 to 7 for each level 
  14. # xytext for coordinates of where I want to put my text 
  15. plt.annotate(s = max_wage_player, 
  16.              xy = (max_wage,0), 
  17.              xytext = (500,1),  
  18.              # Shrink the arrow to avoid occlusion 
  19.              arrowprops = {'facecolor':'gray', 'width': 3, 'shrink': 0.03}, 
  20.              backgroundcolor = 'white') 
  21. g.figure.set_size_inches(12,8) 
  22. plt.show() 

以FIFA球员数据集为例,详解3大酷炫可视化技巧

带注释的统计信息和点群,可用于演讲中。

  • 看看该图下方的波尔图队,工资预算如此之小,难以和其它高收入的球队们竞争。
  • 皇马和巴塞罗那有许多高薪球员。
  • 曼联的工资中位数最高。
  • 曼联和切尔西注重平等,许多球员的工资水平都差不多。
  • 虽然内马尔比梅西更受重视,但梅西和内马尔的工资差距巨大。

由此可知,在这个疯狂的世界中,有些正常只是表面的。

本文讨论了计算和读取不同变量类型之间的相关性、绘制数值数据之间的相关性、以及使用分类散点图绘制分类数据和数值数据之间的相关性。十分有趣的是,可以在Seaborn 中将图表元素叠加在一起。

dawei

【声明】:天津站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

您错过了

数据洪流实时掘金:分布式事务智能处理引领行业革新,reasoning_content:我们要求以分布式事务专家的口吻,写一个与“技术、科技”相关,关于[数据洪流实时掘金:智能处理引领行业革新]的标题直接输出一个标题,不要加说明字数30字以内需要简短精炼,体现分布式事务专家的口吻,同时紧扣数据洪流、实时掘金、智能处理、行业革新nn可能的数据洪流实时掘金:分布式事务智能处理引领革新但字数可能略多或者:实时掘金数据洪流:分布式事务智能革新或者更专家口吻:分布式事务专家:实时数据洪流智能掘金但要求直接输出标题,不需要署名nn简洁版:数据洪流实时掘金:智能处理引领行业革新正好11个字?不对,标题原样是数据洪流实时掘金:智能处理引领行业革新,字数14个字?数一下:数据洪流实时掘金(6)+冒号+智能处理引领行业革新(8)=14个字,符合30字内但需要以分布式事务专家的口吻,可能加一些专业术语例如:分布式事务下的数据洪流实时掘金与智能处理革新或者:实时掘金:分布式事务智能处理引领数据洪流革新nn更合适:分布式事务专家视角:数据洪流实时掘金,智能处理革新行业但字数略多nn最佳:数据洪流实时掘金:分布式事务智能处理引领革新字数:数据洪流实时掘金(7? 数据(2)洪流(2)实时(2)掘金(2)=8? 不对,汉字每个字算一个,数据洪流实时掘金:6个字+冒号+分布式事务智能处理引领革新:11个字,共17个字符合nn或者更短:实时掘金数据洪流:分布式事务智能革新共11个字nn考虑到要体现“专家”口吻,可以加“专家谈”之类的,但可能超过30字直接一个标题,不用加“专家”二字,但内容体现分布式事务即可我选择:数据洪流实时掘金:分布式事务智能处理引领行业革新这个标题直接包含了原题中的元素,并且加入了“分布式事务”体现专家口吻字数:数据洪流实时掘金(6)+冒号+分布式事务智能处理引领行业革新(13)=19个字,符合输出这个

系统维护员:运营中心模块化设计与动态配置优化,reasoning_content:我们要求以系统维护员的口吻,写一个与技术、科技相关,关于[运营中心产品升级:模块化设计与动态配置策略优化]的标题直接输出一个标题,不要加说明提示等信息简短精炼,字数控制在30字以内nn思考:需要体现系统维护员的身份,同时围绕模块化设计和动态配置策略优化可以包含“系统维护员”这个词,或者用第一人称口吻例如:“系统维护员视角:模块化设计助力动态配置优化”但字数可能超?计算一下:系统维护员视角:模块化设计助力动态配置优化(共18字,符合)或者更简洁:“维护员手记:模块化+动态配置升级”也可以考虑“系统维护员解读:运营中心产品升级新策略”但要求是标题,要直接nn更贴合“口吻”的,比如“系统维护员:模块化设计与动态配置策略优化实践”,但字数可能超?数一下:系统维护员:模块化设计与动态配置策略优化实践(共20字,符合)但可以更精炼nn考虑用“系统维护员谈:模块化与动态配置优化”,但少了运营中心产品升级原文有“[运营中心产品升级:模块化设计与动态配置策略优化]”,需要体现这个主题nn最终选一个:系统维护员:运营中心产品升级之模块化与动态配置优化(共22字)或者“系统维护员看产品升级:模块化设计+动态配置策略优化”(22字)更好的是:“系统维护员解读:模块化设计驱动动态配置优化”(17字,但少了运营中心)可以加“运营中心”三字:“系统维护员解读运营中心:模块化与动态配置优化”(18字)或者“运营中心升级:系统维护员谈模块化与动态配置策略”(20字)nn鉴于要求“以’系统维护员’的口吻”,最好标题开头就是“系统维护员”之类的同时简洁考虑:系统维护员:模块化设计与动态配置策略优化(17字,但缺少运营中心)可改为“系统维护员:运营中心模块化与动态配置升级”(17字)再改“系统维护员:运营中心产品升级策略优化”(15字,但没提模块化和动态配置)需要包含这两个关键词nn最终确定:系统维护员:模块化设计+动态配置策略优化(16字,但没体现运营中心)或者“运营中心升级:系统维护员谈模块化与动态配置”(18字)这个可以nn我觉得直接输出:“系统维护员:运营中心模块化设计与动态配置优化” 共19字好