The Art Of Programming A Baseball Game!!!野球Hack!~Pythonを用いたデータ分析と可視化
Shinichi Nakagawa@shinyorke Kawasaki.rb #28 2015/9/30
お前だれよ• Shinichi Nakagawa(36)
• Recruit Sumai Company, Ltd.(入社1年)
• Web Application Engineer(メインはServer Side)
• Agile/Python/Infrastructure as a codeが大好き
• 北海道日本ハムファイターズ &オークランド・アスレチックスの大ファン
• 中島卓也(日)、ソニー・グレイ(OAK)、ココ・クリスプ(OAK)推し
• “野生の野球アナリスト”活動とかいう伝導活動
• PyCon JP 2014 Talk Session(去年のやつ)
• MLBオープンデータ分析&可視化サービスをPythonで構築
• はてブ200超え、PV 14,000以上(slideshare)
Other…
• ブログで野球Hackの成果および考察を披露(不定期)
• MLBオープンデータの紹介と活用例紹介
• 野球データの分析&解析用のライブラリをGithubで公開(ほぼPython製)
• データドリブン野球解説 ※後ほど解説
最終目標(40歳までに)
• エンジニア×ビジネスマンとして、
日本プロ野球orMLBの仕事をやる!
※日本12球団+MLB30球団のオファー待ちw
• 野球データとエンジニアの知見を活かし、2020年東京五輪でメダル獲得のサポート
※選手じゃないですw、エンジニアとして、ね。
プロトタイピングが楽
• 野球Hackは整形されたデータ(スコアブック)と、整形されていないデータ(スコアブック以外のデータ)の解釈と前処理がメイン→使いこなすまで、プロトタイピングが続く
• 前処理・分析・可視化がオールインワンで出来るPythonが楽でいい
→Jupyter, pandas, matplotlib, この3つでほぼイケる
Python is 全部載せ
ライブラリ
• インフラ構築・管理 Ansible, docker-compose, boto3, etc…
• データ分析・可視化 Jupyter, pandas, matplotlib, etc…
• Webアプリ構築Django, Flask, bottle etc…
Pythonはユーティリティープレイヤー( ー`дー´)キリッ
仮想環境
• pyenvで実行環境切り替えOSのPythonに縛られない開発.
Python3.4.3→3.5.0移行がすんなり行けた
• virtualenvでパッケージ管理
アプリのプロジェクトと分析のプロジェクトでパッケージ管理を別々に扱う
• docker-compose(旧名fig)でServer丸ごとスクラップ&ビルド
実行環境をDockerで管理、大胆に「作る」→「壊す」を行う環境を実現
「作る」→「壊す」→「作る」→「壊す」(以下略)
なんでや!Pythonじゃなくてもできるやろ!!※ボールの判定に不服なバルフォアさん、ではありません
元画像:http://www.sbs.com.au/
はい、Pythonじゃなくできます
• インフラ管理・構成
部分的にVagrantを使用、ちなみにChefはやめた.
• データ分析・可視化
得意な人はR・Juliaでいいと思う、野球HackをRでやってる方もいます.(他の言語は、、、どうなんだろう?)
• Webアプリ構築APIやバッチならGolang, サイトならRuby On Rails他選択肢がたくさん有り〼
• 仮想化Rubyのrenv/rbenv-gemsetも素敵ですよね☆
目的(と好み)に合わせて手段を柔軟に変えましょう
俺々開発ルール(やきう版)
• スクラップアンドビルドしやすい環境で作る
• 野球は仮説検証・技術リスクが高いネタが多い(特に前者)
• Sandbox環境で仮説・技術リスクを検証,いらないものは捨てる
• シンプルに作る(疎結合・環境非依存)
• 豊富なライブラリおよび仮想環境活用で実装と環境をシンプルに
• 特にホストOSには依存しない作りにする(Macだけ、Linuxだけルールはナシ)
• 繰り返し作業は自動化
• データベース作成、前処理まではある程度決まった作業なので自動化
Pythonが一番やりやすいってことです
元ネタ(過去ブログより) http://shinyorke.hatenablog.com/entry/
2015/04/06/190243
やりたかったこと
• やきうゲーム「Fantasy Baseball」に勝つため、選手の詳細な情報(打席、投球など)が欲しい
• 「Retrosheet」というデータにそれらが詰められてるらしい
• よし!Retrosheetデータベースを作ろうじゃないか!
Retrosheet is 何?
• メジャーリーグのスコアデータ集
• 1887~2014(昨シーズン)までのデータをCSVで配布 ※
1989以前は欠損有り
• スコアブックで得られる情報(得点、失点、スタメン、打席結果etc…)と選手情報(名前、ポジションなど)がひと目でわかる
• http://retrosheet.org/
やったこと
• Vagrant + AnsibleでMySQL Server構築
• SQLAlchemy + py-retrosheetでmigration
• Jupyter(IPython notebook)とpandasで分析
• matplotlibで可視化
サーバー構築とmigration
$ vagrant up$ ansible-playbook -i hosts retrosheet_server.yml
この2行でサーバーを作れるようにしました!
※VagrantとAnsibleを導入している前提です
PY-RETROSHEET - やきうScript
• Retrosheet専用Download&migration script
[email protected]:wellsoliver/py-retrosheet.git
• データ取得からDB(MySQLなど)へのmigrationを一気通貫に行う
• 細々と開発が続いてる(っぽい)
Jupyter+pandas+matplotlib
• 平たく言えば、「ブラウザ上で使えるPythonその他のSandbox環境」
• データやLibraryが不確実(≒使いこなせていない)時の試し打ちとして最高すぎる環境
• pip install コマンドでちょいちょいとインストールしたらアッサリ環境が出来ます
松井(2004) VS 松井(2011)
• 外野に飛んだヒットを分類&可視化
• 2004・2011共にセンター~ライトへの打球が多い(センター返しor引っ張り)
• 2011年、本塁打と三塁打が恐ろしく少ないあっ(察し
2004(ヤンキース) 2011(アスレチックス)
まとめ シモンズの守備ってまとめに相応しいよね
元画像: http://a.espncdn.com/photo/2013/1028/mlb_nl-gloves_06.jpg
Python + Baseball
• 「野球Hackで迷ったらPython!」
• とはいえ、目的や好みに合わせて言語やFWを選ぶの大切!
→効率化&自分の武器が増えるという意味で
• 好きなデータを好きな言語でHackすると楽しいよ(^O^) ※2年連続2回目
これからの野球Hack(1年後)
• 「データドリブン野球解説」を通じて新しい野球とスポーツの可能性を説いて生きたい!!
• “これが、新しい野球. 既存の野球を軽く飛び越え,私たちは新しいスポーツの楽しみを知る”
• 質が高い解説をするための情報収集&分析と基盤の整備
“”” わたしの関心事は、野球だけ。いったいなぜだろう? それは、ほかの分野の数字と違って、野球のデータには言葉と同じ力があるからだ。 “”” - ビル・ジェームズ(セイバーメトリクスの父) 書籍「マネー・ボール」第四章より