遊戯王データセット解析

Kaggleに遊戯王のデータセットが公開されたのでGoogle Colaboratryを用いて解析してみました．

データセットは[Yu-Gi-Oh! Trading Cards Dataset](https://www.kaggle.com/tathor/yugioh-trading-cards-dataset)から取得しました．


[ポケモンデータ解析.py](https://qiita.com/maskot1977/items/2680927b58cdc4fad8d4)を拝見し，遊戯王バーションも作ってみようと思い，Google Colabolatoryでの操作の練習がてら3時間で作成しました．

進捗があり次第どんどん追加していきたいと思います．



# データの読み込み

[Google Colaboratory Googleドライブからcsvデータの読み込み](https://qiita.com/toyotomihideyoshi/items/3f07acc02f3344366aed)を参照

```ruby:colab
from google.colab import drive
drive.mount('/content/drive/')
```
```ruby:colab
!pip install -U -q PyDrive
from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive
from google.colab import auth
from oauth2client.client import GoogleCredentials

# check auth
auth.authenticate_user()
gauth = GoogleAuth()
gauth.credentials = GoogleCredentials.get_application_default()
drive = GoogleDrive(gauth)
```
```ruby:colab
downloaded = drive.CreateFile({'id':'1P...'})

# Download the file to a local disk as 'sample.csv'.
downloaded.GetContentFile('card_data.csv')

import pandas as pd
df = pd.read_csv('card_data.csv',encoding='CP932')
df.head(10) #先頭10行を表示
```

<img width="674" alt="スクリーンショット 2019-06-18 14.35.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206657/ccb4f14d-deb5-6144-1f65-9668a1c557dd.png">


# データの説明


このデータセットには、トレーディングカードゲーム遊戯王の6534種類のデータが含まれています。
データには次の列があります。

Name：カード名
Type：カードの種類(モンスターカード/罠カード/魔法カードなど)
Level：モンスターのレベル(魔法，罠カードにはない)
Race：カードの種族(戦士、ドラゴン、スペルキャスターなど)
Attribute：属性(水，炎，風など)
ATK：攻撃力
DEF：防御力

# モジュールのインポート

```ruby:colab
import re
import os
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import seaborn as sns



from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_squared_error, mean_squared_log_error

import matplotlib as mpl
from sklearn import linear_model

import pickle
import pdvega

import xgboost as xgb
from sklearn.model_selection import GridSearchCV
from sklearn.datasets import load_digits
from sklearn.metrics import confusion_matrix, classification_report

# Jupyter 上で絵を表示するためのマジックコマンド
%matplotlib inline 
import matplotlib.pyplot as plt # matplotlib.pyplot をインポートし、以下 plt と呼ぶ。
```
数字の大きさに応じて棒グラフを作成

```ruby:colab
df.head(30).style.bar(subset=['Level','ATK','DEF'])
```
<img width="929" alt="スクリーンショット 2019-06-18 14.35.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206657/29b040b0-dc4f-9664-cbf0-d0a023a20edb.png">

```ruby:colab
df.describe() # 平均値、標準偏差、最小値、25%四分値、中央値、75%四分値、最大値をまとめて表示
```
<img width="348" alt="スクリーンショット 2019-06-18 14.37.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206657/9d526c1c-5e57-09a6-7d4c-4191437469ca.png">

4275種類のモンスターカードについて調べていきます．

```ruby:colab
df.info() #データの情報を見る
```
<img width="329" alt="スクリーンショット 2019-06-18 14.38.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206657/b792f824-3299-ae3b-4931-c795f17996bd.png">

6534種類のうちモンスターの数は4275だと分かります．

```ruby:colab
df.isnull().sum()
```
<img width="161" alt="スクリーンショット 2019-06-18 14.39.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206657/33eafe10-58af-f58d-a145-bb35ba500a3c.png">

欠損があるのは2259行です．

```ruby:colab
np.set_printoptions(threshold=np.inf)
np.column_stack(df) #列名を全て取得
```
<img width="596" alt="スクリーンショット 2019-06-18 14.39.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206657/4532b489-26e2-b3d9-2601-05236f2c092e.png">


# 散布図行列

```ruby:colab
pg = sns.pairplot(df.iloc[:,[2,5,6]])
```
<img width="606" alt="スクリーンショット 2019-06-18 14.41.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206657/9fd3b9d8-06f3-3ca3-0f9c-fa29def65841.png">

レベル，攻撃力，防御力の関係が見えてきました．

レベルが高いほど攻撃力は高く
攻撃玉が高いほど防御力は高い

といった傾向が見えます．

しかし，これだけでははっきりとは言えません．
相関係数も見てみましょう．[【相関分析】相関係数行列の算出→ヒートマップ化](https://qiita.com/mnm_analytics/items/db626c9e331bfdc4857a)を参照

# 相関係数行列

```ruby:colab
corr_mat = df.iloc[:,[2,5,6]].corr(method='pearson')
# method='spearman'でスピアマン、'kendall'でケンドールも指定可能
corr_mat
```
<img width="284" alt="スクリーンショット 2019-06-18 14.42.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206657/e3356f01-110b-b489-a525-f57e870b5184.png">

```ruby:colab
#ヒートマップ化

sns.heatmap(corr_mat,
            vmin=-1.0,
            vmax=1.0,
            center=0,
            annot=True, # True:格子の中に値を表示
            fmt='.1f',
            xticklabels=corr_mat.columns.values,
            yticklabels=corr_mat.columns.values
           )
plt.show() 
```

<img width="368" alt="スクリーンショット 2019-06-18 14.42.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206657/58130a7d-4aad-c5ac-224d-d6e19ac52556.png">

全ての変数間に正の相関が確認出来ます．

特にレベル&攻撃力，レベル&防御力は相関係数が大きいです

それを確認する前にまず，タイプ，種族，属性が何種類ずつあるか確認します．

属性との関係を見る前に，魔法・罠が含まれたデータセットからモンスターカードのみ取り出します．
欠損値を含むデータが魔法・罠だったので，これを除外したものがモンスターカードのみのデータになります．

```ruby:colab
df_monster = df.dropna()
df_monster.head(10)
```
<img width="708" alt="スクリーンショット 2019-06-18 14.43.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206657/04ec49fc-1fc2-1b4e-b7bd-193e3b2f599e.png">

これに対して分析を進めていきます．

一応，[pandasでユニークな要素の個数、頻度（出現回数）をカウント](https://note.nkmk.me/python-pandas-value-counts/)を参考にデータの確認をします．

```ruby:colab
df_monster.astype('str').describe()
```
![スクリーンショット 2019-06-18 18.00.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206657/b3b2a748-d7cf-47d0-9000-68b65c2663b3.png)

Typeは21種類，カードの種族は24種，属性は7種類ということが分かりました．

# タイプ
タイプについて見てみます．

```ruby:colab
Type1 = pd.DataFrame(df_monster["Type"])
Type2 = pd.DataFrame(Type1["Type"].value_counts())
Type3 = Type2.reset_index()
Type4 = Type3.sort_values("index")
Type5 = Type4.rename(columns={"index":"Type","Type":"cnt"})
Type6 = Type5.sort_values(by="cnt",ascending=False)
sns.barplot(x="cnt",y="Type",data =Type6)
```
![スクリーンショット 2019-06-18 18.02.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206657/4a1ca2da-1c8a-bdf1-25a3-97d13e3ae103.png)

最も多いのが予想通り効果モンスター2494体ですね．

ノーマルモンスター533体，チューナーモンスター234体もいるのに驚きです．

Fusion Monsterは融合モンスターのことでしょうか？
この辺は後で確認が必要ですね．

# 種族

次に種族についてみてみます．

```ruby:colab
Race1 = pd.DataFrame(df_monster["Race"])
Race2 = pd.DataFrame(Race1["Race"].value_counts())
Race3 = Race2.reset_index()
Race4 = Race3.sort_values("index")
Race5 = Race4.rename(columns={"index":"Race","Race":"cnt"})
Race6 = Race5.sort_values(by="cnt",ascending=False)
sns.barplot(x="cnt",y="Race",data =Race6)

```
![スクリーンショット 2019-06-18 18.03.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206657/4fc595c9-f80b-0cb5-ad1e-abe429434f1a.png)

戦士とマシンが多いですね．意外とドラゴンが上位5位でした．もっといる印象でしたが．

# 属性
次に，属性について見てみます．

```ruby:colab
Attribute1 = pd.DataFrame(df_monster["Attribute"])

Attribute2 = pd.DataFrame(Attribute1["Attribute"].value_counts())
Attribute3 = Attribute2.reset_index()
Attribute4 = Attribute3.sort_values("index")
Attribute5 = Attribute4.rename(columns={"index":"Attribute","Attribute":"cnt"})
Attribute6 = Attribute5.sort_values(by="cnt",ascending=False)
sns.barplot(x="cnt",y="Attribute",data =Attribute6)

```
![スクリーンショット 2019-06-18 18.03.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206657/d2cfabfc-1868-21aa-7cf5-8a40b8861c22.png)

属性は多い順に闇，地，光，水，風，火，占いという結果になりました．

闇と地がやはり多いですね．

ここで，最も攻撃力が高い傾向にある属性が気ります。

先ほどの散布図行列に色をつけてみます

```ruby:colab
df_monster.head()
```
![スクリーンショット 2019-06-18 18.05.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206657/0b3eb3a4-754b-4468-0ffd-840c84cd577d.png)


```ruby:colab
Attributes = list(set(list(df_monster['Attribute'])))
print(len(Attributes), type)


```
今回は基礎集計を中心にやりました．
Google Colaboratoryでの操作の練習になったのでこれからも続けていきたいとおもいます．
これからはさらに分析を進めていきたいと思います．