利用英超FPL数据分析球员第一期——曼联半程MVP
大家新年好,好久没有更新博客,众所周知,我之前的博客基本上是以系统操作和LeetCode算法题的为主,于是趁着新春佳节给大家介绍一些我的idea,其中一个就是将Nature Language Processing (NLP) 应用在英超范特西联盟(FPL)数据上去分析球员的表现。
为什么说选择FPL的数据作为分析的源头,主要是一般的球员数据在各大平台比较分散,而FPL为玩家提供每周竞赛GW的数据比较全面,容易获得,而且还自带了一个基于高级数据分析的奖励分——bonus,来评价每场比赛的优秀球员,分值从1分到3分。因此这些数据极大减轻了笔者在数据处理中的时间负担。
目录
算法选择
数据
结果
结论
引用
算法选择
作为这个算法的初期实现,笔者采用了比较经典TF-IDF算法。这个算法主要作用是根据字词在语句中出现的次数与整个语料中的语句频率来计算一个字词在整个语料中的重要程度,同时能够过滤掉一些非常常见但无重要意义的词语,例如:the。为什么想到将其应用于FPL数据中,笔者主要考虑到,若是以球队为单位可视作语料,每一个球员即可视为单一语句,其每一个动作比如射门,传球,进球则可以看作是每一个字词,因此利用该算法就可以分析得到每一个球员的所发生的动作重要性,以及他们在球队中的重要性。
- TF(Term Frequency):词频
其中t指词在文章中出现的次数,而d指文章的总次数。
- IDF(Inverse Document Frequency):逆文档频率
其中指语料库中的文档数,而指含有该词语的文档数。
- 其重要性:
- 整个语句的长度:
在这里语句长度替代了球员在整个队伍数据所占的篇幅,即其重要性。
数据
数据汇总截止于GW20,即1月28日对阵谢菲联后,只选取了已经出场的球员的数据,数据引用可参考引用一栏。
以下为球员的基础数据,以first name首字母排序:
Goals_scored 进球数
Assists 助攻数
Minutes 上场时间(分钟)
Goal_conceded 失球数
Threat 威胁
FPL_bonus 英超范特西奖励分
Clean_sheets 零封
Red_cards 红牌
Yellow_cards 黄牌
Save 扑救数
Own_goal 乌龙球
Appearance 上场数
Shot_per_90mins 每90分钟射门数
Pass_led_to_shot_per_90mins 每90分钟中引领射门的传球数
其中上场时间和上场数不作为词语分析。
结果
单个动作的重要性(逆文档频率):
Goals_scored | 0.693147181 |
Assists | 0.613104473 |
Goals_conceded | 0.042559614 |
Threat | 0.182321557 |
FPL_bonus | 0.613104473 |
Clean_sheets | 0.344840486 |
Red_cards | 3.17805383 |
Yellow_cards | 0.538996501 |
Save | 2.484907 |
Own_goal | 2.484907 |
Shot_per_90mins | 0.233615 |
Pass_led_to_shot_per_90mins | 0.28768207 |
每个球员的动作频率重要性,以first name首字母排序:
first_name | second_name | Goals_scored | Assists | Goals_conceded | Threat | FPL_bonus | Clean_sheets | Red_cards | Yellow_cards | Save | Own_goal | Shot_per_90mins | Pass_led_to_shot_per_90mins |
Aaron | Wan-Bissaka | 0.693147181 | 0.61 | 0.936311517 | 13.12715 | 1.83931342 | 2.069042918 | 0 | 0 | 0 | 0 | 0.039714525 | 0.192746989 |
Alex Nicolao | Telles | 0 | 1.23 | 0.340476915 | 5.469647 | 1.83931342 | 0.344840486 | 0 | 0 | 0 | 0 | 0.163530396 | 0.500566806 |
Anthony | Martial | 1.386294361 | 3.07 | 0.893751903 | 90.06685 | 1.22620895 | 1.034521459 | 3.1780538 | 0 | 0 | 0 | 0.579364831 | 0.290558893 |
Axel | Tuanzebe | 0 | 0.00 | 0.127678843 | 0 | 0 | 0 | 0 | 0.5389965 | 0 | 2.484907 | 0 | 0 |
Brandon | Williams | 0 | 0.00 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Bruno Miguel | Borges Fernandes | 7.624618986 | 5.52 | 0.936311517 | 129.4483 | 13.4882984 | 2.069042918 | 0 | 2.155986 | 0 | 0 | 0.83166887 | 0.91482899 |
Daniel | James | 0.693147181 | 0.00 | 0.212798072 | 26.80127 | 0 | 0 | 0 | 1.077993 | 0 | 0 | 0.62842395 | 0.307819818 |
David | de Gea | 0 | 0.00 | 1.021430746 | 0 | 1.83931342 | 2.069042918 | 0 | 0 | 91.9415 | 0 | 0 | 0 |
Dean | Henderson | 0 | 0.00 | 0.127678843 | 0 | 0 | 0 | 0 | 0.5389965 | 27.334 | 0 | 0 | 0 |
Donny | van de Beek | 0.693147181 | 0.00 | 0.38303653 | 10.75697 | 0 | 0 | 0 | 0 | 0 | 0 | 0.086437495 | 0.215761554 |
Edinson | Cavani | 2.772588722 | 1.23 | 0.212798072 | 48.67986 | 2.45241789 | 0.689680973 | 0 | 0.5389965 | 0 | 0 | 0.773265157 | 0.201377451 |
Eric | Bailly | 0 | 0.00 | 0.468155759 | 3.646431 | 2.45241789 | 0.689680973 | 0 | 1.077993 | 0 | 0 | 0.039714525 | 0 |
Frederico | Rodrigues de Paula Santos | 0 | 0.00 | 0.553274987 | 12.58019 | 0 | 1.724202431 | 0 | 1.6169895 | 0 | 0 | 0.17287499 | 0.284805252 |
Harry | Maguire | 1.386294361 | 0.61 | 1.149109589 | 51.23236 | 2.45241789 | 2.069042918 | 0 | 2.155986 | 0 | 0 | 0.292018564 | 0.043152311 |
Juan | Mata | 0 | 1.84 | 0.127678843 | 12.21554 | 0 | 0.344840486 | 0 | 0 | 0 | 0 | 0.247631742 | 0.609885994 |
Luke | Shaw | 0 | 0.61 | 0.808632674 | 13.67412 | 6.7441492 | 1.379361945 | 0 | 2.155986 | 0 | 2.484907 | 0.032706079 | 0.5552264 |
Marcus | Rashford | 4.852030264 | 3.07 | 1.021430746 | 118.8737 | 2.45241789 | 2.069042918 | 0 | 1.6169895 | 0 | 0 | 0.593381722 | 0.333711204 |
Mason | Greenwood | 0.693147181 | 0.00 | 0.638394216 | 45.03342 | 0 | 0.689680973 | 0 | 0.5389965 | 0 | 0 | 0.635432395 | 0.163978781 |
Nemanja | Matic | 0 | 0.61 | 0.553274987 | 4.558039 | 0 | 1.034521459 | 0 | 1.077993 | 0 | 0 | 0.086437495 | 0.212884734 |
Odion | Ighalo | 0 | 0.00 | 0.042559614 | 0.364643 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Paul | Pogba | 2.079441542 | 1.23 | 0.723513445 | 42.84557 | 5.51794026 | 1.379361945 | 0 | 1.077993 | 0 | 0 | 0.310707752 | 0.256037044 |
Scott | McTominay | 1.386294361 | 0.61 | 0.595834602 | 15.86198 | 1.83931342 | 1.034521459 | 0 | 0 | 0 | 0 | 0.186891881 | 0.281928431 |
Timothy | Fosu-Mensah | 0 | 0.00 | 0.085119229 | 2.917145 | 0 | 0 | 0 | 0.5389965 | 0 | 0 | 0.247631742 | 0.609885994 |
Victor | Lindelof | 0.693147181 | 0.61 | 0.680953831 | 9.480721 | 0.61310447 | 1.379361945 | 0 | 0 | 0 | 0 | 0.067748307 | 0.083427801 |
对于单个动作来说,自然是物依稀为贵,比如对于非门将球员来说进球,助攻以及威胁球自然是最重要数据,门将则是最看重扑救数。
对每个球员的TF-IDF数据进行汇总,得到其在球队的重要性:
first_name | second_name | Total |
Bruno Miguel | Borges Fernandes | 130.5324 |
Marcus | Rashford | 119.0727 |
David | de Gea | 91.98889 |
Anthony | Martial | 90.2067 |
Harry | Maguire | 51.41404 |
Edinson | Cavani | 48.85062 |
Mason | Greenwood | 45.05657 |
Paul | Pogba | 43.31014 |
Dean | Henderson | 27.33958 |
Daniel | James | 26.84186 |
Scott | McTominay | 16.08797 |
Luke | Shaw | 15.70127 |
Aaron | Wan-Bissaka | 13.48176 |
Frederico | Rodrigues de Paula Santos | 12.81662 |
Juan | Mata | 12.37623 |
Donny | van de Beek | 10.78859 |
Victor | Lindelof | 9.66924 |
Alex Nicolao | Telles | 5.942714 |
Nemanja | Matic | 4.872661 |
Eric | Bailly | 4.60101 |
Timothy | Fosu-Mensah | 3.039865 |
Axel | Tuanzebe | 2.545895 |
Odion | Ighalo | 0.367118 |
Brandon | Williams | 0 |
正如我们的印象一样,我们的大B哥——布鲁诺费尔南德斯,遥遥领先第二名的拉什福德,其动作占据队伍的重要性最大,即他对球队影响最多。
单位分钟里对球队的总重要性:
first_name | second_name | Total/mins |
Dean | Henderson | 0.121509267 |
Edinson | Cavani | 0.092345225 |
Daniel | James | 0.083101736 |
Bruno Miguel | Borges Fernandes | 0.078871558 |
Anthony | Martial | 0.078645774 |
Marcus | Rashford | 0.073185419 |
David | de Gea | 0.058405642 |
Mason | Greenwood | 0.057913324 |
Donny | van de Beek | 0.041978943 |
Odion | Ighalo | 0.040790934 |
Timothy | Fosu-Mensah | 0.037998313 |
Juan | Mata | 0.037054584 |
Paul | Pogba | 0.035587624 |
Harry | Maguire | 0.028563355 |
Axel | Tuanzebe | 0.019434311 |
Scott | McTominay | 0.015850215 |
Luke | Shaw | 0.012481135 |
Frederico | Rodrigues de Paula Santos | 0.011736832 |
Alex Nicolao | Telles | 0.011675272 |
Eric | Bailly | 0.008396003 |
Aaron | Wan-Bissaka | 0.008322075 |
Victor | Lindelof | 0.007829344 |
Nemanja | Matic | 0.006674878 |
Brandon | Williams | 0 |
在每一分钟内,迪恩亨德森,卡瓦尼和丹尼尔詹姆斯对球队的贡献最大。同样的,B费不仅贡献良多,而且效率突出。
每次出场里对球队的总重要性:
first_name | second_name | Total/apps |
Dean | Henderson | 9.113195 |
Bruno Miguel | Borges Fernandes | 6.52662143 |
Marcus | Rashford | 5.95363381 |
Anthony | Martial | 5.63791894 |
David | de Gea | 5.11049369 |
Daniel | James | 4.47364345 |
Edinson | Cavani | 3.75774033 |
Mason | Greenwood | 3.21832616 |
Timothy | Fosu-Mensah | 3.03986502 |
Harry | Maguire | 2.57070191 |
Paul | Pogba | 2.54765522 |
Juan | Mata | 2.06270518 |
Luke | Shaw | 0.98132926 |
Donny | van de Beek | 0.98078076 |
Scott | McTominay | 0.94635106 |
Frederico | Rodrigues de Paula Santos | 0.91547288 |
Alex Nicolao | Telles | 0.8489591 |
Aaron | Wan-Bissaka | 0.74898675 |
Victor | Lindelof | 0.69066001 |
Eric | Bailly | 0.65728709 |
Axel | Tuanzebe | 0.50917895 |
Nemanja | Matic | 0.40605507 |
Odion | Ighalo | 0.3671184 |
Brandon | Williams | 0 |
在每一次的出场中,迪恩亨德森和B费对球队影响最为突出。
结论
毫无疑问,我们B费的确是曼联20~21赛季的半程MVP。而在门将位置上,迪恩亨德森在有限的出场里在门将数据指标上比德赫亚更加有效率,后生可期。在替补的选择上,索尔斯克亚不妨多考虑下丹尼尔詹姆斯,这个上赛季上半程给我们带来希望的小伙子。
但是单从这个算法的应用来说,其实仍有缺陷之处,比如红黄牌以及乌龙球的符号是否应该在后期考虑根据语境或者比赛的进程判断应该为正还是负,还有各个数据标签之间是否应该根据特定的系数计算后进行累加,而不是直接叠加,以及这种算法能否为未来比赛作出预测,这些都是需要去进行探究的,欢迎各位读者留言进行探讨,谢谢。
引用
https://understat.com/team/Manchester_United/2020
https://github.com/vaastav/Fantasy-Premier-League
利用英超FPL数据分析球员第一期——曼联半程MVP相关推荐
- 《利用Python进行数据分析》第一个案例
首先上数据 链接:添加链接描述 提取码:i7xl 我是用的jupter notebook 写的 首先读入数据,由于数据是json形式 #导入数据 import json path='C:\\Users ...
- 啃书:《利用Python进行数据分析》第一章
1.1本书内容 本书系统阐述了Python进行数据控制.处理.整理.分析等多方面的具体细节和基本要点.我再学习这本书的过程中进行一个汇总和总结,通过笔记来强化牢记知识点. 数据的类别 本书中出现的数据 ...
- 用python进行数据分析举例说明_《利用python进行数据分析》读书笔记 --第一、二章 准备与例子...
第一章 准备工作 今天开始码这本书--<利用python进行数据分析>.R和python都得会用才行,这是码这本书的原因.首先按照书上说的进行安装,google下载了epd_free-7. ...
- 数据基础---《利用Python进行数据分析·第2版》第11章 时间序列
之前自己对于numpy和pandas是要用的时候东学一点西一点,直到看到<利用Python进行数据分析·第2版>,觉得只看这一篇就够了.非常感谢原博主的翻译和分享. 时间序列(time s ...
- 利用Python进行数据分析笔记-pandas建模(statsmodels篇)
跟着教程学习了一段时间数据分析,越学感觉坑越多.于是花了一个星期仔细看了下<利用Python进行数据分析>.写在这里主要是记录下,方便自己查看. statsmodels简介 statsmo ...
- 利用python进行数据分析_从删库到跑路
目录 前言 一 numpy模块 1.numpy的数据结构:多维数组ndarray 数组转置和轴对换 矩阵内积 通用函数 利用数组进行数据处理(矢量化) 将条件逻辑表述为数组运算 数组和统计法方法 约简 ...
- 利用Python进行数据分析之金融数据的统计分析
金融领域必备的数据分析技能 上期讲了金融数据的储存,这期讲解利用Python进行金融数据的统计分析 下面运行环境没有的,请看第一期内容安装环境 本节重点: 分析HS300股票的市值和PE的统计规律 个 ...
- 让创新,从“芯”加速—安创孵化成长营第一期成果展示顺利举行
2015年6月24日,北京讯,安创孵化成长营第一期成果展示今日在北京顺利拉开帷幕.在首次展示日上,24家智能硬件和物联网热点领域创新创业团队,向业界展示了他们各自的创新成果及技术"硬&quo ...
- 如何利用数据仓库优化数据分析?
在整个数据分析流程中,数据处理的时间往往要占据70%以上!这个数字有没有让你震惊呢?为了提高分析效率和质量,借用数据仓库进行数据分析是一个很好的选择,详细的工作方法本文都有所介绍. 首先,我们来了解一 ...
最新文章
- 天津商业大学计算机科学与技术分数线,天津商业大学录取分数线2021是多少分(附历年录取分数线)...
- 数据库字段设置为非空默认值
- angularJS 表单验证
- page,client,offset区别
- [PBI催化剂]国际水准,中国首款重量级PowerBIDeskTop外部工具问世
- python3捕获异常_python中异常捕获方法详解
- 母版事件中注册javascript脚本
- oracle inventory directory,oraInventory目录的作用
- 【已解决】Failed to start cron.service: Unit cron.service not found.
- 1000个JQuery插件(转载)
- matlab图像分割算法源码
- 本科大学计算机专业排名2015,2015年美国大学本科计算机专业排名
- 产品经理如何设计网页导航菜单
- tig git的好搭档
- 大家都在努力,你凭什么不努力?
- spring cache注解@Cacheable参数key赋值
- 计算机图形学——游戏方向 第一章 计算机图形学概述
- linux查看dns命令
- 当下非常火的VR全景展示到底是什么?
- MySQL的定时任务详解
热门文章
- node.js使用Sequelize实现多表连接查询
- Python脚本——信手拈来的自动化测试工具
- OMAP3630 I2C device驱动
- Android美化之全局透明背景
- 什么是全量数据、增量数据?如何统一一套系统?
- 远程桌面 域计算机,在AD中实现仅普通域用户可通过远程桌面控制自身计算机
- AttributeError: ‘FigureCanvasTkAgg‘ object has no attribute ‘set_window_title‘
- 浅谈Feature Scaling
- 国内三大制式3G网络简介及比较
- Python数据结构与算法基础|第五期:代码实现——循环队列的链式存储结构