新闻中心

数据分析实例——足球运动员数据集(1)(足球运动员数据统计图)

2023-08-22
浏览次数:
返回列表

又开始做实例了~在本次数据集中,包含了2017年所有活跃的足球运动员的个人数据,包括身高体重等基本数据,以及力量、速度、技巧等多个指标。C罗、梅西、内马尔,到底谁比较厉害呢?答案我们可以从数据中获得。(有意思~)

数据来源:

本次数据集的来源是kesci,提供者是Ustinian,想自己动手试试的同学可以去了解一下~

和鲸社区 - Kesci.comwww.kesci.com/home/dataset/5e79c46b98d4a8002d2cb73c/document

下面开始我们的实例学习之路~

一、了解数据集

下面是和鲸社区中,对数据集的描述,主要包括了:数据集的主要内容、以及数据内的各个标签的中文注释。

(1)数据内容:

2017年所有活跃的足球运动员。

(2)数据说明(标签名):

Name 姓名

Nationality 国籍

National_Position 国家队位置

National_Kit 国家队号码

Club 所在俱乐部

Club_Position 所在俱乐部位置

Club_Kit 俱乐部号码

Club_Joining 加入俱乐部时间

Contract_Expiry 合同到期时间

Rating 评分

Height 身高

Weight 体重

Preffered_Foot 擅长左(右)脚

Birth_Date 出生日期

Age 年龄

Preffered_Position 擅长位置

Work_Rate 工作效率

Weak_foot 非惯用脚使用频率

Skill_Moves 技术等级

Ball_Control 控球技术

Dribbling 盘球(带球)能力

Marking 盯人能力

Sliding_Tackle 铲球

Standing_Tackle 逼抢能力

Aggression 攻击能力

Reactions 反击

Attacking_Position 攻击性跑位

Interceptions 抢断

Vision 视野

Composure 镇静

Crossing 下底传中

Short_Pass 短传

Long_Pass 长传

Acceleration 加速度

Speed 速度

Stamina 体力

Strength 强壮

Balance 平衡

Agility 敏捷度

Jumping 跳跃

Heading 投球

Shot_Power 射门力量

Finishing 射门

Long_Shots 远射

Curve 弧线

Freekick_Accuracy 任意球精准度

Penalties 点球

Volleys 凌空能力

GK_Positioning 门将位置感

GK_Diving 扑救能力

GK_Kicking 门将踢球能力

GK_Handling 扑球脱手几率

GK_Reflexes 门将反应度

(3)导入数据:

import numpy as np import pandas as pd df = pd.read_csv(rC:\Users\Administrator\Desktop\zuqiu8543\football.csv)

(4)查看数据基本信息:

df.head()df.shape

查看数据缺失情况:

df.isnull().sum()

从运行结果可以看到,出现数据缺失的特征总共有六列,而主要缺失的有两列,分别是:National_Position 国家队位置、National_Kit 国家队号码,出现缺失的原因,有可能是部分球员并没有在国家队里服役,因此也就没有相应的号码和位置。同时,由于‘Club 所在俱乐部’、‘Club_Position 所在俱乐部位置’、 ‘Club_Kit 俱乐部号码’、 ‘Club_Joining 加入俱乐部时间 ’、‘Contract_Expiry 合同到期时间’这5项指标也不在我们的研究范围之内。

因此,针对以上缺失值,我们不做处理。(对我们接下去的数据分析和可视化没有影响的~)

二、进行简单数据分析

(1)查看球员的身高、体重的具体信息

首先我们使用head( )查看一下:

df[[Weight,Height]].head()

可以看到,我们的数据是带有‘kg’、‘cm’等单位的,因此我们先对这些单位进行移除,同时修改数据类型,以方便后面的操作。

(忘记应该怎么做的同学可以看这里)

侦探L:如何快速移除数据自带的单位及对数据进行格式转换6 赞同 · 1 评论文章df[Height]=df[Height].apply(lambda x:x[0:-3]) df[Weight]=df[Weight].apply(lambda x:x[0:-3]) df[[Height,Weight]]=df[[Height,Weight]].astype(int)

我们可以查看修改后的数据:

df[[Weight,Height]].head()

使用agg()查看所有球员身高、体重的均值和最值:

df[[Height,Weight]].agg([mean,max,min])

可以看到,数据集中的球员平均身高达到了181cm、平均体重75kg。

上述操作的主要目的是想让大家暖一下手,下面才是我们对这个球员数据集分析的真正开始。

作为非专业球员(嘻嘻,球迷or足球爱好者),我们当然还是更想看看能不能从数据反映出球员的个人实力。所以下面我们就要进行深入分析。

三、通过球员数据,鉴定球员能力

在我们的球员数据集中,总共有这么两项数据:Rating 评分、Skill_Moves 技术等级,这两项数据就是我们的主要研究目标。我们将围绕这两项数据,建立研究需求。

研究需求:

分值(Rating)高低的评分依据是什么?如何构建评分依据?

技术等级(Skill_Moves)的评价标准是什么?如何构建评价标准?

对研究需求的初步解读:

首先我们还是先对我们的目标列加深认知:

(1)分值(Rating):

df[Rating].unique()df[Rating].nunique()

可以看到,分值(Rating)这一目标值是连续型的,总共有49个不同值。

(2)技术等级(Skill_Moves):

df[Skill_Moves].unique()df[Skill_Moves].nunique()

可以看到,技术等级(Skill_Moves)更像是分类型的,总共有1-5五个等级。

进行球员分析前的须知:

总所周知,足球场上总共有11个球员,大致可以分为两类,分别是:1个守门员,及非守门员(前锋、中场、后卫),守门员的能力与非守门员的能力肯定是有区别的,因此我们在通过球员数据鉴定球员能力时,不能按照同一套标准。

对于守门员,我们更多的考究他的护框能力,与其他非守门员球员是截然不同的。

我们可以通过查看数据,进一步观察守门员和非守门员能力的差异:

我们提取出7列特征:

Name 姓名Preffered_Position 擅长位置Speed 速度Finishing 射门Freekick_Accuracy 任意球精准度Shot_Power 射门力量GK_Diving 扑救能力GK_Reflexes 门将反应度

接着,我们查看前五名球员的这些数值差距:

df[[Name,Preffered_Position,Speed,Finishing,Shot_Power,GK_Diving,GK_Reflexes]].head()

在上面五位球员中,前四位是非守门员,第五位是守门员。

从数值上,可以明显看出区别。(忘记各个特征中文名的同学可以去上面看哦,我就不改数据表了)

下面开始正式分析球员能力值的评分标准~

1、守门员的评分标准

在数据集中,GK是表示守门员(门将)的意思,同时,主要有5个特征用于衡量守门员的能力,分别是:

GK_Positioning 门将位置感GK_Diving 扑救能力GK_Kicking 门将踢球能力GK_Handling 扑球脱手几率GK_Reflexes 门将反应度

因此,我们可以将这几列特征提取出来,连同球员得分及技能等级,绘制成一个新数据表——门将数据表。

df_GK = df[[Name,Rating,Skill_Moves,GK_Positioning,GK_Diving ,GK_Kicking,GK_Handling,GK_Reflexes]][df[Preffered_Position]==GK]

查看表格情况:

df_GK.head()

查看一下技能等级(Skill_Moves)的分级情况:

df_GK[Skill_Moves].unique()

可以看到,在所有守门员中,技术等级只有1和2两个等级。

我们进一步查看等级的个数:

df_GK[Skill_Moves].value_counts()

可以看到,在技术等级为1的球员有2002个,等级为2的只有1个,差距太大,这里其实L考虑过做数据平衡化,但是效果不是很好。

综合考虑后,决定在考量守门员的能力时,仅考虑分值(Rating)这一项数据,不考虑技术等级(Skill_Moves)。

(由于在数据表中,球员的单项特征的得分越高,证明这名球员的这项能力更突出,也就是说,这里的特征均属于数值类型,而不是类别型特征。因此,在这里我们不需要进行one-hot独热编码。)

可以看到,特征列都是数值型的。

下面,我们将结合这五项特征,使用机器学习的方法技巧进行分析。(这里总共分为几个部分,由于篇幅原因,可能会将所有内容分为几篇文章。)

一、回归树

首先,我们使用决策树中的DecisionTreeRegressor(回归树)进行分析。

1、将数据集分割成训练集和测试集

导入做决策树相应需要的包:

from sklearn import tree from sklearn.model_selection import train_test_split

首先,将原数据集按特征和目标进行分割:

df_x=df_GK.drop(labels=[Name,Rating,Skill_Moves],axis=1) df_y1=df_GK.loc[:,Rating]

然后,使用train_test_split将数据分成训练集和测试集。

注意~在这里我们指定了拆分系数为0.3,也是说将7/10的数据作为训练集,剩下3/10的数据作为测试集。

#指定评分为目标时: X_train, X_test, Y_train, Y_test = train_test_split(df_x,df_y,test_size=0.3)

下面开始建模,并进行数据训练:

reg = tree.DecisionTreeRegressor(random_state=0) reg = reg.fit(X_train, Y_train)

查看一下在测试集上的准确度(将经过训练集训练后的模型,应用到测试集里,并查看拟合的得分情况)

score = reg.score(X_test, Y_test) score

可以看到,拟合度是比较高的,也就是说这里我们可以借助回归树对球员评分进行预测。

2、同时,我们也可以画出决策树.(但是如果考虑实际问题的话,这里其实并不建议这么做)

import graphviz reg = tree.DecisionTreeRegressor(random_state=0) reg = reg.fit(X_train, Y_train) dot_data = tree.export_graphviz(reg ,out_file = None ,class_names=["球员评分"] ,filled=True ,rounded=True ) graph = graphviz.Source(dot_data) graph

除此之外,我们也可以利用随机森林回归、线性回归、逻辑回归包括支持向量机等方法,进行模型拟合及预测,当然了,使用每种方法的步骤与注意点均有些许不同,这些我也将会在下次为大家说明。

以上便是<数据分析实例——足球运动员数据集(1)>的内容,感谢大家的细心阅读,同时欢迎感兴趣的小伙伴一起讨论、学习,想要了解更多内容的可以看我的其他文章,同时可以持续关注我的动态~

搜索