ベイズ統計でシンデレラガールズ総選挙の順位を予測しない。

はじめに

最近「RとStanではじめるベイズ統計モデリングによるデータ分析入門」を読み終わったのでベイズ統計の練習です。
普段Pythonを使うことのほうが多いので久しぶりにR使いました。


あと
idolmaster-statistics.hatenablog.com
という記事を読んで”アイマス統計”を謳っている割に全然数値を用いた順位推定がされていなくて不満だったので自分で書きました。
どうでもいいですが、効果があると思ったなら仮説を書くだけじゃなくて統計を使って検証すればいいと思います。
楽曲ブーストとかはDIDで出来るんじゃないでしょうか。


ただ先に結論を書いておくと全く意味のある推定は出来ませんでした。
まぁ元から過去の順位などから結果を推定することが出来るとは全く思っていなかったので分析の練習の記録を残す意味でブログにしておきます。

データセット

過去の投票企画 -アイマス デレステ攻略まとめwiki【アイドルマスター シンデレラガールズ スターライトステージ】 - Gamerch
上記ページから各アイドル・各回の順位を持ってきて以下のように整形しました。


・前回順位(last_rank)
・今回順位(rank)
・タイプ(type)
・1位ダミー(1st)
・前回タイプ別順位(last_type_rank)
・前シンデレラガールと同タイプダミー(last_type)


目的変数としては「今回順位」と「1位ダミー」を利用して、その他の変数を説明変数に使うイメージです。
前回の結果だけで今回の順位を予想するということで所謂マルコフ性を仮定してます。この仮定が正しいかと言えば正しくないと思います。


また全アイドルをデータセットにしてもしょうがないので平均順位が25位以上かつ、10位以内に入賞したアイドル+回のみデータとして利用しました。
ただし入賞した後ボイスが付いて順位が下がったアイドルは除外しています。
ここらへんの処理も選択バイアスを生んでいる可能性はあります。

分析

分析1:正規線形モデル(上記参考書7章参照)
 Family: gaussian 
  Links: mu = identity; sigma = identity 
Formula: rank ~ last_rank + type + last_type + last_type_rank 
   Data: dat (Number of observations: 46) 
Samples: 4 chains, each with iter = 2000; warmup = 1000; thin = 1;
         total post-warmup samples = 4000

Population-Level Effects: 
               Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
Intercept          0.03      3.11    -6.14     6.16 1.00     4229     3135
last_rank          1.00      0.69    -0.34     2.39 1.01     2416     2318
typeCu             5.07      2.51    -0.04     9.93 1.00     3094     2736
typePa             2.45      4.27    -5.79    10.81 1.00     3170     2874
last_type          1.76      2.63    -3.37     7.00 1.00     3068     2713
last_type_rank    -0.35      1.29    -2.93     2.16 1.01     2821     2635

Family Specific Parameters: 
      Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
sigma     6.94      0.81     5.62     8.80 1.00     2926     2670


l-95% CI~u-95% Clが95%ベイズ信用区間で、全て0を含んでいるので何も言えないですね。

f:id:viola_voila:20210505142125p:plain
図1.正規線形モデルの各係数信用区間


わかりやすくグラフにするとこんな感じ。
80%信用区間で見ると前回順位が高いと順位が高くなりがちという当たり前の結論を言えます。
あとCuタイプは勝ちにくいという過去の傾向からの結果が強く出ているのは面白いかも。

f:id:viola_voila:20210505145518p:plain
図2.正規線形モデルの95%予測区間付き回帰直線


95%予測区間付き回帰直線を見ると正直なんも言えないことが分かります。

分析2:ロジスティック回帰モデル(上記参考書9章参照)
 Family: bernoulli 
  Links: mu = logit 
Formula: X1st ~ last_rank + type + last_type + last_type_rank 
   Data: dat (Number of observations: 46) 
Samples: 4 chains, each with iter = 2000; warmup = 1000; thin = 1;
         total post-warmup samples = 4000

Population-Level Effects: 
               Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
Intercept          2.17      1.60    -0.75     5.60 1.00     2921     3179
last_rank         -1.73      0.85    -3.65    -0.39 1.00     1125     1342
typeCu            -3.24      1.87    -7.35     0.07 1.00     1623     1732
typePa            -1.10      1.99    -5.33     2.73 1.00     2139     2191
last_type         -3.61      2.45    -8.86     0.71 1.00     1427     2030
last_type_rank     2.12      1.44    -0.31     5.32 1.00     1156     1465


1位になるかを目的変数としてベルヌーイ分布で分析したもの。
95%ベイズ信用区間で0を含んでいないのは前回順位のみです。
タイプ別順位が下がると1位確率が上がるのはなんで?

f:id:viola_voila:20210505143544p:plain
図3.ロジスティック回帰モデルの各係数信用区間
f:id:viola_voila:20210505150046p:plain
図4.ロジスッティク回帰モデルの95%予測区間付き回帰曲線


f:id:viola_voila:20210505150551j:plain

予測

predict()を使って前回上位のアイドル5名の順位を予測してみました。
predict()は乱数を利用するのでシードを固定しないと毎回違う値が出るのですが、なんとなくしっくりこないですね。

分析1:正規線形モデル
     Estimate Est.Error      Q2.5    Q97.5
[fumika] 1.158525  7.572659 -13.83033 15.92196
[shiki] 7.669028  7.432507 -6.917125 22.34874
[nao]  2.95872  7.405161 -12.22525 17.95591
[kaede] 3.737913  7.626621 -11.6109 18.74384
[aiko] 9.887218  8.382684 -6.701798 26.6132


Typeの影響でCoが上位になる予測になってます。いまいちピンとこないですが……

分析2:ロジスティック回帰モデル
     Estimate Est.Error Q2.5 Q97.5
[fumika]  0.88575 0.3181544    0     1
[shiki]  0.05675 0.2313932    0     1
[nao]   0.7525 0.4316136    0     1
[kaede]    0.748 0.4342155    0     1
[aiko]  0.00675 0.08189087    0     0


分析1と同じでCoが強いという予測です。

感想

なーんも意味のある結果が出なかったです。まぁ元から期待していませんでしたが。
とはいえベイズ統計モデリングの練習にはなったので今度はまともな分析を考えてやってみたいと思います。
あと基本的に世の中に出てくるデータ分析の結果は有意な結果が出たものばかりなので、こういうなーんの意味もない結果が出る場合もあるということを示すのもいいかなと思いました。


ベイズ統計のメリットとしては、やはりおぼろげながら浮かんできたp=0.05以下かどうかといった判断にならない部分ですかね。
95%信用区間の解釈のしやすさも良いです。
一般の人に説明するときに「100回繰り返したら95回正しい値が含まれる」とかいう意味不明な説明をするより、「95%の確率でこの区間に正しいパラメータが含まれる」という説明をしたほうが絶対分かりやすいでしょうし。


総選挙に関してはルールの提案を
viola-voila.hatenablog.com
で、シンデレラガールになると順位が下がるかという分析を
viola-voila.hatenablog.com
で行っているので気になる人は読んでください。


scikit-learn、Keras、TensorFlowによる実践機械学習 第2版

scikit-learn、Keras、TensorFlowによる実践機械学習 第2版

  • 作者:Aurélien Géron
  • 発売日: 2020/11/04
  • メディア: 単行本(ソフトカバー)
そういえば機械学習の本も読み終わったので適当に練習してみたいです。