ポケモントレーナーのみなさん、おはこんにちばんは。
ポケモントレーナー業の傍らで JX通信社で機械学習エンジニアとしてインターンしているandmohikoです。
この記事はJX通信社Advent Calendarの12日目です。
ポケットモンスターソードシールドが発売されたので、新作に登場するポケモンのデータを分析しようと思います。
タイトルはもこう先生の動画 をパクりました からお借りしました。
ガチ対戦やってる方は感覚的にわかっていることも多いと思いますが、
今回はそれをデータから導こうと思います。
ついでに厨ポケにメタを張れる可能性のあるポケモンも見つけることがこのエントリーの目的です。
読んでみて面白いと思った方、もっと良い型があるぜ!という方、まさかりを飛ばしたいという方はぜひツイッター @andmohiko にリプライください。
ぜひ 対戦しましょう、相棒のマニューラとお待ちしてます。
バトルしようぜ!
追記(2019/12/24)
jupyter notebookを公開しました。
https://github.com/andmohiko/pokemon_data_analysis
ソードシールドの特徴
前作のウルトラサンムーン(以後USUM)との大きな違いは
- メガ進化・Z技の廃止
- ダイマックス(ポケモンが巨大化するやつ)の追加
- めざめるパワーの廃止
の3点でしょう。
特にこのダイマックスというシステムが導入されたせいで対戦は複雑になりました。
複雑になった主な理由は
- ダイマックスはバトル中に1回、3ターンしかできない
- ダイマックスはどのポケモンでもできる
- ダイマックス中は体力が2倍になり、技の威力も上がる
- ダイマックス技は必ず追加効果がある
などが挙げられます。
従来ならメガ進化できるのは限られたポケモンだったのに対し、
今作は全てのポケモンがバトル中にパワーアップできてしまうため、
相手の戦術が読みにくくなったり、意表を突かれることが多くなりました。
例えば、本来なら1撃で倒せる予定だった対面でダイマックスを切られて攻撃を耐えられ、反撃を食らってやられるということや、
素早さで勝ってるので先攻で攻撃して倒そうと思っていた相手にダイジェット(飛行のダイマックス技で自分の素早さを1段階上げる)を使われて素早さを追い越された、なんてことがあります。
ダイマックス以外の2点についても少し触れておくと、
Z技の廃止とダイマックスによる耐久力の底上げによって前作よりもゆっくりとした試合展開になりました。
めざめるパワーの廃止によってサブウェポンをめざパにしていたポケモンたちが軒並み弱体化しました。
その結果技範囲の広いポケモンの株が上がっています。
ダイマックス技で能力を上げられるので積み技も必要なくなり、フルアタ型が多く見受けられます。
このような理由から、従来の対戦よりも複雑になり、努力値の調整が難しくなりました。
考えるべきことが多すぎるあまり、過去作で開拓済みの戦術を使い続けるポケモントレーナーも少なくないでしょう。
そこでデータの観点から可能性のあるポケモンを見つけたいと思います。
というわけで今作に登場するポケモンの分析に入っていきます。
分析していくぅ
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
以下のような、レート戦で使える全ポケモンの種族値のデータを用意しました。
H, A, B, C, D, Sというカラム名はそれぞれHP, 攻撃, 防御, 特攻, 特防, 素早さを意味しています。
ダイマックス時のパラメータは除いています。
フォルム違いは含まれています。
rate_swsh.head()
もちろんポケモンバトルというのはパラメータでの殴り合いだけではなく、
特性や覚える技や対面などによっても左右されます。
数値からは見えない部分は "ドメイン知識" で補います。
散布図行列
まずはデータの全体像を眺めたいので散布図行列を見てみます。
from pandas.tools import plotting
plotting.scatter_matrix(rate_swsh)
plt.show()
相関係数行列
続いて相関係数行列のヒートマップも見てみます。
sns.heatmap(rate_swsh.corr(),
annot=True,
xticklabels=rate_swsh.corr().columns.values,
yticklabels=rate_swsh.corr().columns.values
)
plt.show()
AとCの相関が低いということは、物理特化か特殊特化にすべきポケモンが多いということがわかります。
また、H,B,DとSの相関が低いことが気になります。
受けに使えるポケモンが必ずしも遅いというわけではないというのは新たな発見でした。
バイオリンプロット
ついでにバイオリンプロットも見てみます。
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()
なんとなくおしゃれになりました。
合計種族値
次に合計種族値の分布を見ていきます。
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
ランキングで見るとこのような結果になりました。
rate_swsh.sort_values("total", ascending=False)[:10]
マンダやガブがリストラされたため600族は5匹になりました。
先ほども触れたように、試合展開が緩やかになったので、高速アタッカーでただ殴り合うだけのバトルではなくなりました。
この変化によって、層の厚い450~550族も日の目を浴びるんじゃないかと期待しております。
素早さ
次に素早さの分布を見ていきます。
ポケモンバトルでは素早さが最も重要なパラメータだと言っても過言ではないでしょう。
先攻で殴れるということはつまり相手よりも1ターン多く行動できるということです。
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
今作は素早さ種族値が60~70が厚いことがわかります。
試しに前作USUMの環境と比べてみると、
USUMでは100族以上がたくさんいたため、剣盾は遅めな環境になったことがわかります。
sns.distplot(usum["S"], bins=20)
plt.show()
つまり前作ではSが物足りなかった 90~100族がむしろ剣盾では速い 方だということになってしまいます。
ミミッキュ弱体化なんて嘘でしたね。
素早さのランキングを見るとこのような結果になりました。
rate_swsh.sort_values("S", ascending=False)[:10]
注目すべきは今作から新登場の600族ドラパルトがS142もあることですね。
こんなのにスカーフなんて持たされたら誰も抜けません。
ただし最速ドラパ(素早さ実数値213)なら、最速スカーフ持ちトゲキッス(80族)がギリギリ上を取れる数値というのが絶妙ですね。
それとヒヒダルマ(ダルマモード)が速いのも厄介です。
A160+特性が実質ハチマキな火力で殴られたらすぐに3タテされてしまいます。
使用率トップポケモンの対策
ツイッターで回ってきた使用率ランキングによるとトップ10はこのような結果になっていました。
【シングルバトル使用率】
— ポケモンソルジャー【ポケソル】 (@Pokesol_info) December 6, 2019
(マスターボール級のみ集計)
11月のランクマッチ(シングルバトル)の『マスターボール級』での使用率をもとにキャラランクを作成しました。
パーティ考察の参考にしてみてください!https://t.co/052NlUkNG8 pic.twitter.com/UYWGUZsQMK
全体的に物理に寄った環境になっているので、Bが高いポケモンは活躍できそうです。
また、特殊アタッカーの選択肢がロトムかサザンドラしかないのも物足りないので、
Cが高いポケモンも探してみます。
防御
防御の高いポケモンを見てみます。
rate_swsh.sort_values("B", ascending=False)[:15]
現環境には炎技を仕込んでるポケモンや、ゴースト対策にふいうちを覚えさせているポケモンが多いこと、フェアリータイプが相変わらず強いことを考慮すると
グソクムシャ、コータス、イシヘンジン辺りにワンチャンありそうです。
特攻
特攻の高いポケモンを見てみます。
rate_swsh.sort_values("C", ascending=False)[:10]
こう見比べるとシャンデラのSが絶妙なことがわかります。
サニゴーンやクワガノンほど遅くもなく、ギルガルドやヨワシのようにトリッキーな性格もないので、
スカーフとの相性が良く、使いやすいということが納得できます。
ポットデスはCとSが高いのでスカーフシャンデラのような使い方をしてみたくなります。
からをやぶるとバトンタッチを覚えるので、特性のくだけるよろいと組み合わせてバトンバシャみたいになったら恐ろしいですね。
ブリムオンは遅いものの耐久力はあるので使ってみたら意外と強いかもしれません。
夢特性がマジックミラーなのでダイマックス技を耐えつつ能力ダウンを跳ね返すなんて立ち回りができたらおしゃれですね。
主成分分析
さいごに厨ポケとそれ以外に違いはあるのかをプロットしてみます。
独断と偏見により厨ポケを選び出しました。
rate_swsh["isChupoke"] = 0
chupoke = ["ミミッキュ", "ドラパルト", "サザンドラ", "ロトム", "バンギラス", "リザードン", "ギルガルド", "トゲキッス", "アイアント", "ドヒドイデ", "ナットレイ", "アーマーガア", "ウィンディ", "ギャラドス", "パルシェン", "ドリュウズ", "カバルドン", "オーロンゲ", "オノノクス", "ヒヒダルマ"]
for i in range(len(rate_swsh)):
if rate_swsh["name"][i] in chupoke:
rate_swsh["isChupoke"][i] = 1
これを主成分分析してみます。
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
これを見ると第2,3象限にいるポケモンは種族値的には厨ポケに匹敵しうる可能性があるように見えます。
一定の種族値を満たしているポケモン同士のバトルはただの数値の殴り合いではなく、戦略が必要なゲームであることがわかりました。
結論
今回の結論としては、厨ポケは種族値が突出しているわけではなく、他のポケモンにも可能性があることがわかりました。
特にグソクムシ、コータス、イシヘンジン、ポットデス、ブリムオンは活躍できるんじゃないかという結果になりました。
環境使用率ランキングを見てもわかる通り、
前作からすでに開拓されてきた戦術がメインで使われているパーティになりがちです。
今作から追加されたポケモンはまだまだ戦術が開拓されている最中なので、
これからどんどん面白い型が発見されるのが楽しみです。
バトルしようぜ!