【案例】足球运动员分析

文章目录

    • 足球运动员分析案例
      • 需求
      • 数据集
      • 程序实现
        • 1. 导入相关库
        • 2. 加载相关数据集
        • 3. 数据探索与清洗
          • 3.1. 缺失值处理
          • 3.2. 异常值处理处理
          • 3.3. 重复值处理
        • 4. 身高与体重处理
        • 5. 运动员身高,体重,评分信息分布
        • 6. 左脚与右脚选手在数量上是否存在偏差
        • 7. 从球员平均分角度,拥有top10评分能力俱乐部/国家
        • 8. 哪个俱乐部更有能力留住球员(5年及以上)
        • 9. 足球运动员是否与出生日期相关
        • 10. 身高与体重是否具有相关性
        • 11. 哪些指标对评分影响最大
        • 12. 年龄和评分具有怎样的关系

足球运动员分析案例

需求

从众多的足球运动员中,发现统计一些关于足球运动员的共性,或某些潜在规律

数据集

数据集包含2017年所有活跃的足球运动员,主要包含名称、年龄、国籍、所效力俱乐部、各项技术评分和综合评分等信息。

  • 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 门将反应度

程序实现

1. 导入相关库

导入numpy、pandas和matplotlib库,并支持图形的中文显示

import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
#支持中文显示
mpl.rcParams['font.family']='Kaiti'
# 使用非unicode的符号,当使用中文时候要设置
mpl.rcParams['axes.unicode_minus']=False
# 魔法命令:如果画出的图无法展示,加这句话!
%matplotlib inline

2. 加载相关数据集

  • 加载相关数据集(注意原数据集中是否存在标题),并查看数据的大致情况
  • 可使用head/tail,也可以使用sample
  • 行与列没有完整显示,可以设置
# 注意是否存在标题
players = pd.read_csv('data/FullData.csv')
# 使用head tail sample大致看下数据集基本情况
# players.head()
# players.tail()
# players.sample(10)
# 设置显示完整的列
# display.[max_categories, max_columns, max_colwidth, max_info_columns,....
pd.set_option('display.max_columns',30)
# players.head()
pd.set_option('display.max_rows',100)
# players

3. 数据探索与清洗

查看缺失值,异常值与重复值

  1. 通过info查看数据缺失值,再通过isnullanydropnafillna等方法对缺失值进行处理
  2. 通过describe查看数据分布情况,可使用箱线图进行辅助
  3. 使用duplicate检查重复值
3.1. 缺失值处理
# 查看缺失值
# players.info()
# info后对数据进行整体的查看,发现National_Position(国家队文字)和National_Kit(国家队号码)存在大量的缺失值
# 分析得到该缺失值正常现象,并不是这些数据不完整(只有少量球员才能加入国家队)
# isnull+any查看缺失值
# players['Club_Position'].isnull().any()
# 找出缺失值数据记录;缺失值返回True,对应的数据保留;非缺失值False,对应的数据删除,所以最后只剩下一条记录
# players[players['Club_Position'].isnull()]
# 对缺失值进行过滤使用 notnull,非缺失值返回True,对应的数据保留;缺失值False,对应的数据删除
players = players[players['Club_Position'].notnull()]
# 再次调用ifo方法查看缺失值过滤结果
# players.info()
3.2. 异常值处理处理
# 异常值处理
# describe方法得到数据的描述性统计信息,比如max min,mean,std进行异常值分析
# players.describe()
# 还可以使用箱线图辅助查看异常值
# players.plot(kind='box')
players[['Rating','Marking']].plot(kind='box')
# players['Rating'].describe()
<matplotlib.axes._subplots.AxesSubplot at 0x9064400>

在这里插入图片描述

3.3. 重复值处理
# 重复值
players.duplicated().any()
# 没有重复值# 如果有重复值,查看重复的数据是什么,根据duplicated得到布尔数据,将布尔数组传递给players,得到重复值数据
# 设置keep参数,【first last False】
# players[players.duplicated()]
# 如果想查看数据集中所有重复数据
# players[players.duplicated(keep=False)]
# 假设存在重复值,删除重复值,可以通过keep设置删除的方式,【first last False】
# players.drop_duplicates(inplace=True)
False

4. 身高与体重处理

将身高与体重处理成数值类型,便于分析。处理方式可以多种,例如,使用矢量化相关操作(替换,正则提取),mapapply

					### 方式01:使用矢量化字符串方式处理 ###
players['Height'] = players['Height'].str.replace('cm','')
players['Weight'] = players['Weight'].str.replace('kg','')
# players.head()
# players.info()
# 替换后,身高和体重仍然是Object类型,不是数值型,需要进一步的类型转换
players['Height'] = players['Height'].astype(np.int)
players['Weight'] = players['Weight'].astype(np.int)
players.info()# players.head()
# players.info()### 方式02:使用map和apply ###
# def handle(item):
#     return int(item.replace('cm',''))# 上面构造的handle函数很简单;所以我们可以选择使用lambda函数来处理!
# players['Height'] = players['Height'].map(lambda item:int(item.replace('cm','')))
# players['Weight'] = players['Weight'].map(lambda item:int(item.replace('kg','')))
# players.head()
# players.info()
# output:
<class 'pandas.core.frame.DataFrame'>
Int64Index: 17587 entries, 0 to 17587
Data columns (total 53 columns):
Name                  17587 non-null object
Nationality           17587 non-null object
National_Position     1075 non-null object
National_Kit          1075 non-null float64
Club                  17587 non-null object
Club_Position         17587 non-null object
Club_Kit              17587 non-null float64
Club_Joining          17587 non-null object
Contract_Expiry       17587 non-null float64
Rating                17587 non-null int64
Height                17587 non-null int32
Weight                17587 non-null int32
Preffered_Foot        17587 non-null object
Birth_Date            17587 non-null object
Age                   17587 non-null int64
Preffered_Position    17587 non-null object
Work_Rate             17587 non-null object
Weak_foot             17587 non-null int64
Skill_Moves           17587 non-null int64
Ball_Control          17587 non-null int64
Dribbling             17587 non-null int64
Marking               17587 non-null int64
Sliding_Tackle        17587 non-null int64
Standing_Tackle       17587 non-null int64
Aggression            17587 non-null int64
Reactions             17587 non-null int64
Attacking_Position    17587 non-null int64
Interceptions         17587 non-null int64
Vision                17587 non-null int64
Composure             17587 non-null int64
Crossing              17587 non-null int64
Short_Pass            17587 non-null int64
Long_Pass             17587 non-null int64
Acceleration          17587 non-null int64
Speed                 17587 non-null int64
Stamina               17587 non-null int64
Strength              17587 non-null int64
Balance               17587 non-null int64
Agility               17587 non-null int64
Jumping               17587 non-null int64
Heading               17587 non-null int64
Shot_Power            17587 non-null int64
Finishing             17587 non-null int64
Long_Shots            17587 non-null int64
Curve                 17587 non-null int64
Freekick_Accuracy     17587 non-null int64
Penalties             17587 non-null int64
Volleys               17587 non-null int64
GK_Positioning        17587 non-null int64
GK_Diving             17587 non-null int64
GK_Kicking            17587 non-null int64
GK_Handling           17587 non-null int64
GK_Reflexes           17587 non-null int64
dtypes: float64(3), int32(2), int64(38), object(10)
memory usage: 7.1+ MB

5. 运动员身高,体重,评分信息分布

# players['Height'].describe()
# 使用直方图查看分布
# plt.hist(players['Height'])
# players['Height'].plot(kind='hist',bins=15)
# players['Weight'].plot(kind='hist',bins=15)
# players['Rating'].plot(kind='hist',bins=15)# 使用核密度图查看数据分布
# players['Height'].plot(kind='kde')
# players['Weight'].plot(kind='kde')
players['Rating'].plot(kind='kde')
<matplotlib.axes._subplots.AxesSubplot at 0x90126d8>

在这里插入图片描述

6. 左脚与右脚选手在数量上是否存在偏差

			### 方式01 ###
# players['Preffered_Foot'].head(10)
# g = players.groupby('Preffered_Foot')
# g.count()
# s = g['Preffered_Foot'].count()
# display(type(s))
# 使用柱状图或饼图展示左右脚选手数量的差别
# s.plot(kind='bar')
# s.plot(kind='pie',autopct='%.2f')### 方式02 ###
# 我们可以使用Sereis的value_counts进行简化操作
# 上面的操作,其实就是针对Preffered_Foot分组,再统计每组的数量
players['Preffered_Foot'].value_counts().plot(kind='barh')
<matplotlib.axes._subplots.AxesSubplot at 0x98fecc0>

在这里插入图片描述

7. 从球员平均分角度,拥有top10评分能力俱乐部/国家

# 哪个俱乐部球员的平均最高,俱乐部人数大于20
# group=players.groupby('Club')
# display(group['Rating'].mean(),type(group['Rating'].mean()))
# group['Rating'].mean().sort_values(ascending=False).head(10).plot(kind='barh')# 同时要求俱乐部人数大于20
# group['Rating'].agg(['mean','count']).sort_values('mean',ascending=False).head(10).plot(kind='bar')# #哪个国家球员的平均最高,国家人数大于20
group=players.groupby('Nationality')
result = group['Rating'].agg(['mean','count']).sort_values('mean',ascending=False)
result = result[result['count']>20]
result.head(10).plot(kind='barh')
<matplotlib.axes._subplots.AxesSubplot at 0xaf665f8>

在这里插入图片描述

8. 哪个俱乐部更有能力留住球员(5年及以上)

# Club_Joining 加入俱乐部时间 Contract_Expiry 合同到期时间
# r = players[['Club_Joining','Contract_Expiry']]
# 由于不存2017年前合同到期的球员,根据2017-加入合同的时间,得到就是球员在俱乐部的效力时间
# r[players['Contract_Expiry']<2017]
# 取出加入俱乐部的年份
# year = players['Club_Joining'].map(lambda x:x.split('/')[-1])
# display(year,type(year))
# 进行类型转换,转成数值型
# year = year.astype(np.int64)
# players['Work_Year'] = 2017-year
# players.info()# 数据集增加工作年限限定,过滤小于5年的数据
# result = players[players['Work_Year']>=5]
# result
# 结果中存在Free Agents只有球员,不参与统计
result = result[result['Club']!='Free Agents']
# 根据俱乐部分组,统计球员,人数多证明俱乐部更有能力留住
result['Club'].value_counts(ascending=False).head(10).plot(kind='barh')
<matplotlib.axes._subplots.AxesSubplot at 0xb61bba8>

在这里插入图片描述

9. 足球运动员是否与出生日期相关

  • 全体球员
  • 知名球员(80分及以上)
# players['Birth_Date']# 全体球员
# 对球员的日期进行切分,扩展为3列
# t = players['Birth_Date'].str.split('/',expand=True) # expand 把结果变成DataFrame
# 对月份进行分析:根据月份来分组,统计每一个月对应球员数量,最后柱状图表示
# t[0].value_counts().sort_values(ascending=True).plot(kind='bar')
# t[1].value_counts().sort_values(ascending=True).plot(kind='bar')
# t[2].value_counts().sort_values(ascending=True).plot(kind='bar')# 知名球员
# 将大于等于80的球员数据保留下来
# t = players[players['Rating']>=80]
# t = players['Birth_Date'].str.split('/',expand=True)
# t[0].value_counts().sort_values(ascending=True).plot(kind='bar')
# t[1].value_counts().sort_values(ascending=True).plot(kind='bar')
t[2].value_counts().sort_values(ascending=True).plot(kind='bar')
<matplotlib.axes._subplots.AxesSubplot at 0x115f0438>

在这里插入图片描述

10. 身高与体重是否具有相关性

  • 散点图
  • 相关系数
# 通过散点图查看变量之间关系:身高与体重
# players.plot(kind='scatter',x='Height',y='Weight')
# # 身高和评分之间的关系
# players.plot(kind='scatter',x='Height',y='Rating')# 相关关系
# players['Height'].corr(players['Weight'])
players['Height'].corr(players['Rating'])
0.046937095897011116

11. 哪些指标对评分影响最大

# players.corr()
# type(players.corr())
players.corr()['Rating'].sort_values(ascending=False)
# output:
Rating                1.000000
Reactions             0.828329
Composure             0.613612
Short_Pass            0.496239
Vision                0.489277
Long_Pass             0.483217
Ball_Control          0.463211
Age                   0.458098
Shot_Power            0.441773
Curve                 0.420796
Long_Shots            0.419517
Aggression            0.404422
Crossing              0.401851
Freekick_Accuracy     0.399575
Volleys               0.386494
Strength              0.369045
Dribbling             0.368565
Stamina               0.355335
Attacking_Position    0.354501
Heading               0.343265
Penalties             0.339898
Finishing             0.328576
Interceptions         0.319504
Jumping               0.289840
Agility               0.283309
Skill_Moves           0.251926
Standing_Tackle       0.249156
Marking               0.236843
Weak_foot             0.226263
Speed                 0.224253
Sliding_Tackle        0.215385
Acceleration          0.206392
Work_Year             0.185010
Weight                0.139703
Balance               0.087811
Contract_Expiry       0.047430
Height                0.046937
GK_Positioning       -0.018586
GK_Handling          -0.021343
GK_Reflexes          -0.022978
GK_Diving            -0.027615
GK_Kicking           -0.031696
National_Kit         -0.084289
Club_Kit             -0.172710
Name: Rating, dtype: float64

12. 年龄和评分具有怎样的关系

# 散点图
# players.plot(kind='scatter',x='Age',y='Rating')
# # 相关系数
# players['Age'].corr(players['Rating'])# cut将数据切分为离散区间表示,bins表示切分成几个区间
# 默认情况下,区间对应数值范围,通过labels设置区间标签内容
# pd.cut(players['Age'],bins=4,labels=['少年队','青年队','成年队','老将队'])
# 根据年龄段来分组,统计每组年龄均值,用折线图描述年龄段和评分之间关系
players['Age2'] = pd.cut(players['Age'],bins=4,labels=['少年队','青年队','成年队','老将队'])
players.groupby('Age2')['Rating'].mean().plot('line',marker='o')# bins设置区间个数,区间等分
# 还可以自定义区间范围
pd.cut(players['Age'],bins=[10,16,22,33,45],labels=['少年队','青年队','成年队','老将队'])
<matplotlib.axes._subplots.AxesSubplot at 0x122a04e0>

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/69957.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

足球运动员分析

数据集 数据集 背景&#xff1a; 我们关注足球运动员的如下内容&#xff1a; 足球运动员是否受出生日期的影响&#xff1f;左撇子适合踢足球吗&#xff1f;足球运动员的号码是否与位置有关&#xff1f;足球运动员的年龄与能力具有怎样的关联&#xff1f; 哪些技能会对足球运…

解析波士顿动力Handle机器人背后的技术(附PPT+视频)

[转] http://www.leiphone.com/news/201703/URrR8CG2tmtghNDl.html 导语&#xff1a;Boston Dynamics 在机器人动力方面堪称翘楚&#xff0c;其由双足或多足机器人组成的机器人天团总是时不时能给我们带来惊喜。上周&#xff0c;Boston Dynamics 又发布了一段视频&#xff0c;并…

解析波士顿Handle机器人背后的技术

在斗鱼直播平台&#xff0c;浙大李超博士的公开课分享了关于handle的技术细节&#xff0c;解析波士顿Handle机器人背后的技术&#xff0c;观察敏锐&#xff0c;思路清晰。 内容介绍了波士顿动力公司的历代4足和2足机器人的开发历史。并结合李超的专业重点讲解了腿的细节。 李…

开源四足机器人 附设计图及代码

斯坦福学生机器人俱乐部&#xff08;Stanford Student Robotics club&#xff09;Extreme Mobility 团队最近迎来了一名新成员——一个名为 Stanford Doggo 的四足机器人。这个机器人能跳 1 米多高&#xff0c;还能表演后空翻。与其他四足机器人动辄上万美元的成本不同&#xf…

ROS2机器人笔记21-03-14

ROS会议和活动&#xff1a; 如果对机器人技术感兴趣&#xff0c;但是看不到任何适合兴趣的项目&#xff0c;那么可能还需要考虑将其应用于同级组织中&#xff0c;例如OpenCV和MoveIt&#xff01; 核心是各种应用和ROS2的逐渐普及 GPU运算越来越主流&#xff0c;Nvidia Jetson…

波斯顿动力机器人“特效专辑”

关注星标公众号&#xff0c;不错过精彩内容 作者 | strongerHuang 公众号 | strongerHuang 波斯顿动力机器人的视频为啥那么火&#xff1f; 首先&#xff0c;他们机器人本身很牛逼&#xff0c;能完成各种高难度动作&#xff0c;拍出来的视频自然很多人关注。 其次&#xff0c;有…

清华2019最新AI发展报告出炉!400页干货,13大领域一文看懂

2019-12-08 20:36:36 当前&#xff0c;人工智能正处在爆发期。我国在人工智能领域的科学技术研究和产业发展起步稍晚&#xff0c;但在最近十余年的时间里抓住了机遇&#xff0c;进入了快速发展阶段。在这个过程中&#xff0c; 技术突破和创造性高端人才对人工智能的发展起着至…

ROS机器人培训基地和暑期学校证书样例

初级工程师证书&#xff08;非高清&#xff09;&#xff1a; 初级师资证书&#xff08;非高清&#xff09;&#xff1a; 为了鼓励学生朋友参与ROS机器人暑期学校&#xff0c;我也参加了并完成了所有任务&#xff0c;证书样本&#xff1a; 2021年&#xff08;非高清&#xff09…

专业的机器人资讯与太空中的ROS

参考&#xff1a;www.therobotreport.com Open Robotics正在与由 Jeff Bezos 创立的亚轨道航天公司Blue Origin和 NASA 合作开发 Space ROS。Space ROS 是 ROS 2 的一个版本&#xff0c;旨在满足航空航天软件在用于任务之前必须满足的验证和确认要求。 机器人操作系统 (ROS) 已…

机器人介绍、应用、前景

机器人介绍、应用、前景 1 介绍1.1 定义1.2 作用1.3 发展历程1.4 分类1.5 三大顾虑1.6 前景 2 种类工业机器臂协作机械臂工业移动机器人复合机器人扫地机器人服务机器人机器狗人形机器人无人机 3 技术3.1 机器人学分类3.2 功能分类3.2.1 感知3.2.2 决策3.2.3 执行AGV减震机构减…

波士顿动力机器人解锁跑酷新技能,凭借感知驱动技术适应技能

编译 | 禾木木 出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09; 波士顿动力开发负责人为大家解读了 Atlas 能够快速越过具有一定倾斜度的障碍物、执行快速转身、跳跃等动作背后的技术。 Atlas 机器人首次完成了复杂的障碍赛。 复杂的障碍赛在波士顿动力公司总部二楼…

算法高级(46)-波士顿动力机器人ATLAS

一、引言 如果说阿尔法狗是对人类智力的碾压&#xff0c;那么&#xff0c;波士顿动力研发的机器人&#xff0c;正在挑战的是仿生学。 波士顿动力公司&#xff08;Boston Dynamics&#xff09;一致在专注于机器人的研发&#xff0c;每一次波士顿动力放出视频都会引起网友的围观…

自研机器人控制系统,挑战波士顿动力机器人

自研机器人协调控制系统&#xff0c;挑战部分波士顿动力实验效果 一.系统简介功能使用实验 二.详细实验解读波士顿动力近似试验1&#xff1a;空间定点自定义试验1&#xff1a;太极云手自定义试验2&#xff1a;醉鬼自定义试验3&#xff1a;边转边走自定义试验4&#xff1a;平移自…

客户案例|保险行业借助智能外呼充分结合业务需求和实际应用场景快速筛选客户

保险行业整体仍然延续稳步发展势头&#xff0c;保险产品结构不断优化&#xff1b;人身险行业原保费收入增速有所放缓&#xff1b;受宏观经济不断恢复企稳及非车险政策支持推动影响下&#xff0c;财产险行业保费收入增速有所加快&#xff1b;人身险及财产险公司健康险类产品均呈…

二次元界福音:MakeGirlsMoe创建动漫人物

开源的动漫角色图片生成工具&#xff0c;支持&#xff1a;选择发色、发型、眼睛、皮肤、微笑、风格等等特征生成二次元图片。可自定义生成可爱的二次元头像&#xff0c;二次元界福音。 GitHub网址&#xff1a;https://github.com/makegirlsmoe/makegirlsmoe_web 在线体验&…

3行代码 为你的网站博客添加萌萌哒可爱二次元女动漫玩偶人物(看板娘)

看板娘一词源自日语“看板娘(かんばんむすめ)”。其中的“看板”指的是店面招牌&#xff0c;或者是为了宣传、打广告而制作的宣传牌。“看板娘”也就是店面的招牌姑娘&#xff0c;亦即能够提升店面人气和顾客流量的女服务生、女店员等。也就是说&#xff0c;看板娘本身就是一块…

AI绘图打开二次元世界

一个AI绘图插件&#xff0c;免部署&#xff0c;直接导入可用 支持英文tag&#xff0c;支持中文不稳定测试中&#xff08;中文需要描述准确不然可能翻译错误&#xff0c;比如死库水会被翻译成Die reservoir water&#xff0c;很明显这个翻译和原词出入很大,用泳装会比较准确&…

acg-faka--功能丰富的发卡二次元商城源码

源码简介&#xff1a; 支付系统&#xff0c;拥有强悍的插件扩展能力&#xff0c;现目今已经支持全网任意平台&#xff0c;任意支付渠道。云更新&#xff0c;如果系统升级新版本&#xff0c;你无需进行繁琐操作&#xff0c;只需要在你的店铺后台就可以无缝完成升级。商品销售&am…

一招生成定制版二次元人脸头像,还能“模仿”你的表情!

作者 | Pramook Khungurn 整理 | Jane、刘畅 出品 | AI科技大本营 最近&#xff0c;日本一位酷爱 Vtubers的粉丝结合了此前发表的多项 GAN 工作制作了两个动漫人物生成器的工具&#xff0c;这两个工具一个可以帮助广大动漫迷们快速、轻松的生成带有不同姿态的动漫人物形象&…

用 AnimeGAN 将图片转换为二次元的日漫风格

梦想伊始 作为日漫的爱好者&#xff0c;特别是对宫崎骏、新海诚这些壁纸狂魔的作品情有独钟。同时&#xff0c;作为一个程序员的我&#xff0c;一直梦想着可以开发一个功能&#xff0c;实现将现实的照片风格转化为动漫风格&#xff0c;为此我开始学习Python&#xff0c;学习过…