用 Python 分析了 10000 场吃鸡数据,原来吃鸡要这么玩!
作者 | 阿广
责编 | 屠敏
1.前言
绝地求生在国内火的一塌糊涂的时候,一款名叫 Fortnite 的游戏在国外刮起了堡垒旋风,这款同样为大逃杀玩法的沙盒类游戏,在绝地求生逐渐走低的形势下,堡垒之夜却夺得多项提名,众多明星主播转战堡垒!
上天入地,盖楼修路,铺陷阱设弹床;想和太阳肩并肩,一发火箭就上天。
鉴于“二百斤灵魂”小胖舍友经常痴迷于吃鸡类游戏,为了帮助他提高游戏胜率,我爬取并分析了 1w 余场吃鸡数据。下面让我们来看一下能吃鸡得强相关条件是什么?
2.获取数据
首先,我们需要加载 Python 库:
import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns %matplotlib inline
然后载入Fortnite数据,检查数据的质量和整洁度,然后整理和清理数据集,以便进行后续的清理工作。
#录入Fornite的CSV数据 Fortnite_data = pd.read_csv('aguang.csv')
为了对数据集有一个大致的了解,不妨先输出数据的前几行。
Fortnite_data.head()
结果为:
serial_number knockout_number assist-number save_number precision hit_the_target exact_strike marching_course material collection material-using afford damage cause_damage building-damage grade Total-score Total-experience teams number match-time competitor-name 0 1 4 1 0 0.33 69 19 4000 1325 670 554 815 3709 3 448.0 762.0 1 2018/5/14 11:37 Alvin 1 2 2 1 0 0.31 28 0 2000 733 110 292 268 7733 9 282.0 536.0 2 2018/5/17 17:48 Alvin 2 3 3 0 1 0.21 33 12 3000 1806 350 245 543 7727 8 291.0 597.0 4 2018/5/18 18:05 Alvin 3 4 2 0 3 0.05 6 0 3000 700 420 746 163 19008 3 NaN NaN 4 2018/5/18 18:26 Alvin 4 5 1 4 1 0.12 32 7 3000 668 370 212 432 13108 4 358.0 734.0 4 2018/5/18 18:53 Alvin
3.观察数据
本数据集包含了1w余把游戏数据,其中可能有“二百斤”的小胖网瘾记录(惨不忍睹:joy:)。该数据集中的缺失值被标记为NaN。数据列名的含义如下:
serial_number: 游戏场次编号 knockout_number: 本场淘汰人数 assist_number: 助攻数 save_number: 救起队友人数 precision: 射击精度 hit_the_target: 命中 exact_strike: 精准打击 marching_course: 行进历程(m) material_collection: 材料已收集 material-using: 使用材料 afford_damage: 承受伤害 cause_damage: 玩家伤害 building-damage: 建筑伤害 total_score: 总分 total_experience: 总经验 teams_number: 参赛情况(1人为Solo,两人为Double,4人为team,3人参赛自动填充为4人) match_time: 游戏时间 competitor_name: 该条记录的所有人
4.数据处理
查看数据类型和数据有无缺失值:
#查看数据类型和数据有无缺失 Fortnite_data.info()
查看一下有无重复数据:
#查看一下有无重复数据 Fortnite_data[Fortnite_data.duplicated()]
结果为:
serial_number knockout_number assist-number save_number precision hit_the_target exact_strike marching_course material collection material-using afford damage cause_damage building-damage grade Total-score Total-experience teams number match-time competitor-name
查看数据的描述统计:
#查看数据的描述统计 Fortnite_data.describe()
结果为:
serial_number knockout_number assist-number save_number precision hit_the_target exact_strike marching_course material collection material-using afford damage cause_damage building-damage grade Total-score Total-experience teams number coun 42.000000 42.000000 42.000000 42.000000 42.000000 42.000000 42.000000 42.000000 42.000000 42.000000 42.000000 42.000000 42.000000 42.000000 20.000000 20.000000 42.000000 mean 21.500000 2.642857 1.261905 0.380952 0.246429 38.452381 6.976190 2576.142857 1092.785714 312.619048 350.047619 567.309524 9336.119048 6.000000 362.700000 676.350000 3.238095 std 12.267844 2.818246 1.415240 0.660834 0.168520 32.539809 8.529684 781.055339 617.643932 213.781967 160.616336 434.419966 6366.174673 4.928761 151.638802 274.785519 1.122052 min 1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 481.000000 200.000000 0.000000 52.000000 0.000000 1755.000000 1.000000 84.000000 168.000000 1.000000 25% 11.250000 1.000000 0.000000 0.000000 0.172500 10.250000 2.000000 2000.000000 694.750000 162.500000 273.000000 262.750000 5780.000000 3.000000 277.750000 507.750000 2.000000 50% 21.500000 2.000000 1.000000 0.000000 0.240000 32.500000 3.500000 3000.000000 905.500000 260.000000 326.000000 513.000000 7819.000000 4.000000 328.500000 602.500000 4.000000 75% 31.750000 3.000000 2.000000 1.000000 0.305000 56.000000 10.250000 3000.000000 1453.750000 367.500000 403.000000 692.500000 10799.500000 7.750000 403.000000 775.250000 4.000000 max 42.000000 15.000000 5.000000 3.000000 1.000000 126.000000 39.000000 4000.000000 2728.000000 1060.000000 877.000000 1970.000000 32963.000000 18.000000 728.000000 1238.000000 4.000000
经过分析数据,发现一场淘汰13人的数据,可能存在误差,单独输出看一下:
Fortnite_data[Fortnite_data['knockout_number']==13]
结果为:
serial_number knockout_number assist-number save_number precision hit_the_target exact_strike marching_course material collection material-using afford damage cause_damage building-damage grade Total-score Total-experience teams number match-time competitor-name 12 13 15 1 0 0.24 103 18 3000 1488 660 52 1970 8612 1 728.0 1238.0 1 2018/5/19 21:47 Wal-Mart
经过分析,这条属于正常数据,可能是“有趣的灵魂”小胖同学这场异常生猛,一人杀了13个,一路高歌在吃鸡的道路上,且只有3000m的行进举例说明基本上没有跑毒的困扰,可以说天时地利了!
为了提高清洁度,将match-time列拆分成年月日列和小时列,下面是数据清理:
#复制一个备用df Fortnite_clean = Fortnite_data.copy()
5.吃鸡到底和哪个数据相关性最强?
在完成数据整理和清理之后,我接下来进行探索性数据分析。首先确定研究问题,然后可以输出描述性统计值,查看有没有值得研究的点(途中可以因为了解到更好的点而调整问题方向),创建可视化图表,解决你在前面提出的研究问题。
探究问题:获得第一名(吃鸡)到底跟那个数据相关性最高?
Fortnite_clean.head() #对整理好的数据输出描述性统计 Fortnite_clean.describe() #选出获得第一名的数据 Fortnite_clean[Fortnite_clean['grade']==1]
结果为:
serial_number knockout_number assist_number save_number precision hit_the_target exact_strike marching_course material_collection material_using afford_damage cause_damage building_damage grade total_score total_experience teams_number data_sources match_day match_hour 12 0013 15 1 0 0.24 103 18 3000 1488 660 52 1970 8612 1 728 1238 Solo Wal-Mart 2018-05-19 21:47:00 18 0019 1 1 1 0.02 5 2 4000 1351 250 225 214 8096 1 608 1156 Team Alvin 2018-05-22 21:24:00 25 0026 5 3 1 0.26 62 2 4000 2728 330 83 1040 7096 1 0 0 Team Wal-Mart 2018-05-28 21:58:00 26 0027 2 3 0 0.18 6 0 2000 1955 100 451 541 23633 1 594 1188 Team Alvin 2018-05-28 21:58:00 27 0028 2 4 0 0.19 48 3 3000 1755 590 283 605 20733 1 0 0 Team Kaka 2018-05-28 21:58:00
奇怪的是,在吃鸡的数据中,Wal-Mart的数据明显偏优良,Alivn和Kaka的数据看起来似乎并不怎么样,在knockout_number,precision和`cause_damage这几个我们惯常看的吃鸡指标中显示非常不突出,甚至还不如很多排名比较靠后的数据。之后筛选出伤害高于606的数据
#筛选出造成伤害高于606的数据 Fortnite_clean[Fortnite_clean['cause_damage']>=606]
我们可以看到高于吃鸡的Alvin和Kaka记录的那次只造成541和605伤害的数据多如牛毛,但是成绩貌似并不怎么样,成绩才在第六名徘徊!那是什么原因造成Alvin和Kaka吃鸡的呢,难道只是搭上了“二百斤”小胖沃尔玛的快船,两位都是划水之辈么!
并不是这样的,我们的眼光落在了afford_damage和building_damage上,两位都有很高的承受伤害和建筑伤害,(堡垒之夜是可以自己搭建筑作为掩体的)那他们是不是去帮主火力手沃尔玛去吸引火力和打掉地方简直给沃尔玛输出空间的呢,让我们继续研究。
那么,引来了一个分支问题:围绕主输出手,一个有着afford_damage和building_damage的队友对吃鸡有功效吗?
解决代码如下:
Fortnite_clean[Fortnite_clean['afford_damage']>=451].grade.mean() output:3.125 Fortnite_clean[Fortnite_clean['building_damage']>=20000].grade.mean() output:1.75
可推断,knockout_number,precision和cause_damage这几个数据对于吃鸡固然重要,但是要是在4人小组中,围绕1到2个输出位,配置1到2为抗住伤害的肉盾和负责拆板子的机枪手,对吃鸡是大有益处的。
经过数据的可视化,热度图如下:
6.分析热度图
在热力图中,与吃鸡(grade)相关性比较高的前三项是:材料收集、淘汰人数和造成伤害。
之前比较看好的命中和精准打击相关性不太高,难道良好的FPS手感在堡垒之夜中已经不太重要了么,这就还需要更多的数据来研究。
7.期望研究的问题
- 是否天命圈与能否吃鸡是不是有相关性?(marching_course<2000)
- 比赛中使用更多的板子与能否吃鸡是不是有相关性?(material_using)
注:由于数据量太小,以后能收集到更多的数据,是希望可以对上面以及更多的方向进行研究。
8.结论
根据上面的热力图可以得出如下结果:
- 与吃鸡相关性比较高的前三项是:材料收集、淘汰人数和造成伤害,基本复合预期;
- 材料使用的相关性高是因为被淘汰的玩家爆出的装备和材料被捡起也视作材料收集;
- 组队如果想要取得好成绩,围绕1到2个输出位,配置1到2为抗住伤害的肉盾和负责拆板子的机枪手,才是正道;
- 正如前面所说,这个分析出来的结果更偏向于单人吃鸡,组队吃鸡,队员之间的工作分配也是非常重要的。
9.最后想说的话
用时间和生命兑换虚拟的快感和对现实的逃避,最终还是一无所获。疏远了自己的朋友,家人,越打越孤独,越孤独越打。
每一局都好像重新开始,每一局都不过是重复上演。一局又一局,看不到尽头。炫耀的是战绩,流失的是生命。
每次该做正事了,仔细规划一番后:好可怕,要好长时间哦。先打一盘游戏压压惊...就这样,一日复一日,一年复一年,时间在别人的圈套中浪费掉,我们和理想的距离也越来越远。
游戏初始画面里都写着,适度游戏益脑,切勿沉迷游戏。我希望每一个打游戏的朋友,都能够做到:吃鸡是一种态度,不是生活的全部!
GitHub 地址:https://github.com/zandaoguang/eattingchicken
作者简介:阿广,本文首发于个人公众号「视学算法」。
「视学算法」是专注于大数据、人工智能和算法的学习平台,也是一个保送中科院软件研究所直博生的自留地。人生苦短,我愿做您最忠实的技术支持伙伴!一起用代码改变世界!