はじめてのクラスタリング　遊戯王の主人公とライバルのモンスターで分析

#はじめに
クラスター分析の勉強として、
遊戯王の歴代主人公とライバルの初期のエースモンスターを分析してみた。（※1）

#動機
対戦ゲームやトレーディングカードゲーム等で勝つための方法を
技術方向から探す中でクラスター分析にたどり着いた。

#目的
スプレッドシートに記載した以下のリストをクラスター分析して、
各クラスターに分けたリストを散布図として表示する。

分析に使用する機械学習の方法として、**K-means法**
そして、それが可能な機械学習ライブラリとして **scikit-learn** を用いた。

参考資料を元にプログラミングを進めていった。

![遊戯王一部を除く歴代エースモンスター.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1877489/d0d20958-67ba-537c-2a59-ca4e3b9699f8.jpeg)
リスト1.歴代主人公とライバルの初期のエースモンスター

#実行環境
    使用言語とバージョン　Python 3.8.3
    開発環境　Windows 10 Pro
    eclipse　4.8.0

#ライブラリの読み込み
他は最初から使えたため、**クラスター分析用**と**googleAPI 用のライブラリ**のみインストールした。
開発環境の機能でコマンドプロンプトを使わずに
ある程度のライブラリインストールできるのはありがたい。

	#数字処理用
	import numpy as np
	import pandas as pd

	#クラスター分析用
	from sklearn.cluster import KMeans

	#グラフ表示用
	import matplotlib.pyplot as plt

	#googleAPI用
	from oauth2client.service_account import ServiceAccountCredentials
	import gspread

#スプレッドシートの情報の読み込み
本来は google スプレッドシートをプログラムに読み込むために
googleAPI を入手し設定等の準備を行うのだが今回は割愛。（方法は参考資料の■1を参照）

下記コードを記載。

    #スプレッドシートから拾ったリストを直接pandasに入れる
    df=pd.DataFrame(wkst.get_all_values())

実行結果として以下リストとなった。

![クラスター分析　df　整形前.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1877489/e0710cd0-69de-53cc-cf6a-fd8619b011d1.jpeg)
リスト1.歴代主人公とライバルの初期のエースモンスター

#データ加工
このままではデータとして使えないため加工した。
分析には数字でしか取り込めないため名前に id を追加。
(おジャマ・イエローの id は 1 となる)
また、結果3　左端の番号は元々の順番を並び替えたものである。

![クラスター分析　npa.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1877489/2323a394-06cc-e383-acc8-e78ca8e7c020.jpeg)　　![クラスター分析　df　加工1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1877489/73dd13c4-9d1b-098f-8ff8-6c2ff18e74a9.jpeg)
結果2.クラスター分析用　結果3.人が見る用の加工後リスト

グラフにすると以下のようになる。
結果4グラフ化より、例えば左端の defens が0、attack が 1000 のモンスターが**おジャマ・イエロー**
対照となる右上の defens が2500、attack が 3000 のモンスターが**青眼の白龍**ということが伺える。

![クラスター分析　全リスト.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1877489/1333a430-0361-17b7-9e7e-6f2cb23cf905.jpeg)
結果4.グラフ化

#クラスター分析
    #クラスター分析
    vpred = KMeans(n_clusters=clust_cnt).fit_predict(npa)

分析する数は自由に決められるため、適当に **3** に設定して試してみた。

#結果
![クラスター分析　番号0.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1877489/3de96b2f-f205-d4fe-ad4d-e50e2663363d.jpeg)　![クラスター分析　番号1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1877489/0e02e6e1-54d6-fd0d-0ef3-0aa55d6ab218.jpeg)　![クラスター分析　番号2.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1877489/b02908f3-4b47-e92f-c5da-513a73943f0b.jpeg)

結果5.クラスター番号 0　　　　　　結果6.クラスター番号 1　　　　結果7.クラスター番号 2

上記がその結果である。
どれがどのモンスターかわかりにくいので、比較用に改めてリスト1を用意した。

リスト1とグラフを見比べると次の点が推測できた。
・結果5 は attack 0 であることから、おジャマ・イエローではないか。
・結果6 attack と defens が両方高いモンスター
・結果7 attack と defens 片方が高いあるいは両方が低いモンスター

以上の結果からしっかりと分析されているように読み取れた。

![遊戯王一部を除く歴代エースモンスター.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1877489/d0d20958-67ba-537c-2a59-ca4e3b9699f8.jpeg)
リスト1.歴代主人公とライバルの初期のエースモンスター


#感想と今後
今回は、少ないデータからでも特徴毎に分けられていることが確認できた。
また、学生時代や業務でクラスター分析を習ったことが無い人間でも、
ここまでは学習できることがわかった。

今後は、画像もしくは動画で分析ができるように検証し、
複数のゲーム画面から有利状況を判別できるようなプログラムを制作してみたい。

#注釈
（※1）下記シリーズのみ理由があって採用しなかった。
・遊☆戯☆王VRAINS　エースモンスターが守備力の概念がないリンクモンスターであるため。
・遊☆戯☆王SEVENS　過去シリーズとルールが異なっているため。

#参考資料
■1　[【もう迷わない】Pythonでスプレッドシートに読み書きする初期設定まとめ（たぬハック）](https://tanuhack.com/operate-spreadsheet/　"【もう迷わない】Pythonでスプレッドシートに読み書きする初期設定まとめ"　たぬハック)
■2　[Pythonでデータサイエンス](https://pythondatascience.plavox.info/　"Pythonでデータサイエンス")