Lean Baseball

No Engineering, No Baseball.

MLBの野球データを用いた分析と可視化のサンプル(Python)を公開しました

思ったよりプレミア12が面白くて盛り上がってる私ですこんばんわ!*1

PyCon JP 2015のトークセッション「野球Hack!~Pythonを用いたデータ分析と可視化」で披露した、MLBのオープンデータ「RETROSHEET」を用いたデモを披露させてもらいました。

そのデモで使ったコードを、「野球データを用いた分析と可視化」のお手本として本日公開いたしましたので報告します!

野球Hack!~Pythonを用いたデータ分析と可視化

サンプルコード(New!!!)

github.com

スライド

www.slideshare.net

動画

youtu.be

サンプルコード解説

何が出来るの?

今回公開した野球データ分析サンプル「hatteberg」は、

  • RETROSHEETcsvファイルを元にデータベース(MySQL 5.7)を作成
  • 上記データをJupyter notebook環境上で分析・可視化

を実現するために必要なモノを揃えました。

PyConJP 2015でお見せした、

のデモ(Jupyter notebookのコード)をサンプルとしてつけています。

どうやって実現しているのか?

MySQL DatabaseをDockerコンテナとして起動、RETROSHEETのデータを取得&データベースを作成するライブラリ「py-retrosheet」を実行してデータ取得、Jupyter notebookでアプリを起動、という方式で実現しています。

詳細な環境構築方法はREADME.mdをご覧ください。

特殊な手順や特別な技術は使っていないので利用はさほど難しくない、と思っています。

ただ、Dockerは使ったこと無い・あるけどまだ慣れていない等あると思いますので、Dockerを使いたくない人は手順を手元のMySQL環境に合わせて読みなおして使うといいと思います。

こだわりポイント

以下は公開にあたり、特にこだわったポイントです。

データ取得と作成のスピード向上

PyConJP 2015で登壇した時点では、py-retrosheetを使ったデータ作成に1年分で20分、デモでお見せした内容のデータ作成に1時間以上掛かっていたのですが、py-retrosheetの実装を見直し&ほぼゼロから作りなおした事により、10分も掛けずにデータを作れるようになりました!

元々のpy-retrosheetが持っていた問題と高速化のポイントについては下記にまとめたので興味ある方はぜひご覧ください!

qiita.com

Vagrant + AnsibleからDockerに移行

PyConJP 2015のデモではVagrantで立てたサーバー上にAnsibleでMySQLやらマイグレをしてデータを作成、という手順でしたが、最近は「気軽に作って壊して捨てて残せる」Dockerが自分の開発環境として一番使いやすいかつ、配布もし易いという事で、Dockerに完全移行しました!

本当はJupyter notebookも含めてDockerにできればよかったのですが、Jupyter絡みの問題にハマって結局MySQLのみになりました。*2

docker-composeでDBもアプリも一緒に立ちあげて気楽に開発出来る感じにしたかったのだが残念orz

Python 3対応

Jupyter notebook(IPython notebook)で作成していたアプリ部分は元々Python 3ベースでしたが、py-retrosheetを使ったデータ作成部分はPython 2のままでした。

こちらも上記の高速化対応の中でPython 3対応、厳密に言うとPython 3.5以上で使うように新たに作り直しました!

タイプヒントを使った記述がPython 3.5なのですが、スクリプトの性質上特にタイプヒントが必須という訳ではないのでこの辺はまあまあ自己満足の世界です笑

楽しみ方

Qiitaのリンクにあるとおり、15年分くらいのデータなら10分ちょっとで作れるのでイチローや松井の成績を追ってみたり、気になる試合のデータを眺めたりするのがベストな楽しみ方かと思います。

楽しみ方は発見次第こちらのブログでも紹介したいと思いますので、興味ある方は是非遊んでみてください!

*1:プエルトリコ戦4-5一点ビハインドでの9裏っていうシチェーションでブログ書いてます。なお、書いてる途中にサヨナラ勝ちしました。

*2:Jupyte notebookサーバーの立ちあげには成功するのですが、notebookを実行すると何故か上手く動かず断念しました。。。