初心者が大相撲力士の強さをPythonとRで分析してみた

![4274125792_272a84c644_o.jpg](https://qiita-image-store.s3.amazonaws.com/0/224315/f0387c22-15cf-a3b2-3af4-1d96abfed7d1.jpeg)



[photo by davidgsteadman](https://www.flickr.com/photos/davidgsteadman/4274125792/in/photolist-7vG1G1-ypJWTh-yE25bq-xKsomi-ypP5SB-xKizvS-yGkam6-dspQ4K-ypPjjB-ypPjHx-xKs8LX-yE1LVU-ypP57t-ypJsbC-yFmWdm-ypHPff-yE2mHU-HLTht-49WFhm-4xBCPV-esdx8s-yLyRf-M5Ycd-7u1VT8-mmUYke-2WdVyB-nLVpPw-4Jyyd-4Jyyz-qA5UX7-2LD76-qSEf5a-4JyxZ-4JyzD-4Jyzd-2WdVqX-4Jyz7-39LEXU-4Jyyi-QgUP-7yi7Bb-bazwKH-hVX93-pVE8RC-czSc8o-bKZbG8-yLz7t-3gG7WD-pVE8UU-7iTLDs)



# はじめに

2018年7月場所、御嶽海が初優勝を果たしました。
関脇の優勝は、2015年5月場所の照ノ富士以来３年ぶりです。
しかし、3横綱と新大関の栃ノ心が休場、残る大関の豪栄道が10勝、高安が9勝と、上位陣大崩れな中での優勝でした。

御嶽海は本当に強いんでしょうか？

今回、2001〜2018年の全取組結果をPythonでWebから取得し、RのBradleyTerry2というパッケージで各力士の強さを判定し、Pandasによってそれを可視化しました。




# データの取得
[日本相撲協会の公式サイト](http://www.sumo.or.jp/ResultData/torikumi/1/15/)から、[この記事](https://qiita.com/Azunyan1111/items/b161b998790b1db2ff7a)を参考に、CSSセレクターを使用してサクっとデータを取得しようとしましたが、スムーズにいかず苦しみました。
[Yahooのスポーツナビというサイト](https://sports.yahoo.co.jp/sumo/torikumi/stats/)が、表形式で1日毎の取組結果を綺麗にまとめてくれていたので、[この記事](https://qiita.com/kitsuyui/items/4906bb457af4d0e2d0a5)を参考に、padasのread_htmlメソッドを使用したところ、3行でサクッとデータ取得出来ました。

```python

import pandas as pd
url = "https://sports.yahoo.co.jp/sumo/torikumi/stats/?bashoId=201807&day=1"
fetched_dataframes = pd.read_html(url)
```



# 強さ判定
力士の強さを判定するには色んな難しさがあります。
まず、幕内力士42人に対して1場所で各力士15回の取組しかありません。
全員と対戦するわけではないため、上位陣との取組が多い場所とそうでない場所では勝星に差が出てきます。
また、怪我等による休場があるため、1場所の対戦数が15回でない力士も出てきます。
そのため、単純に勝星の数が強さを表しているとは言えません。

そこで、今回はBradley-Terryモデルによって強さを判定してみます。
やっていることは[この記事](https://qiita.com/gg_hatano/items/20fece37c061bde6e3c1)と同じで、相撲以外にも[サッカー](http://www.st.nanzan-u.ac.jp/info/nas/academia/vol_002pdf/02-001-007.pdf)や[テニス](https://www.sciencedirect.com/science/article/pii/S0169207010001019)等で適用例があるようです。
Bradley-Terryモデルでは、弱い相手に勝つことよりも強い相手に勝つことが大きく評価されます。

Pythonで実装できればよかったですが、Rに[BradleyTerry2](https://cran.r-project.org/package=BradleyTerry2)という便利なパッケージがあったので、それを使ってみました。

```R

library("BradleyTerry2")

infile <- paste("input/", bashoId, ".csv", sep="")
data <- read.csv(infile)

bt_model <- BTm(
  outcome = cbind(e_win, w_win),
  player1 = e_rikishi, player2 = w_rikishi,
  data = data)
BTabilities(bt_model)

outfile <- paste("output/", bashoId, "_bt.csv", sep="")
write.csv(BTabilities(bt_model), outfile, quote=FALSE, row.names=TRUE)
```




# データの分析
## 御嶽海を中心に
Pythonのデータ分析ライブラリであるPandasでデータ分析してみました。
2018年7月場所の結果は以下の通りです。
n_uwin、n_uloseは不戦勝と不戦敗の数を表してます。
取組数の極端に少ない力士は、強さがおかしな値になるため、取組が10回以下の力士は除いてます。

<div>
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>bt_ability</th>
      <th>bt_s.e.</th>
      <th>n_win</th>
      <th>n_lose</th>
      <th>n_uwin</th>
      <th>n_ulose</th>
      <th>n_kyujo</th>
      <th>rank</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>御嶽海</th>
      <td>2.767772</td>
      <td>0.720529</td>
      <td>13</td>
      <td>2</td>
      <td>0</td>
      <td>0</td>
      <td>0</td>
      <td>1</td>
    </tr>
    <tr>
      <th>豊山</th>
      <td>2.097115</td>
      <td>0.716932</td>
      <td>12</td>
      <td>3</td>
      <td>0</td>
      <td>0</td>
      <td>0</td>
      <td>2</td>
    </tr>
    <tr>
      <th>朝乃山</th>
      <td>1.497341</td>
      <td>0.681284</td>
      <td>11</td>
      <td>4</td>
      <td>0</td>
      <td>0</td>
      <td>0</td>
      <td>3</td>
    </tr>
    <tr>
      <th>貴景勝</th>
      <td>1.489691</td>
      <td>0.614608</td>
      <td>10</td>
      <td>5</td>
      <td>0</td>
      <td>0</td>
      <td>0</td>
      <td>4</td>
    </tr>
    <tr>
      <th>栃煌山</th>
      <td>1.470620</td>
      <td>0.683031</td>
      <td>10</td>
      <td>5</td>
      <td>0</td>
      <td>0</td>
      <td>0</td>
      <td>5</td>
    </tr>
    <tr>
      <th>北勝富士</th>
      <td>1.443543</td>
      <td>0.711216</td>
      <td>11</td>
      <td>4</td>
      <td>0</td>
      <td>0</td>
      <td>0</td>
      <td>6</td>
    </tr>
    <tr>
      <th>豪栄道</th>
      <td>1.388622</td>
      <td>0.607309</td>
      <td>10</td>
      <td>5</td>
      <td>0</td>
      <td>0</td>
      <td>0</td>
      <td>7</td>
    </tr>
    <tr>
      <th>高安</th>
      <td>1.256511</td>
      <td>0.597866</td>
      <td>9</td>
      <td>6</td>
      <td>0</td>
      <td>0</td>
      <td>0</td>
      <td>8</td>
    </tr>
    <tr>
      <th>魁聖</th>
      <td>1.196074</td>
      <td>0.600312</td>
      <td>9</td>
      <td>6</td>
      <td>0</td>
      <td>0</td>
      <td>0</td>
      <td>9</td>
    </tr>
    <tr>
      <th>玉鷲</th>
      <td>1.076712</td>
      <td>0.629103</td>
      <td>8</td>
      <td>7</td>
      <td>0</td>
      <td>0</td>
      <td>0</td>
      <td>10</td>
    </tr>
    <tr>
      <th>阿武咲</th>
      <td>0.923356</td>
      <td>0.696471</td>
      <td>10</td>
      <td>5</td>
      <td>0</td>
      <td>0</td>
      <td>0</td>
      <td>11</td>
    </tr>
    <tr>
      <th>勢</th>
      <td>0.891801</td>
      <td>0.608127</td>
      <td>8</td>
      <td>7</td>
      <td>1</td>
      <td>0</td>
      <td>0</td>
      <td>12</td>
    </tr>
    <tr>
      <th>千代大龍</th>
      <td>0.866630</td>
      <td>0.647969</td>
      <td>9</td>
      <td>6</td>
      <td>0</td>
      <td>0</td>
      <td>0</td>
      <td>13</td>
    </tr>
    <tr>
      <th>妙義龍</th>
      <td>0.751707</td>
      <td>0.663333</td>
      <td>9</td>
      <td>6</td>
      <td>0</td>
      <td>0</td>
      <td>0</td>
      <td>14</td>
    </tr>
    <tr>
      <th>遠藤</th>
      <td>0.728060</td>
      <td>0.626082</td>
      <td>8</td>
      <td>7</td>
      <td>0</td>
      <td>0</td>
      <td>0</td>
      <td>15</td>
    </tr>
    <tr>
      <th>逸ノ城</th>
      <td>0.640806</td>
      <td>0.585467</td>
      <td>8</td>
      <td>7</td>
      <td>0</td>
      <td>0</td>
      <td>0</td>
      <td>16</td>
    </tr>
    <tr>
      <th>千代の国</th>
      <td>0.426281</td>
      <td>0.646826</td>
      <td>6</td>
      <td>7</td>
      <td>2</td>
      <td>1</td>
      <td>2</td>
      <td>17</td>
    </tr>
    <tr>
      <th>佐田の海</th>
      <td>0.364073</td>
      <td>0.688471</td>
      <td>8</td>
      <td>7</td>
      <td>0</td>
      <td>0</td>
      <td>0</td>
      <td>18</td>
    </tr>
    <tr>
      <th>碧山</th>
      <td>0.312468</td>
      <td>0.653265</td>
      <td>8</td>
      <td>7</td>
      <td>0</td>
      <td>0</td>
      <td>0</td>
      <td>19</td>
    </tr>
    <tr>
      <th>琴奨菊</th>
      <td>0.260233</td>
      <td>0.739734</td>
      <td>3</td>
      <td>8</td>
      <td>0</td>
      <td>1</td>
      <td>4</td>
      <td>20</td>
    </tr>
    <tr>
      <th>隠岐の海</th>
      <td>0.203476</td>
      <td>0.689940</td>
      <td>8</td>
      <td>7</td>
      <td>1</td>
      <td>0</td>
      <td>0</td>
      <td>21</td>
    </tr>
    <tr>
      <th>竜電</th>
      <td>0.125162</td>
      <td>0.693777</td>
      <td>8</td>
      <td>7</td>
      <td>0</td>
      <td>0</td>
      <td>0</td>
      <td>22</td>
    </tr>
    <tr>
      <th>阿炎</th>
      <td>0.000000</td>
      <td>0.000000</td>
      <td>6</td>
      <td>9</td>
      <td>0</td>
      <td>0</td>
      <td>0</td>
      <td>23</td>
    </tr>
    <tr>
      <th>正代</th>
      <td>-0.010341</td>
      <td>0.626835</td>
      <td>6</td>
      <td>9</td>
      <td>2</td>
      <td>0</td>
      <td>0</td>
      <td>24</td>
    </tr>
    <tr>
      <th>輝</th>
      <td>-0.053605</td>
      <td>0.601713</td>
      <td>6</td>
      <td>9</td>
      <td>0</td>
      <td>0</td>
      <td>0</td>
      <td>25</td>
    </tr>
    <tr>
      <th>宝富士</th>
      <td>-0.070450</td>
      <td>0.656463</td>
      <td>7</td>
      <td>8</td>
      <td>0</td>
      <td>0</td>
      <td>0</td>
      <td>26</td>
    </tr>
    <tr>
      <th>石浦</th>
      <td>-0.078456</td>
      <td>0.698101</td>
      <td>7</td>
      <td>8</td>
      <td>0</td>
      <td>0</td>
      <td>0</td>
      <td>27</td>
    </tr>
    <tr>
      <th>錦木</th>
      <td>-0.356064</td>
      <td>0.681586</td>
      <td>6</td>
      <td>9</td>
      <td>0</td>
      <td>0</td>
      <td>0</td>
      <td>28</td>
    </tr>
    <tr>
      <th>大栄翔</th>
      <td>-0.650818</td>
      <td>0.682246</td>
      <td>6</td>
      <td>9</td>
      <td>0</td>
      <td>0</td>
      <td>0</td>
      <td>29</td>
    </tr>
    <tr>
      <th>明生</th>
      <td>-0.661536</td>
      <td>0.720544</td>
      <td>6</td>
      <td>9</td>
      <td>0</td>
      <td>0</td>
      <td>0</td>
      <td>30</td>
    </tr>
    <tr>
      <th>旭大星</th>
      <td>-0.684246</td>
      <td>0.680767</td>
      <td>6</td>
      <td>9</td>
      <td>0</td>
      <td>0</td>
      <td>0</td>
      <td>31</td>
    </tr>
    <tr>
      <th>荒鷲</th>
      <td>-0.702632</td>
      <td>0.699892</td>
      <td>5</td>
      <td>10</td>
      <td>0</td>
      <td>0</td>
      <td>0</td>
      <td>32</td>
    </tr>
    <tr>
      <th>千代丸</th>
      <td>-0.765400</td>
      <td>0.699635</td>
      <td>5</td>
      <td>10</td>
      <td>0</td>
      <td>0</td>
      <td>0</td>
      <td>33</td>
    </tr>
    <tr>
      <th>大翔丸</th>
      <td>-0.782858</td>
      <td>0.662296</td>
      <td>5</td>
      <td>10</td>
      <td>0</td>
      <td>0</td>
      <td>0</td>
      <td>34</td>
    </tr>
    <tr>
      <th>松鳳山</th>
      <td>-1.026813</td>
      <td>0.668050</td>
      <td>3</td>
      <td>12</td>
      <td>0</td>
      <td>0</td>
      <td>0</td>
      <td>35</td>
    </tr>
    <tr>
      <th>千代翔馬</th>
      <td>-1.280931</td>
      <td>0.692523</td>
      <td>4</td>
      <td>11</td>
      <td>0</td>
      <td>1</td>
      <td>0</td>
      <td>36</td>
    </tr>
    <tr>
      <th>琴恵光</th>
      <td>-1.384529</td>
      <td>0.735303</td>
      <td>3</td>
      <td>12</td>
      <td>0</td>
      <td>0</td>
      <td>0</td>
      <td>37</td>
    </tr>
    <tr>
      <th>嘉風</th>
      <td>-2.174686</td>
      <td>0.734169</td>
      <td>2</td>
      <td>13</td>
      <td>0</td>
      <td>0</td>
      <td>0</td>
      <td>38</td>
    </tr>
  </tbody>
</table>
</div>

上位陣と対戦して8勝の玉鷲が、下位陣と対戦して10勝の阿武咲よりも、強いと評価されています。
勝星の数だけで強さを判定するよりも、適切に判定されているように思えます。

これだけでは、休場した横綱や大関との比較が出来ません。
2018年7月場所で三役以上の力士について、2018年1,3,5,7月場所のBradley-Terryモデルによる強さランクを、折れ線グラフで見てみます。

![2018_rank_201807sanyaku.png](https://qiita-image-store.s3.amazonaws.com/0/224315/52d4518b-5b20-9e4b-bcb3-3dc7ba1c813c.png)
[](![2018_rank_box_heissei.png](https://qiita-image-store.s3.amazonaws.com/0/224315/f699c01b-8439-f2e2-2ed8-ead0292077b7.png))

調子を落とす力士、休場する力士が多い中、御嶽海がランクを上げてきているのがわかります。

ただ、御嶽海は2018年7月場所が17回目の場所であり、まだまだ強くなる可能性を秘めています。
新入幕から17場所目までの成績を比べてみます。

![2001-2018_rank_201807sanyaku17.png](https://qiita-image-store.s3.amazonaws.com/0/224315/2f3ad89e-2226-6893-7cb8-aee35163815d.png)

わかりにくいので箱ひげ図を見てみます。

![2001-2018_rank_box_201807sanyaku17.png](https://qiita-image-store.s3.amazonaws.com/0/224315/06660da8-011d-ca13-8e18-fbaa10d485f4.png)

御嶽海は白鵬に次ぐ勢いで、駆け上がっているに見えます。
というか、白鵬が圧倒的ですね。



## 白鵬を中心に
前の図で白鵬が圧倒的だったので、2001年以降の横綱で比べてみます。
（幕内在位期間　朝青龍：2001年1月〜2010年1月、白鵬：2004年5月〜、日馬富士：2004年11月〜2017年11月、鶴竜：2006年11月〜、稀勢の里：2004年11月〜）

![2001-2018_rank_heisei.png](https://qiita-image-store.s3.amazonaws.com/0/224315/cd6a9e2b-f80b-7f9c-14a3-fc0368c5893e.png)
![2001-2018_rank_box_heissei.png](https://qiita-image-store.s3.amazonaws.com/0/224315/fa83c7dc-6410-f10e-fbd2-c01fa4dd82d9.png)

[1958年に年6場所制が始まって以降、最速で横綱にまで昇進したドルジさん](https://qiita.com/kei51e/items/dc57ba708ececd5af565)の強さが改めてわかります。
しかし、そのドルジさんが全盛期の中、新入幕から13場所で初優勝し、それから現在に至るまで安定してランク1位付近に居続ける白鵬の強さがやはり際立っています。

勝星も見てみます。

![2001-2018_wins_box_heissei.png](https://qiita-image-store.s3.amazonaws.com/0/224315/0c430347-9eb8-0d76-53e4-5b6e11ad5c4f.png)

白鵬は新入幕以降に11取組以上した場所で、負け越したことないんですね。




# まとめ
御嶽海は強い。いずれ横綱になってもおかしくない。
しかし、朝青龍、白鵬に続く圧倒的な横綱になるのは難しそう。

コードは全て[github](https://github.com/a0082273/sumo_BradleyTerry)にあります。プログラミング、相撲、ともに初心者なのでご教授いただけたらうれしいです。