エンジニアレポート

機械学習で本塁打の確率を予測してみた

2019年07月17日

ベースボール事業部の大坂です。主にプロ球団向けのサービス開発に携わっています。

早速ですが「バレルゾーン」という言葉を聞いたことはありますか?

バレルゾーンは打球速度と打球角度から定義された領域で、このゾーンに入った打球は本塁打など長打になる確率が非常に高くなります。これらのデータは、日本のプロ野球でも記事で目にする機会が多くなっていますね。MLBでは公式サイトでも説明がされていたり打球速度ランキングなどで楽しめるくらいファンにも浸透してきています。

バレルゾーンのように、データを使って特別な領域を可視化したり、事象の発生する確率を求めて分析したりすることは多くありますが、これを機械学習を使って求めたらどのように表現されるのでしょうか。

というわけで、今回は機械学習を使って、本塁打の確率を予測してみたいと思います。

1.まずは実データを集計してみる

機械学習を使う前に、まずは実際のデータを集計してみましょう。データは「Baseball Savant」のデータ検索から、2018年MLBの打撃データを取得して使います。件数が12万件以上もあるので相当なデータ量ですね。ダウンロードしたCSVには多くのデータ項目がありますが、今回は以下に絞って使っていきます。

  • launch_speed・・・打球速度(「Exit Velocity」とも表現されます)
  • launch_angle・・・打球角度
  • events・・・打撃結果(今回は「home_run」をカウントします)

データの中身を見てみましょう。横軸に「打球速度」、縦軸に「打球角度」を置いて、本塁打(home_run)がどのような割合で出ているかをグラフにしました。

010_speed_angle_data

本塁打の割合が大きいほど色が濃くなります。だいたい90mph(≒145km/h)あたりから色が付き始め、打球速度(横軸)が大きくなるほど、打球角度(縦軸)の範囲が広がっています。これだけでも大まかな傾向は把握できそうです。

ただ、90~100mphあたりや110mphを超える領域をみると、色がまばらで正確な情報を把握するのが難しくなります。赤い領域にはなんらかの傾向と連続性があるように見えますが、この範囲を求めることはできないのでしょうか。

ではここから機械学習を使って、この領域がどう表現されるかみていきましょう。

2.機械学習で本塁打の確率を算出してみる

機械学習は自前でサーバーや学習環境を準備しなくても、AWSやAzureなどのクラウドサービスを利用して試すことができます。今回はGoogle Cloud Platform(GCP) のAutoMLを使いました。統計学やPythonの知識がなくても、オリジナルでモデルを作成して、実際に利用するところまでいけました。

ざっと流れを書くとこうなります。

  1. プロジェクトを作成する
  2. 「Storage」で「バケット」を作成してCSVをアップロードする
  3. 「テーブル」で「データセット」を作成する
  4. データセットにバケットのCSVをインポートする
  5. データセットのスキーマでターゲット列を決定する
  6. データセットを分析する
  7. 入力特徴を指定してトレーニングする(→モデルができる)
  8. トレーニング結果を評価する
  9. 任意のデータを使って予測する

使い方の詳細はヘルプや他の紹介サイトに委ねますが、ポイントだけいくつか記載しておきます。

1)バケットはus-central1 にする

バケットの作成では「Regional」を指定して、場所を「us-central1(アイオワ)」にしないと、データセットにCSVをインポートできませんでした。同じリージョンにしないと取り込みできないようです。

2)トレーニングデータには工夫が必要

今回は打球速度と打球角度から、本塁打を判定します。目的変数と説明変数を設定して、「教師あり学習」という手法で学習していきます。

  • 目的変数・・・本塁打(home_run)[0, 1のカテゴリデータ]
  • 説明変数・・・打球速度(launch_speed)、打球角度(launch_angle)[実際の数値データ]

Baseball Savantから取得したデータには「home_run」という列がないので自分で作っておきます。「events」列で「home_run」となっていれば「1」、それ以外には「0」を設定します。

機械学習では文字データを使わず、このように数値化しておく必要があります。

3)トレーニングには時間がかかる

データ量が多くなるほどトレーニングには数時間かかります。どんな精度のモデルができるか、ワクワクしながら待ちましょう。

ただ、無料トライアルではトレーニング時間が長くなると無料枠の消費も気になりますね。注意しましょう。

4)トレーニングの評価はこうなった

トレーニングで作成されたモデルの評価には様々な指標があります。指標の説明はさて置き、今回のモデルは精度が97.1%と出ました。なかなか良さそうです。ただ、「AUC PR」が0.757、「F1 スコア」が0.640となっているあたりは、少し気になるところでもあります。

010_gcp_image3

5)このモデルを使って予測してみる

モデルができれば、あとは任意のデータを流し込んで結果を取得できます。早速実行しましょう。結果はこのようになりました。先ほどの実データを緑で重ねて比較してみます。

010_speed_angle_pileup

いかがでしょうか。丸みを帯びた境界ラインがきれいに重なっているように見えます。そして、実データでは評価できなかった、110mph以上の領域も出力されています。ちなみに110mphで本塁打が50%以上になる角度は20~44°と出ました。これはなかなか良い学習結果が得られたのではないでしょうか。

6)このモデルで実際のプレーを評価してみる

作成したモデルは、パラメーター(打球速度、打球角度)を渡すと、レスポンス(本塁打の確率)を返してくれます。まさに関数みたいなものですね。実際のプレーデータを渡して結果をみてみましょう。

例として、MLBエンゼルスの大谷翔平選手が7月7日の前半戦最終試合で、2打席目にレフトへの14号本塁打(看板直撃!)、4打席目にはセンターへの大きな飛球(フライアウト)を放ちました。この2つの打球をモデルに渡して予測してみます。

<大谷翔平選手 2019/7/7>
・2打席目:106.3mph、34.0°98.3%
・4打席目:95.8mph、27.4°66.4%

2打席目は本塁打の確率が98.3%と、ほぼ完璧な打球だったことがわかります。看板直撃も頷けますね。一方で4打席目は66.4%とこちらも高めの数値ではありますが、もう少し勢いがあれば、、という性質だったことがこの結果から確認できます。

4.まとめ

Google Cloud PlatformのAutoMLを使った機械学習により、打球速度と打球角度をパラメーターとして本塁打の確率を返すモデルを作成してみました。機械学習を使うことで、実データでは評価できない領域までを定義して、実際の打球から打撃結果を予測できるようになりました。

対象として2018年MLBのデータを使用しましたが、別シーズンのデータを使ったり、日本のプロ野球やアマチュアのデータを使えば、また違ったモデルを作成することができそうです。

また、パラメーターは2つの変数だけでしたが、本塁打に影響する要素はなんだろう?と考えてみると、ライトやレフトなどの打球方向、フェンスの高さや距離、風向きや風速、投球の性質など、様々なものが思い浮かびます。このようなパラメーターをさらに増やして、より深みのあるモデルを作成することもできそうです。

今回は本塁打に絞って評価してきましたが、ここまでレポートを書いてくると、安打の確率はどうなの?という疑問も湧いてきますね。最後にそれもご紹介しておきます。赤は確率が低く、青が濃くなるほど長打率が高くなっています。なかなか興味深い絵になったのではないでしょうか。機械学習を使ってこのように予測することで、野球に対する理解の幅が益々広がっていきそうですね。

010_speed_angle_hits

エンジニア募集中!

データスタジアムでは一緒に働いていただけるエンジニアを募集しています。野球、サッカー、バスケなどスポーツが好きな方であれば、とても面白い仕事ができる会社です。興味を持たれた方はぜひこちらをご覧ください。

エンジニアトップ エンジニアインタビュー エンジニアレポート

  • 採用情報
  • おしらせ
  • 掲載事例

ページトップヘ