データで導く 厨ポケ狩り講座

ポケモントレーナーのみなさん、おはこんにちばんは。
~~ポケモントレーナー業の傍らで~~ JX通信社で機械学習エンジニアとしてインターンしているandmohikoです。
この記事は[JX通信社Advent Calendar](https://qiita.com/advent-calendar/2019/jxpress)の12日目です。

ポケットモンスターソードシールドが発売されたので、新作に登場するポケモンのデータを分析しようと思います。
タイトルは[もこう先生の動画](https://www.nicovideo.jp/mylist/12734389) ~~をパクりました~~ からお借りしました。


ガチ対戦やってる方は感覚的にわかっていることも多いと思いますが、
今回はそれをデータから導こうと思います。
ついでに厨ポケにメタを張れる可能性のあるポケモンも見つけることがこのエントリーの目的です。

読んでみて面白いと思った方、もっと良い型があるぜ！という方、まさかりを飛ばしたいという方はぜひツイッター [@andmohiko](https://twitter.com/andmohiko) にリプライください。
ぜひ **対戦しましょう**、相棒のマニューラとお待ちしてます。

バトルしようぜ！

### 追記(2019/12/24)
jupyter notebookを公開しました。
https://github.com/andmohiko/pokemon_data_analysis

## ソードシールドの特徴
前作のウルトラサンムーン(以後USUM)との大きな違いは

- メガ進化・Z技の廃止
- ダイマックス(ポケモンが巨大化するやつ)の追加
- めざめるパワーの廃止

の3点でしょう。
特にこのダイマックスというシステムが導入されたせいで対戦は複雑になりました。

複雑になった主な理由は

- ダイマックスはバトル中に1回、3ターンしかできない
- ダイマックスはどのポケモンでもできる
- ダイマックス中は体力が2倍になり、技の威力も上がる
- ダイマックス技は必ず追加効果がある

などが挙げられます。

従来ならメガ進化できるのは限られたポケモンだったのに対し、
今作は全てのポケモンがバトル中にパワーアップできてしまうため、
相手の戦術が読みにくくなったり、意表を突かれることが多くなりました。

例えば、本来なら1撃で倒せる予定だった対面でダイマックスを切られて攻撃を耐えられ、反撃を食らってやられるということや、
素早さで勝ってるので先攻で攻撃して倒そうと思っていた相手にダイジェット(飛行のダイマックス技で自分の素早さを1段階上げる)を使われて素早さを追い越された、なんてことがあります。

ダイマックス以外の2点についても少し触れておくと、
Z技の廃止とダイマックスによる耐久力の底上げによって前作よりもゆっくりとした試合展開になりました。
めざめるパワーの廃止によってサブウェポンをめざパにしていたポケモンたちが軒並み弱体化しました。
その結果技範囲の広いポケモンの株が上がっています。
ダイマックス技で能力を上げられるので積み技も必要なくなり、フルアタ型が多く見受けられます。

このような理由から、従来の対戦よりも複雑になり、努力値の調整が難しくなりました。
考えるべきことが多すぎるあまり、過去作で開拓済みの戦術を使い続けるポケモントレーナーも少なくないでしょう。
そこでデータの観点から可能性のあるポケモンを見つけたいと思います。

というわけで今作に登場するポケモンの分析に入っていきます。

## 分析していくぅ

```python
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
```

以下のような、レート戦で使える全ポケモンの種族値のデータを用意しました。
H, A, B, C, D, Sというカラム名はそれぞれHP, 攻撃, 防御, 特攻, 特防, 素早さを意味しています。
ダイマックス時のパラメータは除いています。
フォルム違いは含まれています。


```python
rate_swsh.head()
```

<img width="384" alt="スクリーンショット 2019-12-09 15.42.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314160/9ecc9a41-a4db-b011-a1b1-0fdcd141bbea.png">


もちろんポケモンバトルというのはパラメータでの殴り合いだけではなく、
特性や覚える技や対面などによっても左右されます。
数値からは見えない部分は "ドメイン知識" で補います。

### 散布図行列
まずはデータの全体像を眺めたいので散布図行列を見てみます。

```python
from pandas.tools import plotting 
plotting.scatter_matrix(rate_swsh) 
plt.show()
```
<img width="500" alt="スクリーンショット 2019-12-08 19.47.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314160/feeb4b4a-4afc-c449-3b3d-c46bebebdbc3.png">


### 相関係数行列

続いて相関係数行列のヒートマップも見てみます。

```python
sns.heatmap(rate_swsh.corr(),
            annot=True,
            xticklabels=rate_swsh.corr().columns.values,
            yticklabels=rate_swsh.corr().columns.values
           )
plt.show()
```
<img width="350" alt="スクリーンショット 2019-12-08 19.54.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314160/1e745786-89ab-3b04-d7a7-f841482a7cd7.png">

AとCの相関が低いということは、物理特化か特殊特化にすべきポケモンが多いということがわかります。
また、H,B,DとSの相関が低いことが気になります。
受けに使えるポケモンが必ずしも遅いというわけではないというのは新たな発見でした。

### バイオリンプロット

ついでにバイオリンプロットも見てみます。

```python
fig = plt.figure()
ax = fig.add_subplot(111)
ax.violinplot(rate_swsh.iloc[:, 3:].values.T.tolist())
ax.set_xticks([1, 2, 3, 4, 5, 6, 7])
ax.set_xticklabels(rate_swsh.columns[3:], rotation=90)
plt.grid()
plt.show()
```
<img width="383" alt="スクリーンショット 2019-12-08 19.58.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314160/a0fc0a75-be24-a057-0f7b-e51fabd5c187.png">

なんとなくおしゃれになりました。


### 合計種族値
次に合計種族値の分布を見ていきます。

```python
print(rate_swsh["total"].describe())
sns.distplot(rate_swsh["total"], bins=20)
plt.show()
```
```
count    419.000000
mean     408.436754
std      100.948576
min      175.000000
25%      310.000000
50%      440.000000
75%      494.000000
max      620.000000
Name: total, dtype: float64
```

<img width="380" alt="スクリーンショット 2019-12-08 18.38.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314160/605bc252-3911-c094-fb85-079340ab3fbf.png">

ランキングで見るとこのような結果になりました。

```python
rate_swsh.sort_values("total", ascending=False)[:10]
```

<img width="427" alt="スクリーンショット 2019-12-09 15.43.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314160/f2b21a1a-84c9-e2b2-1183-c567c0200b0d.png">


マンダやガブがリストラされたため600族は5匹になりました。
先ほども触れたように、試合展開が緩やかになったので、高速アタッカーでただ殴り合うだけのバトルではなくなりました。
この変化によって、層の厚い450~550族も日の目を浴びるんじゃないかと期待しております。

### 素早さ

次に素早さの分布を見ていきます。
ポケモンバトルでは素早さが最も重要なパラメータだと言っても過言ではないでしょう。
先攻で殴れるということはつまり相手よりも1ターン多く行動できるということです。

```python
print(rate_swsh["S"].describe())
sns.distplot(rate_swsh["S"], bins=20)
plt.show()
```
```
count    419.000000
mean      61.801909
std       27.686495
min        5.000000
25%       40.000000
50%       60.000000
75%       80.000000
max      160.000000
Name: S, dtype: float64
```
<img width="395" alt="スクリーンショット 2019-12-08 19.01.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314160/3f8360dd-e74c-641d-c6e3-232dc6f6c23e.png">

今作は素早さ種族値が60~70が厚いことがわかります。

試しに前作USUMの環境と比べてみると、
USUMでは100族以上がたくさんいたため、剣盾は遅めな環境になったことがわかります。

```python
sns.distplot(usum["S"], bins=20)
plt.show()
```

<img width="390" alt="スクリーンショット 2019-12-08 19.09.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314160/cc805e86-0605-3265-83f1-bc827c37be9b.png">

つまり前作ではSが物足りなかった **90~100族がむしろ剣盾では速い** 方だということになってしまいます。
ミミッキュ弱体化なんて嘘でしたね。

素早さのランキングを見るとこのような結果になりました。

```python
rate_swsh.sort_values("S", ascending=False)[:10]
```

<img width="413" alt="スクリーンショット 2019-12-09 15.45.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314160/6564e2df-ecd9-d270-f5fb-8e1affbacd37.png">


注目すべきは今作から新登場の600族ドラパルトがS142もあることですね。
こんなのにスカーフなんて持たされたら誰も抜けません。
ただし最速ドラパ(素早さ実数値213)なら、最速スカーフ持ちトゲキッス(80族)がギリギリ上を取れる数値というのが絶妙ですね。

それとヒヒダルマ(ダルマモード)が速いのも厄介です。
A160＋特性が実質ハチマキな火力で殴られたらすぐに3タテされてしまいます。


## 使用率トップポケモンの対策

ツイッターで回ってきた使用率ランキングによるとトップ10はこのような結果になっていました。

<blockquote class="twitter-tweet" data-theme="light"><p lang="ja" dir="ltr">【シングルバトル使用率】<br>(マスターボール級のみ集計)<br><br>11月のランクマッチ(シングルバトル)の『マスターボール級』での使用率をもとにキャラランクを作成しました。<br><br>パーティ考察の参考にしてみてください！<a href="https://t.co/052NlUkNG8">https://t.co/052NlUkNG8</a> <a href="https://t.co/UYWGUZsQMK">pic.twitter.com/UYWGUZsQMK</a></p>&mdash; ポケモンソルジャー【ポケソル】 (@Pokesol_info) <a href="https://twitter.com/Pokesol_info/status/1202913451472904193?ref_src=twsrc%5Etfw">December 6, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

全体的に物理に寄った環境になっているので、Bが高いポケモンは活躍できそうです。
また、特殊アタッカーの選択肢がロトムかサザンドラしかないのも物足りないので、
Cが高いポケモンも探してみます。

### 防御
防御の高いポケモンを見てみます。

```python
rate_swsh.sort_values("B", ascending=False)[:15]
```

<img width="418" alt="スクリーンショット 2019-12-09 15.46.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314160/52f7edc4-ee28-e181-7e60-07fc8c313cfb.png">


現環境には炎技を仕込んでるポケモンや、ゴースト対策にふいうちを覚えさせているポケモンが多いこと、フェアリータイプが相変わらず強いことを考慮すると
グソクムシャ、コータス、イシヘンジン辺りにワンチャンありそうです。

### 特攻
特攻の高いポケモンを見てみます。

```python
rate_swsh.sort_values("C", ascending=False)[:10]
```

<img width="409" alt="スクリーンショット 2019-12-09 15.47.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314160/78696afb-db72-2d8f-699f-22a658d1ae7e.png">

こう見比べるとシャンデラのSが絶妙なことがわかります。
サニゴーンやクワガノンほど遅くもなく、ギルガルドやヨワシのようにトリッキーな性格もないので、
スカーフとの相性が良く、使いやすいということが納得できます。

ポットデスはCとSが高いのでスカーフシャンデラのような使い方をしてみたくなります。
からをやぶるとバトンタッチを覚えるので、特性のくだけるよろいと組み合わせてバトンバシャみたいになったら恐ろしいですね。

ブリムオンは遅いものの耐久力はあるので使ってみたら意外と強いかもしれません。
夢特性がマジックミラーなのでダイマックス技を耐えつつ能力ダウンを跳ね返すなんて立ち回りができたらおしゃれですね。

## 主成分分析

さいごに厨ポケとそれ以外に違いはあるのかをプロットしてみます。
独断と偏見により厨ポケを選び出しました。

```python
rate_swsh["isChupoke"] = 0
chupoke = ["ミミッキュ", "ドラパルト", "サザンドラ", "ロトム", "バンギラス", "リザードン", "ギルガルド", "トゲキッス", "アイアント", "ドヒドイデ", "ナットレイ", "アーマーガア", "ウィンディ", "ギャラドス", "パルシェン", "ドリュウズ", "カバルドン", "オーロンゲ", "オノノクス", "ヒヒダルマ"]
for i in range(len(rate_swsh)):
    if rate_swsh["name"][i] in chupoke:
        rate_swsh["isChupoke"][i] = 1
```

これを主成分分析してみます。

```python
from sklearn.decomposition import PCA
features = rate_swsh.drop(["galar_no", "name", "isChupoke"], axis=1)
targets = rate_swsh["isChupoke"]

pca = PCA(n_components=2)
pca.fit(features)
transformed = pca.fit_transform(features)

for label in np.unique(targets):
    plt.scatter(transformed[targets == label, 0],
                transformed[targets == label, 1])
plt.title('principal component')
plt.xlabel('pc1')
plt.ylabel('pc2')

print('各次元の寄与率: {0}'.format(pca.explained_variance_ratio_))
print('累積寄与率: {0}'.format(sum(pca.explained_variance_ratio_)))

plt.show()
```
```
各次元の寄与率: [0.80571412 0.06787654]
累積寄与率: 0.8735906656592968
```

![スクリーンショット 2019-12-12 1.00.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314160/199f3406-3a9c-8f29-096d-86b5da2e25e2.png)

これを見ると第2,3象限にいるポケモンは種族値的には厨ポケに匹敵しうる可能性があるように見えます。
一定の種族値を満たしているポケモン同士のバトルはただの数値の殴り合いではなく、戦略が必要なゲームであることがわかりました。

## 結論
今回の結論としては、厨ポケは種族値が突出しているわけではなく、他のポケモンにも可能性があることがわかりました。
特にグソクムシ、コータス、イシヘンジン、ポットデス、ブリムオンは活躍できるんじゃないかという結果になりました。

環境使用率ランキングを見てもわかる通り、
前作からすでに開拓されてきた戦術がメインで使われているパーティになりがちです。
今作から追加されたポケモンはまだまだ戦術が開拓されている最中なので、
これからどんどん面白い型が発見されるのが楽しみです。

**バトルしようぜ！**