写在前面的话
英雄联盟是一款在世界范围内拥有众多玩家的MOBA游戏,它陪伴了我们这一代人的成长。在游戏中以五人一队为单位分为红方和蓝方两个阵营,最先推掉对方基地水晶的队伍为胜者。队内每个玩家分担不同职责:上单,中单,ADC,辅助以及打野各司其职,不仅要专注于兵线运营和进攻对方防御塔还要掠夺地图资源来为队伍取得更大优势。英雄联盟这款游戏经历了这么多年已经发展出了各种不同的玩法,每个玩家也对游戏有不同的理解,所以游戏中的团队合作和沟通也尤其重要。正是因为其千变万化的玩法和每个版本更新带来的新体验才能使其收获众多玩家,同时这款游戏也推动了中国电竞行业的发展使我们这代人有了自己的独特记忆。
在英雄联盟数据分析这个专题我会使用我手中的英雄联盟数据集来从数据分析的角度多维度分析这款游戏的取胜之道以及各种因素对于游戏胜负的影响。同时也希望读者们能从不同的角度提供建议来帮助我完善这个专题分析。
背景介绍
该数据集包含了大约两万五千场铂金分段的单人排位游戏,所有数据皆来自于蓝色方(不分析Ban/Pick对游戏影响)。数据集中总共包含了55项可供分析的数据,除了队伍总击杀,总助攻,总死亡,总经济,总经验等显性影响游戏局势的因素,还包含了是否取得一塔,一血,击杀元素龙,峡谷先锋,男爵等潜在影响游戏走向的因素。每一局游戏都分为不同的时间节点,自10分钟开始,以2分钟为间隔逐渐增加。如一局游戏持续了25分钟,该局游戏在数据集中就会有第10,12,14,16,...,24分钟的各项数据值,这样我们就可以更深入地分析哪个因素最有可能影响游戏走势,成为游戏中的game changer。
因为数据集中只包含队伍整体数据,因此对英雄选择,队内阵容匹配对游戏的影响不做研究。
下面是该数据集中包含的字段以及对各字段的解释:
gameId:每场游戏独特的游戏ID,用来识别同一场游戏的数据
gameDuration:每场游戏时长,单位为毫秒
hasWon:游戏是否胜利
frame:同一场游戏不同的时间节点,单位为分钟
golddiff:与对方整体经济差距
expDiff:与对方整体经验差距
champLevelDiff:与对方整体英雄等级差距
.......(中间包含的众多游戏元素信息因篇幅过长在这里不做解释,分析用到时会另做解释)
kills:队伍总击杀数
deaths:队伍总死亡数
assists:队伍总助攻数
wardsPlaced:队伍放置视野总数
wardsDestroyed:队伍排除视野总数
wardsLost:队伍丢失视野总数
数据预处理
首先按照常规先进行数据预处理步骤。
因为数据集里的信息太多,所以我选择直接计算所有缺失值的总和如果缺失值过多再进一步分析每一列的缺失值如何处理。但是得到结果后我发现这个数据集非常完整,没有任何缺失值,但是不能高兴得太早,可能还会遇到其他问题。我们继续往下处理,现在来看一看数据集中的数据类型都有哪些。
同样地,因为数据集中信息太多,篇幅有限,我选择使用(value_counts())方法直接观察各类型数据分别有多少,结果显示该数据集中的数据全部为数值型(int或float),这为我们接下来的分析提供了很多便利。在这里不得不说一句,看到这么干净的数据,分析的心情都愉悦了不少。
之前我也提到了,这个数据集总共有约两万五千场游戏的数据,其中每场游戏还包括不同时间节点的数据,那么这个数据集到底有多少条数据呢?
结果显示这个数据集中包含了二十四万多条游戏数据,有了这个数据量我们就可以得到更有质量的分析结果。
在之前对字段解释的时候细心的读者可能就发现了gameDuration和frame两列数据虽然都是表示时间,但是单位却不统一,为了使我们的分析结果更清晰,要把gameDuration这一列数据转化为以分钟为单位。
到这一步数据预处理过程基本就结束了,但是因为该数据集中信息量过大,我决定由浅入深分层次进行分析。第一步,我们先只看结果,把游戏结束时的统计结果单独提取出来进行分析。
这时我遇到了处理该数据集的第一个问题,明明这个数据集中只包含不到两万五千场游戏数据,可是我提取出来的数据怎么会有三万五千多场呢?这个时候我们来“zoom in”一下,看看是不是有重复的场次。
看来有很多场次都重复出现了两次,是什么导致了这个原因?我们继续“zoom in”。
注意⚠️ gameDuration和frame这两列,看来是因为frame是以两分钟为间隔增加的,有的场次frame只统计到了游戏结束之前的时间节点,而有的场次因为结束时间离下一个时间节点更近就统计到了下一个时间节点。找到了原因,我们就可以对症下药,直接删除重复场次中较早的时间节点。