たなかし@観る将×データ解析練習場

入院時の暇を利用して王位戦(木村王位×藤井棋聖)を観戦した2日間以来の観る将。データ解析の練習もかねて棋士の強さ解析を実施しながら、マニアックな角度からの観る将ライフを紹介。

ブラッドリーテリーモデル

ロジスティック解析でできない?

前回二項分布の話をして、ロジスティックモデルにこれまでの戦績をインプットすればできるんじゃね?

とか軽く考えていたのですが、できないですね、それ。

特定の2人の対局のデータだけ使ったら、たぶんできるんですよね。

例えば藤井竜王と豊島九段は昨年山ほど対局したんで、それらの戦績データを使えば真値に近い勝敗確率は求まるだろうし、

異なる条件(先手後手、持ち時間)が勝敗確率にどう影響を与えるか、まさにロジスティック解析でできるんですよね。

でもそれだと藤井竜王と豊島九段の間の勝敗確率しかわからない。異なる棋士の組み合わせのデータを使ってそれぞれの勝敗確率を求めるというアプローチは、

普通にロジスティック解析を使うアプローチではうまくできない、という結論になりました。

(できる方法はあるのかもしれませんが、自分にはその方法がわからないということです。まずデータの入れ方がわからない・・・)

 

Bradley-Terry(BT)モデル

というわけでプランBのブラッドリーテリー(Bradley-Terry)モデル(以下BTモデル)に移行したいと思います。

The Bradley–Terry model is a probability model that can predict the outcome of a paired comparison. Given a pair of individuals i and j drawn from some population, it estimates the probability that the pairwise comparison i > j turns out true, as

where pi is a positive real-valued score assigned to individual i. The comparison i > j can be read as "i is preferred to j", "i ranks higher than j", or "i beats j", depending on the application.

Bradley–Terry model - Wikipedia

日本語版のWikipediaの記事はないんですね。

テニスや野球のような1対1で勝負を争う競技の勝敗予測に使われるモデルで、当然将棋にも使えます。そういう点では、前に紹介したイロレーティングと同じです。

イロレーティングでは

イロレーティング - Wikipedia

を勝敗予測に用いていましたが、BTモデルの場合はもっとシンプルに上のような式を使います。上の式中のパラメータを

のように指数を使って表すと、ロジットを取れば

となるので、回帰分析をする上で扱いやすいです。というか、ここまでは私がロジスティック回帰でやろうとしていたことと、たぶん同じです。

 

BTモデルのRパッケージがある

勝敗予測でググればBTモデルはすぐ出てくるので存在は知っていたし、何ならRパッケージもあって気軽に解析ができることもわかっていました。

でもすぐに使わなかったのは、回帰分析の理論的背景がよくわからなかったからです。よくわからないものでも統計ソフトを使ったらどうにかなってしまうのだけれども、そんな簡単にそこに流れたくなくて・・・。

で、最初は理論的な背景がある程度わかっている二項分布-ロジスティック回帰アプローチから入ったんですが・・・できませんでした。ただ結局、

ロジスティック回帰を使ってやろうとしていたことはBTモデルを使ってやることと同じこと

ということはわかったんで、これでBTモデルの理論的背景はなんとなくわかったことにしましょう(笑)

 

Rパッケージ:BradleyTerry2

というわけでRパッケージの紹介。

www.rdocumentation.org

文字通りRでBTモデル解析を実施するためのパッケージなんで、BTモデル解析はきっと実施できる。でも何をインプットにして何がアウトプットになるのか、これだけではわからない。

このRパッケージを紹介してくれているブログがありますね。

dev.classmethod.jp

BradleyTerry2パッケージにはあらかじめ1987年の東部アメリカにおける野球チームの試合結果が用意されており、これは以下のようにbaseball変数に束縛できます。

data("baseball", package = "BradleyTerry2")

変数の中身を上から見てみましょう。

head(baseball)

出力結果です

  home.team away.team home.wins away.wins
1 Milwaukee   Detroit         4         3
2 Milwaukee   Toronto         4         2
3 Milwaukee  New York         4         3
4 Milwaukee    Boston         6         1
5 Milwaukee Cleveland         4         2
6 Milwaukee Baltimore         6         0

各カラムの表す意味はそのままの意味で、左から順にホームチーム、アウェーチーム、ホームチーム勝数、アウェーチーム勝数です

BTモデルで使うbaseballのデータはこんな形しているんですか。野球のように比較的少ないチームでリーグを構成して、同じチームと何回も当たるリーグ戦形式の場合には、こういうデータのまとめ方でも理解できますが、将棋だとこういう風にまとまったデータはないので、そのままでは使えないですね。

 

他に例はないかなと調べてみると、icehockeyというデータがありますね。

f:id:sdentyu:20220320202241p:plain

これは1試合ごとにレコードが作られているデータセットなので、この形式なら将棋でも作れそうです。result欄が勝敗の結果ですね。(result=1でvisitor勝利。result=0でvisitor敗北。ちなみにresult=0.5で引き分けという結果も入っている。)

 

BTmって関数でBTモデル解析ができるみたいです。

player1とplayer2で対戦チームをインプットして、勝敗の結果はoutcomeでインプットするんですね。player1の方が勝利した場合のにoutcomeが1になるようにデータを作っておけばよい、ということかと思われます。

各チームの係数(coefficient)、つまり強さスケールがアウトプットとして出てきます。

f:id:sdentyu:20220320203138p:plain

強さスケールの推定値と推定精度(SE)を表示するにはBTabilitiesという関数を使うみたいです。Alaska anchorageがability(強さスケール)が0になっているのは、このチームを基準とした相対値として各チームの強さスケールが計算されているからですね。

f:id:sdentyu:20220320204746p:plain

例えばこの結果から、Alaska AnchorageとAir forceの勝敗確率を計算してみると、勝敗確率は

で計算されるので、e^(-1.4135)はだいたい0.25なので、Alaska anchorageがAir forceに勝つ確率は1/1.25で約80%と計算されます。その逆は0.25/1.25なので約20%ですね。

 

 

Rパッケージを使ったBTモデル解析は使えそうですね。これを適用して各棋士の強さスケールを算出し、勝敗確率を算出してみようと思います。