新卒採用アルバイト採用インターンシップJPENエンジニアレポート機械学習で本塁打の確率を予測してみた2019年07月17日ツイートベースボール事業部の大坂です。プロ球団向けのサービス開発に携わっています。「バレルゾーン」という言葉を聞いたことはありますか?バレルゾーンは打球速度と打球角度から定義された領域で、このゾーンに入った打球は本塁打など長打になる確率が非常に高くなります。これらのデータは、日本のプロ野球でも記事で目にする機会が多くなっていますね。MLBでは公式サイトでも説明がされていたり、打球速度ランキングなどで楽しめるくらいファンにも浸透してきています。バレルゾーンのように、データを使って特別な領域を可視化したり、事象の発生する確率を求めて分析したりすることは多くありますが、これを機械学習を使って求めたらどのように表現されるのでしょうか。いうわけで、今回は機械学習を使って、本塁打の確率を予測してみたいと思います。1.まずは実データを集計してみる機械学習を使う前に、まずは実際のデータを集計してみましょう。Savant」のデータ検索から、2018年MLBの打撃データを取得して使います。件数が12万件以上もあるので相当なデータ量ですね。ダウンロードしたCSVには多くのデータ項目がありますが、今回は以下に絞って使っていきます。Velocity」とも表現されます)launch_angle・・・打球角度events・・・打撃結果(今回は「home_run」をカウントします)データの中身を見てみましょう。「打球角度」を置いて、本塁打(home_run)がどのような割合で出ているかをグラフにしました。本塁打の割合が大きいほど色が濃くなります。だいたい90mph(≒145km/h)あたりから色が付き始め、打球速度(横軸)が大きくなるほど、打球角度(縦軸)の範囲が広がっています。これだけでも大まかな傾向は把握できそうです。90~100mphあたりや110mphを超える領域をみると、色がまばらで正確な情報を把握するのが難しくなります。赤い領域にはなんらかの傾向と連続性があるように見えますが、この範囲を求めることはできないのでしょうか。ここから機械学習を使って、この領域がどう表現されるかみていきましょう。2.機械学習で本塁打の確率を算出してみる機械学習は自前でサーバーや学習環境を準備しなくても、AWSやAzureなどのクラウドサービスを利用して試すことができます。AutoMLを使いました。統計学やPythonの知識がなくても、オリジナルでモデルを作成して、実際に利用するところまでいけました。流れを書くとこうなります。プロジェクトを作成する「Storage」で「バケット」を作成してCSVをアップロードする「テーブル」で「データセット」を作成するデータセットにバケットのCSVをインポートするデータセットのスキーマでターゲット列を決定するデータセットを分析する入力特徴を指定してトレーニングする(→モデルができる)トレーニング結果を評価する任意のデータを使って予測する使い方の詳細はヘルプや他の紹介サイトに委ねますが、ポイントだけいくつか記載しておきます。するバケットの作成では「Regional」を指定して、場所を「us-central1(アイオワ)」にしないと、データセットにCSVをインポートできませんでした。同じリージョンにしないと取り込みできないようです。今回は打球速度と打球角度から、本塁打を判定します。Savantから取得したデータには「home_run」という列がないので自分で作っておきます。「events」列で「home_run」となっていれば「1」、それ以外には「0」を設定します。機械学習では文字データを使わず、このように数値化しておく必要があります。3)トレーニングには時間がかかるデータ量が多くなるほどトレーニングには数時間かかります。どんな精度のモデルができるか、ワクワクしながら待ちましょう。無料トライアルではトレーニング時間が長くなると無料枠の消費も気になりますね。4)トレーニングの評価はこうなったトレーニングで作成されたモデルの評価には様々な指標があります。指標の説明はさて置き、今回のモデルは精度が97.1%と出ました。スコア」が0.640となっているあたりは、少し気になるところでもあります。5)このモデルを使って予測してみるモデルができれば、あとは任意のデータを流し込んで結果を取得できます。結果はこのようになりました。先ほどの実データを緑で重ねて比較してみます。丸みを帯びた境界ラインがきれいに重なっているように見えます。実データでは評価できなかった、110mph以上の領域も出力されています。ちなみに110mphで本塁打が50%以上になる角度は20~44°と出ました。これはなかなか良い学習結果が得られたのではないでしょうか。)を渡すと、レスポンス(本塁打の確率)を返してくれます。関数みたいなものですね。実際のプレーデータを渡して結果をみてみましょう。例として、MLBエンゼルスの大谷翔平選手が7月7日の前半戦最終試合で、2打席目にレフトへの14号本塁打(看板直撃!)、4打席目にはセンターへの大きな飛球(フライアウト)を放ちました。この2つの打球をモデルに渡して予測してみます。66.4%2打席目は本塁打の確率が98.3%と、ほぼ完璧な打球だったことがわかります。看板直撃も頷けますね。一方で4打席目は66.4%とこちらも高めの数値ではありますが、もう少し勢いがあれば、、という性質だったことがこの結果から確認できます。PlatformのAutoMLを使った機械学習により、打球速度と打球角度をパラメーターとして本塁打の確率を返すモデルを作成してみました。機械学習を使うことで、実データでは評価できない領域までを定義して、実際の打球から打撃結果を予測できるようになりました。対象として2018年MLBのデータを使用しましたが、別シーズンのデータを使ったり、日本のプロ野球やアマチュアのデータを使えば、また違ったモデルを作成することができそうです。パラメーターは2つの変数だけでしたが、本塁打に影響する要素はなんだろう?と考えてみると、ライトやレフトなどの打球方向、フェンスの高さや距離、風向きや風速、投球の性質など、様々なものが思い浮かびます。このようなパラメーターをさらに増やして、より深みのあるモデルを作成することもできそうです。今回は本塁打に絞って評価してきましたが、ここまでレポートを書いてくると、安打の確率はどうなの?という疑問も湧いてきますね。最後にそれもご紹介しておきます。赤は確率が低く、青が濃くなるほど長打率が高くなっています。興味深い絵になったのではないでしょうか。機械学習を使ってこのように予測することで、野球に対する理解の幅が益々広がっていきそうですね。エンジニア募集中!データスタジアムでは一緒に働いていただけるエンジニアを募集しています。野球、サッカー、バスケなどスポーツが好きな方であれば、とても面白い仕事ができる会社です。興味を持たれた方はぜひこちらをご覧ください。