PGLデータ集計について

PGL(Pokemon Global Link)上のデータ収集及び集計の報告

 

3rdLiveの感想より先にこれを書けって?おっしゃる通りです。レートのシーズン9終わり直後くらいに某所で同じ内容の記事を書いたのですが、そのあともデータ収集を続けたらやや結果を書き直すことができたので読んだ覚えがあるような人も結果の後半はぜひ。

(記事の大部分は5月半ばのものです)

 

背景及び目的

ここのところプログラミングをやる機会が頻繁にあり、何かに活かせないかなというのが始まりです。小学生が知りたての言葉をやたらと使いたがるのとそう大差ないです。せっかく学んだ知識をそのまま春休み中に腐らせるのがいたたまれなかったのもありますね。あとはウェブクローリングって話には聞くけどどうやってんの?という純粋な疑問から。

データ収集して、適当に加工して何が期待されるのか、ということについて当初は「何かしらの値変動を起こしている集合(技・性格・特性・持物)が観測されれば、あるポケモンのある型が流行っている、という情報が数値的に取り出せるのでは?」と考えていました。

 

方法

簡単にはPythonでウェブクローリングをしてPGLのデータをテキストファイルで保存して、javaのプログラムで解析→グラフ化という手順を取ることになりました。ぶっちゃけもっと冴えたやり方があるのですが時間の関係上今のところこれで動くので妥協中。

※以下込み入った話なので結論を急ぐ方は飛ばしてください。

始めに、Javaでやってみようということで調べましたが、実行するとどうもうまく行かない。

原因は、PGLのサイトがJavaScriptによってHTML情報の上書きを行う形でポケモンのデータを並べていたことです。つまりHTMLの情報だけ取ってくるのでは足りない訳ですね。困った。

ここで同時期にやっていたPythonだとやりやすいんじゃないの?って話を読み、調べるとseleniumとPhantomJSとやらを使うといいらしいとのこと。(Seleniumはブラウザを自動で動かすツール的なもの。つまり、これにそったコードを書けば自動的にデータ収集ができる。すごい!PhantomJSはブラウザの一種。InternetExplorer()とかGoogleChormeとかの仲間。ただ、GUIが省略されているのでプログラム上から動かすのが基本らしい。)どうやらこの組み合わせは王道らしい。どっちも入れてやってみるとまあそこそこまではいくのですが、肝心の技のパーセント辺りが拾えない。

f:id:Metamond:20180612204610p:plain

(左側のじゃれつく…〇〇%等)

原因は分からないけど色々やってみた末、PhantomJSで拾っているJavaScriptが完全な形になっていないのでは?という仮説が立ったのでseleniumで操作するブラウザをGoogleChromeに変えるとうまく動くではありませんか。GoogleChromeは神。

というわけでPythonで無事にPGLのデータ収集が始まりました。具体的には、後で解析しやすいように形を整えてテキストファイルに保存するようにしました。(データベース的な話は一切わからないので今の私にできそうなのはこの辺りでした。調べればもっと冴えたやり方があるとは思う。) 結論の前になんですが、後日談的に、Pythonseleniumを使って云々と書いていますが、賢明な皆様ならお気づきでしょうがJavaでも使えるんですよね、selenium。いや、なぜ検索しているときに目に入らなかったのか…。テキストファイルにした後の解析及びグラフ作成はPythonGUI的なあれが分からなった(学び始めるには時間かかりそうだった)ので渋々Javaで作ったのですがこれ最初から全部Javaで作れたのでは?という落ち。

テキストファイル以降のグラフ作成はswingは勿論、JFreeChartというもので作っています。なんと無料!

 

結果

結局のところ、どういう結果が出たの?というお話。結論から言うと、「プログラム自体は問題なく動いたが、有意義な情報にはならなかった」です。次のページのグラフはPGLのレーティングバトル(シングル)のデータ集計結果です。横軸が順位(左が1位m右が30位)、縦軸が時期です。

f:id:Metamond:20180612203926p:plain

まあこれ自体は楽しくなくはない感じなので良しとしましょう。

そこそこ順位の入れ替わりもありますしね。3周目にドリュウズが消えたときはエラーが出ました。

続いてそれぞれのポケモンの技・特性・性格・持ち物の情報のうち変動が大きかったグラフを2つほど。

f:id:Metamond:20180612203955p:plain f:id:Metamond:20180612203958p:plain

見ればわかる通り、大きい変動でこの程度なのですよね。ランドロスの特性がずっと変わらないのは当然、みたいな話ではなく、一番変えやすい部分である技でさえこのぐらいしか変わっていないという結論になります。

いやはや、準伝の性格ならまだしも、ほかのものもこんなに全然変わってないなんて予想外でしたね。そもそも技等の順位が入れ替わるケース(グラフ上で交わる)が少なかったので安定しちゃってる感じがあります。

ポケモンランキングの方は、内部の使用率が何パーセントであろうと、表示されるのは上位から何位という離散値なので、グラフにしたときに分かりやすく結果が出るという補正もありますね。一方技などのそれぞれの種族の詳細な値は連続値につき数パーセント程度の変動しか観測できないためあまり変化が感じられないといったところでしょうか。

当初期待していた、あるポケモンのある型の流行を数値的に観測する、という目的は今のところ果たせなかったことになります。考えられる原因としては、そもそも大きな変化のある流行りが今期になかった・集計期間が短い、が挙げられます。もっと集計期間を長くしてグラフ作ってみると多少の変化は現れるのかもしれません。ただどっちにしても型の流行り、という局所的な変化には対応できませんが。激流ゲッコウガとか威嚇ガオガエンとかの時期のデータがないのが悔やまれますね。恐らくもっと急な変化になっていたと思うのですが。

 

結果(6/12追記)

シーズン終了直後(5/16)のものはデータを取らなかったのですが、その後はとっていたのでそれと合わせて全体のグラフにしたものがこちらになります。

f:id:Metamond:20180612204042p:plain

いい感じに楽しいグラフになりました。シーズンの変わり目はさすがに変動が大きいようですね。また、個別にポケモンを見ると以下のものが特に変化が大きかったです。

f:id:Metamond:20180612204110p:plain

f:id:Metamond:20180612204135p:plain

f:id:Metamond:20180612204151p:plain

ゲンガーとかルカリオとかまさしく私が想像していたようなグラフになってて嬉しいですね!滅びの歌系が減ってたり、特殊型が増えていたり!シーズン後半は固まってくるのでは?という予想がされますが(忘れなければ)シーズン10は全期間データ収集したいところです。

 

今後の展望

集計期間中、毎回グラフ作ってみて変化があんまりないことに気付き始めたあたりから考えてみたのですが、離散的な数値なら捉えやすい、ということなら「このポケモンと一緒に手持ちに入れられているポケモン」を集計した方が価値ある情報になるのではないでしょうか。全体のランキング情勢にも関わらず、このポケモンの一緒に手持ちに入れられているポケモン順位の上位は〇〇がいるということが数値で評価できれば、よく使われている「並び」が自動的に出せるのでは?と。(ex.ポリゴン2と一緒によく入っているポケモンの2位は、全体順位は24位なのにクチート、など)その場合既に知られている有名な並びが抽出できたら割と成功なのかと思いますが、すでに知られているものが出てきてもあまり有意義ではない…?まあアルゴリズム組むのが楽しいみたいなところがあるので私が楽しければそれで…。

 

参考文献

Qiita様に頼りっぱなしでした。

JFreeChart

http://www.jfree.org/jfreechart/     (公式)

https://www.javadrive.jp/jfreechart/ (使用例)

https://qiita.com/tontan9616/items/7c755aadf954a5a26ffa (使用例)

Python+Seleniumについての記事

https://qiita.com/motoki1990/items/a59a09c5966ce52128be

https://qiita.com/kinpira/items/383b0fbee6bf229ea03d

PGL(Pokemon Global Link)

https://3ds.pokemon-gl.com/