LPL数据分析(2020-2022赛季)
❗❗❗本文最后更新于 301 天前,其中的信息可能已经过时;如有错误请在文章下方评论✅,欢迎纠错🥰!
本人第一次Python项目实战,轻喷

选题背景

《英雄联盟》(League of Legends,简称LOL)是由美国拳头游戏(Riot Games)开发、中国内地由腾讯游戏代理运营的英雄对战MOBA竞技网游,自从2013年开始举办LPL春/夏季联赛后,英雄联盟的热度在国内不断提高,关注人群规模庞大,影响群体越来越多,同时随着更多资本入局,联赛奖金的上调以及场馆的建设和周边产品的推出,使得这一游戏已经成为了中国电竞行业的重要组成,这也让更多的赛事选择在中国举办,而中国战队在国际赛事上的表也是精彩纷呈,在S8、S9以及S11三次获得英雄联盟全球总决赛的冠军,中国选手的身价的不断上升,逐渐开始加盟外国战队走向世界,英雄联盟是划时代的产物,它现在的高度不止局限于游戏,它正在慢慢演变成一种潮流、一种文化、一种精神,这也从侧面佐证了我国电竞行业的崛起趋势。

2022年的赛季已经过半,距离世界赛也越来越近,本小组意通过课程所学,对2020年春季赛至2022年春季赛这5给赛季的数据进行数据采集与预处理,收集每个赛季的战队、选手以及英雄数据,从不同方面进行分析,优胜劣汰,最终由分析结果得出哪几支队伍能够成功晋级世界赛,即哪几支队伍能够获得2022年夏季赛的前四名。

当然英雄联盟这一游戏的影响因素有很多,例如每个版本都会有不同的强势以及弱势英雄,选手的状态以及战队的运营情况都会对最终成绩造成影响,所有本小组的目的是在不考虑外部因素以及不可抗力的情况下对数据进行分析,本次分析仅具有参考价值,结果以实际情况为准。

数据源描述

本次我们组选择的数据源为英雄联盟赛事官网(腾讯游戏)。

其中2020年春季赛:(https://lpl.qq.com/es/data/rank.shtml?iGameId=134&sGameType=1,5

2020年夏季赛:(https://lpl.qq.com/es/data/rank.shtml?iGameId=134&sGameType=7,8

2021年春季赛:(https://lpl.qq.com/esnew/data/rank.shtml?iGameId=148&sGameType=1,5

2021年夏季赛:(https://lpl.qq.com/esnew/data/rank.shtml?iGameId=148&sGameType=7,8

2022年春季赛:(https://lpl.qq.com/esnew/data/rank.shtml?iGameId=167&sGameType=1,5

观察以上URL,URL繁多且规律不统一,因此小组决定使用selenium的By子类来定位元素,并且模拟鼠标操作点击进行拟人爬取,此步骤简化了访问多个URL的复杂步骤。

来到LPL数据官网中,大家可以时刻关注赛季的进展以及自己喜爱的战队或者选手的整体数据,同时本小组可以找到适合我们的数据以及对比情况,并且数据全面、涵盖面广泛、分类清晰,有利于本小组之后进行数据采集与预处理。此平台的数据板块内容全面,存在近10万条战队、选手以及英雄数据,其中战队数据包含出场次数、胜负情况、胜率等10个维度,选手数据包含场上位置、总击杀、总助攻、总死亡、KDA等14个维度,英雄数据包含登场次数、pick比率、ban比率、胜率等9个维度。以上三类数据使用了JavaScript脚本来明文展示,但对网页元素进行观察后,所有数据均存在于本页面,因此使用BeautifulSoup模块定位元素进行爬取。同时,部分战队有重建、更名或解散的情况,这个问题我们在后期对所有数据进行筛选以及清洗,并以战队为单位进行整理。

网页整体的组织结构非常的工整,数据齐全,几乎没有空值或重复值,我们预计爬取的有效数据是1200条左右,由于数据规范化程度很高,因此经过数据清洗与数据规约后,有效数据数量几乎保持不变。

根据需求,我们的数据字段分为三类:

战队:trank,team,appearance,win_lose,winRate,totalKill_perGame,totalDie_perGame,catchEye_perGame,rowEye_perGame,money_perGame,baron_perGame,dragon_perGame;

选手:prank,player,position,appearance,modelViewPresenter,totalKill_perGame,totalAssist_perGame,totalDie_perGame,killDieAssist,money_perGame,creepScore_perGame,catchEye_perGame,rowEye_perGame,attendanceRate_perGame,contrapositionEconomicDifference,damage,gold;

英雄:hrank,hero,appearance,pickRatio,banRatio,winRate,totalKill_perGame,totalAssist_perGame,totalDie_perGame,killDieAssist,commonPlayers;

有了以上数据的支持,我们的最终分析结果将会更加具有可信度。

具体实验过程

数据采集阶段

在正式采集数据的阶段,本小组对数据源进行了考察,发现2020年的数据与其它年份的数据有结构上的不同,因此,本小组对2020年的数据使用了requests模块访问数据API接口进行了爬取,对其它年份的数据采用了selenium模块进行了爬取。

由于目标数据存放在很多不规则的URL中,因此需要依靠msedgedriver来模拟鼠标操作,同时,该手段需要依赖selenium.webdriver.common.by的子模块By来定位元素标签,使用browers.find_element方法来定位元素,By所支持的定位器分类如下:CLASS_NAME = ‘class name’;CSS_SELECTOR = ‘css selector’;ID = ‘id’;LINK_TEXT = ‘link text’;NAME = ‘name’;PARTIAL_LINK_TEXT = ‘partial link text’;TAG_NAME = ‘tag name’;XPATH = ‘xpath’。

在多次踩坑之后,解决了模拟鼠标操作之后页面不稳定以及页面焦点不在新页面上的问题,即使用time.sleep方法稳定跳转后的页面。

使用windows=browers.window_handles获取父页面的句柄,为页面切换做准备;browers.switch_to.window(windows[-1]),该方法用于新旧窗口之间的切换,控制浏览器将窗口切换为第-1个页面(即新页标签)。

在requests模块爬取过程中,搭配json模块进行数据解析;在selenium模块爬取过程中,使用BeautifulSoup的find与find_all方法来查找元素。在所有年份的数据采集过程中,嵌套了tqdm进度条模块,使得爬取过程可视化,更加直观、清晰。使用time.perf_counter方法记录程序开始与结束时间,用于统计程序执行耗费的时间。

2020年数据:

在官网界面,右键点击检查(按F12打开开发者工具),点击【Network】,按CTRL+R 刷新之后,在【name】下方找到【LOL_MATCH2_MATCH_TEAMRANK_LIST_134_7_8.js】,接着点击【Preview】,就会出现如下界面。

此时得到的数据是用json包装后的,利用Python简单处理一下就能获取到想要的数据。这些数据是用接口形式传输的,可以直接爬取API接口,点击旁边的【Headers】,复制【Request URL】后面的网址。

接下来打印请求的网址后的结果。

此时所有的战队信息已经获取成功,可是输出的内容是一个str(字符串)对象,需要使用json.loads()函数将str对象转换为dict(字典)对象。再使用字典和列表的方法就可以将想要的数据提取出来,并且存放到另外一个字典里面。个人数据的爬取过程同理。

然而,获取英雄数据就不是那么顺利了,还是回到官网,点击【英雄数据】还是右键检查,找到【LOL_MATCH2_MATCH_HERORANK_LIST_134_7_8.js】

观察数据,没有英雄的名称,只有【iChampionId】和其他数据,想要查看英雄的名称,我们的第一反应就是访问英雄联盟官网,右键检查,找到【hero_list.js】,结果非常尽人意!

仔细观察,发现英雄名称前面有个【heroId】,再和刚才的【iChampionId】进行比对,发现二者是相对应的。从两个接口获取到的数据,需要保证【iChampionId】的英雄匹配到正确的名称,因此作出如下判断。

过程图如下:

至此,数据采集阶段结束,所有数据已经准备就绪,下一步需要进行数据预处理与存储。

数据存储与预处理阶段

对于爬取到的数据,本小组新建了一个名为LeagueofLegendsProLeague的数据库,为提高存储便捷性,使用了python代码编写了建表语句。同时,将两种不同结构的数据写入数据库中,分别使用了sqlalchemy模块的子模块create_engine和pymysql模块。

将采集到的数据转换为DataFrame类型,观察到在team数据帧中的winRate、totalKill_perGame、totalDie_perGame字段以及player数据帧中的totalAssist_perGame字段为不规范的数据类型,因此引入re模块对以上字段进行数据清洗,同时,辅助以apply函数及匿名函数,具体实例演示:

将以上所有DataFrame写入xlsx文件,以备后续数据分析使用。

再将所有DataFrame写入csv文件,供给后续提交。

数据可视化阶段

上述xlsx文件已经就绪,数据可视化需要读取以上文件,涉及到numpy、pandas模块进行提取Series,辅之matplotlib的子模块pyplot进行绘图。考虑到图片以及坐标轴刻度需要使用中文,因此先将字体与中文显示问题解决。

将x坐标轴的刻度改为战队名称,需要从DataFrame中提取team列。

数据分析阶段

本阶段使用statsmodels模块对以上数据进行多元线性回归分析、相关分析、显著性检验、拟合优度检验、异方差性检验,选取战队数据对胜率进行预测,即胜率作为因变量,选择总击杀、总死亡、场均插眼、场均排眼、场均金钱、场均大龙、场均小龙作为自变量,分别为x1,x2,x3……建立多元线性回归模型。

多元线性回归模型:

建立回归模型并求得方程如下图所示。

其中 y 为要预测的变量,x 为影响 y 值的变量,b 为回归系数,计算方式为:

计算结果为一个矩阵,分别对应b0,b1,b2,b3……

从下图中可以看出,胜率与总击杀、总死亡、场均大龙等数据呈现出较为一致的联动变化关系,除总死亡以外均呈现相同的变化趋势,根据相关知识,推测以上数据存在线性相关关系。

根据公式,求解出回归系数显著性检验的统计量如下图所示,通过显著性检验。

检验:

通过计算可决系数进行多元线性回归方程的拟合优度检验,可决系数是用来反映回归模式可靠程度的一个统计指标,可决系数越大,说明模型的预测值和观测值越接近,模型的拟合优度越好。计算方法如下:

其中, 是回归方程计算的预测值,y为实际值, 是实际值的平均值。

通过计算可决系数与修正自由度的可决系数进行多元线性回归方程的拟合优度检验如下图所示。可以看出以上数据存在高度相关性,并且该回归模型拟合度高。

从u^2散点图可以看出,u^2的值在0~20之间,大致呈现为一条斜率为正的直线,具有异方差性。根据公式求解出标准估计误差为下图(有一定的误差)。

后四个赛季的分析过程同上,分别绘图分析与回归分析,在得到回归方程后计算了标准估计误差,进行了拟合优度检验与回归系数检验,通过检验后进行预测。虽然数据间已经呈现高度相关性,但预测出来的结果仍有一定的偏差,但总的来说有不错的效果。此处不再赘述,可视化结果见ipynb文件。

通过对比本组的此次实践所爬取到的战队数据可以得出,RNG、V5以及TES这三支战队的综合实力相较于其他队伍要更强一些,所以我们预测这次2022年的夏季赛这三支战队将大概率进入到四强当中。而通过爬取到的数据显示EDG、JDG、WBG这三支战队的实力相当,所以我们推测四强当中的最后一个席位将由这三支战队中的其中一支占据。

在对EDG、JDG、WBG这三支战队进行分析的时候,由于实力相近我们决定采用对位分析的方法将战队里的选手进行逐一分析(对位分析即将两只战队中的同一位置的选手进行比较分析)。

通过我们的数据分析得出在其他选手的水平相当的情况下EDG战队中的中单和下路这两个位置的选手要比另外两只战队中的同对位选手的状态更好,发挥的更加稳定。并且EDG战队拥有丰富的大赛经验以及冠军基础(曾在2021年夺得全球总决赛冠军),再加上EDG战队的俱乐部成立于2013年,相比于另外两支队伍要早很多,基底要更加的深厚。

WBG战队有着顶尖水准的上单,但是由于队内的问题例如选手位置分配的不合理,在比赛当中选手资源分配不合理以及选手不契合战队体系等导致战队的整体水平略逊于EDG。

而JDG战队整体水平就比较稳定了,但这也是最大的问题,虽然发挥稳定但是过于的稳定以至于略显平庸了,并且在比赛当中JDG战队缺少亮点,缺乏选手的高光时刻。所以我们认为最后一个四强成员战队有很大的概率是EDG战队。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇