###前置き
前回に引き続きPUPGのキル分析についてやって行きます。
前回の投稿では、seaborn-pairplotを使ってデータを散布図行列にプロットしました。
そこでわかったことを実際にロジスティック回帰分析を使ってさらに分析します。
###詳細
使用するアルゴリズム→ロジスティック回帰
データ→PUPGのデータ(キルされた時間、死因、犠牲者、キル時のXY座標などなど)からデータの加工をしたもの *詳細については、前回の投稿を見ていただければわかります。
まずもうちょっと前回の散布図行列から気になったところを深掘りするためプロットします。
####気になったこと↓
2000秒(ドン勝者が決まった時点)で多い死因ってなんだろう?
それでは、プロット
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
df = pd.read_csv("/Users/uematsuyuuki/Desktop/kill_match_stats_final_0.csv")
#数値データでなくてはプロットできない。
show_df = df.drop(['victim_position_x','victim_position_y','victim_placement','killer_name'],axis=1)
#欠陥値の補足
show_df['kill_position_x'] = show_df['killer_position_x'].fillna(show_df['killer_position_x'].mean())
show_df['kill_position_y'] = show_df['killer_position_y'].fillna(show_df['killer_position_y'].mean())
#欠陥値の削除
show_df = show_df.drop(['killer_position_x','killer_position_y'],axis=1)
print(show_df.head())
#日本語表記は検討 ソードオブショットガン,クロスボウ、グレネード、火炎瓶、フライパン、鎌、バール、マチェット
#MAPの中には一種類しかなく分類不可能なためコメント表示
#show_df['map_type'] = show_df['map'].replace({'MIRAMAR':int(100),'ERANGEL':int(200)})
#print(show_df[show_df["map_type"==200]].head(10))
show_df['gan_type'] = show_df['killed_by'].replace({'Punch':0,'Deagle':1,'P1911':2,'R45':3,'R1895':4,'P18C':5,'P92':6,\
'Skorpion':7,'S12K':8,'S1897':9,'S686':10,'DBS':11,'Tommy Gun':12,\
'Vector':13,'Micro UZI':14,'MP5K':15,'PP-19 Bizon':16,'UMP45':17,\
'AUG':18,'G36C':19,'M16A4':20,'M416':21,'M762':22,'Mk47 Mutant':23,\
'QBZ':24,'SCAR-L':25,'AKM':26,'GROZA':27,'M249':28,'DP-28':29,\
'AWM':30,'Win94':31,'Kar98k':32,'M24':33,'mini14':34,'QBU':35,'Mk14':36,'SKS':37,\
'SLR':38,'VSS':39,'Bluezone':40,'Down and Out':41,'Falling':42,'Grenade':43,'Hit by Car':44,'death.WeapSawnoff_C':45,'Mini 14':46,\
'UMP9':47,'Machete':48,'Sickle':49,'Groza':50,'Crossbow':51,'Drown':52,'Uaz':53,'Pan':54,'RedZone':55,'Motorbike':56,'Buggy':57,\
'death.ProjMolotov_DamageField_C':58,'Dacia':59,'Motorbike (SideCar)':60,'death.Buff_FireDOT_C':61,'Crowbar':62,'Van':63,'Pickup Truck':64,\
'Aquarail':65,'Boat':66,'death.ProjMolotov_C':67,'death.PG117_A_01_C':68,'death.RedZoneBomb_C':69,'death.PlayerMale_A_C':70}).astype(int)
two = print(show_df.head(10))
#データサイズが大きく時間がかかるため249に縮小。
n = show_df[0:250]
x = n['killed_by']
y = n['time']
plt.scatter(x,y)
plt.title("relate killed_by and time ")
plt.xlabel("killed_by")
plt.xticks(rotation=90)
plt.ylabel("time")
plt.grid(True)
plt.savefig('PUPG_kill_time.png')
plt.show()
###表を見てわかることとしては、
1.Down and Out(サーバーのダウンや退出?)が多く見られる。
*実は殺されてないんよ
2.M416という銃が序盤から終盤まで結構活躍している印象がある。
3.AKMという銃が序盤に結構活躍していますね。
4.Punchも序盤で活躍。 拳で!
###好奇心 データ数増やしたらどうなるんだろう??
10000データに増量。
データの量によって、見方が結構変わりました。
###10000データをプロットしてわかったこと
1.上位に位置する銃は上で説明した物以外にもKarであったりS12K,SCAR-L、UMP9などがある。
2.grenadeの活躍が銃の種類によってはより大きいということで意外にも重要な位置づけにある。
3.ドン勝者が2000秒までに決まると思っていたが、まれに2000秒を超えることもあることから2000秒以降の戦いの可能性について把握できた。
4.攻略サイトなどで強いと言われていた、AWMは強いという割にはこの銃でのキル数は少ない。。。*ただ、取得したデータが古い場合も考えられるためなんとも言えないところ。
###それではロジスティック回帰へ
ロジスティク回帰については、結構苦戦し未だに理解し切れていないところがありますが記載しながら考えてやっていこうと思います。
参考までにロジスティック回帰の勉強で参考にさせていただいた物です。
https://www.youtube.com/watch?v=mMMzDFttZ8A
https://qiita.com/matsukura04583/items/0fb73183e4a7a6f06aa5
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
from matplotlib.colors import ListedColormap
import matplotlib.cm as cm
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import confusion_matrix as confusion
n = show_df[0:5000]
df = pd.read_csv("csvまでのパス")
#数値データでなくてはプロットできない。
show_df = df.drop(['victim_position_x','victim_position_y','victim_placement','killer_name'],axis=1)
#欠陥値の補足
show_df['kill_position_x'] = show_df['killer_position_x'].fillna(show_df['killer_position_x'].mean())
show_df['kill_position_y'] = show_df['killer_position_y'].fillna(show_df['killer_position_y'].mean())
#欠陥値の削除
show_df = show_df.drop(['killer_position_x','killer_position_y'],axis=1)
print(show_df.head())
#日本語表記は検討 ソードオブショットガン,クロスボウ、グレネード、火炎瓶、フライパン、鎌、バール、マチェット
#MAPの中には一種類しかなく分類不可能なためコメント表示
#show_df['map_type'] = show_df['map'].replace({'MIRAMAR':int(100),'ERANGEL':int(200)})
#print(show_df[show_df["map_type"==200]].head(10))
show_df['gan_type'] = show_df['killed_by'].replace({'Punch':0,'Deagle':1,'P1911':2,'R45':3,'R1895':4,'P18C':5,'P92':6,\
'Skorpion':7,'S12K':8,'S1897':9,'S686':10,'DBS':11,'Tommy Gun':12,\
'Vector':13,'Micro UZI':14,'MP5K':15,'PP-19 Bizon':16,'UMP45':17,\
'AUG':18,'G36C':19,'M16A4':20,'M416':21,'M762':22,'Mk47 Mutant':23,\
'QBZ':24,'SCAR-L':25,'AKM':26,'GROZA':27,'M249':28,'DP-28':29,\
'AWM':30,'Win94':31,'Kar98k':32,'M24':33,'mini14':34,'QBU':35,'Mk14':36,'SKS':37,\
'SLR':38,'VSS':39,'Bluezone':40,'Down and Out':41,'Falling':42,'Grenade':43,'Hit by Car':44,'death.WeapSawnoff_C':45,'Mini 14':46,\
'UMP9':47,'Machete':48,'Sickle':49,'Groza':50,'Crossbow':51,'Drown':52,'Uaz':53,'Pan':54,'RedZone':55,'Motorbike':56,'Buggy':57,\
'death.ProjMolotov_DamageField_C':58,'Dacia':59,'Motorbike (SideCar)':60,'death.Buff_FireDOT_C':61,'Crowbar':62,'Van':63,'Pickup Truck':64,\
'Aquarail':65,'Boat':66,'death.ProjMolotov_C':67,'death.PG117_A_01_C':68,'death.RedZoneBomb_C':69,'death.PlayerMale_A_C':70}).astype(int)
###ここより上の部分は前回の投稿と全く同じ部分です。そのため、読み飛ばしても問題ありません。
###順序を追って説明
ステップ1:データの準備
データの範囲指定で今回は約5000件のデータを使用
#データの範囲を指定
n = show_df[0:5000]
#時間に関するデータを準備 説明変数とする
data2 = n.loc[:,["time"]].values
#死因に関するデータを準備 目的変数とする
label2 = n.loc[:,["gan_type"]].values
#テストデータを作る x=説明変数 y=目的変数
X_train, X_test, y_train, y_test = train_test_split(data2,label2, test_size=0.5, random_state=0)
ステップ2:ロジスティク回帰分析のアルゴリズムをセット
#アルゴリズム ロジスティク回帰の用意
model2 = LogisticRegression()
ステップ3:学習させる
#学習させる
model2.fit(X_train,y_train)
ステップ4:分類をする。
ここで行われた分類とは何か?
A,時間を説明変数として死因に関する分類を行う。
#xの特徴量をさらに細かく指定し、yの予測が可能
show_one = model2.predict(X_test)
print("予測結果\n",show_one)
結果
予測結果
[41 41 41 ... 41 41 41]
全て41(番号についてはデータの置き換えの辞書を参照)だった。
41番は'Down and Out':41ということでサーバーダウン及び退出によるものだということがわかります。
41番のデータが多いため偏った予測??になってしまいました。
そのため、一度データ量の変更をして見ました。
結果
予測結果
[41 41 40 41 41 41 41 41 41 41 41 41 40 41 41 40 41 41 41 41 41 40 40 41
41 41 41 40 41 41 41 41 41 41 41 41 41 41 40 41 41 40 41 41 40 41 41 40
40 41 41 41 41 41 41 41 41 41 41 40 41 41 41 41 41 40 41 41 41 41 41 41
41 41 41 41 41 41 41 41 41 41 41 41 41 40 41 41 41 41 41 41 41 41 41 41
40 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 40 40 40 41 41
41 41 41 41 41 40 41 40 40 41 41 41 41 40 41 41 40 41 41 40 40 41 41 41
41 41 40 41 41 41 41 41 41 41 41 41 41 41 40 41 41 40 41 41 41 41 40 41
41 41 41 41 41 41 41 40 41 41 41 41 40 41 41 41 41 41 41 41 41 41 41 41
41 41 41 41 40 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 40 41 41
41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
40 41 41 40 40 40 41 40 41 41]
Train score: 0.212
Test score:0.196
500のデータ量だとちらほら40という数字も出てきました。
'Bluezone':40。このデータはブルーゾーンに入れずして死亡したものです。
これでもデータの偏りが出ている気がします。。
人の死は予測できないんだね。