伝説ポケモンの特徴ってなんだ？~主成分分析(教師なし学習)で解き明かす~

#はじめに
データ分析をしてみたいけど、どのデータを分析しよう…
と途方に暮れていたところ**kaggleサイト**にて馴染みのある**ポケモンのデータセット**を見つけました。
なんか面白そう。とりあえずやってみるか。

やってみたい方はこちらへ
https://www.kaggle.com/abcsds/pokemon



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449715/0556dd7d-4874-5345-c861-7a80adb2f1ad.png)

#主成分分析ってなに？
**ビッグデータは“多変量”**が当たり前。
たくさんのデータ項目（変数）を横断的に見て解釈することが求められる。
こんな時、**情報の損失を最小限**にしつつ、できるだけ**少ない変数に置き換えられる**素晴らしい手法が存在している。
それが**主成分分析**!

つまり、
**たくさんの変数(特徴)があるときに、それをごく少数の（たいていは1～3の）項目に置き換えることで、データを解釈しやすくできる分析手法。**


#データセット
```py

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
sns.set_style('whitegrid')

df = pd.read_csv('Pokemon.csv')
df.head()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449715/6cda2759-662f-3e13-f2da-eccb3c862897.png)


**出力の1行目**をみると、
<img width="150" src="https://zukan.pokemon.co.jp/zukan-api/up/images/index/7b705082db2e24dd4ba25166dac84e0a.png" class="img" alt="フシギダネ">

**Bulbasaur(フシギダネ)**の


- 属性はGrass(草),Poison(毒)

- Total=HP+攻撃力+防御力+特攻+特防+素早さ
- HP=49
- 攻撃力=49
- 防御力=49
- 特攻=65
- 特防=65
- 素早さ=45
- 第一世代のポケモン
- 伝説ポケモンではない

以上の**特徴**が分かる。

#型名,欠損値確認
```py
df.info()
```

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449715/e291010f-8a5b-c161-0ab5-ca6949bc7dbb.png" class="img" alt="データ型">

##考察
**「Type2」**には**欠損値が386個**あることが分かる。
これは**「Type1」には欠損値がない**ことから、**属性が一つのみ**のポケモンが800匹中**387匹**にいると推定できる。


##説明変数、目的変数
今回は**「HP」「Attack」「Defense」「Sp.Atk」「Sp.Def」「Speed」を説明変数、「Legendary」を目的変数**として分析してみようと思う。

```py
#カラム「Legendary」の値をbool型からint型へ変更
df['Legendary'] = df['Legendary'].astype(int)
#不要カラム削除
df= df.drop(['Name', 'Type 1','Type 2'], axis=1)
```


#試しに2変数を説明変数に
```py
#とりあえず「HP」と「Attack」からLegendaryを可視化
fig, ax = plt.subplots(figsize=(12 , 8))
df.plot(kind='scatter', x='HP', y='Attack', s=100, 
        c='Legendary', cmap='winter', alpha=0.5, ax=ax)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449715/555195bb-7a4d-cf27-416a-a9357508ddc5.png)

**緑の点**が**伝説ポケモン**。**青の点**が**普通のポケモン**。

##考察
このグラフから**2変数「HP」と「Attack」**だけでは、**全然分類できない**ことが分かる。(緑の点と青の点を分ける線を綺麗に引けないなぁ…)

#相関関係
```py
#相関関係を数値化
df.loc[:, 'HP':'Speed'].corr()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449715/f1be56d6-0e2a-b907-16be-5aa426e738b5.png)

```py
#相関関係を可視化
sns.pairplot(df.loc[:, 'HP':'Speed'])
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449715/0d4ae50f-6da3-27d0-a2af-caf7647710f7.png)

##考察
- **「Deffense」と「Sp.Def」=「0.510747」**
- **「Sp.Atk」と「Sp.Def」=「0.516121」**
- 上記の変数に**相関関係**がありそうなので、**主成分分析**で**データを圧縮**できそう!

#主成分分析
```py
from sklearn.decomposition import PCA
# 元の特徴量と同じ数で主成分分析
pca = PCA(n_components=6)#PCAインタンス生成
X_pca = pca.fit_transform(df.loc[:, 'HP':'Speed'])
df_pca = pd.DataFrame(X_pca, columns=['1st', '2nd', '3rd', '4th', '5th', '6th'])
df_pca.head()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449715/4ad02296-94fe-c791-9689-49ec061fb85e.png)

```py
#寄与率(~主成分は全体のデータの内の何％の情報を表しているか)
pca.explained_variance_ratio_
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449715/fe599a78-a2b4-82d7-6c46-b9e3e31d3679.png)

```py
#累積寄与率を可視化
plt.figure(figsize=(10, 8))
plt.plot(np.hstack([0, pca.explained_variance_ratio_.cumsum()]))
plt.xlabel("n_components", fontsize=15)
plt.ylabel("explained_variance_ratio_", fontsize=15)
plt.show()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449715/01387cfd-6e81-759f-c276-bf02b62dc6d7.png)

##考察
**第一主成分~第三主成分**までで**オリジナルデータ(「HP」「Attack」「Defense」「Sp.Atk」「Sp.Def」「Speed」)の6つの情報(データ)**を**約80%**表せていることが分かる。

##主成分分析の負荷量ベクトル
スコアの**ばらつき度合い**が**最大**になる時のベクトル。
つまり、**情報をより蓄えている**時のベクトルを表している。

```py
#各主成分負荷量を数値化
pca.components_
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449715/0621f194-69fd-b2b7-29cb-de1b455663ce.png)

```py
#各主成分の負荷率を可視化
plt.figure(figsize=(14, 12))
sns.heatmap(pca.components_, 
            cmap='Blues', 
            annot=True, 
            annot_kws={"size": 20},
            fmt="1.1f",
            xticklabels=df.loc[:, 'HP':'Speed'].columns,
            yticklabels=['1st', '2nd', '3rd', '4th', '5th', '6th'])
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449715/2082d6ea-2658-81be-a6cb-1b2322d413a0.png)

##考察
* **第一主成分**は**「HP,Attack,Defense,Sp.Atk,Sp.Def,Speedが高い」**　vs **「それらが低い」**でデータを散らばせていることが分かる。つまり**総合力の差**。

* **第二主成分**は**「Defenseが高く、そしてSp.Atk,Speedが低い」**vs **「Defenseが低く,Sp.Atk,Speedが高い」**でデータを散らばせていることが分かる。

* **第三主成分**は**「Attackが低く,そしてSp.Atk,Sp.Defが高い」** vs **「Attackが高く,そしてSp.Atk,Sp.Defが低い」**でデータを散らばせていることが分かる。



#可視化
```py
#横軸:第一主成分,縦軸:第二主成分
df_pca['Legendary'] = df['Legendary']

fig, ax = plt.subplots(figsize=(12 , 8))
df_pca.plot(kind='scatter', x='1st', y='2nd', s=100, 
            c='Legendary', cmap='winter', alpha=0.5, ax=ax)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449715/fba94473-4f3b-cf51-6816-9eb896fd81b8.png)


```py
#横軸:第一主成分,縦軸:第三主成分
df_pca['Legendary'] = df['Legendary']

fig, ax = plt.subplots(figsize=(12 , 8))
df_pca.plot(kind='scatter', x='1st', y='3rd', s=100, 
            c='Legendary', cmap='winter', alpha=0.5, ax=ax)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449715/70915a40-a392-ffa9-1e4e-4b594b156041.png)

##考察
* 上図から、**第一主成分の値**が**大きいほど伝説ポケモン**が、小さいほど普通のポケモンであると分類できていることが分かる。
* **第二主成分,第三主成分**は第一主成分ほどきれいに**分類できておらず**、伝説ポケモンの特徴を掴むことは難しいと分かる。

#まとめ
**伝説ポケモンの特徴**は**総合値が高い**ことが改めて分かった。
**特定のスキルが高い**からといって、**伝説ポケモンである**と言えることは難しいことも分かった。
実際に伝説ポケモンのデータをみてみると…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449715/034ccee9-9958-c612-dc76-80a882f4da22.png)


<img width="150" src="//cdn.bulbagarden.net/upload/thumb/b/b3/719Diancie.png/600px-719Diancie.png" class="img" alt="フシギダネ"> <img width="150" src="//cdn.bulbagarden.net/upload/thumb/f/fb/720Hoopa.png/600px-720Hoopa.png" class="img" alt="フシギダネ"> <img width="150" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449715/c38a8a3a-3450-38bf-875b-0decfd298148.png" class="img" alt="フシギダネ"> <img width="150" src="//cdn.bulbagarden.net/upload/thumb/4/44/721Volcanion.png/250px-721Volcanion.png" class="img" alt="フシギダネ">　

**総合値高い**ですね…
今回は**「ポケモンの世代」**,**「属性」**を考慮していなかったので**この2変数**も分析に加えてみようと思う。
因みに上記の4匹伝説ポケモンは知りませんでした…