Lean Baseball

No Engineering, No Baseball.

機械学習を使った野球データサイエンス - 打者・大谷翔平選手の20代をシュッと占ってみた

やったことは非常にシンプルでして.

大谷翔平選手の26〜29歳(2020〜2024年)までの打撃成績を, 一般的な打撃成績データ(安打, 本塁打, 三振etc...)を使った機械学習でそれっぽく出してみました

f:id:shinyorke:20200726232049j:plain
大谷翔平さんはやっぱ凄い(詳細はこの後で)

まだまだ改良点や穴があるものの, 統計的にもアルゴリズム的にも十分に納得行くモノができたので一旦公開します.

なお, どういったアプローチでやったか?特徴量はどうやって選んだか??については8/28, 29開催のPyCon JP 2020で発表します.*1

免責事項

  • 言うてもおもちゃですしちょっとしたお遊びです. そのつもりでご覧ください.
  • 一部のサンプルコードを除きコードおよび特徴量は公開しません.
  • データはMLBのPublicな公開データセットであるLahman’s Baseball Databaseおよび, RETROSHEETを使っています.
  • 2020年(26歳)の成績は, 162試合やった場合想定の数字です. 今年は60試合前後なので正確には予測成績の1/3くらいになると思われます!

なお, 実装と検証はいつもどおりPythonを使っています.*2

スタメン

機械学習を用いた成績の占い方

占い, と言っても適当にやってるわけではありませんが.

やり方としてはかなりシンプルな方法を採用しました.

  1. 最近傍探索で大谷翔平と他の選手の近さ(距離)を数値として求める
  2. 距離が近い選手を特定の条件でピックアップし, 確率分布的な方法で数値をエイッと出す

TASKその1:大谷翔平と他の選手の近さ(距離)を数値として求める

過去に2万人近くいる, メジャーリーグでの出場経験者すべてに対して, 近似最近傍探索(ANN)を使って, 数学的な距離を求めました.

実はこれは以前このブログでもやった方法を用いています.

shinyorke.hatenablog.com

ダルビッシュ有さんの時は投手成績を特徴量として使いましたが, 今回出したいのは「打者としての大谷翔平さんの成績」なので打者成績を特徴量として使っています.

この方法で距離を出した結果がこちらになります.

f:id:shinyorke:20200727000422p:plain
最近の人から懐かしの人まで, 強打者揃いました.

MLB好きの人は「おっ」ってくるんじゃないでしょうか?

指名打者および一塁・左翼を主ポジションとして活躍した(している)選手*3が比較的近いという傾向が出ました.*4

比較的筋が良さそうな気がします.

TASKその2:確率分布で成績の予測値を算出

TASKその1で出した選手一覧を学習データとして以下の分類タスクを行いました.

  • 大谷翔平の最新成績が25歳(2019年)なので, そこに合わせて25歳の成績を抽出
  • いくつかの成績指標を元に, 選手の成績群を「超強い選手」「強い選手」「普通の選手」「弱い選手」というラベルを付与
  • 大谷翔平の25歳成績を予測データとして分類し, ラベルを求める. ちなみに分類はナイーブベイズで実施.*5

コードの雰囲気だけ載せます.

# 大谷翔平に似ている選手の成績がdfに入ってるとして

# 25歳の成績をOPSの降順で抜き出す
df_25 = df[df['age'] == 25].sort_values(by='OPS', ascending=False)

# 成績を4分類ほどに別ける. ちなみに4は適当.
df_25['category'] = pd.qcut(df_25['OPS'], 4, labels=False)


# ナイーブベイズでcategory分類を行う
from sklearn.naive_bayes import MultinomialNB

def naive_bayes(X, Y, predict_data):
    model = MultinomialNB()
    model.fit(X, Y)
    ret = model.predict(predict_data)
    return ret[0]

index = naive_bayes(
    df_25[['age', 'AB', 'HR', 'RBI', '他にもあるけど秘密']].values,  # 学習データ
    df_25['category'].values,  # 分類するラベル
    df_shoei_ohtani[['age', 'AB', 'HR', 'RBI', '他にもあるけど秘密']]  # 大谷翔平さん25歳の成績
)

# 得られた選手(index)と同じcategoryの選手から確率分布して成績算出(ややこしいので省略)

これで求められたラベルが付いた選手の確率分布から予測成績として,

  • 本塁打(HR)
  • 打点(RBI)
  • 安打(H)
  • 打数(AB)

を求めました.

ちなみに, 安打を打数で割ると打率(BA)になるので, 主要な打撃成績である「打率・打点・本塁打」が出揃うことになります.*6

機械学習で算出した「大谷翔平選手の26〜29歳」

さてさておまたせしました!これで算出した大谷翔平選手の成績です.

この先のグラフは,

X軸:年齢. 25歳(2019)までは実際の成績, 26歳(2020)以降は予測成績. なお, 2020年(26歳)はメジャーリーグが60試合しか無いため実際の数字はこれの1/3程度です(通常162試合やるので)

Y軸:各種成績. 今回は前述の通り, 本塁打(HR), 打点(RBI), 安打(H), 打数(AB)となります& H / ABで打率が計算できます.

を基本ルールとして記載しています.

全体感

f:id:shinyorke:20200727213215p:plain
AB(打数)の伸びと共に成績が上がってる感!

この先少しずつ数字の解説をしますが,

  • 年齢を重ねる毎にABが増えてる. 要するに出場回数が増える!(と今回のモデルが予想)
  • 28歳(2022年)に一度スランプの年が来るっぽい. ここだけグラフが谷になってる.
  • その翌年の2023年(29歳)にキャリアハイの成績を残す. メジャー6年目...リアルですねえ.

細かい数字も見てみましょう.

安打, 本塁打, 打点

まず基本成績となる,

  • 安打
  • 本塁打
  • 打点

に絞ったグラフです.

f:id:shinyorke:20200727214117p:plain
キャリアハイ(予定)の29歳で151安打, 32本塁打, 107打点

26〜28歳は順調に本塁打・打点が推移し, 29歳で突然30本塁打・100打点越えという突然強打者っぽい成績になるっぽいです(凄)

これでも現実あり得るかもっていうFACTがあって,

  • 同僚の強打者マイク・トラウトが32歳で, この時は流石にまだ数字が落ちない(と思われる)ので相乗効果で打点は稼ぎそう
  • エンジェルスいやメジャー全体でも期待をされている超若手有望株ジョー・アデルが24歳の年でこの時に丁度爆発しそうな予感!

大谷翔平さんだけ強打者, みたいなシチュエーションだと数字が伸びにくい可能性があるのですが, トラウトが衰える前, アデルがちょうど伸び盛りっていうタイミングで29歳というのは大谷翔平さん的に良いのでは説あります.*7

打率

野球ファン的に気にする人も多い打率はどうでしょう?

f:id:shinyorke:20200727214924p:plain
26歳(今年)で落ちた後, 0.265〜0.280台をキープっぽいですね.

思ったより打率は伸びなさそうです. どころか落ちますね...キャリアハイ(多分)の29歳でいい感じになりそうです.

これはもうちょっと原因を探りたいですがおそらく,

  • 長打を稼ぐ代わりに三振増える*8
  • 打数が増えるけどヒットがそれに続かないなりの理由がある

とか考えられます.

出塁率・長打率も見たいところですが今回は割愛します(まだ算出していない).

26〜29歳までの通算成績

表にしてみました.

年度 年齢 打率 本塁打 打点
2020 26 0.261 29 80
2021 27 0.265 32 85
2022 28 0.274 28 85
2023 29 0.281 32 107

これで指名打者のほかピッチャーできるんですよ, すごくないですか(こなみ)

大谷さんはそろそろエンジェルスとの契約を見直す時期だったと記憶していますが*9, この予測データを見る限りさっさと契約延長すべきとも言えます.

課題&結び

というわけで, 機械学習を用いた野球データサイエンスとして大谷翔平さんの成績を予測してみました.

それっぽい数字になったものの,

  • 細かい話は省略しますが, 年齢ごとの成績を確率分布で出すロジックに改善の余地がありそう. 今回は29歳の成績がMaxでしたがアスリートの肉体・精神の最高潮って28歳説があるのでチューニングするとかアリかも.*10
  • 打者の場合, 球場が広い・狭いなどで成績が変化する(いわゆるパークファクター)幅があるがそこを考慮に入れていない.
  • 未来の事なので, 大谷翔平が打者(投手)専任・移籍する・故障するetc...未来へのリスクは常に付きまとう.

など穴はそこそこあります.

すべてが埋まるかアレですが, PyCon JP 2020の発表までにいい感じにしようと思います!

pycon.jp

続きはPyCon JP 2020の前あたりにまた出せれば.

参考文献ほか

機械学習アルゴリズムの検討と実装はこちらを大いに参考にさせてもらいました.

野球の統計データ・考え方はいつもの本.

また, この話のVer.0的なやつは先日kawasaki.rbでやってきました.

*1:28か29ですが, まだ日は決まってません. 決まり次第お知らせします.

*2:使ったのはpandas, scikit-learn, plotlyそしてBigQuery Clientです.

*3:オルティス, ハフナー, エンカーナシオンとMLB好きな人なら定番な強打者から, 横浜ベイスターズにいたグリエル...の弟など渋い所がシレッと入ったりこれだけでもご飯お代りできるぐらい面白いです個人的には.

*4:大谷翔平が指名打者(DH)なので近いポジションが出るといいなと思っていましたがその通りになりました. ここは特徴量でちょっとした工夫をした箇所ですが詳しくはPyCon JP 2020で話したいお気持ち.

*5:ちなみにランダムフォレスト, ロジスティクス回帰など他のアルゴリズムも試しましたが結果は同じでした.比較的少量かつ次元数が少ないデータだったからかも?

*6:出塁率とかもそうですが, 率系の数字は元の指標が出れば計算で出せるのでそっちを優先しました.

*7:ただしこれは大いに取らぬ狸の皮算用, な所があります. トラウト, アデルの予測成績も見て判断したい所.

*8:打率は良い選手ですが三振は比較的多い(四球少ない)のが大谷さんの特徴でもあります.

*9:2021年で年俸調停の権利, 2024年でFA(参考). 2023年キャリアハイの場合, 球団視点では2022年, 選手視点では2023年に契約結び直しが良さそう.

*10:セイバーメトリクスではPeak AgeとかAging Curveと呼ばれているものがありまして, これらの検証・アルゴリズムの確定をすることでこの辺がシュッとなる...はずです.