※このエントリーの内容ですが、ソースコード公開含めパワーアップして別のエントリーにまとめました!!!新しい方を見るといいかもです!!!!
春季キャンプスタート!&週ベ*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を実行してデータを突っ込む
ちなみに、環境は
- クライアント(Chadwick+py-retrosheet実行):Mac OS 10.10.2(Yosemite)
- サーバー(Mysql):Ubuntu 14.04(64bit、Virtualbox上に構築)
割とどこにでもありそうな環境ですね。
MySQLサーバーのイメージをVagarnt + Ansibleで構築
Vagrantで適当にUbuntu 14.04のイメージをup、以下のプレイブックを使いMySQLのインストールおよびschemeを作成しました。
MySQL5.6をインストール&Application用のユーザーを作成、py-retrosheetのschema.sqlを実行しています。
なお、schema.sqlには一部タイポがあって、以下のとおり変更して実施する必要があります。
※2015/4/6現在、タイポは治ってるので対処不要です!
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とコードを書き換えました。
全ての準備が整ったら以下のコマンドでデータをダウンロードします。
python download.py -y 2014
-yは指定した年のデータをダウンロードするというオプションです。
全部下ろすとキツイので一年分ずつ下ろすといい感じです。
そして、下ろしたデータをparseしてMySQLに突っ込む為のおまじないはこちらになります。
python parse.py -y 2014
オプションはdownload.pyと同じです。これで2014年の全試合および全打席データがMySQL上で使用可能な状態になります。
とりあえず初期化とクリーニングはこれで何とかなります!
データの意味、具体的な使い方は、、、次のエントリーで。
*2:Pepperの件は当ブログの過去エントリーを参照。ちなみにもう手元にいないです。
*4:こちらも解決済み、新しいエントリーの方をご参照ください!最強の野球オープンデータ「Retrosheet」をPython+Vagrant+Ansibleで誰でも使えるようにしました - Lean Baseball