|
【版权声明】版权所有,严禁转载,严禁用于商业用途,侵权必究。
作者:厦门大学计算机科学与技术系2023级研究生 黄万嘉
指导老师:厦门大学数据库实验室 林子雨 博士/副教授
时间:2024年6月
相关教材:林子雨、郑海山、赖永炫编著《Spark编程基础(Python版,第2版)》(访问教材官网)
相关案例:基于Python语言的Spark数据处理分析案例集锦(PySpark)
数据集和代码下载:从百度网盘下载本案例数据集和代码。(提取码是ziyu)
本实验旨在通过应用大数据处理技术,对Kaggle社区提供的PUBG游戏统计数据集进行深入分析。实验的主要目标包括:
1.在Ubuntu 18.04操作系统上部署Hadoop 3.1.3和Spark 2.4.0环境,为大数据处理提供基础设施。
- 下载并预处理PUBG Finish Placement Prediction数据集,以适应实验需求并准备数据进行分析。
- 利用Python编程语言和Spark框架,对处理后的数据集进行探索性数据分析,以理解玩家在游戏中的表现和行为模式。
- 分析玩家击杀数、伤害量、移动行为和物品使用情况等关键指标,以及它们与比赛结果之间的关系。
- 通过数据可视化技术,将分析结果以图形化的方式展现出来,帮助更直观地理解PUBG玩家的行为特征和游戏模式。
(1)Linux:Ubuntu 18.04
(2)Hadoop3.1.3
(3)Python:3.7
(4)Spark:3.4.0
本次实验数据集来源Kaggle社区的“PUBG Finish Placement Prediction”数据集,下载链接为:数据集源自PUBG游戏的统计数据,旨在构建一个模型来预测玩家在每场比赛中的最终排名。数据集包含了从个人玩家到整个团队的详细游戏后统计信息,格式为CSV文件,每个玩家的统计信息占据一行。下面是数据集各字段的含义:
DBNOs - 击倒敌人玩家的数量。示例:3, 5。
assists - 对队友击杀敌人有助攻的次数。示例:1, 0。
boosts - 使用的增益物品数量。示例:2, 5。
damageDealt - 造成的总伤害量(扣除了对自身的伤害)。示例:500, 300。
headshotKills - 爆头击杀敌人的数量。示例:2, 1。
heals - 使用的治疗物品数量。示例:3, 1。
Id - 玩家的唯一标识符。示例:101, 202。
killPlace - 根据击杀敌人数量的排名。示例:5, 1。
killPoints - 基于击杀的排名分数(如果rankPoints不是-1,则0应视为“无”)。示例:120, -1。
killStreaks - 最大连杀数。示例:3, 1。
kills - 击杀敌人的总数。示例:3, 7。
longestKill - 击杀时与敌人的最远距离。示例:200米,100米。
matchDuration - 比赛持续的时间(秒)。示例:1800, 2400。
matchId - 比赛的唯一标识符。示例:match_101, match_202。
matchType - 比赛模式,如“solo”、“duo”、“squad”。示例:solo, squad。
rankPoints - Elo评分系统中的排名分数(-1表示“无”)。示例:240, -1。
revives - 复活队友的次数。示例:1, 0。
rideDistance - 乘坐载具的总距离(米)。示例:500米,1000米。
roadKills - 在载具中击杀敌人的数量。示例:2, 0。
swimDistance - 游泳的总距离(米)。示例:20米,50米。
teamKills - 意外击杀队友的次数。示例:0, 1。
vehicleDestroys - 摧毁的载具数量。示例:1, 3。
walkDistance - 步行的总距离(米)。示例:1000米,800米。
weaponsAcquired - 拾取的武器数量。示例:4, 6。
winPoints - 基于胜利的排名分数(如果rankPoints不是-1,则0应视为“无”)。示例:100, -1。
groupId - 队伍的唯一标识符。示例:group_101, group_202。
numGroups - 比赛中记录的参赛队伍数量。示例:20, 30。
maxPlace - 比赛中记录的最差排名。示例:21, 35。
winPlacePerc - 预测目标,即比赛的百分位排名,1代表第一名,0代表最后一名。示例:0.95, 0.5。
本次实验采用pandas库对数据进行预处理,由于实验要求限制,原数据集(628MB)不符合数据集要求,采用随机删减数据的方式,缩减数据集规模,使用的代码shuffle.py如下:
删减完成后,对数据集进行预处理。在数据预处理中,对数据集进行重复值处理及缺失值处理,之后保存数据集:
得到清洗完成的数据集,将其写入HDFS中:

我将采用Python编程语言和Spark大数据框架对数据集“data.csv”进行处理分析,具体步骤如下:
对于PUBG游戏而言,玩家的击杀数是很重要的数据,可以直观反映玩家的游戏水平。因此先分析平均击杀/最高击杀/99%玩家的击杀数,代码如下:
输出结果为:平均击杀为 0.9228 , 99% 的玩家击杀了 7 或以下,最高的击杀记录为 56。输出的图片结果如下,可以看到,大部分人在比赛里没有击杀,其次是击杀了一个人,这也很好的反应了该款游戏的难度。

既然大部分玩家在一局对局里面无法实现一次击杀,我们继续分析他们是否造成了伤害。
结果如下图所示,可以看到,大部分0击杀的玩家,造成了0伤害,也就是一枪不开或者开了都没中,就被击败。

PUBG游戏中,玩家可以步行或者使用载具,我们先来分析玩家在每局游戏中的步行行为。代码如下:
得到下图,可以看出相当一部分玩家步行距离 < 100m,表明他们跳伞落地就被击杀或者直接就挂机了。

分析玩家的载具行为,代码如下:
得到如下输出和图片:
平均载具行驶距离为 606.6m, 99% 的玩家行驶了 7005.0m 或更少, 行驶距离最远的玩家行驶 27410.0m.
275812 位玩家 (74.4269%) 行驶了 0 米. 他们本局游戏没有使用过载具.
由上述输出和图片,玩家们在游戏中大部分没有机会使用到载具,这可能和载具获取难度有关,同时,载具的平均行驶距离为606.6m,这也表明一旦玩家有机会使用载具,他们会持续使用载具进行移动。
PUBG中提供了种类繁多的物品,分为治疗物品(医疗包、医疗箱、绷带)和增益物品(能量饮料、止疼药),分析物品的使用情况可以侧面反映游戏的激烈程度,分析代码如下:
可以得到以下的输出和图片:

平均每个人使用 1.4 个治疗物品,99%的人使用 12 或更少,而最多的人使用了 54 个。
平均每个人使用 1.1 个增益物品,99%的人使用 7 或更少,而最多的人使用了 22 个。
根据输出的图片,可以粗略判断出治疗物品和增益物品的数量似乎与获胜百分比(Win Percentage)有一定的关联。图中显示,随着治疗物品或增益物品数量的增加,获胜百分比也有所提高。
PUBG游戏中有3种游戏模式。一个人可以单独玩,也可以与朋友(二人组)一起玩,也可以与其他 3 个朋友(小队)一起玩。100 名玩家加入同一服务器,因此在双人组的情况下,最大团队为 50 个,在小队的情况下,最大团队为 25 个。原始数据并没有这个特征,因此需要我们自己分析
代码如下:
输出及图片如下:

共有 59261 场(15.99%)单人游戏,274568 场(74.09%)双人游戏,以及 36752 场(9.92%)组队游戏。
可以看出在不同游戏模式下,随着击杀数的增加,获胜百分比大致呈上升趋势。此外,单人模式在较高击杀数时的获胜百分比似乎高于双人和组队模式,这可能表明在获得较多击杀后,单人模式的玩家胜率提升更为显著。
本次实验经过一系列的数据处理和分析,得出以下结论:
- 数据预处理:成功地对原始数据集进行了清洗和缩减,删除了重复和缺失的数据,为数据分析阶段准备了高质量的数据集。
- 玩家行为分析:通过对击杀数、伤害量、步行距离和载具使用等数据的分析,揭示了PUBG玩家在比赛中的行为模式。大部分玩家在比赛中难以实现击杀,且有相当一部分玩家步行距离较短,表明他们可能很快就被淘汰或选择挂机。
- 物品使用情况:分析表明,治疗物品和增益物品的使用与玩家的获胜百分比存在一定的关联,使用这些物品数量的增加似乎能提高获胜的机会。
- 组队情况分析:根据不同的游戏模式(单人、双人、组队),分析了玩家的组队情况和获胜百分比的关系。结果显示,单人模式在获得较多击杀后胜率提升更为显著。
- 数据可视化:利用matplotlib和seaborn等工具,将分析结果进行了直观的可视化展示,包括击杀数分布、伤害量分布、步行距离和载具使用距离的分布图。
最后,在实验过程中,加深了我对Hadoop和Spark大数据技术的理解,掌握了使用这些工具进行数据处理、分析和可视化的方法。同时实验的分析结果也可以为PUBG游戏设计提供了数据支持,例如,通过了解玩家行为模式,游戏开发者可以对游戏机制进行调整,以提升玩家的游戏体验和满意度。
(责任编辑:admin) |