StatModeling Memorandum

StatModeling Memorandum

StanとRとPythonでベイズ統計モデリングします. たまに書評.

階層ベイズモデルで勝敗データからプロ棋士の強さを推定する

前の記事のモデルを若干拡張して、勝敗データから将棋のプロ棋士の強さ(skill)を推定しました。

まず勝敗データとレーティングの値ですが、こちらのサイトを参考にさせていただきました。このようなデータを日々更新していくのには多大な努力と忍耐がないとできません。素晴らしいサイトです。

モデルのBUGSコードは以下のようになりました。

model{
   for (i in 1:N.member) {
      skill[i, 1] <- skill.0[i]
      for (t in 2:N.year){
         skill[i, t] <- skill[i, t-1] + beta[i] + r.skill[i, t-1]
      }
   }
   for (g in 1:N.game) {
      winner.p[g] ~ dnorm(skill[Winner[g], Year[g]], tau.k[Winner[g]])
      loser.p[g] ~ dnorm(skill[Loser[g], Year[g]], tau.k[Loser[g]])
      z[g] <- 1
      z[g] ~ dbern(constraint[g])
      constraint[g] <- step(winner.p[g] - loser.p[g])
   }

   for (i in 1:N.member) {
      skill.0[i] ~ dnorm(0, 1.0E-4)
      beta[i] ~ dnorm(0, tau[1])
      for (t in 1:(N.year-1)){
         r.skill[i, t] ~ dnorm(0, tau[2])
      }
      tau.k[i] <- 1/(s.k[i]*s.k[i])
      log(s.k[i]) <- log.s.k[i]
      log.s.k[i] ~ dnorm(mu.s.k, tau[3])
   }
   mu.s.k ~ dnorm(0, 1.0E-4)
   for (k in 1:N.tau){
      tau[k] <- 1/(s[k]*s[k])
      s[k] ~ dunif(0, 100)
   }
}

今回は以前よりはデータが豊富にあるため、skillをこの10年の時系列に沿ったARモデルにしています。1年ごとに対局データを分けて、1年ごとにskillを推定しています。また個人ごとの勝負におけるムラも推定しています。こちらはARモデルにすると収束が著しく悪くなったため、時刻で不変としました。ほんとは禁酒しただとか彼女と別れただとかで勝負ムラも変わってくると思うんですけどデータ不足で推定は厳しいです。

また勝負ムラの標準偏差の事前分布をすべて一様分布にすると収束しませんでした。The BUGS Bookの10.4(p.239)やGelman氏のこちらの論文を参考に、log-normalにしました。1回1回の勝負はデータが1個ですので厳しいようです。

WinBUGSで推定に要した時間は、n.iter=153000, n.burnin=3000, n.thin=100で1chainあたり17時間ほどでした。勝負回数が20552個でそれぐらいかかるようです。

以下は結果です。算出結果もここにアップしておきます。まずは既存のレーティングと2013年5月時点の推定されたskillのmedian値(skill.2013.median)を比べてみました(クリックしてから画像を「名前をつけて保存する」とやっとちゃんと見えます 5000x1250)。

f:id:StatModeling:20201114151133p:plain

エラーバーは50%信頼区間です。かなりよく一致しています。ずれが大きいTop5人は以下の通りです。

nidknamekidleagueratingskill.2013.25pskill.2013.medianskill.2013.75p
182斎藤慎太郎286C116151.34650941.7515782.188632
183八代弥287C215680.86670301.1541051.502008
185石田直裕289C215370.88451651.3178971.856214
187千田翔太291C215160.44915871.0183041.654934
184上村亘288C215000.29272990.8684401.511082

このでは斎藤五段は三浦八段・山崎七段らと同レベルと推定されています(信頼区間の幅はやや大きいですが)。またC2の強い方々も乖離が大きいです。このあたり、レーティングの「みんな同じような低い点数からはじまり、落ち着くまでは正常に評価できない」という弱点が出ていると思います。

次に、72期A+B1リーグ棋士のここ10年のskill値の推移をplotしました。レーティングでは渡辺竜王がトップですが、このモデルではまだまだ羽生三冠が健在です。

f:id:StatModeling:20201114151301p:plain

次にここ10年のskillの伸びにおけるTop10、Worst10を算出しました。

nidknamekidleagueratingskill.2004skill.2013nobi.25pnobi.mediannobi.75p
157中村太地261C117460.671751.4374280.44340450.73329151.1001785
131渡辺明235A19652.276002.8598120.30366460.52810100.8013349
151広瀬章人255B117101.139001.6899890.25601420.49645100.7965535
142横山泰明246C216510.535751.0187370.26092350.47888950.7769740
85屋敷伸之189A17681.022001.5410460.24811120.47876270.7611302
156糸谷哲郎260C118021.252501.8066590.21940600.47338400.7855363
104行方尚史208A17941.144001.6679980.25050820.47052310.7428080
160豊島将之264B118251.714002.1414910.10207000.35152750.6550150
145村山慈明249B216931.054001.4031070.11426480.32117860.5757152
108矢倉規広212C215870.340300.6452250.09440600.29909550.5599487


nidknamekidleagueratingskill.2004skill.2013nobi.25pnobi.mediannobi.75p
53室岡克彦153Others1308-0.648700-1.0155555-0.6221045-0.3295232-0.09669114
114堀口一史座218B215110.7390500.3948955-0.6013588-0.3422950-0.12947450
81先崎学185B215631.0900000.6795169-0.6440560-0.3834030-0.17505725
121増田裕司225C214540.4556500.0320565-0.6821765-0.4126065-0.19333700
47南芳一147B214810.6766500.2575185-0.7004830-0.4200815-0.19731450
51西川慶二151C21302-0.554950-1.0409635-0.7204574-0.4455855-0.21005515
8桐山清澄93C113450.011745-0.5530300-0.8314145-0.5273410-0.28145507
3内藤國雄77C21286-0.420350-1.0943750-0.9698775-0.6194700-0.35344555
102川上猛206Others14000.430650-0.2249530-0.9717605-0.6285038-0.36916637
116近藤正和220C114720.7391000.0995915-0.9445024-0.6403400-0.38788652

個人的にはTop10は納得の顔ぶれです。近藤六段は最も下げていますが、これはゴキゲン中飛車がよく研究されて対策ができたということを数字が語っているように思います。個人的にはブームになる前の15年前から今でもまだゴキゲン中飛車を愛用していますので非常に応援しています。

最後に勝負ムラですが、思ったよりも差がありませんでした。将棋は運の要素が少なく実力が出やすい勝負と言えそうです。そんな中でも勝負ムラのあるTop6と安定なTop6は以下の通りでした。

nidknamekidleagueratingmura.25pmura.medianmura.75p
143島本亮247Others13931.0734871.4096621.686491
151広瀬章人255B117101.0384771.4009491.676528
119小林裕士223C116111.0241291.3983601.647609
135橋本崇載239B116761.0318341.3971021.648886
40脇謙二138C113671.0699561.3965431.681691
12滝誠一郎101Others12821.0320191.3951471.657814


nidknamekidleagueratingmura.25pmura.medianmura.75p
8桐山清澄93C113450.98967621.3587291.623525
124伊奈祐介228C214781.00015351.3562861.625069
81先崎学185B215630.99297851.3549981.629421
62日浦市郎164C115170.99680001.3545241.637671
127松尾歩231B117070.99826631.3533051.644934
57井上慶太157B215620.98515631.3512091.648227

安定キングは井上九段、松尾七段が続きます。ムラの大きいほうも広瀬七段、小林七段、橋本八段などなんとなく納得ができる顔ぶれです。

データさえあれば階層ベイズモデルでかなりお手軽に色々と推定できます。レーティングだけではわかりずらい勝負ムラなんかも推定できて楽しいです。まぁデータクレンジングは苦労しましたが。みなさんもいかがでしょうか。