ポケモンのタイプ相性を可視化する

# はじめに
この記事は [Wano Group Advent Calendar 2023](https://qiita.com/advent-calendar/2023/wano-group)の12日目の記事となります。

# ポケモン対戦とは
ポケットモンスター スカーレットバイオレット(以下ポケモンSV)では世界中の人とポケモン対戦をすることができます。そしてそのポケモン対戦での使われたポケモンや技・道具などは集計されておりポケモンホームというアプリで確認をすることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203730/6cce7cdb-682c-7332-ec59-d932b14f9d90.png)
例えばこの画像からは「カイリュー」「ハバタクカミ」などのポケモンが人気ということが分かります。

# タイプ相性
ポケモンにはタイプというものがあり他のゲームなどでの「火属性」「水属性」...みたいなものがこのタイプという概念になります。他のゲームと同じように「水タイプの技は炎タイプのポケモンに効果抜群(与えるダメージが通常の2倍)」「炎タイプの技は水タイプのポケモンに効果いま一つ(与えるダメージが通常の半分)」というように相性が設定されています。
タイプは今現在で18タイプが存在しそれぞれに相性が設定されています(「[この相性表がポケモン公式で紹介されています](https://www.pokemon.co.jp/ex/sun_moon/fight/161215_01.html))。

# 可視化してみる
この相性を計算して良く使われるポケモンを効果的に対策できればいいと思いこれを可視化できれば使いやすいんじゃね？と思い簡単に可視化できるようにしてみました(もちろんポケモン対戦はタイプだけで決まるものではありません)。またポケモンSVでの新要素「テラスタル」については今回は考慮しないものとします(使用ポケモンの使用率の高いテラスタルはポケモンHOMEにて公開されていますがデータの集計は難しいです...)。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203730/06a70401-2e79-0043-4fe2-026e007d2bf3.png)


とりあえずポケモン対戦のシングル対戦シーズン12での使用率上位を使い可視化してみます。
例として「[テツノツツミ](https://zukan.pokemon.co.jp/detail/0991)」というポケモンで攻めることを考えてみます。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203730/12bff482-665c-bc77-e36a-474cfe1c2b2c.png)


テツノツツミは素早さが非常に高くほとんどのポケモンよりも先に動くことができ、「フリーズドライ(氷タイプ)」「ハイドロポンプ(水タイプ)」の2つの技だけでほとんどのポケモンに対して効果普通、効果抜群(1倍以上)のダメージを与えることができる、登場以来ポケモン対戦でよく使われるポケモンです。



特に「フリーズドライ」という技が強力で、通常水タイプのポケモンに氷タイプの技を使うと「いまひとつ(0.5倍)」なのですがこの「フリーズドライ」という技だけ水タイプのポケモンにも「ばつぐん(2倍)」でダメージを与えることができるすごい技です。



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203730/03a396f6-f3ea-b176-d248-e16962437ff4.png)

(※左上から右下にかけて使用率順位が高い⇒低いと推移しています)
このように2つの技だけで多くのポケモンに対して2倍・4倍のダメージを与えることができ、効果いまひとつでダメージを抑えられてしまうことが基本的には無いということが分かります。
実際に適当にポケモンを6匹決めてしまうと「あれ...テツノツツミやばくね...？」ってなってしまうのはよくあります。


逆にポケモン対戦に置いて攻めるときに一番弱いと言われがちな虫タイプはどうでしょうか。



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203730/1219f9d1-25c9-dea1-72b7-5246928fe37b.png)


使用率の高いポケモンから多く使われないポケモンまで満遍なくまともなダメージを与えることができないのが分かります。ただ使用率の高いポケモンには虫タイプに弱い「草タイプ」「悪タイプ」のポケモンが多いため一部のポケモンには刺さるといった感じですね。

これは今回作成した下記ページで使用することができます。
https://fvrchan.github.io/poke-type-checker/


# PokeAPIを活用する
このようなポケモンの能力や相性関係などをアプリ・サービス開発に役立てることができる[PokeAPI](https://pokeapi.co/)というものが有志によって開発されています。

今回のタイプ相性を可視化するのに使用させていただいたものは次のものです。

https://pokeapi.co/docs/v2#types

※一部抜粋
``` /pokeapi.co/api/v2/type/1
{
  "damage_relations": {
    "double_damage_from": [
      {
        "name": "fighting",
        "url": "https://pokeapi.co/api/v2/type/2/"
      }
    ],
    "double_damage_to": [],
    "half_damage_from": [],
    "half_damage_to": [
      {
        "name": "rock",
        "url": "https://pokeapi.co/api/v2/type/6/"
      },
      {
        "name": "steel",
        "url": "https://pokeapi.co/api/v2/type/9/"
      }
    ],
    "no_damage_from": [
      {
        "name": "ghost",
        "url": "https://pokeapi.co/api/v2/type/8/"
      }
    ],
    "no_damage_to": [
      {
        "name": "ghost",
        "url": "https://pokeapi.co/api/v2/type/8/"
      }
    ]
  },
  ......
```
こちらはノーマルタイプの情報を取得したものですが、ノーマルタイプの技を使うとき、ノーマルタイプの技を受けるときのタイプ相性の情報を取得することができます。他にも「ノーマルタイプの技の一覧」「ノーマルタイプを持つポケモン一覧」などを取得できるなどポケモン関連のサービスを作ったりポケモンの情報を集めるのに活用することができます。

例えばPython3でAPIを全タイプの詳細を取得するには
```Python
import json
import requests
import time
type_list = json.loads(requests.get(
    "https://pokeapi.co/api/v2/type").content)["results"]
type_dict = dict()
for type in type_list:
    type_detail = json.loads(requests.get(type["url"]).content)
    time.sleep(1)
    type_dict[type_detail["name"]] = type_detail

writer = open("type.json", "w")
writer.write(json.dumps(type_dict))
writer.close()

```


他にもタイプのものだけではなく
* https://pokeapi.co/docs/v2#pokemon ⇒ ポケモンの基本的な情報
* https://pokeapi.co/docs/v2#pokemon-forms ⇒ ポケモンのフォームの情報(※同じ名前のポケモンでも環境によって姿を変えたりした別の形態のポケモンが存在しそれをリージョンフォームと呼んでいます)。

など様々なAPIを活用させていただきました。



# 最後に
ポケモン対戦をポケモンSVから本格的に始めた私ですが、ポケモン徹底攻略様などポケモン・ポケモン対戦関連のツールやサービスを提供してくださる方が沢山おり日々感謝しています。
最終的にはダメージの計算なども織り交ぜ、自分もそのようなサービスやツールを開発してポケモン・ポケモン対戦をする皆様の役に立てればと思います。

現在、Wanoグループでは人材募集をしています。興味のある方は下記を参照してください。

Wano | [Wano Group JOBS](https://group.wano.co.jp/jobs/)
TuneCore Japan | [TuneCore Japan JOBS](https://www.tunecore.co.jp/jobs)