ロジスティック回帰で最強の戦国武将を推定する

戦国時代の戦歴データをロジスティック回帰でモデリングすることで、武将の強さをレーティングしました。

# 戦歴データの取得
戦国時代の戦歴データは、Wikipedia日本語版の[日本の戦国時代の戦い](https://ja.wikipedia.org/wiki/Category:%E6%97%A5%E6%9C%AC%E3%81%AE%E6%88%A6%E5%9B%BD%E6%99%82%E4%BB%A3%E3%81%AE%E6%88%A6%E3%81%84)というカテゴリに属する記事を対象にして、[Battlebox](https://ja.wikipedia.org/wiki/Template:Battlebox)というテンプレートの内容を取得しました。

Battleboxが使われた記事では、合戦の情報が所定の形式で記載されているため、比較的マシン・リーダブルでした。


#### Battleboxの例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215805/b63a4754-ef5c-cf4a-66e0-7c2d57e400a0.png "Battleboxの例")
(引用元: https://ja.wikipedia.org/wiki/%E6%A1%B6%E7%8B%AD%E9%96%93%E3%81%AE%E6%88%A6%E3%81%84)



実際にモデリングに利用したのは、(1)「指導者・指揮官」の欄に記載された双方の交戦勢力の武将 と (2)勝ったはどちらかという結果の情報です。後者に関しては、変則的な表記方法をされている場合があるため、私が「結果」の欄を読んで判定しました。判定結果は、(a)左側に記載された勢力の勝利、(b)右側に記載された勢力の勝利、(c)その他の3種類のいずれかとしました。その他は、引き分けと明示されているケースや明確に勝者が決まらなかったとみられるケースです。

交戦勢力の中で誰が「指導者・指揮官」に相当するのか、勝利の定義などには明確な基準がないものと思われますし、それ以前に、記事によって執筆者が異なるwikipediaの場合には基準の統一性の担保が難しいという問題がありますが、ここでは目を瞑るものとします。また、Battleboxが使用されていないなど機械的な処理に手間がかかる記事や正常に処理できない記事は、簡単のためにモデリングの対象外としました。

最終的には、合戦194件とそこに関与した武将607人からなるデータセットが構築できました。

# ロジスティック回帰によるモデリング
チェス・プレイヤーであれ武将であれ、何かの勝負事に関わる人の強さを定量化する素朴な方法としては、勝率を計算する方法が思いつきますが、これには課題があります。例えば、同じ勝率の人が複数いたとしても、その勝率を得るに至った対戦相手の強さが違えば、強さは同じとは言えないということがあるでしょう。別の言い方をすれば、もし総当り方式で全員を対戦させることができれば、比較可能な勝率が計算可能ですが、現実にはゲームであってもそのような膨大な対戦を行うことは難しいですし、まして合戦はそう都合よく起こるものではありません。

チェスにおいては、この課題を解決する[イロ・レーティング (Elo rating)](https://ja.wikipedia.org/wiki/%E3%82%A4%E3%83%AD%E3%83%AC%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0)と呼ばれる手法が開発・運用されており、対戦相手の強さに応じて更新されるプレイヤーの強さ (レーティング) が計算されているそうです。

実はこのイロ・レーティングの計算手順は、ロジスティック回帰によって勝敗の予測モデルを構築することとほぼ同等であることが知られています[^1] [^2]。 まずは、ロジスティック回帰の文脈でイロ・レーティングを計算することを考えてみましょう。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215805/bdec0167-2c0d-32fc-9f7e-411071f8f886.png)


上の図では、便宜上、合戦の当事者を味方と敵と区別し、味方側で参戦した武将には1、敵側で参戦した武将には-1をセットしています。目的変数は味方側が勝利した場合は1、敗北した場合は0です。

ロジスティック回帰のモデルには、説明変数の列の数だけ回帰係数があり、この場合は各武将に対応する回帰係数があることになります。このデータセットに対してロジスティック回帰のモデルをフィットさせると、回帰係数はどうなるでしょうか? 2戦とも勝利している織田信長の回帰係数が他の武将のものより大きくなることが想像できると思います。つまり、戦歴から考えて強い武将ほど回帰係数が大きくなるように調整されるので、回帰係数が強さのレーティングになるということです。

ところで、オリジナルのイロ・レーティングは専ら1対1の対戦が行われるチェスのために開発されたものでしたが、合戦は多対多の武将の間で行われることも想定する必要があります。そこで説明変数を以下のように構築することにしました。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215805/9533a12e-fa53-b778-1e1e-8aebfc484474.png)


単純に複数の武将が参戦している場合には複数の武将に1または-1をセットすることを考えましたが、それだと参戦している武将が多い方が有利ということになります。もし武将たちが肉弾戦で戦うのであれば人数が多い方が有利でしょうが、実際には指揮官として参戦していることを考えると、必ずしもそうはならないように思われます。そこで、上の図のように敵味方それぞれについて要素の合計の絶対値が1になるように正規化しました。[^3]

# レーティングの結果
|            |   順位 |   レーティング |   勝利 |   敗北 |   引き分け |   勝率 |
|:-----------|-------:|---------------:|-------:|-------:|-----------:|-------:|
| 武田信玄   |      1 |          1.334 |     10 |      1 |          3 |  0.714 |
| 小早川隆景 |      2 |          0.927 |     10 |      2 |          1 |  0.769 |
| 織田信長   |      3 |          0.856 |     14 |      5 |          5 |  0.583 |
| 山中幸盛   |      4 |          0.833 |      7 |      1 |          0 |  0.875 |
| 北条氏綱   |      5 |          0.827 |      5 |      0 |          0 |  1     |
| 三好長慶   |      6 |          0.82  |      5 |      0 |          0 |  1     |
| 宇都宮成綱 |      7 |          0.818 |      4 |      0 |          0 |  1     |
| 豊臣秀吉   |      8 |          0.813 |      5 |      2 |          2 |  0.556 |
| 北条氏康   |      9 |          0.676 |      6 |      1 |          0 |  0.857 |
| 徳川家康   |     10 |          0.669 |      6 |      3 |          3 |  0.5   |
|  ...   |   ...   |    ...    |    ...   |    ...   |     ...      |   ...  |
| 田原親賢            |    598 |         -0.403 |      0 |      2 |          0 |  0     |
| 諏訪頼重_(戦国時代) |    599 |         -0.409 |      0 |      2 |          0 |  0     |
| 大内義隆            |    600 |         -0.427 |      0 |      3 |          0 |  0     |
| 上杉朝興            |    601 |         -0.44  |      0 |      2 |          0 |  0     |
| 三好之長            |    602 |         -0.444 |      1 |      2 |          0 |  0.333 |
| 六角義賢            |    603 |         -0.482 |      1 |      2 |          0 |  0.333 |
| 杉原盛重            |    604 |         -0.515 |      0 |      2 |          0 |  0     |
| 油川信恵            |    605 |         -0.521 |      0 |      2 |          0 |  0     |
| 武田高信            |    606 |         -0.532 |      0 |      2 |          0 |  0     |
| 足利義輝            |    607 |         -0.646 |      0 |      3 |          0 |  0     |


俗に戦国最強と呼ばれる[武田信玄](https://ja.wikipedia.org/wiki/%E6%AD%A6%E7%94%B0%E4%BF%A1%E7%8E%84)が1位となりました。ある意味納得の結果ですし、レーティング値が飛び抜けた値になっているのも目を引きます。興味深いのは勝率の観点では1位とはなっていない点です。手法の特性上、参戦した合戦の数や対戦相手の強さも考慮されたランキングになっているものと推察されます。
2位以降には比較的マイナーな武将も登場しています。[小早川隆景](https://ja.wikipedia.org/wiki/%E5%B0%8F%E6%97%A9%E5%B7%9D%E9%9A%86%E6%99%AF)は毛利元就の三男で豊臣政権下の五大老にも数えられる大名です。[山中幸盛](https://ja.wikipedia.org/wiki/%E5%B1%B1%E4%B8%AD%E5%B9%B8%E7%9B%9B)は山中鹿介の名で知られ、主家尼子家再興のために尽力した人物です。

一方、最下位は、室町幕府末期の将軍である[足利義輝](https://ja.wikipedia.org/wiki/%E8%B6%B3%E5%88%A9%E7%BE%A9%E8%BC%9D)でした。データ上は合戦には一度も勝てず、永禄の変で三好三人衆らに殺害されています。もし最期に戦って負けた相手が織田信長のようなレーティングの高い武将であれば、ここまで低いレーティングにはならなかったかもしれません。

# 結果の妥当性
武将の強さという量は、直接観測できるものではないので、今回のレーティング結果の妥当性を検証する方法は必ずしも明らかではありません。今回は、参考までに、ロジスティック回帰のモデルがどの程度、正確に合戦の勝敗を予測できるのか評価してみました。これは参戦武将の強さがどの程度、合戦の勝敗を左右するのかを評価したと言いかえることができると思います。

結果は、クロスバリデーションでのROC-AUCが0.70+/-0.07というものでした。参戦した武将と勝敗の間に何の関係もないのであれば0.5になるはずなので、一応意味のあるモデルができていると言えそうです。


# 課題
まず、1位の武田信玄の戦績を例にとっても、一般には49勝3敗20分とされることが多いように思いますが[^4]、ここで使用したデータセットでは10勝1敗3分となっており、データのカバー率が不十分であることが示唆されます。

また、今回は日本の戦国時代に限定してレーティングを行いましたが、すべての武将について比較可能なレーティングとなっているのかは疑問があります。例えば、東北地方と九州の武将が直接対戦することは考えにくく、両者の強弱を推定することは困難です。理屈上は、両者の間に直接の対戦がなくても、いずれもが豊臣秀吉のような全国に勢力を伸ばした武将と対戦していれば、その結果からある程度の推定の推定は可能になりますが、そういった例はあったとしても稀と思われます。

同様に、活動した時代に開きがある武将間での比較可能性についても不確かなところがあると思います。今回のデータセットでは、機械的に年代が読み取れたものだけでも、1455年の享徳の乱から1590年の小田原征伐まで100年以上の開きがあり、初期の武将と末期の武将を比較するのは困難です。

# データセットとコード
データセット (合戦データとレーティング結果):
https://www.kaggle.com/datasets/masahiromochizuki/sengoku-battle-dataset

レーティングのnotebook:
https://www.kaggle.com/code/masahiromochizuki/rating-of-sengoku-commanders




[^1]: https://stmorse.github.io/journal/Elo.html
[^2]: https://tosaka2.hatenablog.com/entry/2022/01/06/225401
[^3]: この辺りは議論のあるところだと思います。より厳密にやるのであれば、兵数に比例するように値を調整するなど考えられますが、必ずしも(信頼の置ける)兵数の情報が手に入るわけではないので、今回はこれで妥協しました。
[^4]: http://optimusprime.web.fc2.com/shingen/shin_kassen.html