Lean Baseball

No Engineering, No Baseball.

最強の野球オープンデータ「Retrosheet」をPythonでHackしてゲームに勝つる何かを作ろう(序章)

※このエントリーの内容ですが、ソースコード公開含めパワーアップして別のエントリーにまとめました!!!新しい方を見るといいかもです!!!!

shinyorke.hatenablog.com

春季キャンプスタート!&週ベ*1野球選手名鑑号発売で球春がやってきましたねこんばんは!

PepperやらRaspberry Piやらに浮気をしていた私*2ですが、なんだか面白い野球のデータを見つけた&Hackしたいキモチが高まったので久々に野球Hackをしてみました!

とりあえずデータをクリーニングして使える所まできたのでレポート書きますねー

最強の野球オープンデータ「Retrosheet」

野球のデータといえばやはり「スコアブック」で、試合の結果、打者の打席結果、投手の投球内容を一挙手一投足追いかけたい訳で、そんなデータ無いかなぁ、、、と探してたらありました!!!

Retrosheet http://www.retrosheet.org/

1989年(平成の年)から、メジャーリーグの以下の記録を保存&公開しています。

  • 試合中のイベント(Play-by-Play)
  • 試合の記録(Game logs)
  • スケジュール(Schedule)

正式な記録は1989年かららしいですが、それ以前の記録も過去の実況テープから起こして(!?)記録しているそうです。

知ったキッカケはWeb+DB PRESS vol.84の特集「メジャーリーグのデータで学ぶ[速習]統計分析」という記事からです。

今までは野球のオープンデータといえばSean Lahman Databaseしか知らなかった私ですが*3、こんな素晴らしいデータがあった事を知らないこと自体に恥というか後悔を覚えました。

Retorosheetの賢い使い方

そんな最高のデータをGETしたのはいいですが、いざ入手してデータをみてみると、、、超使いにくい!!!!

アーカイブを解凍すると謎の拡張子で保存されたCSVが現れる、しかもデータ構造は行ごとに違うという、データクリーニング必須やん!

、、、っていう状況に陥ったわけですが、なんとそんなデータをCとPythonでHackした猛者のコードを見つけたのでこちらを拝借させて頂きました。

Chadwick: Software Tools for Scoring Baseball Games

wellsoliver/py-retrosheet · GitHub

ChadwickはRetrosheetのデータをParseして意味ある単位に出力するC言語製のライブラリで、py-retrosheetは、Retrosheetのサイトから指定した年のデータをダウンロード、ChadwickのコマンドでParseしてデータベース(MySQL/ポスグレ/SQLiteの三択)に格納してくれるという神ライブラリです。

もうこれはやるしか無い!と思い早速両方DLして使ってみました。

やったこと

  • MySQLサーバーのイメージをVagarnt + Ansibleで構築
  • ChadwickをDLしてビルド
  • py-retrosheetを実行してデータを突っ込む

ちなみに、環境は

割とどこにでもありそうな環境ですね。

MySQLサーバーのイメージをVagarnt + Ansibleで構築

Vagrantで適当にUbuntu 14.04のイメージをup、以下のプレイブックを使いMySQLのインストールおよびschemeを作成しました。

gist39dd25f92cebba45a7be

MySQL5.6をインストール&Application用のユーザーを作成、py-retrosheetのschema.sqlを実行しています。

なお、schema.sqlには一部タイポがあって、以下のとおり変更して実施する必要があります。

※2015/4/6現在、タイポは治ってるので対処不要です!

gist280e87d56c17f9b4f158

ChadwickをDLしてビルド

こちらはsourceforgeからコードをダウンロード、READMEに従いビルドしたらアッサリ使うことが出来るようになりました。

Yosemiteな人は手順に従いmakeしちゃってください。

なお、Ubuntuに入れようとした時は失敗しました、libが見つからないだのなんだの、やれば解決しそうな課題でしたが別にサーバーで実施する意味はないので今回はそっと閉じましたw *4

py-retrosheetを実行してデータを突っ込む

py-retrosheetをクローン、ちゃんと実行出来るようにSQLAlchemyやら何やらをインストールしました。

そしてconfig.iniを自分の環境に合わせて書き直しました。

ちなみに、私はMySQLのengineをPyMySQL(https://pypi.python.org/pypi/PyMySQL)にするため、以下の様な感じでiniとコードを書き換えました。

gistd378a1e09f25f3c817b1

gistd895f37cdc4177c83632

全ての準備が整ったら以下のコマンドでデータをダウンロードします。

python download.py -y 2014

-yは指定した年のデータをダウンロードするというオプションです。

全部下ろすとキツイので一年分ずつ下ろすといい感じです。

そして、下ろしたデータをparseしてMySQLに突っ込む為のおまじないはこちらになります。

python parse.py -y 2014

オプションはdownload.pyと同じです。これで2014年の全試合および全打席データがMySQL上で使用可能な状態になります。

とりあえず初期化とクリーニングはこれで何とかなります!

データの意味、具体的な使い方は、、、次のエントリーで。

*1:週刊ベースボールのこと

*2:Pepperの件は当ブログの過去エントリーを参照。ちなみにもう手元にいないです。

*3:Pythonではじめる野球プログラミング

*4:こちらも解決済み、新しいエントリーの方をご参照ください!最強の野球オープンデータ「Retrosheet」をPython+Vagrant+Ansibleで誰でも使えるようにしました - Lean Baseball