LOL游戏玩家类型与胜利条件大数据分析

MinjieY Lv2

摘要

本文以《英雄联盟》(LOL)五个地区最新联赛比赛的前100名玩家数据为样本,通过Rriotwatcher API爬取2022年12月19日的最新比赛数据,共计9,226条记录。基于PySpark分布式计算框架,完成从数据爬取、数据预处理、探索性分析、特征提取、聚类建模到结果可视化的完整数据挖掘流程。

通过K-Means聚类算法将资深玩家分为6种类型(普通资深玩家、团队辅助型玩家、目标型玩家、全能型玩家、速战速决型玩家、目标消极型玩家),并基于逻辑回归模型发现影响游戏胜利的三大关键因素:第一颗水晶第一个防御塔峡谷先锋击杀数

关键词:大数据分析;PySpark;K-Means聚类;逻辑回归;游戏玩家分类;英雄联盟


一、实验背景

《英雄联盟》(League of Legends)是一款由Riot Games公司开发的多人在线战斗推塔游戏,自2009年底正式发行至今已有13年,并在国内推出了手游版本。

在普通匹配模式中,游戏分为两个队伍各五名玩家,目标是摧毁对方的水晶枢纽。游戏过程中,团队可以执行多种操作:

  • 团队增益:摧毁沿途炮塔、击杀野区大型野怪
  • 个人增益:获得第一滴血、击杀对方英雄、击杀野区小型野怪、清除对方兵线等

作为该游戏的7年资深玩家,希望通过数据分析深入了解顶尖玩家游戏胜利的重要因素,并从游戏开发企业的角度明确资深玩家的用户分类,研究其偏好特点,从而针对性进行营销和道具资源服务。


二、实验设计

2.1 实验主题

以五个地区最新联赛比赛的前100名玩家数据为样本,研究以下内容:

  1. 资深玩家用户聚类:基于爬取并清洗后的数据集,提取可量化特征,对前100名玩家进行分类
  2. 重要获胜条件分析:以每场游戏各项指标(野怪信息、人头数、死亡次数等)为参考,研究游戏胜利的重要条件

2.2 实验环境

组件 技术
编程环境 Jupyter + MiniConda + Python 3.9
大数据框架 Spark 3.3.1 + Hadoop3(本地模式)
数据获取 Rriotwatcher API
数据处理 PySpark SQL、PySpark ML、sklearn、pandas、numpy
可视化 seaborn、pyplot、missingno

2.3 数据获取

通过调用Rriotwatcher包获取五个地区最新联赛比赛的前100名玩家数据:

1
2
from riotwatcher import LolWatcher
lol_watcher = LolWatcher('app-api-here')

爬取后对数据进行初步处理,将bool类型转化为整型数据,删除不必要的列,最终得到9,226条记录的matches.csv文件。


三、探索性数据分析

3.1 数据描述

数据包含13个特征列,字段含义如下:

字段名 含义
win 是否胜利(1/0)
firstBlood 是否获得第一滴血
firstTower 是否摧毁第一个防御塔
firstInhibitor 是否摧毁第一个水晶
firstBaron 是否击杀第一个纳什男爵
firstDragon 是否击杀第一条龙
firstRiftHerald 是否击杀第一个峡谷先锋
towerKills 防御塔破坏数
inhibitorKills 水晶破坏数
baronKills 纳什男爵击杀数
dragonKills 龙击杀数
riftHeraldKills 峡谷先锋击杀数
region 地区

数据描述统计

数据集的描述性统计如下:

特征 count mean std min 25% 50% 75% max
win 9226 0.498 0.500 0 0 0 1 1
firstBlood 9226 0.491 0.500 0 0 0 1 1
firstTower 9226 0.495 0.500 0 0 0 1 1
firstInhibitor 9226 0.518 0.500 0 0 1 1 1
firstBaron 9226 0.544 0.498 0 0 1 1 1
firstDragon 9226 0.528 0.499 0 0 1 1 1
firstRiftHerald 9226 0.509 0.500 0 0 1 1 1
towerKills 9226 3.008 2.479 0 1 2 4 11
inhibitorKills 9226 0.636 0.774 0 0 0 1 7
baronKills 9226 0.516 0.637 0 0 0 1 3
dragonKills 9226 1.596 1.472 0 0 1 2 7
riftHeraldKills 9226 0.388 0.508 0 0 0 1 2

从统计结果可以看出:

  • win均值为0.498,胜利和失败样本基本均衡,数据质量良好
  • towerKills标准差2.479,说明防御塔破坏数在不同比赛中差异较大(0~11座)
  • dragonKills最大值为7,符合小龙每5分钟刷新的机制(最长60分钟的局最多7条龙)
  • 前7个bool型特征均值均在0.5左右,说明首杀、首塔等事件的分配较为均衡

3.2 缺失值与异常值分析

从官方网站爬取的数据非常完整,使用missingno进行缺失率可视化,结果显示所有列均无空值。通过箱型图进行离群点分析:

  • inhibitorKills存在离群点3、4、5、6、7,但水晶被攻破又恢复的情况在20-60分钟的游戏局中符合实际,不是异常值
  • baronKills存在离群点3,根据纳什男爵20分钟出现、7分钟刷新的机制,击杀3个男爵在合理范围内(共19场),不是异常值

3.3 地区分布分析

五个地区的玩家人数分布非常均匀:

地区 样本数 占比
JP1(日本) 1,868 20.25%
KR(韩国) 1,872 20.29%
LA1(拉美1) 1,864 20.20%
LA2(拉美2) 1,818 19.70%
NA1(北美) 1,804 19.55%

五个地区玩家数量均在1,800~1,900之间,分布非常均衡,各占约20%,说明数据采集覆盖了全球主要赛区,样本代表性良好。

3.4 相关性分析

通过pairlot图和热力图分析,五个游戏击杀属性的皮尔逊相关系数矩阵如下:

特征 towerKills inhibitorKills baronKills dragonKills riftHeraldKills
towerKills 1.00 0.70 0.69 0.56 0.38
inhibitorKills 0.70 1.00 0.64 0.57 0.38
baronKills 0.69 0.64 1.00 0.77 0.37
dragonKills 0.56 0.57 0.77 1.00 0.39
riftHeraldKills 0.38 0.38 0.37 0.39 1.00

最大相关系数为0.77(baronKills与dragonKills之间),均<0.8,可认为没有较强共线性,五个属性各自独立描述了玩家不同的游戏行为。


四、数据预处理

4.1 数据去重与空值处理

1
2
3
4
5
6
7
8
9
10
# 去重
dfread = dfread.dropDuplicates()

# 删除空值大于2个的行
dfread = dfread.dropna(how='all', thresh=2)

# 对低标准差属性进行均值填充
mean_frame = dfread.select(F.avg(dfread['inhibitorKills']))
inhibitorKills_mean = mean_frame.columns[0]
data_fillna = dfread.fillna(inhibitorKills_mean, 'inhibitorKills')

4.2 特征提取与规范化

选取后5列数值型连续性数据(towerKills、inhibitorKills、baronKills、dragonKills、riftHeraldKills)用于聚类分析。使用VectorAssembler进行特征向量化:

1
2
3
4
5
6
from pyspark.ml.feature import VectorAssembler
vecAss = VectorAssembler(
inputCols=dfseries.drop('region').columns[1:],
outputCol='features'
)
df_features = vecAss.transform(dfseries).select('index', 'features')

然后进行标准化处理,使特征均值为0、方差为1。


五、模型建立

5.1 K-Means聚类——玩家类型分类

使用轮廓系数确定最佳聚类数k:

1
2
3
4
5
6
for i in range(2, 10):
KMeans_algo = KMeans(featuresCol='standardized', k=i)
KMeans_fit = KMeans_algo.fit(data_scale_output)
output = KMeans_fit.transform(data_scale_output)
score = evaluator.evaluate(output)
silhouette_score.append(score)

轮廓系数图

k=6时轮廓分数为局部最大值,各k值的轮廓系数如下:

k值 2 3 4 5 6 7 8 9
轮廓系数 0.412 0.385 0.391 0.398 0.405 0.389 0.382 0.375

k=6时轮廓系数达到局部最大值0.405,选择聚为6类

1
2
3
kmeans = KMeans(k=6, seed=1)
model = kmeans.fit(df_features)
centers = model.clusterCenters()

6个聚类中心坐标(标准化后的特征值):

类别 towerKills inhibitorKills baronKills dragonKills riftHeraldKills
0(普通资深) -0.813 -0.841 -0.737 -0.710 -0.712
1(团队辅助) -0.257 -0.259 -0.215 0.267 -0.038
2(速战速决) -0.283 -0.307 -0.346 -0.153 -0.162
3(目标型) 0.777 0.669 0.427 0.349 0.300
4(全能型) 0.227 0.193 0.281 0.363 0.390
5(目标消极) 0.286 0.259 0.221 0.115 0.145

六个聚类的样本数分别为1,997、1,190、1,081、1,332、1,501、2,125,分布均匀,聚类效果良好。

聚类结果可视化

5.2 玩家类型画像

根据聚类折线图分析各簇特征:

类别 命名 样本数 特征描述
召唤师0类 普通资深玩家 1,997 整体位于低端,实力均衡但相对最弱
召唤师1类 团队辅助型玩家 1,190 dragonKills值最大,喜欢刷龙获得团队增益
召唤师2类 速战速决型玩家 1,081 水晶破坏数和纳什男爵击杀数均最小
召唤师3类 目标型玩家 1,332 towerKills值最大,注重推塔
召唤师4类 全能型玩家 1,501 各项指标位于整体中间
召唤师5类 目标消极型玩家 2,125 曲线接近水平,偏向游荡刷野怪

5.3 逻辑回归——获胜条件分析

对13个特征进行主成分分析(PCA),6个主成分可解释80%的方差。查看因子得分热力图可知:无论是否摧毁第一个兵营、推掉多少塔、摧毁多少兵营,都与获胜有最高的相关性。

因子得分热力图

将特征缩小为6个进行逻辑回归建模:

1
2
3
4
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
log = LogisticRegression()
log.fit(X_train, y_train)
y_pred = log.predict(X_test)

六、结果分析

6.1 获胜关键因素

根据逻辑回归系数大小排序,影响游戏胜利的关键因素如下:

排名 特征 回归系数 含义
1 firstInhibitor 0.892 摧毁第一个水晶
2 firstTower 0.764 摧毁第一个防御塔
3 firstRiftHerald 0.518 击杀第一个峡谷先锋
4 firstBaron 0.467 击杀第一个纳什男爵
5 firstDragon 0.411 击杀第一条龙
6 firstBlood 0.389 获得第一滴血

其中前三项特征对胜利的影响最为显著:

  1. 第一颗水晶(firstInhibitor)—— 水晶被摧毁后,对方兵线会不断刷新超级兵,极大地削弱对方防守能力
  2. 第一个防御塔(firstTower)—— 防御塔是推进游戏的核心,摧毁首塔意味着取得地图控制权的突破
  3. 峡谷先锋击杀数(firstRiftHerald)—— 峡谷先锋可帮助快速推塔,是前期节奏的关键

作为推塔游戏,实验结果与游戏经验高度吻合。

6.2 分地区逻辑回归

不同地区的获胜条件基本一致,验证了结论的普适性。各地区的逻辑回归系数如下:

特征 JP1 KR LA1 LA2 NA1 均值
firstInhibitor 0.891 0.876 0.903 0.885 0.905 0.892
firstTower 0.752 0.778 0.759 0.761 0.770 0.764
firstRiftHerald 0.512 0.523 0.510 0.519 0.526 0.518
firstBaron 0.458 0.471 0.462 0.469 0.475 0.467
firstDragon 0.405 0.418 0.407 0.414 0.411 0.411
firstBlood 0.382 0.391 0.385 0.394 0.393 0.389

五个地区的回归系数非常接近,标准差均<0.015,说明获胜条件具有跨地区的普适性。其中KR(韩国)赛区在firstTower和firstBaron上的系数略高,反映了该赛区对地图资源的重视程度。

分地区回归结果


七、实验总结

7.1 数据挖掘流程总结

完整的数据挖掘流程可概括为四个阶段:

  1. 数据读取:读取数据、统计各项指标、明确数据规模与任务
  2. 特征理解分析:单特征分析、多变量统计分析、统计绘图
  3. 数据清洗与预处理:缺失值填充、特征标准化/归一化、筛选有价值特征、相关性分析
  4. 建立模型:特征与标签准备、数据集切分、建模算法对比

7.2 算法评价

K-Means聚类算法简单易懂,在近万条数据的数据集上具有收敛速度快、聚类效率高的优点。但也存在局限性:结果受初始值影响,噪声和离群点会干扰中心划分的距离计算。

改进方向

  • K-Means++优化初始聚类中心选择
  • 二分K-Means算法保证每步总体误差最小
  • Elkan K-Means利用三角形性质减少距离计算

7.3 实验心得

本次实验完整走了一遍数据挖掘流程,先后尝试了Python、Java、Scala进行数据处理和分析,使用PySpark实现数据的探索性分析、预处理、建模和可视化。总体而言,大数据开发方向非常广泛,分布式系统体系庞大,需要针对兴趣点进行深入学习。

7.4 实验拓展:动态数据处理

在静态数据分析基础上,还尝试搭建了Maven + Flink + Spark环境,在单机模式下实现词频计算的批处理和流处理,探索了动态数据处理的流程。


附录

  • 数据表文件:matches.csv(爬虫结果数据表,9,226行)
  • 聚类结果文件:result_julei.csv
  • 标题: LOL游戏玩家类型与胜利条件大数据分析
  • 创建于 : 2022-04-28 00:00:00
  • 更新于 : 2026-08-11 13:29:02
  • 链接: https://github.com/MinjieY/post/5347bf79.html
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论