u++の備忘録

【可視化編】機械学習を用いた大相撲千秋楽の勝敗予想

はじめに

前回は、「Sports Analyst Meetup #4」でのLTに向けて、大相撲のデータを収録している「Sumo Reference」を紹介しました。

upura.hatenablog.com

本記事では、「Sumo Reference」から収集したデータを用いて、特徴量の作成に向けた簡単な可視化を実施します。

データの収集

データは「Sumo Reference」から取得し、次の形式に加工しました。

df.head(3)

f:id:upura:20190803220932p:plain

各行に、特定の場所の特定の力士の情報を格納しています。

「day_1」〜「day15」は、1〜15日目の勝敗です。NaNは、欠場を意味します。千秋楽の勝敗予想に当たって必要になる情報として「千秋楽の対戦相手」を「final_opponent」として取得しました。「datetime」は「yyyymm」形式で開催場所を示しています。

データは2000年1月場所から、最新の2019年7月場所までを取得しました。

len(df)
4340

仮説

いきなり思考停止で特徴量を作って機械学習モデルにデータを突っ込んでも良いですが、まずはこの分析を始めるに当たっての仮説に立ち戻ります。

千秋楽の勝敗は、その場所の調子(14日目までの結果)までに左右される部分があるのでは?

具体例を考えると、次の通りです。

  1. 7勝7敗で千秋楽を迎えた力士は、何としてでも勝ち越しをしたい(「ここ一番」の本気を出す)
  2. 13勝1敗のように大勝している場合は、勝率が高くなりそう
  3. 千秋楽を前にN連勝している場合は、その流れで千秋楽も勝利しそう

今回の分析ではこのような仮説に基づき、1〜14日目の勝敗データから、千秋楽(15日目)の勝敗を予測するモデルの構築を目指します。

可視化

ここでは、上述した仮説1, 2に対応する特徴量「14日目までの勝数」を考えます。勝数が決まれば敗数は14からの差分として自明に定まるので、カテゴリとしては「勝数」と「勝敗」に違いはありません。

まずは「14日目までの勝数」の分布を見てみます。

ここでの可視化に当たって、1日でも欠場のある力士は削除しているので、0勝はかなり少なくなっています。

f:id:upura:20190729121703p:plain

次いで「14日目までの勝数」別の「千秋楽の勝率」です。

f:id:upura:20190729121736p:plain

個人的に着目したのは次の2点です。それぞれ、先に述べた仮説の1, 2に対応します。

  • 7勝7敗の場合の勝率が(6勝8敗や8勝6敗の場合に比べて)高い
  • 14日目までに12〜14勝している場合は勝率が0.5よりも高い

※ 前者について、こういう数字が出ると「八百長」のような話が出がちですが、今回は話題として取り上げません。ここに因果があるかを議論するには扱っている情報量が少なすぎるためです。

可視化を通じて、事前に持っていた仮説がある程度正しそうだと分かりました。つまり、今回作成した「14日目の勝数」という特徴量は、千秋楽の勝敗を予想するモデルに寄与する可能性がありそうです。

おわりに

本記事では「Sports Analyst Meetup #4」でのLTに向けて、「Sumo Reference」から収集したデータを用いて特徴量作成のための簡単な可視化を実施しました。次回は、ベンチマークとなる機械学習モデルを構築する予定です。