見出し画像

MLBデータ分析もどきの初歩の初歩(Python)

はじめに

IT後進国と言われて久しい日本ですが、かくいう筆者の勤務先でも「時代はAIだ」「ITパスポート取れ」「プログラミング言語勉強しろ」といった今更感満載のにわかDX運動が巻き起こっており、泣く泣くPythonを勉強することになってしまいました。

しかし、単に勉強するだけではつまらない上、野球のデータ分析でもPythonが使われているらしいので、趣味も兼ねて分析のような実験をしてみたいと思います。

上記の通り、書いている人間は初心者な上、記事の内容も大したことはありません。
ですが、「数字に興味はあるけどプログラムってなんですか」という方のお役に立てばこれに勝る喜びはございません。

よくあるつまづきポイント

分析は料理と似たところがあります。料理には食材と調理器具が必要ですが、分析にも食材となる「データ」と調理器具となる「ツール」が必要になります。色々なWebサイトで数字を目にしますが、どこもこの料理のようなことをやっています。

「では自分もやってみたい」となる(なってくれたらいいなあ…)のですが、いざこれに手をつけると結構な壁にぶち当たります。大きなものは2つあると思います。

素材(データ)の問題

分析とは「ある物事を分解して、それらを成立させている成分・要素・側面を明らかにすること」です。つまり、分析の対象となる「ある物事」、つまりデータはある程度大きくなければいけません。しかし、このデータを探す段階で問題が2つあります。

  1. まとまったデータがない
    日本人なので日本のプロ野球(NPB)のデータを使いたいところですが、悲しいかな、NPBには一般人が使えるまとまったデータの塊が存在しません。毎日の試合のデータをちまちま集めて塊にすることもできますが、それなりに苦行なのでやはり悲しい気持ちになります。

  2. まとまったデータがあってもでかすぎる
    まとまったデータは存在するものの、その行数や容量が大きすぎると、処理の上で問題が起こりえます。数十万行もあるデータをExcelで開くと数分かかったりしますが、大きなデータを扱うにはそれに適したツール(調理器具)が必要になります。

調理器具(ツール)の問題

前述のように、大きなデータを扱うためには、それに適したツールが必要となります。具体的に言えば、小さなデータを扱うならばExcelでも十分ですが、大きなデータを扱うにはRやPythonといったプログラミング言語を駆使することが必要となってきます。
しかし、ここでも問題が2つあります。

  1. 環境構築が面倒
    プログラミング言語を使うためには、それを実行するための環境をお使いのPC等に構築しなければなりません。
    知識がある人ならば簡単かもしれませんが、素人が手を出すとかなり手間取ります。慣れない黒い画面、指示通りにコマンドを書いても出てくるエラー等々、思い通りにいかない現実の中で自分でも何をしているのか分からず、悲しくなって結局嫌になりがちです。

  2. 奥が深すぎてとっつきにくい
    RやPythonといった言語は実際のビジネスでも使われるように、実用的かつ広範囲に応用可能なものです。プログラミング言語の中では情報が多く、難易度は低めとされますが、そうは言ってもプログラミング言語です。ボタンを押せば済むようなものではなく、文字で指示を与える必要があります。
    様々なサイトを見ればサンプルも豊富にあります。しかし、右も左もわからないうちは何をしているのかがさっぱり分からず、疎外感を味わうこともあります。これが積み重なると、やっぱり嫌になって投げてしまいがちです。

で、どうするの?

ここまで「素材(データ)」と「調理器具(ツール)」の問題を述べましたが、文句ばかり言っても始まりません。そのような人は会社の働かないおじさんで十分です。
では、どうすれば良いのでしょうか。

データの対策:MLBのデータを使う

NPBにおけるデータの問題は前述の通りですが、かたやメジャーリーグ(MLB)ではこのようなデータの塊が一般にも無料で開放されており、これを使って気軽に分析を行うことが可能です。よって、今回はMLBのデータを使用します。

ツールの対策:Google Colabを使う

「Google Colaboratory(Colab)」は、Googleが提供するブラウザベースのPythonの実行環境です。簡単に言うと、ブラウザでPythonを使えるツールです。
Gmailのアカウントがあれば利用でき、基本は無料です(今回のサンプルも無料でできます)。余談ながら、Googleドライブ上のファイルを読み込んだりすることもできます。

Colabを使うメリットは、1にも2にも実行環境の構築が不要なことです。見知らぬソフトを入れたり、謎の呪文のようなコマンドを打っては出てくるエラーにキレる必要もありません。
よって、今回はColabを利用し、Pythonというプログラミング言語による簡単な分析めいたことを行います。最低限のプログラミングは必要ですが、極力少ない内容&コピペのみでできるようにします。
が、書いている人間も大概素人なこともあり、やることも大した内容ではない点はご容赦ください。

分析もどきをやってみる

前提

当たり前かもしれませんが、以下の環境を前提とします。

  • PCを使っていること

  • Gmailにログインしていること

ステップ1:Colabへのアクセス・ファイル作成

Googleで「Google Colab」と検索すると以下のページが出てくるのでアクセスします。

よくわからない画面が出てきますが、とりあえず左上の「ファイル」から「ノートブックを新規作成」をクリックします。これでPythonを使うためのファイル(ノートブック)が作られます。

画面左上の「ノートブックを新規作成」をクリック

ノートブックを作成すると、プログラムの入力画面が表示されます。スプレッドシートくらいの気軽さで触っていますが、れっきとしたPythonの実行環境です。

基本的な使い方は、コードを書いたら左の実行ボタンを押すだけです。別のコードを足したい場合は、コードを入れるところ(「セル」と言います)の下にある「+コード」ボタンを押してください。

サンプルのコードを書いていますが、特にコピペする必要はありません

ステップ2:pybaseballのインストール

いきなり「pybaseball」なる横文字が出ましたが、これがMLBのデータ分析に必要な食材と調理器具のセットです。

pythonには「ライブラリ」と呼ばれるものがたくさんあります。いわゆる魔法のようなものです。魔法の中でもファイアは炎、サンダーは雷といったように、複数の種類が存在します。pythonの世界も同様で、用途に応じて様々なライブラリを使い分ける必要があります。

ColabはGoogleが提供しているだけあり、すでに様々なライブラリがインストールされているのですが、pybaseballは含まれていません。このため、利用者がインストールする必要があります。
とはいえやることは簡単で、以下の1行コードをコピペして実行するだけです。

!pip install pybaseball
10秒くらいで終わります

たった1行のコードでいきなり文字がずらっと出るため、何か悪いことをした気になりますが正常です。念のため、末尾の出力に「Successfully Installed」とあるのを確認できれば1万点です。

これでMLBのデータ分析を行う準備が整いました。

Step3:大谷翔平選手の投球データを分析してみる

pybaseballにはStatcast、FanGraphs、Baseball Reference等、MLBで用いられる主要なデータの塊(データセット)が含まれていますが、あくまで素人による最初のお試しですので、高望みはせずに簡単な分析もどきを行います。内容は以下とします。

  • Statcastのデータを利用

  • 対象とする選手は大谷翔平選手(2023年、投手として)

  • 算出する数値は球種ごとの平均球速・回転数

(とんでもなく簡単ですが)やることは決めたので、次はどのようにやるかを決める必要がありますが、流れは以下のようになります。やることはコピペだけです。

  1. 選手IDの確認

  2. 分析対象データの抽出

  3. 求めたい数値の算出

Step3-1 :選手IDの確認

大谷翔平選手のデータを扱うにあたっては、まず選手IDを確認する必要があります。100年以上の歴史を持つMLBの世界ゆえ、同姓同名の選手が複数いるケースも往々にしてあるため、名前ではなくその選手唯一の値であるIDを調べる必要があるわけです。
必要なコードは以下となりますので、コピペして実行してください。

なお、インストールしたライブラリを使う際には呼び出しが必要となります。また、「#」で始まる行は説明(コメント)なので、なくても動作には影響しません。

# ライブラリの呼び出し
from pybaseball import playerid_lookup
# 選手の検索(Lastname, Firstnameで指定)
playerid_lookup('ohtani', 'shohei')
いろんな数字や文字が出ます

コードを実行すると、上の画像のような結果が出力されます。様々な値がありますが、これはpybaseballが扱う様々なデータソースによってIDが異なるため、それぞれのIDを表示しているものです。
今回使用するStatcastのデータに必要なIDは「mlbam」と決められているので、大谷選手のIDは「660271」であると確認できます。

Step3-2:分析対象データの抽出

大谷選手のIDが確認できたら、次に同選手の2023年における投球データを切り出します。Statcastは10年以上にわたる1球ごとのデータが格納されており、とんでもなく膨大なデータセットとなっているため、必要な部分だけを切り出すことでさっさと分析できるようにします。
やることは同じようにコピペのみです。

# ライブラリの呼び出し
from pybaseball import statcast_pitcher
# 大谷選手の投球データ抽出(2023/3/30〜2023/10/1)
data = statcast_pitcher('2023-03-30', '2023-10-01', 660271)
# 結果の表示(最初の5行だけ)
data.head()
5行 x 92列の表が出力されます

92列という値が出ていますが、これはStatcastが1球ごとに92種類のデータを取得していることを意味しています。それだけで圧倒されそうですが、今回算出したいのは「球種ごとの平均球速・回転数」なので、球種・球速・回転数の3つで十分です。

なお、Statcastで取得しているデータの定義については、MLBがリファレンス(英語)を出していますので、ご興味のある方はご参照ください。

Step3-3:求めたい数値の算出

先ほど抽出したデータから、球種別に球速・回転数の平均値を求めるコードを入力します。例によってコピペのみです。
なお、出力結果は小数点第1位までの表示としています。

#球種ごとの平均値を算出
data.groupby('pitch_type').mean()[['release_speed','release_spin_rate']].round(1)
Warningが出ていますが気にしなくて大丈夫です

1行のコードを実行することで、求めたい数値を算出することができました。
Statcastからデータを集計・可視化しているBaseball Savantのデータと同じ値となっていることが確認できるかと思います。

これで分析もどきは完了です。ありがとうございました。

おわりに

繰り返しとなり恐縮ですが、本記事の内容はあくまでとっかかりのとっかかりです。PythonにせよRにせよ実現できることはほぼ無限にあり、より高度な分析や可視化はもちろんのこと、(特にPythonでは)機械学習を用いた予測も行うことが可能です。

「分析」というと肩肘を張ったようなイメージがありますが、あまり準備をしなくても無料で気軽にコードを書ける環境があり、野球のデータに触れられる機会があることをご存知いただければ幸いです。

参考サイト様

この記事が気に入ったらサポートをしてみませんか?