RStudioで行ったスプラトゥーンのゲームデータの前処理をまとめてみる。
目次
スプラトゥーンのゲームデータ
上記のサイトからcsvファイルをダウンロードする。毎日stat.inkというサイトにアップロードされたデータがまとめられている。2017年8月くらいからデータがアップロードされており、すべてのファイルは100MB超え。
データの構造
内容は日程、ゲームのバージョン、ロビーモード、ゲームのモード、ステージ時間、勝敗結果(Alpha or Bravoの勝利)、ノックアウトの可否と、Alphaチームの各メンバーのブキ、キル数、デス数、アシスト数、スペシャル回数、塗りポイント、ランクが表示されている。
複数のcsvファイルの読み込み
library(magritter) library(dplyr) ##データの前処理、複数のcsvファイルと重複を除外 csv_list <- list.files("/Users/hogehoge/hogege/splatoon2/battle-results-csv", pattern = "*.csv", ,full.names = T) datacsv <- lapply(csv_list,read.csv) data_bind <- do.call(rbind, datacsv) dat<- data_bind%>% dplyr::distinct(.keep_all = FALSE) dat
list.filesでファイル名のリストを取得する。patternはファイル形式を指定。full.namesはファイルを絶対パスごと取得。
lapplyでリストに関数を渡し、結果のリストを返している。do.callですべてのリストを結合している。最後のdistinctで、結合したものの中で完全に重複があるものを除外している。
特定のバージョン・ルールのデータを抜き出す
ver431 <- dplyr::filter(dat, dat$game.ver == "4.3.1") ver431reg <- dplyr::filter(ver431, ver431$lobby.mode == "regular")
スプラトゥーンは定期的にゲームのバージョンアップが行われていて、ブキの性能が微妙に違うのでなるべくバージョンを分けて分析をしたほうが良さそう。
ということでdplyrのfilter関数を用いて特定のバージョンを抽出し、ナワバリやガチホコなどのルールごとにデータを分けた。
Alphaチーム・Bravoチームのデータを集計する
ver431hokosum <- ver431hoko%>% mutate(result = case_when( .$win == "alpha" ~ 0L, .$win == "bravo" ~ 1L ))%>% mutate(alphakill=A1.kill+A2.kill+A3.kill+A4.kill)%>% mutate(bravokill=B1.kill+B2.kill+B3.kill+B4.kill)%>% mutate(alphainked=A1.inked+A2.inked+A3.inked+A4.inked)%>% mutate(bravoinked=B1.inked+B2.inked+B3.inked+B4.inked)
mutateとcase_whenで新たにresult列を作成し、alphaが勝ちの場合”0″、Bravoが勝ちの場合”1″とコード付けした。
更にAlphaチームの総キル数とBravoチームの総キル数や塗りポイントを新たに列を作ってまとめている。
勝ちチーム、負けチームで集計する
Alpha/Bravoに勝ちチーム負けチームが混在している状態なので、新たに勝ち/負けチームの総キル数・塗りポイントなどをまとめた列を作成する。
431hoko <- ver431hokosum%>% dplyr::mutate(win.kill=case_when( ver431hokosum$result==0 ~ alphakill, ver431hokosum$result==1 ~ bravokill ))%>% dplyr::mutate(lose.kill=case_when( ver431hokosum$result==0 ~ alphakill, ver431hokosum$result==1 ~ bravokill ))
こちらもcase_whenとmutateを利用して条件によって分けている。
個人的メモ:列ごと(1試合ごと)にIDを与えていろいろ
hoko431 <- ver431hokosum%>% mutate(num = row_number())%>% dplyr::mutate(win.kill=case_when( ver431hokosum$result==0 ~ A1.kill+A2.kill+A3.kill+A4.kill, ver431hokosum$result==1 ~ B1.kill+B2.kill+B3.kill+B4.kill ))%>% dplyr::mutate(lose.kill=case_when( ver431hokosum$result==0 ~ B1.kill+B2.kill+B3.kill+B4.kill, ver431hokosum$result==1 ~ A1.kill+A2.kill+A3.kill+A4.kill ))%>% dplyr::mutate(win.kill.assist=case_when( ver431hokosum$result==0 ~ A1.kill.assist+A2.kill.assist+A3.kill.assist+A4.kill.assist, ver431hokosum$result==1 ~ B1.kill.assist+B2.kill.assist+B3.kill.assist+B4.kill.assist ))%>% dplyr::mutate(lose.kill.assist=case_when( ver431hokosum$result==0 ~ B1.kill.assist+B2.kill.assist+B3.kill.assist+B4.kill.assist, ver431hokosum$result==1 ~ A1.kill.assist+A2.kill.assist+A3.kill.assist+A4.kill.assist ))%>% dplyr::mutate(win.death=case_when( ver431hokosum$result==0 ~ A1.death+A2.death+A3.death+A4.death, ver431hokosum$result==1 ~ B1.death+B2.death+B3.death+B4.death ))%>% dplyr::mutate(lose.death=case_when( ver431hokosum$result==0 ~ B1.death+B2.death+B3.death+B4.death, ver431hokosum$result==1 ~ A1.death+A2.death+A3.death+A4.death ))%>% dplyr::mutate(win.inked=case_when( ver431hokosum$result==0 ~ A1.inked+A2.inked+A3.inked+A4.inked, ver431hokosum$result==1 ~ B1.inked+B2.inked+B3.inked+B4.inked ))%>% dplyr::mutate(lose.inked=case_when( ver431hokosum$result==0 ~ B1.inked+B2.inked+B3.inked+B4.inked, ver431hokosum$result==1 ~ A1.inked+A2.inked+A3.inked+A4.inked ))%>% dplyr::mutate(win.assist=case_when( ver431hokosum$result==0 ~ A1.assist+A2.assist+A3.assist+A4.assist, ver431hokosum$result==1 ~ B1.assist+B2.assist+B3.assist+B4.assist ))%>% dplyr::mutate(lose.assist=case_when( ver431hokosum$result==0 ~ B1.assist+B2.assist+B3.assist+B4.assist, ver431hokosum$result==1 ~ A1.assist+A2.assist+A3.assist+A4.assist ))%>% dplyr::mutate(win.special=case_when( ver431hokosum$result==0 ~ A1.special+A2.special+A3.special+A4.special, ver431hokosum$result==1 ~ B1.special+B2.special+B3.special+B4.special ))%>% dplyr::mutate(lose.special=case_when( ver431hokosum$result==0 ~ B1.special+B2.special+B3.special+B4.special, ver431hokosum$result==1 ~ A1.special+A2.special+A3.special+A4.special ))%>% select(c(num, result, win.inked, lose.inked, win.kill.assist, lose.kill.assist, win.kill, lose.kill, win.death, lose.death, win.assist, lose.assist, win.special, lose.special))
hoko431A <- hoko431%>% dplyr::filter(hoko431$result == 0)%>% select(c(num, result, win.kill, win.kill.assist, win.assist, win.inked, win.death, win.special)) hoko431B<- hoko431%>% dplyr::filter(hoko431$result == 1)%>% select(c(num, result, win.kill, win.kill.assist, win.assist, win.inked, win.death, win.special))%>% mutate(result = 0) hoko431C <- rbind(hoko431A, hoko431B) head(hoko431C) colnames(hoko431C) <- c("num", "result", "kill", "kill.assist", "assist", "inked", "death","special") hoko431D <- hoko431%>% dplyr::filter(hoko431$result == 0)%>% select(c(num, result, lose.kill, lose.kill.assist, lose.assist, lose.inked, lose.death, lose.special))%>% mutate(result = 1) hoko431E<- hoko431%>% dplyr::filter(hoko431$result == 1)%>% select(c(num, result, lose.kill, lose.kill.assist, lose.assist, lose.inked, lose.death, lose.special)) hoko431F <- rbind(hoko431D, hoko431E) hoko4310$result <- (1)- hoko4310$result head(hoko4310)
GLMMを行いたかったので、ゲームID、勝敗(0or1)、チームキル数、チームデス数、チーム塗りポイントの列を作成する。
具体的な流れとしては、まず元データからデータフレームAに勝ちチームのデータを抽出。列名を変更
次に元データからデータフレームBに負けチームのデータを抽出。列名を変更し、最終的にAとBを結合という流れをとっている。
hoko431にnum(ゲームID), result, win.inked, lose.inked, win.kill, lose.kill, win.death, lose.deathを抽出。
hoko431Aにはすでにresultに”0″とついている勝利チームを抽出、hoko431Bにはresultに”1″とついている列を抽出し、最終的にresult”0″に変更。hoo431CでA,Bを結合し、列名を変更している。
また勝ちチームを1とするために引き算で逆転させている。
最終的に出来上がったものがhoko4310というデータフレーム。
参考にしたサイトなど
http://www.housecat442.com/?p=698
http://yasuhirodaiku.com/archives/74
上記のサイト以外にも見たサイトは色々ありますが、主だったものを紹介。mutate, case_whenのあたりはr-wakalangでも質問させて頂きました。