xiangze's sparse blog

機械学習、ベイズ統計、コンピュータビジョンと関連する数学について

東方プロジェクト人気投票の統計解析 中休み

年が明けてしまいましたが、いまだ東方プロジェクト人気投票の統計解析 記述統計編 - xiangze's sparse blogの統計モデルコードのデバッグ中です。
書き忘れていた前提やモチベーションを記します。

東方人気投票の前提知識

東方人気投票のはじめかた(投票のやり方)2022年度版 | 東方我楽多叢誌 〜strange article of the outer world〜

  • 選択式でキャラクター(人妖)、音楽、作品に対してそれぞれ7,10,5票入れることができ特に推しには2票入れられる。
  • アンケートで年齢や地域、東方プロジェクトを知った時期、感想などを記載できる。平均年齢は約21歳から19.5歳に減少し分散が大きくなりつつある。一貫して男性比率が減少している。海外、特に東アジアからの投票が日本の一地域に匹敵する数だけ存在していてその割合は増加している。

第18回は性別でその他が選択できるがここでは表示していない。

東方Project作品は以下のように分類される

それぞれの人気

東方神霊廟(2011年12月)までの関係図
http://thwiki.info/th/kanren.png

東方Project - Wikipedia

可視化で見れること

教師なしクラスタリングのその先へ~次元削減と定量解析~
こちらのブログではプロ野球投手の試合データから試行錯誤的な次元削減、可視化から投手の特性の時間的変遷の洞察まで行っていて驚嘆しました。
個々のキャラクター、音楽の個性を把握したいというモチベーションがあります。それは次のモデリングとその意図についてで説明します。

贅沢を言えばグラフだけでなくコードも視認性が高くすることで再利用性にもしたいです。この点においてpandasはR,tidyverseに比べ特定条件の行の抽出、plotとの連携とかでわかりづらいです。
R のパッケージ {targets} にコントリビュートした話 - Sansan Tech Blog
jupyter notebookからコードを抽出して再利用もできますが、紹介されている{targets}の方が必要なところだけ再実行する機能があったりして洗練されています。pythonが優れている点はpytorchやopencvなどのライブラリの充実、そしてそれらがcolabで実行可能なところでしょうか。


R for Data Science (2nd edition) (https://r4ds.hadley.nz/intro.html)

ベイズモデリングもまたこの図のサイクルに含まれるでしょうが下記のモデリングの難しさに起因してサイクル期間が大きくなりがちです。

高次元データの2次元での表現は以前論文コーパスの次元圧縮とLDAによるトピックの関係の可視化 - xiangze's sparse blogでもチャレンジしたもののt-SNEの結果は芳しくなく、LDAによる分類、可視化の方がうまくいった経験があります。データの性質(ドメイン知識)から

モデリングとその意図について

「統計モデリングとは何なのか」をいま一度整理してみる - 渋谷駅前で働くデータサイエンティストのブログ

でも書かれているように統計モデリングをするということは何かを説明したいという意図があります。

 normVote_{i,t} \sim Dir(\sum_{l=1}^{TM} main_{j(i,t-l),t-l} \sigma_{j,l} \ + \sum_{l=1}^{TM} boss_{j(i,t-1),t-l}Lv_i b_{j(i,t-l),l} \ +\sum_{l=1}^{TM} sub_{j(i,t-l)} s_{j,l}+\epsilon_i )

魅力モデルはその名の通りキャラクターの魅力が何によるものなのかを説明しようとします。下に書いた将棋の分析結果では棋士個人の(年齢に寄らない)強さの推定を試みていますが人気投票ではそれは明らかです。得票をもたらした魅力が何に基づくか、登場作品、強さ(登場ステージ)、自機かどうかなどの要因に分解して理解したいです。 実際姉妹キャラクターでほとんど同じ票数、順位の場合と大きく票数の異なる場合が見られます。

トピックモデルの方はもともと投票総数の増減を正規化した投票データの観察からで見られた傾向からはわからなかった各選挙の特徴、特に投票総数の極端な増減の理由を把握したいというのが(後付けではあるが)モチベーションです。キャラクターや音楽より毎回の選挙の分類が関心事ということになります。

Cross-Corpora Comparisons of Topics and Topic Trends
ではLDAのモデル選択を情報量基準(sBIC)を使ってやっているそうで高度です。

データサイエンス×演劇 〜トピックモデルによる舞台のジャンル・特徴分け PART2〜|Yu_Se|note
新型コロナウイルスが演劇に与えた影響
推薦サービスをリリースしたそうです。
www.rcmdyasan.com

採択論文が増え続けているCVPR論文のトピックモデルによる分類と傾向 - xiangze's sparse blogをpython3で復活させたい思いもあります。

可視化結果続き

個別キャラ、作品のプロット

以下はキャラクターと音楽の得票比率のプロットですがこれでは点が重なっており、前回のサブタイトルごとに集計した結果より見た目がわかりづらいです。
回数が少ない=候補が少ないので藍色の値が大きいのは当然だが、17,18回目のU.Nオーエン、フランドール・スカーレット(右上)が突出しているということは見て取れます。

17回
18回

Intro to animations in Python

楽曲、キャラ得票比率の個別のplotアニメーション

作品ごとに集計した投票結果の時系列



初出作品(妖々夢永夜抄)が人気トップになる激しい時代



新作(風神録地霊殿)が第二グループを形成し始めるキャラ人気はトップグループより低いが音楽人気は高い。
新作(星蓮船神霊廟)の初出が既存の人気作品ほどではなくなる。


11回以降 新作が初回から下位グループに位置するようになり、紅魔郷の人気独走が進展している。

やや分かりづらいですが青が整数作品、赤が非整数作品、オレンジが旧作に大体対応します。0(黄色)は音楽のみ or キャラのみの投票結果の合併(分離した方がよさそう)



東方プロジェクトを知ってから2回くらい経ってから投票アンケートに到達しているように見える。そこから少しづつ減少していく。

stanによるモデリングの難しさ

魅力モデルではindexとしてmain,boss,sub(整数作品の自機、整数作品のボス、非整数作品登場キャラ)を読み込んでいますがこれは疎なデータを扱うときの手法で
stan user's guideでも説明されています。
csvから読み込んだDataframeの異なる列を読んでいた、データの型があっていない場合(そもそもpositive integerでなければいけません)でもruntime errorでしか検出できずそれもわかりづらいです。

実行以前に完全に判別するにはassersion、あるいは型ヒントを使いたいが、stanにはassertionがないのでpythonコード側、stanコードに入れる直前に
正規化された選挙データをディリクレ分布で表現しましたが

Rejecting initial value: Error evaluating the log probability at the initial value. Exception: dirichlet_lpdf: prior sample sizes[3] is 0, but must be positive!

とlpdf(log probability distribution function)の初期値が0になってしまうというエラーが出ました。これは第18回投票までの全てのキャラクター数の次元をとっているためでまだ登場していないキャラクターに関する魅力を推定しようとする奇妙なことになってしまいます。これはモデルが不自然と言われればそれまでですが、個体差の項εを導入し選挙時に未登場のキャラクターではその値が無限小になることを期待します*1

先達の解析

テニス
ベイズモデリングで男子プロテニスの強さを分析してみた – 戦略コンサルで働くデータサイエンティストのブログ

将棋

フェデラー、錦織あるいは加藤一二三藤井聡太と言ったそんなに詳しくない人にもわかる目覚ましい個人の力を推定することに成功しています。
同様に東方人気投票でも目立つキャラクターの特性をデータから見出したいです。

実は単純な比較である程度わかったりもします。


news.yahoo.co.jp
FIFAランクに対応するだけのアニメが同時期に放送されていることに驚きます。

自分の好きなコンテンツのデータを解析していきましょう。

*1:計算上の制約とモデルの特性が関連してるのが少し不思議に感じます