備忘録 a record of inner life

やったことや考えたこと・本・論文・音楽の備忘録。 特に環境科学・生態毒性に関して。

階層ベイズモデルを用いてバトルMCの強さランキングを作成する

誰が最強のMCなのか。MCバトル好きの間では常に議論になることです。

 

MCバトルの勝敗は、各MCの実力だけでなく、MCのコンディションやMC同士の相性、バトルの審査方法、会場の空気など様々な要因によって決まります。実力あるMCであっても意外な人物に惨敗したり、成績が振るわない対戦形式があったりして、勝敗の結果からMCの実力を推定するのは案外難しいものです。

 

勝敗の結果から各プレイヤーの実力を推定する方法として階層ベイズモデリングがあります。例えば将棋の勝敗データに適用したブログ記事→階層ベイズモデルで勝敗データからプロ棋士の強さを推定する - StatModeling Memorandum。今回は、このブログの著者が書いたStan・Rベイズモデリング本(通称アヒル本)を参考にして、階層ベイズモデルを用いてバトルMCの実力を推定してみました。

 

 

 

勝敗データ

ネット上に散らばっている勝敗データをかき集めました。

2000年代のバトル結果はネットであまり集められなかったので、2010年~2017年のデータのみ対象にしました。また、地方で開催されているバトルを含めるとキリが無くなるので、UMB(Ultimate MC Battle)やKOK(King of Kings)の本戦などの全国大会だけを選びました。

対象にした大会は、UMB2010~2017、KOK2015~2017、罵倒Grand Championship 2014・2015・2017、戦極MC Battle 第6・8・9・10・13・16章、フリースタイルダンジョンの初代モンスター時代の1on1のみ*1フリースタイルダンジョンの東西口迫歌合戦です(一部抜け落ちている試合あり)。全部で661試合。もし他に勝敗データを提供してくださる方がいらっしゃれば、ぜひコメントいただけると嬉しいです。

 

負けてしかいないMCはほとんど推定に役立たないので除外したところ、139MC・477試合が残りました。この477試合のデータを用いて、ベイズモデリングをおこないました。

 

f:id:Kyoshiro1225:20180603113946p:plain

こんな感じでExcelにまとめました。

 

モデル式

ヒル本の将棋の棋士の強さ推定モデル(p.188~190)をほぼそのまま拝借します。

Performance [g, 1] ~ Normal ( μ [Loser [g] ], σ [Loser [g] ] )

Performance [g, 2] ~  Normal ( μ [Winner [g] ], σ [Winner [g] ] )

Performance [g, 1] < Performance [g, 2] 

μ [ n ] ~ Normal ( 0, σn )

σ [ n ] ~ Gamma ( 10, 10 )

 

gは試合のインデックスを示し、今回は477まであります。nはMCのインデックスを示し、1~139まであります。Performance[g,1]とPerformance[g,2]は試合gにおける勝者と敗者のパフォーマンスです。各試合におけるプレイヤーmのパフォーマンスは、平均μm・σm正規分布から生成されると考え、1・2式目のように表現しています。σは各MCの"勝負ムラ"を示し、弱情報事前分布であるガンマ分布に従うと設定しています。パフォーマンスの大きい方が勝者となる、という制約が3式目です。

詳しいことはアヒル本を読んでください。

 

Stan・Rコード

下のようなコードをStanで書きました。というか、アヒル本からコピーしました。

data {

  int G;

  int P;

  int<lower=1, upper=P> LW[G,2];

}
parameters {

  ordered[2] performance[G];

  vector[P] mu;

  real<lower=0> s_mu;

  vector<lower=0>[P] s_pf;

}
model {

 for(g in 1:G) {

    for (i in 1:2) {

       performance [g,i] ~  normal(mu[LW[g,i]], s_pf[LW[g,i]]);

     }

 }

 mu ~ normal (0, s_mu);

 s_pf ~gamma (10,10);

} 

 でRからStanを走らせました。

P <- max(data2[,c("Loser_id","Winner_id")])

dat <- list( G =G, P = P, LW=data2[,c("Loser_id","Winner_id")] ) 

stanmodel <- stan_model(file="model.stan")

fit <- sampling(stanmodel, data=dat, pars=c('mu','s_mu','s_pf'), seed=1234, chains =4 , iter = 2500) 

 

 

結果

推定された強さμの高いトップ20のMCは下の通りになりました(μの5~95パーセンタイル値を図示してます)。図の下に行くほど強くなっています。誰もが納得のR-指定がトップ1に輝いていますね。その後のGADORO、mol53、晋平太などの並びも、それなりに妥当ではないでしょうか。

f:id:Kyoshiro1225:20180603114622p:plain

注意すべきは、推定結果は今回扱った勝敗データに依存しているという点。当たり前ですが、扱う勝敗データを拡張すれば結果は変わります。今回は全国レベルの大きな大会だけに絞ったので、地方予選で勝ち続けていてもそれが推定結果に反映されてません。さらに、ここ2~3年の人数が大きい大会で優勝した人は、勝利した試合数が多いので有利になっています。

ちょっと意外な人がトップ20に入っているのもデータ選択の妙ですね。GASHIMAや鎮座DOPENESS、般若は、勝利した試合しか今回のデータに含まれてないのでランキング上位ですが、データ数が少ないので信頼区間が非常に大きくなっています。

 

次に"勝負ムラ"σの大きいMCと小さいMCのトップ10です。上の図がσの大きいMC、つまりムラがあるMCで、下の図がσの小さいMC、つまり安定しているMCです。やはり図の下側からトップ(あるいはワースト)の順になっています。

サイプレス上野が一番ムラがある、という結果でした。なぜか納得です。戦極8章でR-指定を倒して優勝した一方で、フリースタイルダンジョンなどでの連敗が反映されているのでしょうか。安定しているMCには、やはり実力のあるMC達がランクインしてますね。逆にここに入っていない晋平太や崇勲は、割と負けるけどハマったら強いというタイプでしょうか。

f:id:Kyoshiro1225:20180603114647p:plain

 

最後に

できれば年ごとの強さを推定したかったのですが、そのためにはデータ数が少なすぎるみたいです。アヒル本のp.231~235を参考に時系列モデルを作成してみましたが、あまり納得できる結果にはなりませんでした。計算時間もかなりかかるし…。残念。

地方予選も含めて膨大なMCバトルのデータを持っている方がいれば、ぜひ提供してくださいw。 

個人的にはR-指定と晋平太の2トップになって欲しかったなぁ。

 

StanとRでベイズ統計モデリング (Wonderful R)
 

 

*1:晋平太や呂布カルマなどチーム戦が導入されてからの1 on 1はまだ含めてない。