@m_seki の

I like ruby tooから引っ越し

ポケモンカードの5月のシティリーグの500デッキを類似度計算してグラフにする練習

デッキ間のcos類似度を計算したものを可視化する練習1

@rick36i にシティリーグの結果がプレイヤーズのサイトで見れるということを教わったので早速データを集めてみた。

event.pokemon-card.com

ここから使用されたデッキと使用された日をメモしたので、JSONgithubに保存した。

github.com

できたもの

とりあえずできたデンドログラムはこれ。見やすくするのは続編であとで書く。

http://www.druby.org/city-2022-05-29.pdf

中央の横長のクラスタパルキアです。(色は適当かも) PDFを拡大表示するとデッキのIDが見えると思うけど、これじゃあどんなデッキかわからないので、あとで可視化を工夫する。

類似度の計算

以前からデッキ間のcos類似度は計算できてて、それを使って似ているデッキの比較ができる検索システムを作ってあった。

hamana.herokuapp.com

同じ意味のカード(ホイルとかレアリティ違いとかそういうの)を正規化する仕組みがあるので、見た目が違うカードでも 意味が同じなら同じカードとみなして計算する。なのでデッキIDが違うけど同じデッキ、みたいなのもわかる。

github.com

1要素目がカードのID、2要素目が正規化先のカードのIDまたはオリジナルなら名前。RubyのArrayのppだけど、JSONとしても読めるような...。

距離行列

要素間の距離からなる要素数x要素数の行列を距離行列というらしい。今回は500デッキあったので500x500。 距離は1-cos類似度で計算しました。

これを元に階層型のクラスタリングするぞ。(こちらを参考にしました)

chokkan.github.io

(2n + 1 x 2n + 1行列で解くのがかっこ良さそうでしたが、Rubyなので雑にHashでやりました)

なお最初のPDFは最短距離法で求めたものです。

デンドログラム

んで、デンドログラムが描きたかったんだけど自分でやるのは相当めんどくさいのでobervableの例を参考にしました。

observablehq.com

サンプルをWebページで触るのまでは簡単だけど、自分用のなにかを作るといつもハマるのね。

スクリプト

解きながら・実験しながら改造していったので、スクリプトが断片的にしか残ってない...。もうちょっとかっこよくしたらgithubに載せます。

読んでたけど今回は使わなかった本

AmazonのPAAPIが使えなくなっちゃうのでなにか買っていって!