Rでやったスプラトゥーンのゲームデータの前処理

Rでやったスプラトゥーンのゲームデータの前処理

RStudioで行ったスプラトゥーンのゲームデータの前処理をまとめてみる。

スプラトゥーンのゲームデータ

stat.ink

上記のサイトから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というデータフレーム。

参考にしたサイトなど

list.filesによるファイルパスの取得方法いろいろです。ファイル件数が増えてくると重くなるので、その場合は他の言語やOSのコマンドでファイル一覧のテキスト…
qiita.com


http://yasuhirodaiku.com/archives/74
上記のサイト以外にも見たサイトは色々ありますが、主だったものを紹介。mutate, case_whenのあたりはr-wakalangでも質問させて頂きました。