Lean Baseball

No Engineering, No Baseball.

最強の野球オープンデータ「Retrosheet」をPython+Vagrant+Ansibleで誰でも使えるようにしました

2ヶ月前のエントリーにはてブが入りまくった件で「そういえば続編書いてないや」と気が付き、エントリーしますた。

「誰でも」の定義および、このエントリーの対象読者について

「誰でも」というのは、

(エンジニアなら)誰でも

という意味です。

より具体的には、

  • 野球愛溢れるエンジニアにとって、Vagrant + Ansibleでのサーバー構築の練習&Pythonでのプログラミングという趣味実益を兼ねたいい感じのお勉強なるかつ、趣味の野球でhackが出来る二度美味しい内容です
  • 野球に興味が無い方にとっては野球愛溢れるエンジニア同様サーバー構築&Pythonネタとしていい勉強になるかもです。ただ、他にももっといいエントリーがあると思います
  • 非エンジニアの野球ファンの皆さまにとっては(小難しい的な意味で)ヘビーな内容となっていますので、覚悟してお読みください!ただ、プログラミングを覚えたい方にとっては凄くいい勉強になるかも

なお、事実上こちらのエントリーの続編となります!

shinyorke.hatenablog.com

おしながき

  • Retrosheetって何?
  • Vagrant + Ansibleで野球(MLB)データベースを作る
  • 試しにPythonで使ってみる
  • 今後の展開(≒私がやりたいこと)

Retrosheetって何?

Retrosheet(http://www.retrosheet.org/)は一言で言うと、

MLBの試合実況・スコアブックを元に作成された試合情報オープンデータ」

です。データの特性および作成経緯は本家HPおよび前回のエントリーをご参照ください。

特徴をザックリ言うと、

  • 約80年分の試合データ(Game logs)、および各試合の打席・走塁イベント(Event file)が公開されている
  • Game logs/Event file共にcsv形式だが、かなり独特の構成で使いにくい

独特かつ使いにくい、が知りたい方は是非ダウンロードしてzipを解凍してみてください。頭痛待ったなしです!

ちなみにデータの解説・仕様はこちらにあります。

Retrosheet Event Files

Retrosheet Game Logs

かなりの野球リテラシー、スコアブック読み力を要求される辛い(もしくは楽しい)仕様ですね!

Vagrant + Ansibleで野球(MLB)データベースを作る

CSVのままではExcelで読むことはできても、アプリの題材にしたりプログラミングしたりはできないので、以下のライブラリ達を使ってMySQL Serverにまとめてみました。

ついでに、同じように使いたい人もきっといるだろうと思い、

Vagrant + AnsibleでServerを自動構成&みんなで使えるようにPlaybookを公開しました!

Shinichi-Nakagawa/retrosheet-mysql-server · GitHub

詳細な利用方法はREADME.mdに譲りますが、基本的にはリポジトリをcloneして以下の2行で起動します。

※playbookの内容を見直し、実行の手順を簡素化&taskをsub task化しました(2015/4/11)

$ vagrant up

$ ansible-playbook -i hosts retrosheet_server.yml

この2行でライブラリのインストール、DB schemeの作成、データの入手とダウンロードまで全て行います。

【Appendix】Playbook内で利用しているライブラリ

試しにPythonで使ってみる

DBだけあっても何もできないので、ライブラリのサンプルも用意してみました。

Shinichi-Nakagawa/retrosheet-app-example · GitHub

試しにイチローさんが2014年、どんな打球を飛ばしたかの傾向を可視化してみます。

gist.github.com

こんな結果になりました。単打が多いイチローさんらしい結果になりました!!!

f:id:shinyorke:20150406185639p:plain

今後の展開(≒私がやりたいこと)

  • 投球および打席ベースの成績はほぼすべてとれるので、セイバーメトリクス的な指標を自分で書いたりして遊ぶ
  • ある日ある試合の打席やらスタメン表がとれるので、それを利用して超細かい野球選手名鑑(MLB)を作る
  • 投球情報(しかも一球毎!)を活用して「振り返り用Pitch f/x*2」を作る
  • 球場の情報とGISを紐付けて「アメリカ野球地図」アプリを作る。例えばこれで各チーム(30球団)のオールスターとか作っちゃったりetc...

やりたいことがたくさんありすぎます!

触ってみた方、居ましたらフィードバックよろしくお願いします&何か面白いことを一緒にやりましょう!

*1:単にlibへのリンクが無かっただけでしたw

*2:狭義の意味では、速度どころか球種まで割り出す「進化型スピードガン」の事だが、広義の意味では投球内容を指す