Help us understand the problem. What is going on with this article?

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

ポケモンホームというアプリのバトルデータという機能で、ポケモン剣盾ランクバトルのデータが見られるようになりました。
その他の機能 | 『Pokémon HOME』公式サイト

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

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

バトルデータのJSONを取得する

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

取得したJSONをCSVに変換する

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

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が作れます。

...
サンダース,シャドーボール,76.4
サンダース,10まんボルト,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をインポートします。

$ 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

検索してみる

DBを読み込ませるとmoveテーブルの内容が検索できるようになるので、検索してみます。
私の構築だと、初手で「このゆびとまれ」という技を使われると、なすすべなくボコボコにされてしまうため、この技を使うポケモンは真っ先に無力化する必要があります。なので、このわざを採用しているポケモンを検索しました。
image.png

こんな感じで、「このゆびとまれ」を使用するポケモンと「このゆびとまれ」の採用率が出てきました。
image.png
ほぼ全員100%に近い採用率のため、選出画面でこのポケモンを見た時点で、このポケモンを無力化するためのポケモンを戦闘に参加させる必要があることがわかります。

Metabaseの魅力は、自分でSQLクエリを書いたり、簡単なSUMぐらいならお手軽に算出できるところです。例えば「最も多くの種類のポケモンに採用されている技はなにか」といった情報もMetabaseならすぐ検索できます。
image.png
「まもる」は181種類のポケモンが採用していることがわかります。サイドチェンジも覚えてるポケモンが多いですね。
グラフ部分をクリックすると、まもるを採用しているポケモンがわかります。
image.png
コロモリとかどういう構築で使うのかめちゃくちゃ興味があります。面白いですね…。

まとめ

  1. ポケモンホームのバトルデータの中身はJSONなので自分で解析できる。
  2. Metabaseは便利。
  3. 可視化すると戦略の参考になる。
  4. ポケモンホーム、結構いい使用料とってるので、改良する気がないならAPIを公開してほしい。
retrorocket
Perlが好きだったが最近の衰退っぷりから別の言語を使い始めたほうがいいのではないかと悩み始めた。
https://retrorocket.biz
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした