ふたくちおとこ

クチート大好きな私が、主にポケモンやボドゲに関して書くブログ

【ORAS】PGLにおけるポケモンの関係性を可視化した

こんにちは。sacchinと申します。ORASレート最終シーズンいかがお過ごしだったでしょうか? 私は、今まであまり興味がなかった図鑑埋めに奮闘していました。

さて、今回はPokemon Global Link(PGL)のデータを利用してコミュニティを抽出したので、 その結果をご報告したいと思います。R言語を利用しています。

グラフとして考える

グラフと聞くと、円グラフや線グラフのような統計図表が頭に浮かぶ方が多いと思います。 しかし、この記事ではグラフ理論におけるデータ構造を指しています。

一緒に手持ちに入れられているポケモン

PGLであるポケモンを選択すると以下の画面が表示されます。 (クチートはとてもかわいいので選択してしまいますよね。)

f:id:sacchin13:20160916101026p:plain:w500

図中の右側に表示されている一緒に手持ちに入れられているポケモンを、以下の様なグラフとして捉えます。

f:id:sacchin13:20160916105714p:plain:w300

次にガブリアスを見てみましょう。同じようにグラフにしてくっつけてみます。 おぉ、人物相関図っぽくなりましたね。

f:id:sacchin13:20160916105718p:plain:w300

さらにウォッシュロトムも見てみましょう。同じようにくっつけます。

f:id:sacchin13:20160916105722p:plain:w300

かなり複雑なグラフになりました。 上記は、ネットワークとも呼ばれているみたいです。

コミュニティに分割する

さて、本題のコミュニティ抽出です。 今回は手持ちに入れられているポケモンということなので、ノードが複数のコミュニティに属することを許す手法を用います。 ちょうどlinkcommというパッケージがありましたので、活用させていただきました。

library("linkcomm")
d <- read.table("data.txt")
g <- graph.data.frame(d[1:2],directed=T)
oc <- getOCG.clusters(g)
plot(oc, type="graph")

対象のデータは、ORASシーズン17のシングル対戦における

[使用率上位12体] + [それらと一緒に手持ちに入れられているポケモン120体] = 132体

から重複を除いた46体です。

結果

概要

まずは全体を見てみましょう。

f:id:sacchin13:20160916164514p:plain:w600

すごい!ちゃんとコミュニティに分けられてる! それぞれの色がコミュニティを表しているようです。 一色の場合は1つのコミュニティにだけ所属しているポケモンで、 円グラフのように多色になっている場合は、複数のコミュニティに所属しているポケモンです。

中心に非常に多くのコミュニティに所属しているポケモンがいますね。 みなさん、どのポケモンなのか予想してみましょう。

コミュニティ詳細

次に特徴のあるコミュニティをピックアップしていきます。

No ポケモン1 ポケモン2 ポケモン3 ポケモン4 ポケモン5 ポケモン6 ポケモン7
1 クチート カイリュ- ポリゴンZ
2 クチート ジャローダ ラグラージ
3 ガルーラ スイクン キノガッサ ガブリアス ボルトロス ファイアロー ゲンガー
4 ヘラクロス クレセリア ヒードラン
5 カイロス サンダー バシャーモ ラグラージ マンムー ナットレイ
6 ニョロトノ ラグラージ ボーマンダ マンムー ウォッシュロトム ナットレイ
7 エアームド バンギラス ウォッシュロトム ドリュウズ ファイアロー ゲンガー
  • コミュニティ1
  • コミュニティ2
  • コミュニティ3
  • コミュニティ4
    • 綺麗なヘラクレセドランです。ちょっと感動しました。
  • コミュニティ5
    • ここはバシャサンダーナットとラグカイロスが混じった感じでしょうか。
  • コミュニティ6
    • 雨パコミュニティと名前をつけたいですね。トノラグとマンダマンムーナットあたりが見えます。
  • コミュニティ7
    • 一転して砂パコミュニティとなりました。バンギムドーとバンドリあたりは関連が強そうです。

最もコミュ力の高いポケモンは?

さて今度は、あるポケモンがいくつのコミュニティに属しているかを見てみましょう。

f:id:sacchin13:20160916115254p:plain:w700

なんとゲンガーが17のコミュニティに属していました。コミュニティは全部で32個だったので、半分以上です。 次いで、ファイアローの16、ガブリアスの13、ガルーラの12と続きます。 先ほど予測してみましょうと書きましたが、みなさんどうだったでしょうか? 筆者は、ファイアローだと思ってました。惜しいです。

最後に

今回はR言語を用いて、一緒に手持ちに入れられているポケモンをネットワークと見立てて解析をしてみました。 有名な構築が1つのコミュニティとなったり、コミュニティの中にいくつかの構築が含まれる結果になりました。

PGLのデータがすでに集計後のデータであるため、うまく分割できないかもと考えていましたが、うまく分割できて良かったです。 また何か思いついたら解析して見たいと思います。それでは。

ポケモングルーバルリンクのデータについて

みなさん、こんにちは。sacchinです。 XY・ORASの世代も後残り60日ほどになってしまいました。 今日は、今までお世話になったポケモングローバルリンクのデータについて軽く見ていきたいと思います。

PGLでやり取りされているJSONデータ

みなさんご存知の通り、PGLではレーティングバトルの統計をシーズンごとに見ることができます。

f:id:sacchin13:20160916101026p:plain

この時にやり取りされているデータを、Chromeの開発者ツールで見てみます。

JSONデータの内容

  • status_code
    • レスポンスの成否を表す
  • beforePokemonId
    • 一つ前のポケモンのID
    • [ポケモンの図鑑番号]-[フォルムなどを表現するサブID]というフォーマット
  • nextPokemonId
    • 一つ後のポケモンのID
    • 上と同じフォーマット
  • rankingPokemonInfo
  • rankingPokemonTrend
    • このポケモンのステータスのトレンド
    • wazaInfo
      • 覚えている技のランキング
    • tokuseiInfo
      • 特性のランキング
    • seikakuInfo
      • 性格のランキング
    • itemInfo
      • 持っている道具のランキング
  • rankingPokemonIn
    • 一緒に手持ちに入っているポケモンのランキング
  • rankingPokemonSufferer
  • rankingPokemonSuffererWaza
    • このポケモンが相手を倒した時に使用した技のランキング
  • rankingPokemonDown
  • rankingPokemonDownWaza
    • 相手に倒された時に使われた技のランキング
  • rankingPokemonDownWazaOther
    • 相手の技以外で瀕死になった確率
  • timezoneName

ほぼすべて画面に表示される内容と同じです。 しかし、興味深いのは以下のフラグが存在したことです。

PGLの画面には表示されていない内容だったので驚きました。 また後者は、メガゲンガーとヘドロゲンガーなどを区別することができそうです。 ※いくつかのポケモンを確認して私が憶測した内容になりますので、間違っている可能性はあります。

まとめ

ポケモングローバルリンクJSONデータの内容について軽く見ていきました。 概ね画面において確認できる内容と同じでしたが、画面に現れないデータも確認できました。

筆者のひとりごと

PGLAPI公開されないかなぁ。

JSONデータの全容

最後にJSONデータの全容を掲載しておきます。

{
  "status_code":"0000",
  "beforePokemonId":"444-0",
  "nextPokemonId":"446-0",
  "rankingPokemonSuffererWaza":[
    {
      "ranking":1,
      "typeId":14,
      "usageRate":50.587404236710874,
      "wazaName":"げきりん","sequenceNumber":1
    },~
  ],
  "rankingPokemonSufferer":[
    {
      "formName":null,
      "typeName1":"ドラゴン",
      "typeName2":"じめん",
      "monsno":445,
      "formNo":"0",
      "pokemonId":"445-0",
      "ranking":1,
      "countBattleByForm":1,
      "battlingChangeFlg":1,
      "typeId1":14,
      "typeId2":8,
      "name":"ガブリアス",
      "sequenceNumber":1
    },~
  ],
  "rankingPokemonIn":[
    {
      "formName":null,
      "typeName1":"ノーマル",
      "typeName2":null,
      "monsno":115,
      "formNo":"0",
      "pokemonId":"115-0",
      "ranking":1,
      "countBattleByForm":1,
      "battlingChangeFlg":1,
      "typeId1":1,
      "typeId2":0,
      "name":"ガルーラ",
      "sequenceNumber":1
    },~
  ],
  "rankingPokemonTrend":{
    "wazaInfo":[
      {
        "ranking":1,
        "typeId":8,
        "usageRate":99.6182301156945,
        "name":"じしん",
        "sequenceNumber":1
      },~
    ],
    "tokuseiInfo":[
      {
        "ranking":1,"usageRate":98.5016794362363,"name":"さめはだ","sequenceNumber":1
      },
      {
        "ranking":2,"usageRate":1.4983205637636934,"name":"すながくれ","sequenceNumber":2
      }
    ],
    "seikakuInfo":[
      {
        "ranking":1,
        "usageRate":63.80211191850893,
        "name":"ようき",
        "sequenceNumber":1
      },~
    ],
    "itemInfo":[
      {
        "ranking":1,
        "usageRate":35.72786546947378,
        "name":"こだわりスカーフ",
        "sequenceNumber":1
      },~
    ]
  },
  "rankingPokemonInfo":{
    "formName":null,
    "typeName1":"ドラゴン",
    "typeName2":"じめん",
    "monsno":445,
    "formNo":"0",
    "pokemonId":"445-0",
    "ranking":1,
    "weight":"950.0",
    "typeId1":14,
    "typeId2":8,
    "name":"ガブリアス",
    "sequenceNumber":1,
    "height":"190.0"
  },
  "rankingPokemonDown":[
    {
      "formName":null,
      "typeName1":"ノーマル",
      "typeName2":null,
      "monsno":115,
      "formNo":"1",
      "pokemonId":"115-1",
      "ranking":1,
      "countBattleByForm":1,
      "battlingChangeFlg":1,
      "typeId1":1,
      "typeId2":0,
      "name":"ガルーラ",
      "sequenceNumber":1
    },~
  ],
  "rankingPokemonDownWazaOther":{
    "ranking":0,
    "typeId":0,
    "usageRate":9.623185809663491,
    "wazaName":"その他",
    "sequenceNumber":0
  },
  "rankingPokemonDownWaza":[
    {
      "ranking":1,
      "typeId":4,
      "usageRate":10.405027672350414,
      "wazaName":"れいとうビーム",
      "sequenceNumber":1
    },~
  ],
  "timezoneName":"JST"
}