2015年の秋にPokemon Goが発表され、世界的に社会現象となったポケモンですが、今もなお、子供にも、大人にも絶大な人気があります。
ポケモンのキャラクターがユニークでバラエティに富んでいるということが、人気の理由なのではないでしょうか。
私も全くのポケモン初心者だったのですが、ポケモン・データから何か面白い分析はできないかと試行錯誤しています。
世界的データサイエンスのコンペサイト:Kaggleで公開されているデータセットの中にはポケモンに関するデータが結構あるようです。データサイエンティストにとってPokemonは興味深い研究課題のようですね!
ということで、今回はKaggleのデータセットからポケモンの属性データを主成分分析を使って、理解していこうと思います。
そもそも、ポケモンには、CP(Combat Point: 戦闘力)、HP(Hit Point:体力)、体重、身長 ・・・ などなど、いろいろな属性があるようです。
参考:
【ポケモンGO】CPとは?上限の上げ方と初期値/進化時CPを解説
https://pokemongo.gamewith.jp/article/show/23752
こういった属性の総当たりの散布図を書けばそれぞれの属性の相関は分かりそうです(例えば、体が大きければHPも大きいとか・・・・)しかし、変数が多くなるとパッと見てわからないですよね。
もっと効果的にポケモンの属性を2次元のマップで表して、似ているタイプのポケモンを見つけ出すといったことはできないでしょうか?
・・・ということで、今回は主成分分析(PCA: Principle Component Analysis)を用いてポケモンの属性分布がパッと見てわかる可視化方法を考えたいと思います。
主成分分析とは、「多変量データの相関関係を利用し、情報の損失も最小限に抑えつつ、少量の合成変数に縮約、次元削減して分析する・・・」 とのことですが・・・
要するに、HPとか、CPとか、攻撃力とか、防御力とか、体力とか、身長とか・・・いっぱい属性があると人間の理解が苦しいので、似たような属性をまとめて、いい感じの主成分なるものを抜き出し、シンプルに考えましょう・・・ということだと理解しています。(乱暴な理解ですみません。)
結果から紹介していきます!!
第一世代151個体のポケモンを主成分分析しTableau で主成分分析した結果は以下のようになります。
画面右上を見ると、大きさ(height_m)と体重(weight_kg)は似たような成分となり、個体が大きければ、重くなるということで、これは当たり前ですね。同様に防御力(defence)も大きくなるので、これらは似ている成分と言えそうです。Snorax(カビゴン)、Gyarados(ギャラドス)、Onix(イワーク)は大きくて防御力の強い属性のポケモンとして似ているグループと言えます。
画面右下を見ると、speed(速さ)とsp_attack(スペシャル攻撃力)は似ている成分と言えます。画面右下にプロットされるポケモンは小さいけれど素早く、強い特殊攻撃を持っているポケモンと言えそうです。Gengar(ゲンガー),Alakazam(フーディン)はこのような特徴が強いです。
そして画面右下の飛び値としてMewtwo(ミューツー)がいますが、これは大きくないけれどとにかくものすごく強いということなのでしょうね。
全体を見渡すとY軸が上は大きくて防御が高い、下は小さくスバシッコイ
X軸は右に行くほど総合的に強い、左は総合的に弱い(MagiCarp コイキング、Caterpie キャタピー、Weedle ビードル)といえそうです。
このように主成分分析によって、特徴の似ているポケモンを見つけ出したり、特徴の飛び抜けているポケモンを見つけて、俯瞰的にポケモンを理解しやすくなるかと思います。
次にどのようなステップで分析を行ったかご紹介していきます。
* データをどこから持ってくるか
それでは実際にデータを持ってきて前準備をしていきましょう。
今回はKaggleで公開されているデータから以下のデータセットを利用します。
① Pokemon Go: 151 Pokemon and battle stats
第一世代のポケモン151種類のMAX CPとMAX HPの情報があります。
https://www.kaggle.com/abcsds/pokemongo
② The Complete Pokemon Dataset
こちらには、802 ポケモン属性に加えて、体重、身長、捕獲率などデータが充実しています。https://www.kaggle.com/rounakbanik/pokemon
これらのデータを用いて分析を進めていきましょう。
* Tableau Prep を使ってデータ準備をする
今回は、データ準備ツールであるTableau Prepを利用してデータの前準備をします
以下の作業をします。
+ 不要なフィールドの削除 (必要なフィールドのみ利用することにします)
+ Pokemon IDで2つのデータセットを結合 (ポケモン固有のID情報が振られている)
+ 欠損値(Weightの欠損)があるデータの削除 (欠損値があると主成分分析ができないため、もったいないけどここは捨てることにします。)
+ 出力をCSVとして出力する。
Tableau Prepではデータの分布も見えるので、attack やdefense は正規分布しているっぽいというのは分かりますね。
(注:画面はProject Maestro のスクリーンショットです。)* Rで主成分分析する
ではTableau Prepで作成したデータセットをインプットとしてRで主成分分析を行います。
データをRに読み込みprcompを使って主成分を計算します。
Rによる主成分分析の実施方法はこちら
を参照ください。
> data <- as.data.frame(PRICOMPdata151)
> row.names(data) <- data[,2]
> data = data [,3:11]
> result = prcomp(data,scale=TRUE)
> biplot(result)
まずはRで主成分分析のプロットを指定見ます。プロットは書けましたね・・・何となくうまい感じに分布しています。でもこれだと文字が重なっているところは全く見えませんし、見たいポケモンのハイライトもできません。もう少しTableau を使って楽し気なビジュアライゼーションをしてみましょう。
* Tableau でリッチな可視化を行う。以前紹介したこちらの記事と全く手法な同じですが、主成分のデータをもとのデータセットに新たなフィールドとして追加します。
これをCSVに吐いて、Tableau から可視化します。
> x1 <- result$x[,1]
> x2 <- result$x[,2]
> data1 <- cbind(PRICOMPdata151,x1,x2)
> data1
> write.csv(data1,"c:/tmp/Rstudy/Pokemon_pcomp.csv")
Pokedex.org というサイトがあり、これにPokeDex(ポケモン番号)を渡すとポケモンの説明が表示されます。これは便利です。Pokedexの情報は既にデータセットの中に入っていますから、これをダッシュボードのURLアクションとして渡してあげます。
URLアクションを追加するとこのようなダッシュボードが作成できます。
カスタムシェープを用いて、ポケモンのアイコンを散布図に配置する方法についてはこちらを参照しました。Dealing with 718 Pokemon Shapes in Tableau
これでポケモンの属性がぐっとわかりやすくなります。ハイライトやフィルタを付けてもわかりやすいですね。
Tableau Publicはこちらから。
ポケモンは知れば知るほど奥が深く、データ分析の研究課題としても興味深いですね。
ポケモンを題材に他にも面白いアイディアがあれば、分析にトライしてみたいと思います。
以上、ご参考になれば幸いです。