该数据集的来源是 kesci,提供者是 Ustinian。想自己尝试的同学可以学习一下~
下面开始我们的示例学习之路~一、了解一下数据集
以下是 Hewhale 社区中数据集的说明,主要包括:数据集的主要内容,以及数据中各个标签的中文注释。
(1)数据内容:
2017 年所有现役足球运动员。
(2)数据描述(标签名):
姓名
国籍
National_Position 国家队位置
National_Kit 国家队号码
俱乐部所在的俱乐部
Club_Position 是俱乐部的位置
Club_Kit 俱乐部号码
Club_Joining 加入俱乐部时间
Contract_Expiry 合约到期时间
评分
高度
重量
Preffered_Foot 擅长左(右)脚
Birth_Date 出生日期
年龄
Preffered_Position 擅长位置
Work_Rate 生产力
Weak_foot 非惯用足的使用频率
Skill_Moves 技能等级
Ball_Control 控球
盘带能力
打标能力
Sliding_Tackle
站立_抢断压迫能力
侵略性攻击能力
反应反击
Attacking_Position
拦截 抢断
想象
沉着冷静
穿越
近路
Long_Pass
加速
速度
耐力耐力
力量
平衡
敏捷
跳跃
头球投球
Shot_Power 射击功率
完成射门
Long_Shots
曲线
Freekick_Accuracy 任意球精度
处罚 处罚
凌空抽射能力
GK_Positioning 守门员位置感
GK_潜水救护能力
GK_Kicking 守门员踢球能力
GK_Handling 投掷机会
GK_Reflexes 守门员反应
(3)导入数据:
import numpy as np
import pandas as pd
df = pd.read_csv(r'C:\Users\Administrator\Desktop\zuqiu8543\football.csv')
(4)查看数据基本信息:
df.head()
df.shape
检查缺失的数据:
df.isnull().sum()
从运行结果可以看出,共有六列缺失数据,主要缺失两列,分别是:National_Position国家队位置,National_Kit国家队号码。数据缺失的原因可能是部分球员没有在国家队服役,所以没有对应的号码和位置。同时,“Club's club”、“Club_Position”、“Club_Kit 俱乐部编号”、“Club_Joining 加入俱乐部”、“Contract_Expiry 合同到期时间”五个指标不在我们的研究范围内。
因此,我们不处理上述缺失值。(对我们后续的数据分析和可视化没有影响~)
二、执行简单的数据分析
(1)查看玩家身高体重的具体信息
首先我们用head()来看看:
df[['Weight','Height']].head()
可以看出我们的数据有‘kg’和‘cm’等单位,所以我们先去掉这些单位,修改数据类型,方便后续操作。
(忘记做什么的同学可以看这里)
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。
上述操作的主要目的是为了给大家暖手,下面才是我们分析这个玩家数据集的真正开始。
作为非职业球员(嘻嘻,球迷或足球爱好者),当然,我们还是想看看能不能从数据中体现出球员的个人实力。那么我们来深入分析一下。
三、通过玩家数据识别玩家能力
在我们的玩家数据集中,一共有两个数据:Rating score,Skill_Moves技能等级,这两个数据是我们主要的研究目标。我们将围绕这两个数据建立研究需求。
研究需求:
评分(Rating)的依据是什么?如何构建评分基础?
Skill_Moves 的评价标准是什么?如何构建评价标准?
研究需求初步解读:
首先,让我们加深对我们目标列的理解:
(1)评分:
df['Rating'].unique()
df['Rating'].nunique()
可以看出Rating的目标值是连续的,共有49个不同的值。
(2)技能移动):
df['Skill_Moves'].unique()
df['Skill_Moves'].nunique()
可以看出,技能等级(Skill_Moves)更像是一种类型,从1到5一共五个等级。
在进行玩家分析之前:
众所周知,足球场上一共有11名球员,大致可以分为两类,即:守门员和非守门员(前锋、中场、后卫)、守门员和非守门员的能力必须是不同的,所以我们在通过玩家数据来识别玩家能力的时候不能遵循同一套标准。
对于守门员,我们更看重他的护框能力,这与其他非守门员球员完全不同。
我们可以通过查看数据进一步观察守门员和非守门员的能力差异:
我们提取了 7 列特征:
Name 名称 Preffered_Position 好位置 速度 速度 射门 任意球_Accuracy 任意球 准确性 Shot_Power Shooting Power GK_Diving Saving Ability GK_Reflexes Goalkeeper Reactivity
接下来,我们看看前五名球员的这些数字差距:
df[['Name','Preffered_Position','Speed','Finishing','Shot_Power','GK_Diving','GK_Reflexes']].head()
上述五名球员中,前四名是非守门员,第五名是守门员。
从数值上可以清楚地看出差异。(忘记每个特征中文名的同学可以顶一下,我就不改数据表了)
下面开始正式分析球员能力值的评分标准吧~1、守门员评分标准
在数据集中,GK表示守门员(goalkeeper)。同时,衡量守门员能力的主要有五个特征,分别是:
GK_Positioning 守门员的位置感 GK_Diving 守门员的扑救能力 GK_Kicking 守门员的踢球能力
因此,我们可以提取这些特征列,连同球员的得分和技术水平,并将其绘制成一个新的数据表——守门员数据表。
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()
可以看到有2002个玩家技能等级为1,只有1个玩家等级为2,差距太大了。其实L这里已经考虑了数据平衡,但是效果不是很好。
综合考虑,决定在考虑守门员能力时,只考虑得分(Rating),不考虑技术水平(Skill_Moves)。
(因为在数据表中,玩家单项特征的得分越高,说明玩家的能力越突出,也就是说这里的特征都是数值型的,不是分类特征。所以,这里我们One-hot encoding不是必需的。)
如您所见,特征列都是数字的。
下面,我们将结合这五个特点,用机器学习的方法论技巧进行分析。(这里一共分为几个部分,由于篇幅原因,可能会分成几篇。)
一、回归树
首先,我们在决策树中使用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
此外,我们还可以使用随机森林回归、线性回归、逻辑回归,包括支持向量机等方法进行模型拟合和预测。当然,每种方法的使用步骤和注意点都略有不同。这些我下次也会给你解释。
以上就是内容。感谢您的仔细阅读。同时,也欢迎有兴趣的朋友一起讨论学习。想了解更多可以看我的其他文章,也可以继续关注我的动态~