Lean Baseball

No Engineering, No Baseball.

未来のダルビッシュ有を探してみよう! - 機械学習を用いてダルさんっぽい有望株を探してみた

プロ野球が開幕し, メジャーリーグの開幕もほぼ決まり野球好きの私達に日常が徐々に戻ってきて喜びを感じている今日このごろ.

私と言えばプロ野球をガッツリ楽しみながら野球データサイエンスに勤しんでいますがこんな感じで新作ができたのでちょこっとお披露目したいと思います.

f:id:shinyorke:20200628145203p:plain
今回のテーマです(詳細は本文参照)

要約すると,

データサイエンスと機械学習で量産型未来のダルビッシュ有さんを探してみよう!*1

という話で, お遊び程度にやったらいい感じになったので紹介したいと思います.

なお, このタスク・分析はSean Lahman DATABASEおよびretrosheetというメジャーリーグの公開されている,誰でも使えるオープンな成績・統計データを用いています(トラッキングデータ等は一切使っていません).

TL;DR(要約)

  • 「未来のダルビッシュ有っぽい投手を探す」というタスクは, 近似最近傍探索(ANN)でいい感じに解決できる.
  • Spotifyご謹製のAnnoyを使って爆速開発・検証できた, 決まり手は特徴量の選び方.
  • 奪三振マシーンかつ, ちょっと本塁打打たれるぐらいの先発投手が未来のダルビッシュ有になる率が高い(こなみ)

スタメン

数字で知るダルビッシュ有さん

データサイエンスの基本は「対象となるテーマについてのドメイン知識を得た」上でタスクを決めてやりきることです.

私はメジャーリーグ大好きマン(かつダルビッシュ有さんがかつて在籍していた北海道日本ハムファイターズの大ファン)でダルビッシュ有の成績はちょっと見たら色々語れるくらいには野球好きですが, 冷静になるためにちゃんと数字をふりかえってみます.*2

という訳で, 以前やった「投手の特徴をセイバーメトリクスで知る」アプローチでちょっと見てみました.

shinyorke.hatenablog.com

対象としたデータは,

  • メジャーリーグ移籍以降の成績. ちなみに29歳(2015年)はトミージョン手術で全休のため対象外.*3
  • 成績全体のクオリティを把握するために防御率・WHIP・FIPの推移
  • 奪三振・与四球・被本塁打の傾向を知るため, SO/9, BB/9, HR/9の推移

を見てみました.*4

f:id:shinyorke:20200628151846p:plain
防御率・WHIP・FIP推移

防御率がだいたいFIPと一致する裏表がない投手だなと改めてわかります.

一昨年の不調を乗り越えての昨年の成績は素敵すぎます.

f:id:shinyorke:20200628152231p:plain
SO/9, BB/9, HR/9推移

まず思うのが奪三振マシーンだなっていうこと. これは野球ファンにとって改めて言うまでもないと思います. すごいの一言.

そして三振を結構奪ってる割には四球率(BB/9)が安定している(不調だった32歳, 2018年を除き綺麗に下がってる)のもほほーってなります.

一方, 若干本塁打を打たれやすい投手だというのがHR/9で理解できます.

未来のダルビッシュ有を探す

(投手としての)ダルビッシュ有さんを構成するのは,

  • 三振がたくさん奪える
  • 四球を連発しない, むしろ四球率が落ち着いている
  • 若干本塁打を打たれる

が数字で理解できます.

また, 大事なコンテキストとして,

  • 先発投手である(ダルさんは中継ぎ・抑えではない)
  • 右投げである(ダルさんは右投げである*5

も忘れちゃいけません. どれだけで奪三振マシーンで四球がそこそこで本塁打をすこし打たれるPでも左投げだったり先発じゃなかったりしたらそれはダルさんではありません.

解き方

「ダルビッシュ有さんっぽい投手を見つける」タスクは色々な方法で解けそうな気がしますが, 基本的には,

  1. 野球の一般的な成績情報(勝利, 敗北, 奪三振etc...)を特徴量として, 各投手との「距離」を測る
  2. 何かしらの方法でクラスタリングを行い, 「ダルビッシュ有さんと他の投手」の距離を求める
  3. 距離が近い順に並べてかつ, 若い投手を上から順に取る

という方法で行けます.

ここで二通りのやり方を考えました.

  • セイバーメトリクスの古典的な手法「類似性スコア」を用いて距離を求める
  • 「教師あり学習」なアプローチの機械学習で距離を出す

結論から言うと今回は後者を採用しました.

その1: 類似性スコアを用いる

セイバーメトリクス大好きマンの私が真っ先に思いついたのがこの方法でした.

大雑把に言うと,

類似性を見たい選手を1000点とした場合, 比較対象の選手は何点になるか?

本人を1,000点とした場合他の選手は何点になるか?と愚直に求める方法です.

過去に試したことがありこちらのエントリーに色々書いてます(これは打者版ですが).

shinyorke.hatenablog.com

しかしこの方法は,

成績の差分で評価するため, 通算成績が似ている順に並ぶ傾向にある.

という欠点があり,今回のように「ダルビッシュ有という大物に近い若手有望株を探す」というタスクには全く向きません(成績の差分が大きすぎるため).

ある程度実績を積んだ選手が過去の誰に似ているか?といったタスクには向いていますが今回はそうじゃないので泣く泣くこの方法は捨てました.

その2: 機械学習(今回採用した方法)

今回採用した方法です.

やりたいタスクを改めて書く(大切なので二度言う)と,

  1. 野球の一般的な成績情報(勝利, 敗北, 奪三振etc...)を特徴量として, 各投手との「距離」を測る
  2. 何かしらの方法でクラスタリングを行い, 「ダルビッシュ有さんと他の投手」の距離を求める
  3. 距離が近い順に並べてかつ, 若い投手を上から順に取る

という内容で, これは思いっきり機械学習の「教師あり学習」で解けるタスクだと気が付きました.

ここで色々とググったり本を読んだり先行事例を見てみたりしてみた結果,

  • kNNなど, 近傍探索とかそういう方法が今回最も適していそう
  • これらのやり方を取るのに必要な次元も揃いそう

と色々と気が付き, その中でも近似最近傍探索で程よい精度・いい感じのやり方でできそう!と気が付き試すことにしました.

TL;DRに記載した通り, 結果的にこれでやったモデルがいい感じになりました.

近似最近傍探索をPythonで解いてみる

という訳で, 近似最近傍探索をPythonでザクッとやる方法を調べたところ,

blog.amedama.jp

まさに求めていたライブラリ・手法に出会いました(詳しくは上記もみじあめさんのブログをご覧ください).

github.com

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

結果と考察

なんやかんやでいい感じに試して見た結果はこちらです.

f:id:shinyorke:20200628162141p:plain
昨年デビューしたルーキー3名が対象に!

どの投手も, SO/9高め・BB/9若干低め・HR/9高めとダルビッシュ有さんらしい特徴を捉えてました, これは上手く行ってる!

生えある第一位はサンディエゴ・パドレス期待の先発右腕クリス・パダックでした.

クリス・パダック - Wikipedia

先発右腕かつ奪三振マシーンで, 日本で一番面白いメジャーリーグ誌であるスラッガーの選手名鑑の寸評もそのようなことが書いてあり, 彼が「ダルビッシュ二世」と言うこと自体間違いでは無さそうです.

次点が大谷翔平の同僚, ロサンゼルス・エンジェルスのグリフィン・キャニング.

ja.wikipedia.org

90mph台中盤の速球と3種類の変化球で組み立てる。

ダルビッシュ有さんも複数の変化球を操る, 90mph台中盤の4シームを操る万能投手なのでスタイル的にも似てます.

ちなみに今回の特徴量には球速や球種は含んでいないのでこの結果はビビりました, やるじゃんAI.*8

第三位は日系三世のハワイ出身, マイアミ・マーリンズ期待の星ジョーダン・ヤマモト.

ja.wikipedia.org

若干与四球が多いあたり, パダックとキャニングより半歩劣る感あります.

が, 78 2/3回を投げて82奪三振はなかなかの奪三振マシーンぶりです, 先発でこれならたしかに未来のダルビッシュ有になり得ます.

ちなみにこの方法の課題としては,

  • 球速や球種, 投球フォームは考慮していないので投手としてのタイプが違う人が混ざる. 例えばキャニングは球種がダルビッシュ有と比べて少ない
  • 実際の試合で経験した特徴量ベースなので, 未デビューだったり他リーグ(例えば日本プロ野球だったりマイナーリーグだったり)でプレーした選手の予測は不可能

という点があります.

まとめ&真にやりたいこと

というわけでうまい具合に機械学習というAIで「未来のダルビッシュ有を探してみよう!」というタスクが無事いい感じにできました.

ただこれがゴールというわけでもなく, 私が真にやりたいことは「未来のダルビッシュ有の成績を予測する」事です.

これもおそらく機械学習で行けそうな気が...試したらまた改めて披露します.

参考文献・資料

手法の検討だったり考え方をまとめたりするのに, 今回は機械学習図鑑が大活躍しました.

類似性スコアだったり選手成績の解釈は名著Analyzing Baseball with Rが思いっきり参考になりました.

Annoyの使い方・具体的な例は先人の知恵を色々とお借りいたしました.

blog.amedama.jp

qiita.com

qiita.com

*1:元々は量産型〇〇を探すネタで行きましたが, なんか真面目な結果に収束したのでタイトル変更しました.

*2:これがなぜ大切か?はちょっと昔の記事に書きました.

*3:グラフは便宜上出ちゃってますご了承ください :bow:

*4:なぜ勝ち負けを見ないかは以前のエントリーを読んでもらえれば理解できると思います.

*5:練習で左投げとかもしてますけどね, 試合では左じゃないのでそこは無視.

*6:そもそも数MB程度, 10,000レコード行かないスモールデータな学習なのでGPUのGの字も考えてませんでした.

*7:言うまでもなく, 今回苦戦したのは特徴量でこれについては秘中の秘ですが上述の通りLahman Databaseとretrosheetを使いこなせば行けます.

*8:Sean Lahmanにもretrosheetにも球速・球種のデータはありません.

自分プロジェクトを挫折せず続ける技術 - 個人開発をはじめよう!

職業としてエンジニアをやりたい・やってるけど(サーバーサイド→アプリエンジニア, インフラ→機械学習エンジニア的な)ジョブチェンジをしたいという方は結構いらっしゃると思います(かつての私もそんな人達の一人でした*1).

エンジニアをやりたい, 別の領域のエンジニアにジョブチェンジしたいというときに,

  • 仕事終わった後, 週末などに個人学習をする
  • 勉強会やイベントに参加したりコミュニティーのメンバーになって仲間を増やす
  • 一念発起?して自分でWebサイト・サービスやiOS/Androidアプリを作ってリリースする

といった, 「自分プロジェクト」言い換えると「個人開発」をすると思いますが, これって中々続かない事多くないですか?

少なくとも私は上手く行かなかった時期がありましたし, 今は上手く行ってるものの, たまにこの手の相談を受けます.

そんな中, 奇しくも今年の4月に「個人開発をはじめよう!」というこのテーマにピッタリな良い本が出版されました.

一言で言うと個人開発・プロジェクトの事例集で, 私のこのブログの話も事例の一つとして紹介いただいています.

というわけでこのエントリーでは, 「個人開発・自分プロジェクトを挫折せず続ける技術」についてちょっと書きたいと思います.

なお対象読者は,

  • スキルアップや今後のキャリアのために自学自習に励んでいる方
  • 一念発起的に思いついたアイデア・企画を形にしようとしている方
  • これらの活動・思考について携わっていたり支援している方や企業(つまり生業にしている人)

あたりを想定しております.

TL;DR

  • なにはともあれ, Done is better than perfect(完璧よりもさっさと終わらせろ)である.
  • さっさと終わらせるために「完了可能な計画」「時間と状況を作る」「道具と場所に可能な限り投資」すると良き.
  • 自分用の「これってときの勝ちパターン」を用意しておくとなお良いし駄目ならしばらく寝かせて諦めよう.

おしながき

自分プロジェクトで挫折あるある

あくまで私の主観・オピニオンですが, 「スキルアップのための活動・学習(自学自習)上手く行かない」「個人開発で挫折したわー」のパターンは以下の三つに分類されるかなと思っています.

  • アイデアや企画に起因する問題
  • やりたいんだけどさ...時間がないンゴ
  • 途中までやってたんだけど気が乗らなくなって挫折

他にもありそうな気がしますが, この3つについて軽く言及します.

アイデア・企画の問題

まずスタートしたときは気合入ってるので, アイデアをメモしたり人に語ったり, 実現に向けての準備(本を買って読む, 色々とリサーチするなど)で盛り上がると思うんですよ.

で, 実際半日一日手を付けてみて, 「あれ?思ったとおりにならんぞ?」「最初に考えた・調べたときと違う...」などなど, いろんなトラブルでやる気がやりはじめた時の1/334になったりする.*2

なんて経験は誰しもあると思います. 私はそんな理由で企画倒れになったアプリのネタがたくさんあります.

その他にも, 「学習をはじめたものの, ゴールが見えない」「学んだのはいいけど何したいかわからない」なんてこともあると思います.*3

これらは最初のアイデアや企画に何かしらの問題があるパターンと自分は思っています.

時間が無い

就職(転職*4じゃなくて)・結婚・育児・家を持つなどなど, ライフステージそのものが変わる*5不可避なものはしょうがないとして.

  • 仕事が忙しい(おそらく一番多いやつ)
  • 休日に時間を取ろうにも予定が(おそらく二番目に多いやつ)
  • やろうと思ったんだけど友達/同僚と予定が...

(緊急事態宣言が解除されているとは言え)今もStay Homeな風潮が続いて比較的時間は作りやすい状況だとは思いますが, 未だにこの辺って解決していない印象あります.

気が乗らないからの挫折

アイデア・企画の問題にせよ, 時間が無い問題にせよ, これらが解決しないと気が滅入ってそのうち自然に挫折しちゃいます.

これが「自分プロジェクト」「個人開発」が挫折するメカニズムです.

自分プロジェクトを挫折せず続ける3つの技術+2

そんな, 豆腐のように柔らかい・壊れやすい「自分プロジェクト」「個人開発」をいい感じに継続して挫折しないノウハウが私なりにあります.

自学自習を兼ねてプロダクト作ったり発表したりするような生活をかれこれ9年ぐらいしてきた中で上手くいくパターンがあって,

  • ちゃんと終わる, 「完了可能」な計画を立てる
  • 鉄の意志で時間と状況を作る
  • 計画, 時間, 状況に寄与する道具と場所に可能な限り投資する

この3つが上手く回るといい感じになります.

1. 「完了可能な計画」を立てる

私を含めた世界中の3,340万人ぐらいがイキって引用してるであろうこれ.

Done is better than perfect(完璧よりもさっさと終わらせろ)

顔本を作った人が発した有名すぎる名言ですが結局これがすべてで, 「完了可能な計画」の元「さっさと終わらせろ!」が基本かなと.

「Web広告とPythonを完璧に覚えてからDjangoでサイト作ってGoogle AdSenseつけてAWSでローンチだ!」とか, 「Deep Learningを完璧に覚えてからKaggleやってスコア上げて転職だ!」とかとか, 「完璧」ってワードが入った時点で爆死(世にいう地雷ワード)です.

そもそも「完璧」ってなんやねん?的な. 上司に「おう, 完璧にやってから報告しろよ」とか言われたらムカつくじゃないですか*6. それと同じです.*7

個人開発をはじめよう!」の事例全てに共通するのですが, ちゃんと終わることをやってるんですよね, 初手でイケてる技術を使わなくても, 汚いコード・クリーンアーキテクチャとは程遠いコードを書いていてもしっかりバリューを残す的な.

というわけで, 完了するためには雑にやって全然構わないので「終わらせることを見据えた計画と言語化」が必須だと思っています&少なくとも自分は実践しています.

私としてはこの「完了可能な計画」にオススメしてるのが名著「アジャイルサムライ」で紹介されている「インセプションデッキ」で, ちょっとした大きいネタをやるときは必ず書いて見直すようにしています.

上記はPyCon JP 2015のときのものですが, 今も書いてます(最近のやつは色んな事情で公開したくないので割愛*8).

別にインセプションデッキじゃなくても, WBSでもビジネスモデル・キャンバスでもホワイトボードなりメモなりに残すでもなんでも良いのですが,

  • やりたいこと・成し遂げたいことを一言
  • やるために必要なモノ. 技術, 時間, 道具
  • いつまでにやるか?という締切とスケジュール

ぐらいは残すといいと思います.

あと, 何よりも「自分がやりたいこと」をやるのが大事です!

特に個人開発は自分ごとにできる好きで楽しくて意義あること*9ができるといいと思います.

2. 鉄の意志で「時間と状況」を作る

自分プロジェクト・個人開発だけじゃなくて, 「ブログ書きたいんだけど時間が無い」とかアウトプット活動全般で時間の問題に困ってる人に必ず言ってることがあって.

「時間がない」のが問題じゃなくて, 「時間を割くような状況を作っていない」のが問題なのでは?

1日は24時間, というのは全員等しく平等で, 「どの活動に優先度を付けて時間を割いているか?」がホントに解くべきISSUEのはずで.

  • 仕事が忙しくて時間がないといいますが, これって仕事のやり方とか工夫できませんか?
  • 休日に時間が取れないといいますが, 実は不要不急の予定だったりしませんか?
  • 人に誘われている予定, これはホントに大切なことですか?

という問いかけを自分にすると色々気がつく&できることあるんじゃないかなと思いますし, それでも「いや, 仕事(休日)とか人付き合い大事だし」であれば, 「自分プロジェクト」「個人開発」「ブログを書く」みたいなのはさほど大切な活動じゃないのでしばらく寝かせるか辞めるかした方がいいんじゃないと思います(し, 寝かせる・辞める価値観は十分あるのでそれを尊重します).

私の場合は徹底して「時間を確保するための状況作り」をしています.

  • 週末の土曜日か日曜日のどちらかで必ず2時間以上のまとまった時間を作る
  • GW, 夏休み, 年末年始などのまとまった長期休みにまとまった開発・勉強期間を作る
  • 独学と外の勉強会・もくもく会の時間をバランスよく取る. 具体的には「独学(独習) 7:3 外のイベント・勉強会」, ぐらい.

自分のライフスタイルに合わせながら生み出したものなのであくまで一例ですが, 人それぞれパターンあると思うので自分にあったスタイルを見つけるといいかなと思います.

ちなみに私の場合は個人開発・自分プロジェクトの時間・リソース確保がメチャクチャ大事なので, 「不要不急の会社の飲み会・イベント」「漠然と集まるだけな友人知人の飲み会・遊び」は「鉄の意志をもって」丁重にお断りをし, 友達と遊ぶ・自分が息を抜く時間はまとめて取るようにしています.*10

3. 「道具と場所」に可能な限り投資する

「完了可能な計画」「確保した時間」を生かしてやりきるために投資するもの, それは道具と場所です.

道具についてはやることによって色々あるので一概に言えないと思いますが, 私の場合は

  • PCやタブレットなど, ハード系商売道具への投資は妥協しない. 極論で言うとローン組んででも自分に最適な道具を買う*11.
  • ソフトウェア的なモノ, 例えばエンジニアだとeditorとかIDEなんかは使いやすい・手に馴染むものがあったら惜しまずお金を払う.
  • 職場だけでなく, モバイル系の道具(ノマド用), 自宅の環境にもしっかり投資する.

自宅環境のこだわり話はnoteに書いたのでそちらを見てもらえると嬉しいです.

note.com

様々な事情で自宅に環境確保できない...いや, 確保できたとしても外でノマドしたりとかを挟む&それに必要な道具を揃える(例えばインターネット*12)とベストです.

私は自宅に環境はありますが, 性格とライフスタイル上一日外を出ないというのが耐えられないのでカフェで作業するノマド・スタイルを重要視しています.

f:id:shinyorke:20200606210111j:plain
場所を外に求めるのも大事

モバイルでいい感じに作業できる状態を作ると, 「帰り道に一杯やりながら」とか「旅行・出張先で集中して」みたいなこともイケるのでオススメです.

先ほどの時間・状況の件で「長い休みでやる」みたいな事をやる時にも繋がってるくるので.*13

【可能であれば】勝ちパターンを作る

この先はおまけです.

挫折しないためにはサクサクと進むと気持ちいいですよね. というよりサクサク進まないから挫折するとも言えます.

これに対する処方箋ですが,

得意なやり方, すぐ始められる・作れるモノを使って自走できる「勝ちパターン」を持ってしまえ!

とオススメします.

  • 仕事なり趣味なりで元々得意な方法・すぐやれるやり方でやる癖をつける
  • 既存のFrameworkとかでもいいし, 自分が過去にやったモノのコピーでもいい
  • ポイントは「これからやりたい・学ぶ好き・憧れなモノ*14」じゃなくて「考えなくても手が動くぐらいに馴染んだ得意なもの」を使う*15

自分の場合は「迷ったらPython」というぐらいPythonが手に馴染んでいるので,

  • データサイエンスで何かやるときのパターンはすでにある
  • Webも同様で, サクッとやるならFastAPIとかFlask, チーム作業とかちゃんとやるならDjango

ぐらいのルールでやってます.

いずれも着手してから半日〜1日で「とりあえず動いた!」ぐらいはできるようにしています.*16

ちなみにFastAPIについては自分が作ったモノの中で公開していいやつを勝ちパターン的に公開しています.*17

github.com

Pythonほどほどに使えて特に勝ちパターン無いよーって人はぜひ持っていってください(MIT Licenceの範疇で自由にご利用ください).

【最終兵器】諦めて寝かせる

ここまで読んで・考えても「うーん...」という場合は,

潔く諦めて別のことをしましょう, またやる気が出たら再開しましょう!

「なんでできないんやー」「思い通りに行かないな...」ってときはやめちゃっていいと思いますし, 辞めることは別に恥じゃないですと.

個人開発をはじめよう!」で私のブログで取り上げられたのはこちらの「野球地図をPythonで作ろう」という話なのですが.

shinyorke.hatenablog.com

これ, 始めたときは面白いと思ったのですがなんかの理由*18で続きを諦めているんです笑

で, 昨年PyCon mini Hiroshima 2019というイベントに参加・トークに申し込もうと思ったときに「地図やりたい」と思い立ち, なんやかんやで復活しました.

shinyorke.hatenablog.com

上記ブログにも書きましたが, 4年越しの復活です. 自分でもびっくりしました.

何がいいたいかって言うと,

アイデアややることが先行しすぎて時期尚早なんてことはザラにあるので飽きたら寝かせていいんだぜ!

そういうことです.*19

個人開発をはじめよう!

なにはともあれ「個人開発をはじめよう!」じゃありませんか.

このエントリーで書いた「自分プロジェクトを挫折しない技術」は, すべて自分の実体験に基づいていますが, この本のエピソードを読んで上手く言語化できた気がします.

また, この本読めば読むほど面白くて,

  • 企画立案からMVPつくってフィードバックもらってサービスを伸ばした実践例だったり
  • 何かしらの形でマネタイズするときに良かった・困った話とか
  • 物事をやり抜くための意思決定とか技術選定とかチームメンバーの選び方などなど

といった, 「個人開発だけとは言い切れない, まるで新規事業の事例集のような装い」 があり最高です.*20

これらの先人の知恵が一冊で読めるの相当美味しいと思います, Stay Homeのお供として, これからのキャリアに思い馳せながら個人開発をはじめる人が増えると嬉しいです.*21

*1:キャリアの最初は銀行の基幹系システムを構築する巨大プロジェクトの下っ端でしたし, そこから業務システム系の事をしてWebのエンジニアになってフロントだのインフラだの機械学習だのetc...言うたら今も現在進行形でカメレオンのように変わっています.

*2:なんでや阪神関係ないやろ

*3:これはプログラミングを学んでるとかそういうフェーズの人に多いかも. 実務にせよ学業にせよゴール決まっていて上手くいくパターンもあれば学ぶことそのものが目標になってその後を考えてなかったりetc...

*4:転職コストとか意味・意義が変わった今だと, 普通の転職ぐらいじゃライフステージと呼ばない気がします. 「エンジニアしてましたが一念発起して焼き鳥屋になります(またはその逆)」ぐらいのノリであればライフステージに関わるとは思いますが.

*5:自分プロジェクト・個人開発関係なくライフステージ起因のものは無理しない方がいいと思っています, それこそ一生に関わるモノなので.

*6:今の会社ではもちろんそんな事無いのですが, かつていたどっかのチームではまあまああったので実話です.

*7:ちょっと後に載せてるインセプションデッキみたいなモノで「これができたら完了です!」な宣言をやりきったらある種完璧と言えなくも無いですが, そもそもそんな言語化の意味と意義を理解している人は完璧なんて言わないんです.

*8:やっていく内にやることのレベルが上がってPublicにできない話が増えたんですよね... 今回のエントリーと関係ないですがもう少しPublicにできる事例を増やそうかなと最近目論んでいます(後述するFastAPIの話とかがまさにそれ)

*9:趣味でも金儲けでもモテるためでも何でもいいです, 要は寝食忘れて打ち込んでもいいかな的なモチベーションがあれば最高です.

*10:良くも悪くも「独身一人暮らし」というライフステージで時間のコントロールが比較的しやすいが故に, 余計なところで時間が溶けないように工夫しています. また, 仕事の生産性だったり時間の使い方は言うまでもなくしっかりタイムマネジメントしています.

*11:私は大人なので上限ナシでやっちゃいますが, 別に中古とか整備済み用品とかでも最適なのがあればそれでいいと思います.

*12:モバイルルーターやテザリングもいいですが, 地味にキャリアのWifiとかはお店に合ったりするので便利です(セキュリティ問題を解決できれば). ちなみに私はキャリアのWi-Fiとテザリングをよく使います.

*13:長い休みの旅行・帰省先でやるのは気分転換になって結構オススメ

*14:「普段JavaとかPHPしてるので最近やってるPython/Golangで!」みたいなやつです. 普段使ってないものは学習コストがかかりますよと.

*15:ここが結構落とし穴で, 「好きなもの」と「これから学ぶもの」が混同するケースがあり, 「好きで始めたらハマって結果何もできない」的な辛さを味わうこともあります. 「得意かつ好き」が最も理想ですが分かれる場合は迷わず得意な方をとりましょう!

*16:最初はとにかく雑でも書いて動かして, 目的を達成・いい感じになったら丸っと綺麗に書き直す(いわゆるリファクタリング)をしています. ちなみにテストは書いたり書かなかったりです(コケたら困る部分だけテスト書いてる).

*17:これは別途エントリー書きます, なぜ作って公開したかを含めて.

*18:PyCon JP 2015の発表の時には引用すらしてなかったので完全に気が変わったものと思われます, マジでうろ覚えですが. 最も, データセットとかやりかたは流用しているので無駄ではなかったです.

*19:余談ですが, 私はRADIOHEADというバンドが好きで彼らの新曲はたまに10年以上前のデモテープから生まれる事があり, インタビューとか見ると自分と同じようなことを言ってました.

*20:事例で上がってる人すべてが本業だけじゃない部分で結果・成果が出ているというのもあるかもしれません. かくいう私も本業以外にこのブログや技術顧問などなどでいろんな成果出してますし

*21:選者・著者のyuzuta0さんのブログもぜひご一読を!記事編集・レビューなど良かったです&色々と迷惑かけてかたじけなかった:pray:

野球の防御率はたまに嘘をつくのでDIPSと合わせて見てみよう - データサイエンスから学ぶセイバーメトリクス

前回は打者成績の話をしたので(予告通り)投手の成績の話をします.

投手をシーズン成績(または通算成績)で見る時, 代表的な指標として以下の3つがあります(いわゆる, 「投手三冠」の対象).

  • 勝利数(その名の通り, 投げて勝利した回数)
  • 奪三振(打者から奪った三振の数)
  • 防御率(9イニングあたりの自責点率. このエントリーの主人公).

この成績のうち, 勝利数は投手個人の頑張り「だけ」では稼げない数字というのは野球をちょっとでも見たことある人なら想像つくと思います.*1

奪三振は「三振」が持つ意味, 見た目の派手さからすると投手の実力が生きるモノと言えます(そしてこれは事実だという話をこれからします).

問題は, 「相手に許した得点(自責点)を9イニング(ほぼ一試合分)に平均した」実に便利な指標である「防御率」で,

防御率は投手を必要以上に良く見せる(もしくは悪く見せる)ことがあり, 「たまに嘘をつく」実にイヤらしい指標です.

言葉と数字の雰囲気的に投手の実力っぽい感じがしますがこれは(少なくとも数式・特徴量な意味では)事実です.

というわけで, 今日はとあるメジャーリーガーが「防御率詐欺*2」を働いているという以下のグラフを理解するところをゴールとしましょう.

f:id:shinyorke:20200520224216p:plain
某投手が防御率ほど信頼できない, の例

これを読み終わる頃には「防御率」の数字の読み方に深みが加わり, これからの野球を別の視点で面白く見られると思うのでしばらくお付き合いください.

このエントリーのダイジェスト

  • 投手のパフォーマンス・成績の良さを防御率だけで評価しちゃいけない. 他の指標も合わせて見る習慣をつけよう.
  • セイバーメトリクスには「投手の実力が活きやすい」指標を重点的に評価するDIPSという概念があり, そこから生まれたFIPという指標を使うことにより「防御率の嘘」を見抜くことができる.
  • 被本塁打・奪三振・与四球にフォーカスして成績を見ると投手の特徴がつかめるのでオススメ.

という話を, メジャーリーグのオープンデータを駆使して解説します.

スターティングメンバー

この連載の対象読者&前提条件

以下は前回は打者成績の話と同じです.

  • 何かしらのデータサイエンス・データ分析を自分で考え手を動かしてやっている方. 仕事・学業・趣味問わず.
  • SpreadsheetやSQL, プログラミング言語(Python/Rなど)など何かしらの道具でデータを加工したり抽出できたりできる
  • 野球のルール・記録の意味を把握していること. レベル感的には野球に興味なくても夏の甲子園とか日本シリーズを楽しめればOK

プロ野球やメジャーリーグに対するマニアックな知識は必要ありません.*3

なお, 今回は昨年メジャーリーグで162イニング以上投げた投手(=規定投球回数*4到達者), 約60人のデータからこの話を紐解きます.

投手のパフォーマンスを評価する指標

投手の大事な役割は「失点を抑えながら相手打者からアウトを取る」ことです*5.

三振を奪ったりゴロアウト・フライアウトを効率的に奪い, ランナーの出塁を減らすことにより役割を果たします.

そんな投手たちの働きのクオリティを表す指標はいくつかありますが, これも野球の歴史・セイバーメトリクスの進化とともに変わってきたのでまずはそれを紹介します.

防御率 - 自責点から見るそれっぽい数字

よく知られている指標です. 「最優秀防御率」というタイトルがあるぐらいみんな知ってると思います.

このエントリーはあくまでもデータサイエンスでありセイバーメトリクスなので, 数式とその意味から語りますね.

まず防御率の数式をおさらいしましょう.

防御率 = (自責点 * 9) / イニング数

数式の意味合い的には,

「仮にこのピッチャーが9イニング(一試合)投げきった時, 平均して何失点するか?」

というお題目の元この数式が存在します. 自責点に9を掛けてるのはそのためです.*6

一見するとそれっぽい事をしていて正解な風に見えますが, 唯一にして最大の欠陥が「自責点」を元にしていることです!

自責点 - Wikipediaの解説によると,

自責点(じせきてん、Earned run / ER)は野球の試合において投手の責任とされる失点のこと。

(中略)

野手(投手自身も含む)の失策、捕逸、打撃妨害、走塁妨害によって一塁を得した走者ファウルフライに対して失策があった後に安打などで出塁した走者失策がなければアウトになったはずの走者が得点した場合は、自責点とならない。

(中略)

失策、捕逸、打撃妨害、走塁妨害によって進塁した走者が得点した場合は、これら守備側のミスがなくても得点ができたと記録員が判断したときに限って自責点となる。

色んな凡例(いや判例だな)がたくさんありますが, 要約すると

  • 野手(投手自身を含む)の失策での失点は自責点にならない, 基本的に.
  • 「守備でエラーとか関係なくホームインだろ(確信)」と記録員が判断した時は自責点になる.

と言えます. これはつまり,

自責点は記録員の忖度*7によって決まる指標で, 投手の実力は関係ない

ということになります.

投手が投げている間の「自責点」は必ずしも投手の責任ではない, という「自責点, 自責じゃないのでは?」と疑いたくなるような事実から出来ている防御率は投手の実力を反映しているものとは言えないってことでもあります(が, 便利な指標なので使うことには反対しない).

WHIP - 投手の安定度を表す

防御率と並べて見られることが多い指標として, WHIPという指標があります.

これはシンプルに言うと, 「イニングあたり何人の走者を出したか?」という事実を把握できます.

WHIP = (被安打 + 与四球) / イニング数

「Walks Plus Hits per Inning Pitched」がWHIPの正式名称ですがホントそのとおりです.

ちなみに数字の基準はこんなかんじです(by WHIP - Wikipedia),

WHIP 評価
1.00 素晴らしい
1.10 非常に良い
1.25 平均以上
1.32 平均
1.40 平均以下
1.50 悪い
1.60 非常に悪い

WHIP 1.2は言い換えると「1イニングあたり平均してランナーを1.2人出す」という意味なので直感的につかみやすい数字です.

一見すると「被安打」「四球」という客観的な記録(エラーのように記録員の忖度が入らない)を元に出していて筋が良さそうとも思えますが!?

  • 四球は「投手のコントロール」が強く出るプレー. これを変数とするのは問題はなさそう.
  • しかし, 被安打は「投手の責任」と「投手だけじゃ決まらない」要素がごっちゃになっている.
    • 真っ向勝負で打たれた本塁打, は後ろを守る野手とは関係ないので投手の責任
    • 野手が打球処理にもたつく間に内野安打, は果たして投手の責任か?
    • などなど, 上げると色々ある

被安打の件は, 「味方の守備が上手であればWHIPが下がり*8, 下手くそであればWHIPが上がる*9」要素が十分にあり, 必ずしも正確な指標とはいえません. 防御率同様, WHIPも「被安打」という要素で事実をぼやかしている可能性があります.

DIPS(から生まれたFIP) - 投手の実力をシンプルに評価する

防御率はあやしい, WHIPもあてにならない...そこでDIPS(Defense Independent Pitching Statistics)という理論が登場します.

DIPSのコンセプトは、投手の成績を「投手自身でコントロールできる部門」と「投手自身ではコントロールできない部門」に分けて、「投手自身でコントロールできる部門」だけで投手を評価することである。

出典:DIPS (野球) - Wikipedia

言い換えると,

  • 投手は自分自身がコントロールできる「被本塁打*10」「与四球(与死球)*11」「奪三振*12」のみ, 責任を取るべき.*13
  • 投手が自分自身だけではコントロールできない「被安打(本塁打を除く)」「自責点」「勝利(敗戦)」などは責任を取らなくていい.

(投手に限らず)成績に対して「選手自身の責任」と「選手の責任じゃない部分」という責任分界点を作った最初の事例でもあり, この考え方は今でも重用されています.

DIPSは概念の名前で実際の指標はいくつかありますが, 特によく使われる(かつ比較的算出が容易)なのがFIP(Fielding Independent Pitching*14)です.

FIP = (13 * 本塁打 + 3 * (四球 - 敬遠四球 + 死球) - 2 * 奪三振) / イニング数 + リーグの防御率から算出する定数*15

本塁打, (敬遠四球を除いた)与四死球*16, 奪三振を元にイニング数から算出, 最終的に防御率っぽい数字に収束するようにできています.

「三振をたくさん奪い, 四球が少ない」投手は相当優秀な数字になる一方, 「三振少ない, 四球が多い打たせて取る」系のピッチャーはそれなりの数字になります.

ちなみに, 防御率っぽくする理由はシンプルで「防御率は普段見慣れている数字*17かつ,FIPと防御率の差分でどんな投手かを把握しやすい」からです.

実際に数字を見る時はこんな感じに見ると良いかと思います.

  • 防御率 ≒ FIP: (本塁打を除く)被安打, 野手のエラー等の「他責」イベントの影響が小さく実力どおりの成績が出ている.
  • 防御率 > FIP: 不幸な被安打や野手のエラーが多く, 本来持つ実力以上に失点している「不幸な投手」の可能性.
  • 防御率 < FIP: チームの野手の守備が上手く, 不幸な被安打・エラーが少ない可能性. 本来持つ実力以上にラッキーな「いつか炎上する投手」の可能性.

防御率 < FIPかつ差が大きい(0.5を超えるぐらいかな)投手が, 新時代の防御率詐欺投手となります.

防御率とFIPから「防御率詐欺」を見つける

「防御率はたまに嘘をつく」「FIPとの差分で区分けができる」と理屈を説明したのでケーススタディ的に見てみましょう.

  • 誰がどう見てもエースの投手(良い子)
  • 実際の防御率詐欺(悪い子)
  • FIPの数字以上に防御率が悪い(変わった子)

この3つのケーススタディで紹介します.

良い子 - エース級投手

大エース代表は昨年のサイ・ヤング賞*18投手, ジャスティン・バーランダーです.

ja.wikipedia.org

スリークォーター気味のフォームから最速160km/hの4シーム, スライダーとカーブ中心の組み立てで三振を量産するわかり易すぎる好投手です.

f:id:shinyorke:20200523142443p:plain
バーランダーの防御率・FIP・WHIP推移

いい投手だなーってのがわかります, 特に2017年以降.

ちなみにバーランダーは結構ベテランの投手(今年で37歳)で, 実際の所グラフに出していない2013年以前の成績もヤバいです(今が第2全盛期と思ってもらえれば).

2014年からの推移を見ると,

  • アストロズに移籍した2017年(厳密には2017年夏にトレード移籍)を境にどの指標も下がって強い投手に
  • 2018, 2019の防御率とWHIPは安定. ちなみにWHIPは2年連続リーグ一位
  • 2019年のFIPが若干悪化している?

というのが見えてきます.

FIPは先ほど解説の通り, 被本塁打・与四死球・奪三振が重要な説明変数となるので, 合わせて以下の指標もちょっと見てみます.

  • 9イニング(約一試合)あたりの被本塁打(HR/9)
  • 9イニングあたりの奪三振(SO/9)
  • 9イニングあたりの与四球(BB/9)

f:id:shinyorke:20200523143431p:plain
バーランダーのHR/9, SO/9, BB/9

若干地味ですが, どの数字も2018年より悪化してました.

指標 2018 2019
HR/9 1.18 1.45
SO/9 12.20 12.11
BB/9 1.56 1.70

イニングあたりの本塁打, 四球が増えて三振が減った事により若干悪化したとわかります(といっても誤差な気がしますが).

というように, 本塁打・与四死球・三振にフォーカスするとこういうことが直感的にわかるようになります.*19

悪い子 - 防御率詐欺

という見方がわかったところで, 今度は「防御率詐欺」である, 「防御率よりFIPが悪い」投手を見ます.

ja.wikipedia.org

マイク・ファイアーズという投手で昨年の成績は,

15勝4敗 防御率3.90(184 2/3回, 33試合先発)

という一見すると頼れるエースっぽい投手です(実際にオークランド・アスレチックスのエースなのですが*20).

先ほどのバーランダーと同じグラフで見てみると,

f:id:shinyorke:20200523144723p:plain
ファイアーズの防御率, FIP, WHIP

2018年と2019年の防御率は(過去の年と比べて)イケてますが, FIPがボロボロです.

ちなみにWHIPは平均より若干良い程度です.

こちらもHR/9, SO/9, BB/9である程度説明ができます.

f:id:shinyorke:20200523145723p:plain
ファイアーズのHR/9, SO/9, BB/9

グラフを見ただけで察しかもですが,

  • SO/9(奪三振)が綺麗に右肩下がり
  • BB/9(四球)が見事に増加

「三振があまりとれない, 四球が増えた投手」...贔屓チームにいたら実際嫌だと思いませんか?見ていて安心できないですし.*21

本来だったら防御率が4点台半ば〜下手したら5点台のファイアーズが見た目素晴らしい防御率に収まってる理由ですが,

  • 2018年から在籍しているオークランド・アスレチックスの内野守備はリーグ屈指で特に三塁・一塁・ショートが良い.
  • 外野も守備が安定しており, 球場自体が広いためヒットおよび本塁打のリスクも少ない.*22
  • 上記の理由により, 「自責点」につながるイベントが少ない(と思われる).

ファイアーズの成績が悪かった時期は守備に恵まれていない, 逆に今成績が良いのはチーム守備に助けられているともいえます.*23

変わった子 - 逆・防御率詐欺

最後にちょっと変わった投手を見てみます.

f:id:shinyorke:20200523150654p:plain
防御率よりFIPが突然良くなった投手(2019)

ホセ・キンターナという若干マニアックな選手なのですが,

13勝9敗 防御率4.68, FIP 3.80(171回, 31試合先発)

防御率を見ると微妙ですが, FIPをみると然程悪い投手に見えません.

FIPだけで言ったらさっきのファイアーズの方が信用できません(ちなみにファイアーズのFIPは4.97)

キンターナのHR/9, SO/9, BB/9に着目してみると

f:id:shinyorke:20200523151537p:plain
与四球が減っててつよい!

BB/9とHR/9の数字が良くなっていて信頼できる投手になってるっぽいです.

防御率が悪いのはファイアーズと逆でチームの守備とかに問題があったかもしれません.

現在31歳でこの先の伸びしろは若干怪しいですが,

  • 三振をもっと取れるようになると一気にエースになるかもしれない.*24
  • 今のチームより守備が上手なチームに移籍したら防御率が本来の実力に近い数字になるかもしれない.*25

ということが言えそうです.

結び - DIPSは野球データの特徴量そのもの

というわけでこのエントリーでは「防御率の嘘」と, 「DIPSによる斜め上から投手を評価する」方法を紹介しました.

実はこの考え方, 以前こちらのエントリーでも少し触れていまして.

shinyorke.hatenablog.com

記録にも「主観」に頼っているなんとも言えない罠があったりします

この話をより深く掘り下げて紹介したのでありました, DIPSという考え方は野球における特徴量エンジニアリングの基本だぜ!っていう.

普通の野球の見方・楽しみ方の目線ではDIPS(FIP)は若干とっつきにくい話ですが, 自責点や他のイベントと合わせて読み解くとより理解できると思います.

次回は...ちょっと間を空けて守備・走塁もしくは得点期待値の話をしたいなと思います.

長文にお付き合いいただきありがとうございました!

【Appendix】参考文献

今回の指標とグラフは私が独自に収集・計算したものですが, 手っ取り早く見たい人はFanGraphsをオススメします.

www.fangraphs.com

DIPSが使われるようになった原点はマネーボールの後半, チャド・ブラッドフォードの件です.

何度でも言うけど映画版じゃなくて書籍で読もうね!

*1:シンプルに言うと, メチャクチャ点を取る強いチームの投手は5回4失点とかでも勝利がつくことがある一方, ほとんど打たない・点を取れないチームのエースは9回1失点完投しても負けることがあります, いわゆる「ムエンゴ」案件.

*2:防御率詐欺の出典はなんJで, こちらの解釈では「防御率が良いけどWHIP高いやつはあやしい」という文脈になってます(そしてこの視点はある程度正しい)が, 今回は「DIPSという概念からみた防御率詐欺」というお話になります.

*3:野球, チーム, 選手などなどから来る「ファン心理」「思い込みというバイアス」を抜くという意味でも重要な条件でございます(by前回記事のそのままコピー).

*4:日米ともに一軍の場合試合数と同じイニング数になります(日本プロ野球は143, メジャーリーグは162でそれぞれレギュラーシーズン試合数)

*5:打者として20本以上ホームランを放つような二刀流の怪物もいますが, 基本的には投手は投げてアウトを稼ぐのが仕事です&二刀流のすごいマンは打者と投手二役と考えると良いでしょう(早く今シーズンが見たい)

*6:この後いくつか指標が出ますが, 投手の指標はWHIPみたいな例外を除き, 「9イニング(9回)を一試合と見立てた場合の平均」という図式が多いです. これを覚えると数字は読みやすくなります.

*7:なぜかと言うと, 失策(エラー)は「記録員が”普通の選手ならあのボールはとれてた”はず」という主観にに基づいた記録で, これは記録員によってそのしきい値が違うことを意味しているからです. 客観的な指標が多い野球において珍しい「外部からの主観によって決まる」指標です.

*8:本来ヒットだったかもな当たりがファインプレーで取られる, とかそういう機会が増えるイメージ.

*9:並の外野手だったら取れる平凡なフライを落球して走者一掃...とかそういうケース.

*10:ランニング本塁打を除く, フェンス超えの本塁打は投手と打者で決まる.

*11:ベンチからの指示でやる敬遠を除き, 投手自身のコントロールでほぼ決まる.

*12:良い投手, エースと呼ばれるピッチャーの華はやっぱ三振だと思うんですよ...という意見はさておき, これも投手と打者の関係性で決まる.

*13:厳密にはキャッチャーがいてこそ, というのもありますし, 昨今の傾向ですとキャッチャーがストライクを取る能力(フレーミング)も重要な視点ではありますが, フレーミングの影響幅より投手の実力のほうが影響するのは事実としてあります. キャッチャーのストライク管理能力以上に, 投手が速いボールを投げたり空振りを奪える変化球を投げるほうがより天賦の才に近いかつ難しいと思うので.

*14:要約すると, 「守備に影響されないピッチングの能力」です.

*15:ちなみに面倒くさい時は3.1とか防御率っぽい定数にするとそれなりの数値に収束します(この方式を使うことはまあまあある)

*16:敬遠四球を除外するのは, 敬遠はベンチの指示などで行う「自責ではない」行為であるためです.

*17:前回登場したwOBPもそうですが, 既存の指標っぽい値にスケールするように調整するのは割とセイバーメトリクスあるあるです.

*18:メジャーリーグにおける最優秀投手賞的な栄冠. 日本で言えば沢村賞に該当.

*19:これは重要な話で, この3つの割合を見るだけで投手のタイプがおおよそ判別がつきます. 特にあんまり見たことない投手・知らない投手を見る時はこの視点重要です.

*20:昨年のメジャーリーグ開幕戦@東京ドームの初戦で先発しています, イチローが引退したシリーズですね.

*21:なお私はそんなオークランド・アスレチックスの大ファンです&実際ファイアーズが投げる試合は全くもって信頼していません.

*22:HR/9が安定しているのは球場の影響も多少あります.

*23:これはデータサイエンス・セイバーメトリクスをつかった球団運営としては成功例の一つで, 「エース級の投手がいないかわりに野手の守備で抑える」のはチーム視点ではかなり良い戦略です. 流石マネーボールの元祖オークランド・アスレチックスの面目躍如といった所か.

*24:キンターナほど歳をとってるとこの可能性は低い気がしますが, 24, 5歳ぐらいの若手投手の可能性を探る的な課題であればこのような解き方もアリです.

*25:例えば, アスレチックスにファイアーズの代わりにキンターナを入れてみたら...とか考えると面白いかも知れません.