Python社区  »  Python

用Python分析了1w场吃鸡数据,原来吃鸡要这么玩!

Python中文社区 • 1 月前 • 205 次点击  


本文作者,我的好朋友阿广,中国科学院软件研究所研究生,先后在阿里、华为、中科院实习踩过坑。公众号【视学算法】(非视觉算法哦!)专注于机器学习、深度学习、计算机视觉、前沿论文和基础程序设计等算法,欢迎关注。

概述 

  • 前言

  • 获取数据

  • 观察数据

  • 数据处理

  • 吃鸡到底和哪个数据相关性最强?

  • 分析热度图

  • 期望研究的问题

  • 结论

  • 阿广说

  • 推荐阅读

前言   

绝地求生在国内火的一塌糊涂的时候,一款名叫Fortnite的游戏在国外刮起了堡垒旋风,这款同样为大逃杀玩法的沙盒类游戏,在绝地求生逐渐走低的形势下,堡垒之夜却夺得多项提名,众多明星主播转战堡垒!

上天入地,盖楼修路,铺陷阱设弹床;想和太阳肩并肩,一发火箭就上天。

鉴于“二百斤灵魂”小胖舍友经常痴迷于吃鸡类游戏,为了帮助他提高游戏胜率,我爬取并分析了1w余场吃鸡数据。下面让我们来看一下能吃鸡得强相关条件是什么?

获取数据

首先,我们需要加载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

观察数据

本数据集包含了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:  该条记录的所有人

数据处理

查看数据类型和数据有无缺失值

#查看数据类型和数据有无缺失
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()

问题:获得第一名(吃鸡)到底跟那个数据相关性最高?

在完成数据整理和清理之后,我接下来进行探索性数据分析。首先确定研究问题,然后可以输出描述性统计值,查看有没有值得研究的点(途中可以因为了解到更好的点而调整问题方向),创建可视化图表,解决你在前面提出的研究问题。

探究问题:获得第一名(吃鸡)到底跟那个数据相关性最高?

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_numberprecision`cause_damage这几个我们惯常看的吃鸡指标中显示非常不突出,甚至还不如很多排名比较靠后的数据。之后筛选出伤害高于606的数据

#筛选出造成伤害高于606的数据
Fortnite_clean[Fortnite_clean['cause_damage']>=606]

我们可以看到高于吃鸡的Alvin和Kaka记录的那次只造成541和605伤害的数据多如牛毛,但是成绩貌似并不怎么样,成绩才在第六名徘徊!那是什么原因造成Alvin和Kaka吃鸡的呢,难道只是搭上了“二百斤”小胖沃尔玛的快船,两位都是划水之辈么!

并不是这样的,我们的眼光落在了afford_damagebuilding_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 precisioncause_damage这几个数据对于吃鸡固然重要,但是要是在4人小组中,围绕1到2个输出位,配置1到2为抗住伤害的肉盾和负责拆板子的机枪手,对吃鸡是大有益处的。

dfData = Fortnite_one.corr()
plt.subplots(figsize=(8, 8)) # 设置画面大小
sns.heatmap(dfData, annot=True, vmax=1, square=True, cmap="Blues")
plt.show()


经过数据的可视化,热度图如下:

https://github.com/zandaoguang/eattingchicken

或者点击查看原文可查看源码

分析热度图

在热力图中,与吃鸡(grade)相关性比较高的前三项是:材料收集、淘汰人数和造成伤害


之前比较看好的命中和精准打击相关性不太高,难道良好的FPS手感在堡垒之夜中已经不太重要了么,这就还需要更多的数据来研究。

期望研究的问题

  • 是否天命圈与能否吃鸡是不是有相关性?(marching_course<2000)


  • 比赛中使用更多的板子与能否吃鸡是不是有相关性?(material_using)


注:由于数据量太小,以后能收集到更多的数据,是希望可以对上面以及更多的方向进行研究。

结论

根据上面的热力图可以得出如下结果:


  • 与吃鸡相关性比较高的前三项是:材料收集、淘汰人数和造成伤害,基本复合预期;

  • 材料使用的相关性高是因为被淘汰的玩家爆出的装备和材料被捡起也视作材料收集;

  • 组队如果想要取得好成绩,围绕1到2个输出位,配置1到2为抗住伤害的肉盾和负责拆板子的机枪手,才是正道;

  • 正如前面所说,这个分析出来的结果更偏向于单人吃鸡,组队吃鸡,队员之间的工作分配也是非常重要的。


下面推荐一个值得关注的公众号,地球不爆炸,算法不放假。阿广每月免费包邮送书几十本不等,如果你有任何关于技术的问题,欢迎关注阿广的微信公众号「视学算法」(非视觉算法哦!)

视学算法

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/71033
 
205 次点击  
分享到微博