Kaggle项目之PUBG Finish Placement Prediction(一)——探索性分析

数据来自Kaggle,也可以在这里取,提取码wymx。比赛在一个月前结束,这里拿来练练手~
附加python代码多图预警!!

0、问题背景

在PUBG游戏中,每场比赛最多有100名玩家(matchId)。 玩家可以在团队中(groupId)根据有多少其他团队在被淘汰时还活着而在游戏结束时排名(winPlacePerc)。 在游戏中,玩家可以拿起不同的弹药,恢复被击倒但未被击倒的队友,驾驶车辆,游泳,跑步,射击,并体验所有后果 - 例如跌得太远或者自己跑过来 消除自己。
您将获得大量匿名的PUBG游戏统计数据,其格式设置为每行包含一个玩家的游戏后统计数据。 数据来自所有类型的比赛:独奏,二重奏,小队和自定义; 不保证每场比赛有100名球员,每组最多4名球员。
你必须创建一个模型,根据他们的最终统计数据预测球员的完成位置,从1(第一名)到0(最后一名)。

1、各变量含义
DBNOs - 击倒多少敌人 
assists - 伤害过多少敌人(最终该敌人被队友杀害)
boosts - 使用过多少个提升性的物品(boost items used)
damageDealt - 造成的总伤害-自己所受的伤害
headshotKills - 通过爆头而杀死的敌人数量
heals - 使用了多少救援类物品
Id - 玩家ID
killPlace - 杀死敌人数量的排名
killPoints - 基于杀戮的玩家外部排名。将其视为Elo排名,只有杀死才有意义。如果rankPoints中的值不是-1,那么killPoints中的任何0都应被视为“无”。
killStreaks - 短时间内杀死敌人的最大数量
kills - 杀死的敌人的数量
longestKill - 玩家和玩家在死亡时被杀的最长距离。 这可能会产生误导,因为击倒一名球员并开走可能会导致最长的杀戮统计数据。
matchDuration - 匹配用了多少秒
matchId - 匹配的ID(每一局一个ID)
matchType -  单排/双排/四排;标准模式是“solo”,“duo”,“squad”,“solo-fpp”,“duo-fpp”和“squad-fpp”; 其他模式来自事件或自定义匹配。
rankPoints - 类似Elo的玩家排名。 此排名不一致,并且在API的下一个版本中已弃用,因此请谨慎使用。值-1表示“无”。
revives - 玩家救援队友的次数
rideDistance - 玩家使用交通工具行驶了多少米
roadKills - 在交通工具上杀死了多少玩家
swimDistance - 游泳了多少米
teamKills - 该玩家杀死队友的次数
vehicleDestroys - 毁坏了多少交通工具
walkDistance - 步行运动了多少米
weaponsAcquired - 捡了多少把枪
winPoints - 基于赢的玩家外部排名。将其视为Elo排名,只有获胜才有意义。如果rankPoints中的值不是-1,那么winPoints中的任何0都应被视为“无”。
groupId - 队伍的ID。 如果同一组玩家在不同的比赛中比赛,他们每次都会有不同的groupId。
numGroups - 在该局比赛中有玩家数据的队伍数量
maxPlace - 在该局中已有数据的最差的队伍名词(可能与该局队伍数不匹配,因为数据收集有跳跃)
winPlacePerc - 预测目标,是以百分数计算的,介于0-1之间,1对应第一名,0对应最后一名。 它是根据maxPlace计算的,而不是numGroups,因此匹配中可能缺少某些队伍。
import pandas as pd
origin_data = pd.read_csv('train_V2.csv')
print origin_data.shape
#origin_data.head()
(4446966, 29)
%matplotlib inline
import matplotlib.pyplot as plt
import seaborn as sns#数据可视化
import numpy as np

查看这些数据包含有47965局(47965次匹配)

print len(origin_data.groupby(['matchId']))
47965

2、探索性分析——单个变量

(1)整形(int)变量的分布
def feature_barplot(feature, df_train = origin_data, figsize=(15,6), rot = 90, saveimg = False): 
    feat_train = df_train[feature].value_counts()
    fig_feature, axis1, = plt.subplots(1,1,sharex=True, sharey = True, figsize = figsize)
    sns.barplot(feat_train.index.values, feat_train.values, ax = axis1)
    axis1.set_xticklabels(axis1.xaxis.get_majorticklabels(), rotation = rot)
    axis1.set_title(feature + ' of training dataset')
    axis1.set_ylabel('Counts')
    plt.tight_layout()
    if saveimg == True:
        figname = feature + ".png"
        fig_feature.savefig(figname, dpi = 75)

feature_barplot('DBNOs') #击倒敌人的分布

在这里插入图片描述
如果直接这样作图,会发现该图像呈现极为右偏的分布,其实,DBNOs超过6,7和8的人数就已经非常少了,因此将DBNOs>x的全部归为一类,那么x具体是多少更有说服力呢,一个精确的做法是:先找出99%的分位数,将大于99%分位数的归为一类。

origin_data['DBNOs_new'] = origin_data['DBNOs']
origin_data.loc[origin_data['DBNOs_new'] > origin_data['DBNOs_new'].quantile(0.99)] = 'larger'
plt.figure(figsize = (10,6))
sns.countplot(origin_data['DBNOs_new'].astype('str').sort_values())
plt.title('DBNOs')
plt.show

在这里插入图片描述
可见大部分玩家击倒敌人的数量为0

(2)连续变量的分布

造成的伤害值是一个连续变量(总伤害-自身受到的伤害)

#造成的伤害值的分布(总伤害-自身受到的伤害)
plt.figure(figsize=(10,6))
plt.title("Damage Dealt")
sns.distplot(origin_data['damageDealt']) #distplot直方图
plt.show()

在这里插入图片描述
对于那些击杀数为0的玩家,他们造成的伤害如何?

data_kill_0 = origin_data[origin_data['kills']==0]
plt.figure(figsize=(10,6))
plt.title("Damage Dealt by 0 killers",fontsize=15)
sns.distplot(data_kill_0['damageDealt'])
plt.show()
#del data_kill_0

在这里插入图片描述
步行距离也是一类连续变量,先找到均值和百分之99的分位数

print('The average person walks for {:.1f}m, 99% of {}m or less, while the marathoner champion walked for {}m.'
      .format(origin_data['walkDistance'].mean(), 
              origin_data[
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值