プロ野球が開幕し, メジャーリーグの開幕もほぼ決まり野球好きの私達に日常が徐々に戻ってきて喜びを感じている今日このごろ.
私と言えばプロ野球をガッツリ楽しみながら野球データサイエンスに勤しんでいますがこんな感じで新作ができたのでちょこっとお披露目したいと思います.
要約すると,
データサイエンスと機械学習で量産型未来のダルビッシュ有さんを探してみよう!*1
という話で, お遊び程度にやったらいい感じになったので紹介したいと思います.
なお, このタスク・分析はSean Lahman DATABASEおよびretrosheetというメジャーリーグの公開されている,誰でも使えるオープンな成績・統計データを用いています(トラッキングデータ等は一切使っていません).
TL;DR(要約)
- 「未来のダルビッシュ有っぽい投手を探す」というタスクは, 近似最近傍探索(ANN)でいい感じに解決できる.
- Spotifyご謹製のAnnoyを使って爆速開発・検証できた, 決まり手は特徴量の選び方.
- 奪三振マシーンかつ, ちょっと本塁打打たれるぐらいの先発投手が未来のダルビッシュ有になる率が高い(こなみ)
スタメン
数字で知るダルビッシュ有さん
データサイエンスの基本は「対象となるテーマについてのドメイン知識を得た」上でタスクを決めてやりきることです.
私はメジャーリーグ大好きマン(かつダルビッシュ有さんがかつて在籍していた北海道日本ハムファイターズの大ファン)でダルビッシュ有の成績はちょっと見たら色々語れるくらいには野球好きですが, 冷静になるためにちゃんと数字をふりかえってみます.*2
という訳で, 以前やった「投手の特徴をセイバーメトリクスで知る」アプローチでちょっと見てみました.
対象としたデータは,
- メジャーリーグ移籍以降の成績. ちなみに29歳(2015年)はトミージョン手術で全休のため対象外.*3
- 成績全体のクオリティを把握するために防御率・WHIP・FIPの推移
- 奪三振・与四球・被本塁打の傾向を知るため, SO/9, BB/9, HR/9の推移
を見てみました.*4
防御率がだいたいFIPと一致する裏表がない投手だなと改めてわかります.
一昨年の不調を乗り越えての昨年の成績は素敵すぎます.
まず思うのが奪三振マシーンだなっていうこと. これは野球ファンにとって改めて言うまでもないと思います. すごいの一言.
そして三振を結構奪ってる割には四球率(BB/9)が安定している(不調だった32歳, 2018年を除き綺麗に下がってる)のもほほーってなります.
一方, 若干本塁打を打たれやすい投手だというのがHR/9で理解できます.
未来のダルビッシュ有を探す
(投手としての)ダルビッシュ有さんを構成するのは,
- 三振がたくさん奪える
- 四球を連発しない, むしろ四球率が落ち着いている
- 若干本塁打を打たれる
が数字で理解できます.
また, 大事なコンテキストとして,
- 先発投手である(ダルさんは中継ぎ・抑えではない)
- 右投げである(ダルさんは右投げである*5)
も忘れちゃいけません. どれだけで奪三振マシーンで四球がそこそこで本塁打をすこし打たれるPでも左投げだったり先発じゃなかったりしたらそれはダルさんではありません.
解き方
「ダルビッシュ有さんっぽい投手を見つける」タスクは色々な方法で解けそうな気がしますが, 基本的には,
- 野球の一般的な成績情報(勝利, 敗北, 奪三振etc...)を特徴量として, 各投手との「距離」を測る
- 何かしらの方法でクラスタリングを行い, 「ダルビッシュ有さんと他の投手」の距離を求める
- 距離が近い順に並べてかつ, 若い投手を上から順に取る
という方法で行けます.
ここで二通りのやり方を考えました.
- セイバーメトリクスの古典的な手法「類似性スコア」を用いて距離を求める
- 「教師あり学習」なアプローチの機械学習で距離を出す
結論から言うと今回は後者を採用しました.
その1: 類似性スコアを用いる
セイバーメトリクス大好きマンの私が真っ先に思いついたのがこの方法でした.
大雑把に言うと,
類似性を見たい選手を1000点とした場合, 比較対象の選手は何点になるか?
本人を1,000点とした場合他の選手は何点になるか?と愚直に求める方法です.
過去に試したことがありこちらのエントリーに色々書いてます(これは打者版ですが).
しかしこの方法は,
成績の差分で評価するため, 通算成績が似ている順に並ぶ傾向にある.
という欠点があり,今回のように「ダルビッシュ有という大物に近い若手有望株を探す」というタスクには全く向きません(成績の差分が大きすぎるため).
ある程度実績を積んだ選手が過去の誰に似ているか?といったタスクには向いていますが今回はそうじゃないので泣く泣くこの方法は捨てました.
その2: 機械学習(今回採用した方法)
今回採用した方法です.
やりたいタスクを改めて書く(大切なので二度言う)と,
- 野球の一般的な成績情報(勝利, 敗北, 奪三振etc...)を特徴量として, 各投手との「距離」を測る
- 何かしらの方法でクラスタリングを行い, 「ダルビッシュ有さんと他の投手」の距離を求める
- 距離が近い順に並べてかつ, 若い投手を上から順に取る
という内容で, これは思いっきり機械学習の「教師あり学習」で解けるタスクだと気が付きました.
ここで色々とググったり本を読んだり先行事例を見てみたりしてみた結果,
- kNNなど, 近傍探索とかそういう方法が今回最も適していそう
- これらのやり方を取るのに必要な次元も揃いそう
と色々と気が付き, その中でも近似最近傍探索で程よい精度・いい感じのやり方でできそう!と気が付き試すことにしました.
TL;DRに記載した通り, 結果的にこれでやったモデルがいい感じになりました.
近似最近傍探索をPythonで解いてみる
という訳で, 近似最近傍探索をPythonでザクッとやる方法を調べたところ,
まさに求めていたライブラリ・手法に出会いました(詳しくは上記もみじあめさんのブログをご覧ください).
pip installしただけで気楽にやれる, GPUもいらない*6, indexでもベクトルでも結果を引けるという便利さ最高じゃないか!
ってなりました.
今回学習と検証に使ったコード(要約)ですが,
import pandas as pd from annoy import AnnoyIndex df = pd.read_csv('pitcher_stats.csv') t = AnnoyIndex(15, 'angular') # 数字(15)は次元数. ちなみに15は適当です. for r in df.iterrows(): item = [ r[1].win, r[1].lose, # 今回使った特徴量は秘密です :bow: r[1].so, r[1].bb, r[1].hr ] t.add_item(r[0], item) t.build(10) # 10 trees t.save('test_pitcher.ann')
学習とモデル作成はたったこれだけで, 使うときも,
# モデルの読み込み u = AnnoyIndex(15, 'angular') u.load('test_pitcher.ann') # ダルに近い投手(519はファイル内のindex番号) for id in u.get_nns_by_item(519, 11): # 近い順にindex出てきますよ, 他にもベクトルとかから探せる&距離も出ます.
これで行けます.
簡単すぎて鼻血出そうです.*7
結果と考察
なんやかんやでいい感じに試して見た結果はこちらです.
どの投手も, SO/9高め・BB/9若干低め・HR/9高めとダルビッシュ有さんらしい特徴を捉えてました, これは上手く行ってる!
生えある第一位はサンディエゴ・パドレス期待の先発右腕クリス・パダックでした.
先発右腕かつ奪三振マシーンで, 日本で一番面白いメジャーリーグ誌であるスラッガーの選手名鑑の寸評もそのようなことが書いてあり, 彼が「ダルビッシュ二世」と言うこと自体間違いでは無さそうです.
次点が大谷翔平の同僚, ロサンゼルス・エンジェルスのグリフィン・キャニング.
90mph台中盤の速球と3種類の変化球で組み立てる。
ダルビッシュ有さんも複数の変化球を操る, 90mph台中盤の4シームを操る万能投手なのでスタイル的にも似てます.
ちなみに今回の特徴量には球速や球種は含んでいないのでこの結果はビビりました, やるじゃんAI.*8
第三位は日系三世のハワイ出身, マイアミ・マーリンズ期待の星ジョーダン・ヤマモト.
若干与四球が多いあたり, パダックとキャニングより半歩劣る感あります.
が, 78 2/3回を投げて82奪三振はなかなかの奪三振マシーンぶりです, 先発でこれならたしかに未来のダルビッシュ有になり得ます.
ちなみにこの方法の課題としては,
- 球速や球種, 投球フォームは考慮していないので投手としてのタイプが違う人が混ざる. 例えばキャニングは球種がダルビッシュ有と比べて少ない
- 実際の試合で経験した特徴量ベースなので, 未デビューだったり他リーグ(例えば日本プロ野球だったりマイナーリーグだったり)でプレーした選手の予測は不可能
という点があります.
まとめ&真にやりたいこと
というわけでうまい具合に機械学習というAIで「未来のダルビッシュ有を探してみよう!」というタスクが無事いい感じにできました.
ただこれがゴールというわけでもなく, 私が真にやりたいことは「未来のダルビッシュ有の成績を予測する」事です.
これもおそらく機械学習で行けそうな気が...試したらまた改めて披露します.
参考文献・資料
手法の検討だったり考え方をまとめたりするのに, 今回は機械学習図鑑が大活躍しました.
類似性スコアだったり選手成績の解釈は名著Analyzing Baseball with Rが思いっきり参考になりました.
Annoyの使い方・具体的な例は先人の知恵を色々とお借りいたしました.
*1:元々は量産型〇〇を探すネタで行きましたが, なんか真面目な結果に収束したのでタイトル変更しました.
*3:グラフは便宜上出ちゃってますご了承ください :bow:
*4:なぜ勝ち負けを見ないかは以前のエントリーを読んでもらえれば理解できると思います.
*5:練習で左投げとかもしてますけどね, 試合では左じゃないのでそこは無視.
*6:そもそも数MB程度, 10,000レコード行かないスモールデータな学習なのでGPUのGの字も考えてませんでした.
*7:言うまでもなく, 今回苦戦したのは特徴量でこれについては秘中の秘ですが上述の通りLahman Databaseとretrosheetを使いこなせば行けます.
*8:Sean Lahmanにもretrosheetにも球速・球種のデータはありません.