ポケモン剣盾のランクバトルのバトルデータをMetabaseで可視化する。


ポケモンホームというアプリのバトルデータという機能で、ポケモン剣盾ランクバトルのデータが見られるようになりました。
[その他の機能 \| 『Pokémon HOME』公式サイト](https://www.pokemon.co.jp/ex/pokemonhome/features/)

ただ、肝心のUIがバグありすぎてかなり使いにくいのと、検索機能が存在せず、戦略の参考にしづらいため、バトルデータの情報を抜き出して[Metabase](https://www.metabase.com/)で可視化することにしました。
MetabaseはOSSのデータ可視化ツールで、MySQLやPostgres、MongoといったDBのデータを簡単操作でグラフにしてくれます。

バトルデータの中身はただのWebViewで、普通のWebページを表示しているだけなのと、データ自体はJSONでやりとりされているため、JSONの内容を自分の使いたいDBにインポートできればMetabaseで可視化可能です。
私はお手軽さを優先してJSONの中身をSQLite3に変換しました。

## バトルデータのJSONを取得する
（プログラミングしておらず、Qiitaのガイドラインに沿わない内容だと判断したため、）取得方法は自分のブログに書きました。以下を参照ください。
[ポケモンホームのバトルデータ（ランクバトル）のJSONを解析する。 – return $lock;](https://retrorocket.biz/archives/1178)

## 取得したJSONをCSVに変換する
SQLite3だとCSVモードがあるので、JSONをCSVに変換します。Python3を使いました。
以下のコードでは、各ポケモンの覚えているわざと、わざの採用率を抜き出しています。

```python

pokedex = "";
#  https://resource.pokemon-home.com/battledata/js/bundle.js の図鑑と持ち物情報を抜き出してjsonにしたものを読み込む
with open('./bundle.json', 'r') as json_open:
    pokedex = json.load(json_open)

pdetail = "";
# https://resource.pokemon-home.com/battledata/ranking/{シングル or ダブルのID}/{rstの値}/{ts2の値}/pdetail-{1から5} をcatで全部連結させたjsonを読み込む
# 私はダブルバトルのプレイヤーなので、ダブルバトルのJSONだけ使っています。
with open('./pdetail-1-5.json', 'r') as json_open:
    pdetail = json.load(json_open)

for pokenum in pdetail.keys():
    for p_detail_id in pdetail[pokenum].keys():
        for pokewaza in pdetail[pokenum][p_detail_id]['temoti']['waza']:
            name = ""
            if pokenum == "876":
                if p_detail_id == "0":
                    name = "イエッサン♂"
                else: 
                    name = "イエッサン♀"
            elif pokenum == "479":
                if p_detail_id == "0":
                    name = "ロトム（デフォ）"
                elif p_detail_id == "1":
                    name = "ロトム（火）"
                elif p_detail_id == "2":
                    name = "ロトム（水）"
                elif p_detail_id == "3":
                    name = "ロトム（氷）"
                elif p_detail_id == "4":
                    name = "ロトム（飛行）"
                elif p_detail_id == "5":
                    name = "ロトム（草）"
            else:
                name = pokedex['poke'][int(pokenum) -1]
            print(name + "," + pokedex['waza'][pokewaza['id']] + "," + pokewaza['val'])
```

こんな感じのCSVが作れます。

```text
...
サンダース,シャドーボール,76.4
サンダース,１０まんボルト,59.8
サンダース,まもる,52.0
サンダース,かみなり,37.3
サンダース,ウェザーボール,36.4
サンダース,ほうでん,28.9
サンダース,どろかけ,27.6
サンダース,みきり,14.4
サンダース,ボルトチェンジ,13.3
サンダース,あまえる,12.0
ブースター,フレアドライブ,86.2
ブースター,あなをほる,84.5
ブースター,ばかぢから,55.2
ブースター,ねっぷう,50.0
ブースター,でんこうせっか,32.8
ブースター,こらえる,31.0
ブースター,アイアンテール,19.0
ブースター,あくび,13.8
...
```

## CSVをSQLite3にインポートする
SQLite3でDBとテーブルを作成して、CSVをインポートします。

```bash
$ sqlite3 double_move.db
sqlite> create table move(name text, move text, adoption_rate real);
sqlite> .mode csv
.import ./move.csv move
```

## SQLite3をMetabaseに読み込ませる

Metabaseの管理者メニューから作成したDBを読み込みます。
私が使っているのはv0.35.3です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321603/cd401a76-f403-fe54-a2a6-4e566044c078.png)

## 検索してみる

DBを読み込ませるとmoveテーブルの内容が検索できるようになるので、検索してみます。
私の構築だと、初手で「このゆびとまれ」という技を使われると、なすすべなくボコボコにされてしまうため、この技を使うポケモンは真っ先に無力化する必要があります。なので、このわざを採用しているポケモンを検索しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321603/19605c63-9914-1d9d-7ed7-949fd69d871f.png)

こんな感じで、「このゆびとまれ」を使用するポケモンと「このゆびとまれ」の採用率が出てきました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321603/ad29854f-99be-1d4f-4d7c-7c6f0a9b87f1.png)
ほぼ全員100%に近い採用率のため、選出画面でこのポケモンを見た時点で、このポケモンを無力化するためのポケモンを戦闘に参加させる必要があることがわかります。

Metabaseの魅力は、自分でSQLクエリを書いたり、簡単なSUMぐらいならお手軽に算出できるところです。例えば「最も多くの種類のポケモンに採用されている技はなにか」といった情報もMetabaseならすぐ検索できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321603/4e4504fe-9fce-e323-0c7f-566176cfcda7.png)
「まもる」は181種類のポケモンが採用していることがわかります。サイドチェンジも覚えてるポケモンが多いですね。
グラフ部分をクリックすると、まもるを採用しているポケモンがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321603/e6fd07dd-6c7c-5e7e-aad1-75fae527233b.png)
コロモリとかどういう構築で使うのかめちゃくちゃ興味があります。面白いですね…。

## まとめ
1. ポケモンホームのバトルデータの中身はJSONなので自分で解析できる。
1. Metabaseは便利。
1. 可視化すると戦略の参考になる。
1. ポケモンホーム、結構いい使用料とってるので、改良する気がないならAPIを公開してほしい。