[スマブラSP]ファイターのキャラパラメータを主成分分析したかった、、、(R言語、主成分分析)


概要

この記事では、Nintendo Switch用ソフト大乱闘スマッシュブラザーズSPECIALの全82ファイターのキャラパラメータ(歩行速度や空中速度等)を主成分分析します。
前回の記事ではスマブラspのファイターをキャラパラメータからクラスター分析を用いて、ファイターを分類しました。実は前回の記事はクラスター分析も前に主成分分析を行うはずだったのですが諸事情からクラスター分析のみとなりました。
よって、今回の記事は前回の記事に上手く書けなかった主成分分析を供養してあげたいと思います。前回の記事と比べて内容の質は落ちると思いますがご了承ください。主成分分析もクラスター分析と同じく多変量解析のうちの一つです。
スマブラspの分析として参考までに読んでいただけると幸いです。また、複数の空中ジャンプを持つキャラ等もいるためすべてのキャラパラメータを用いているわけではないです。

大乱闘スマッシュブラザーズSPECIALとは

大乱闘スマッシュブラザーズSPECIAL(スマブラSP)は相手ファイターを画面外にふっとばす対戦型アクションゲームです。全82ファイターが参戦していますが、今回集計ではキャラパラメータが同じダッシュファイターは一つとしました。

準備(データ収集)

前回の記事と同じデータを用いるため、前回に記事をすでにお読みのかたは主成分分析(RStudioの操作)まで飛ばしてもらっても大丈夫です。
各ファイターのパラメータを収集するために以下のサイトを利用させていただきました。

大乱闘スマッシュブラザーズWiki https://smashwiki.info/%e3%82%ab%e3%83%86%e3%82%b4%e3%83%aa:%e3%83%91%e3%83%a9%e3%83%a1%e3%83%bc%e3%82%bf

スマブラSPECIAL 検証wiki https://w.atwiki.jp/smashsp_kensyou/pages/30.html

全ファイターの全パラメータはスマブラSPECIAL 検証wikiさんのスプレッドシートに書かれていましたが、データによっては数値ではないデータも含まれており、今回使用する主成分分析以外の分析手法(数量化理論等)も必要となってくるため、全データから運動性能に関するデータのみを抽出することとしました。

今回使用する元データは以下の表のとおりです。

運動性能のパラメータとして地上、空中横移動、空中落下、ジャンプ関連のパラメータを考慮しました。
主成分分析するにあたって、元データを標準化しました。

標準化は16個のパラメータの単位をそろえるために行います。
標準化後は各パラメータの分散は1になります。
上記の表を今回使用する解析ソフトであるRStudioで使いやすくするために、下のデータを元データとして用います。

元データはRstudioで読み込むためにcsv形式で出力します。

準備(R編)

キャラパラメータを分析するにあたってR言語を使用します。
R言語を使用するために統計解析用ソフトであるR、RStudioをダウンロードする必要があります。
どちらもフリーソフトで、下記のURLからダウンロードできます。

R https://cran.r-project.org/
RStudio https://www.rstudio.com/products/rstudio/download/#download

主成分分析(RStudioの操作)

主成分分析は多数の変数から少ない数の合成変数(主成分)に情報を凝縮して表す分析手法です。観測された全変数から合成変数(主成分)が構成されます。この合成変数を主成分と呼び、データの特性を説明できる新たな評価軸を作ることができます。
今回のデータの場合、各ファイターに対し歩行加速や歩行速度といった16個のパラメータが存在しています。その16個のパラメータを情報損失が少ない新な1~3個程度のパラメータに変換できれば便利だと思ったため主成分分析を行いました。16個のパラメータを多いとするかは個人の主観になってくるわけですが、今回はとりあえず主成分分析をしたらどうなるかを含めて分析をしてみました。主成分を導出する式は今回は割愛させていただきます。

  1. RStudioを立ち上げます。
    下のようなConsoleが出てくると思います。
    コマンドは赤い丸で示している「>」の隣に書きます。 

2. RStudio作業用ディレクトリの確認もしくは変更します。
作業用ディレクトリ確認コマンド

getwd()

作業用ディレクトリ変更コマンド

 setwd("パス名")

作業用ディレクトリ確認コマンドをConsoleに打ち込みます。
作業用ディレクトリが分かるので、そのディレクトリにcsv形式の元データを入れておきます。
もしくは、setwd("パス名")で作業用ディレクトリを変更可能です。

3. Rstudioに元データを読み込み
  その後、Consoleに下記のコマンドを打ち込みます。

 (データ名)<-read.csv("(ファイル名)",header=T)

実際の画面は下のとおりです。
  保存するデータ名を「sp1」にして、元データのファイル名は「sp1.csv」で保存していたので、下のようになります。
  header=Tとなっていますが、これは元データの「ファイター名」や「歩行加速」といったセルをデータと認識させないためです。

  すると、元データがRStudioに取り込まれます。

4. 主成分の導出
  主成分を導出するコマンド

 (データ名)<-prcomp(データ名)

実際の画面は下のとおりです。
sp1の1列目はファイター名を書いているので、sp1[,2:17]と指定します。
変数pca_sp1に主成分を代入しておきます。

ここで、pca_sp1(主成分)をよくみると、

第一主成分のみで元の16個のパラメータを25%表していることがわかります。第一主成分は最も元データを表します。
ここで、寄与率は元の16個のパラメータのどれほどの割合を説明できるかを表しています。
累積寄与率は見ると、第一主成分と第二主成分のみで元データの40%を表しており、第八主成分まで考慮すると84%ととなり、80%を基準とすると16個のパラメータが8個のパラメータに縮約できました。

ここで主成分分析を図示すると下のようなイメージです。

また、各ファイターの第一主成分を見ることができます。

83ファイター分の第一主成分が出力されます。マリオの第一主成分は-0.746645006ですね。
この主成分をcsvファイルに書き込むとすると、

作業ディレクトリにpca_sp1x1.csvというcsvファイルが書き込まれます。

もし、ここで主成分分析の結果が第一主成分と第二主成分程度で累積寄与率が90%以上あれば、16個のパラメータを2個のパラメータに縮約できたこととなり第一主成分を横軸、第二主成分を縦軸に取るといったグラフから結果を目視しやすくなります。
しかし、今回の結果は第八主成分まで考慮して累積寄与率が80%に到達します。もちろん元データから得られた結果に対して真摯に向き合わなければいけません。元データを自分の望む結果に改ざんすることはあってはなりません。

一応今回の結果を第一主成分を横軸、第二主成分を縦軸に取るファイター分布を出力します。第一主成分と第二主成分の累積寄与率は40%であることから、第一主成分と第二主成分を考慮するのみでは元データの情報量を60%損失していることになります。
以下のファイター分布はこのことを考慮して見て頂きたいです。

このグラフの1~83までの番号は元データのファイターの番号です。
しかし、この図は何度も言うように元データの情報量を60%損失しています。この図は外部パッケージを使用して作成しており、最後に説明を後回しにさせていただきます。
前回の記事は元データを標準化後にクラスター分析していましたが、本当は主成分分析で第一主成分と第二主成分までで累積寄与率が高ければ主成分分析の後にクラスター分析を行おうと思っていました。第一主成分と第二主成分の二つならファイター分布も見やすくて便利だと思ったからです。しかし、主成分分析の結果を見ると累積寄与率が第八主成分まで考慮してなんとかなるかも程度であり元データの情報量損失が激しいと感じたので、前回の記事では主成分分析をせずにクラスター分析をしました。
言い換えれば、第一主成分の寄与率が25%というのはスマブラspがバランスが良いということを表していると思いました。

まとめ

・スマブラspのファイターの運動性能に関連するキャラパラメータを主成分分析しました。
・第一主成分の寄与率は25%で、第八主成分まで考慮すると累積寄与率が80%に到達しました。

おまけ1(第一主成分と第二主成分のグラフの作り方)

第一主成分を横軸、第二主成分を縦軸に取るとファイター分布は、

このグラフはRStudioの外部パッケージ(maptools)を使用しています。

install.packages("maptools")
library(maptools)

maptoolsをダウンロードし、以下のコマンドを打ち込めば作成できます。

 par(las=1)
 plot(x=NULL,type="n",xlab="第一主成分",ylab="第二主成分",xlim=c(-10,10),ylim=c(-5,5),xaxs="i",yaxs="i",xaxt="n",yaxt="n",bty="n")
 axis(side=1,at=seq(-10,10,1),tck=1.0,lty="dotted",lwd=0.5,col="#dddddd",labels=expression(-10,-9,-8,-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7,8,9,10))
 axis(side=2,at=seq(-5,5,1),tck=1.0,lty="dotted",lwd=0.5,col="#dddddd",labels=expression(-5,-4,-3,-2,-1,0,1,2,3,4,5))
 points(x=pca_sp1$x[,1],y=pca_sp1$x[,2],pch=16,col="#ff8c00")
 pointLabel(x=pca_sp1$x[,1],y=pca_sp1$x[,2],labels=rownames(sp),cex=0.8)
 box(bty="l")
 

参考サイト https://data-science.gr.jp/implementation/ida_r_pca.html

あとがき

今回はスマブラspのファイターを主成分分析してみました。
スプレッドシートのデータを全て使ってはいませんが結果としては、スマブラspはバランスが良いと思いました。
結果として各ファイターの各主成分を表にまとめたり、主成分負荷量を出すべきとは思いますがとりあえずこの内容で一旦投稿させていただきます。
各ファイターの各主成分や主成分負荷量を見たい方は何かコメントしてくださると助かります。
今回みたいな分析結果だとうまくまとめるのが難しいです。
とりあえず今はいろいろな分析方法を試してみて、スマブラspを分析したいです。
今回もいろいろなサイトを参考にさせていただきました。ありがとうございます。
あくまで今回のような見方もできるかも程度で読んでいただけると幸いです。

お読みいただきありがとうございました。