野球hack!~pythonを用いたデータ分析と可視化 #pyconjp
TRANSCRIPT
野球Hack!~Pythonを用いたデータ分析と可視化 - The Art Of Programming A Baseball Game! -
Shinichi Nakagawa@shinyorke PyCon JP 2015 Talk Session(2015/10/11)
Who am I ?
• Shinichi Nakagawa(@shinyorke)
• Recruit Sumai Company, Ltd.
• Pythonista/Agile/Baseball Scientist
• 贔屓チーム
• 北海道日本ハムファイターズ(NPB)
• オークランド・アスレチックス(MLB)
• “野生の野球アナリスト”活動
“野生の野球アナリスト” 活動
• PyCon JP 2014 Talk Session(去年のやつ)
• MLBオープンデータ分析&可視化サービスをPythonで構築
• はてブ200超え、PV 14,000以上(slideshare)
• PyCon JP 2014 Lightning Talk(去年のやつ)
• Agileプロセス活用、アダム・ダン率の紹介
• アダム・ダンさん、Python界隈で有名になる
Other…
• ブログで野球Hackの成果および考察を披露(不定期)
• MLBオープンデータの紹介と活用例紹介
• 野球データの分析&解析用のライブラリをGithubで公開(ほぼPython製)
• データドリブン野球解説 ※後ほど解説
最終目標(40歳までに)
• エンジニア×ビジネスマンとして、 日本プロ野球orMLBの仕事をやる!※NPB12球団+MLB30球団のオファー待ってます
• 野球データとエンジニアの知見を活かし、 2020年東京五輪でメダル獲得のサポート ※エンジニアとして(選手にはならないw)
Today’s Starting Member
• Pythonと野球
• MLBオープンデータ活用とPython
• Pythonで「俺々野球分析基盤」
• まとめ - これからの野球Hack
Pythonと野球
なぜ野球×Pythonなのか?
• 野球データと野球Hack
• Pythonと野球Hack
野球データ(嬉)
• ボックス・スコアによる正規化済みのデータが存在
• 打撃・投球・試合の成績がボックス・スコアで読みやすい・書きやすいフォーマットでまとまっている
• 使えるデータが存在
• メジャーリーグはオープンなライセンスで使えるデータが存在 (利用制限ほぼなし)
• 日本プロ野球はデータをぶっこ抜く自動的に取得する仕組みを自作することにより入手可能(当然、利用は制限される)
ボックス・スコア※Sportsnaviより
野球データ(辛)
• データの解釈
• ボックス・スコア自体は読みやすいが、解釈そのものはルールや規約を正確に読む必要がある例)振り逃げはどう記録される? インフィールドフライの条件とは?
• ボックス・スコアには乗らないデータの存在
• 投手の球速、変化球の種類、打球の速度や着地点etc…
ボックス・スコアに乗らないデータが存在&独自のフォーマットでの記載が多く読み書きが難しい
野球Hackの掟
• スクラップアンドビルド
• データを読む→仮説を立てる→コードを書く→可視化する→検証→またデータを読む…の繰り返し、コードを書いては壊すを繰り返す作業が大半
• データの読み書きとルールの勉強
• 野球の記録の読み方、記録がつく理由を把握する為にルールを勉強 →ルールを正確に把握するため、公認野球規則&審判の知識が必要 ※実際本を買って勉強してます(実話)
Pythonと野球Hack• インフラ管理・構成
Ansibleおよびdocker compose(というよりDocker)を活用、すぐ作れる&壊せるインフラで思う存分スクラップアンドビルドを!
• バージョン&パッケージ管理 pyenv + virtualenvでバージョン&パッケージ管理をプロジェクト単位で切り替え.
→特定のPythonバージョン&パッケージに依存しない作り.
• データ分析・可視化 IPython notebook + pandas + matplotlibでカジュアルに分析&可視化.
面倒くさいQUERYなどはSQLAlchemyなどで型化.
• Webアプリ構築 サクッと作る目的でFlask/bottle、しっかり作る目的でDjangoを使う.
なんでや!Pythonじゃなくてもできるやろ!!※ボールの判定に不服なバルフォアさん、ではありません
元画像:http://www.sbs.com.au/
はい、Pythonじゃなくできます
• インフラ管理・構成部分的にVagrantを使用、ちなみにChefはやめた.
• バージョン&パッケージ管理Rubyのrenv/rbenv-gemsetなど、他の言語にも当然ながら存在.
• データ分析・可視化得意な人はR・Juliaでいいと思う、野球HackをRでやってる方もいます.(他の言語は、、、どうなんだろう?)
• Webアプリ構築APIやバッチならGolang, サイトならRuby On Rails他選択肢がたくさん有り〼
目的(と好み)に合わせて手段を柔軟に変えましょう
MLBオープンデータとPython
元ネタ(過去ブログより) http://shinyorke.hatenablog.com/entry/
2015/04/06/190243
やりたかったこと
• 野球ゲーム「Fantasy Baseball」に勝つため、選手の詳細な情報(主に成績)が必要に
• MLBのオープンデータ「Retrosheet」にそれらが詰められてるらしい
ワイ「データベースつくればいいじゃん!」
Retrosheet is 何?
• メジャーリーグのスコアデータ集
• 1887~2014(昨シーズン)までのデータをCSVで配布
※1989以前は欠損有り
• スコアブックで得られる情報(得点、失点、スタメン、打席結果etc…)と選手情報(名前、ポジションなど)がひと目でわかる
• http://retrosheet.org/
やったこと
• Vagrant + AnsibleでMySQL Server構築
• SQLAlchemy + py-retrosheetでmigration
• Jupyter(IPython notebook)とpandasで分析
• matplotlibで可視化
構成
Simple is Best?
構成
Simple is Best!!! →構成を型化してイケてる感じに
サーバー構築と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を一気通貫に行える神ライブラリ
IPython notebook+pandas
• 平たく言えば、「ブラウザ上で使えるPythonその他のSandbox環境」
• データやLibraryが不確実(≒使いこなせていない)時の試し打ちとして最高すぎる環境
• pandasで前処理、matplotlibでお絵かき(グラフ描画など)
分析と可視化
• レスターは何月に一番勝っているのか?
• ボットのマルチ四球(=1試合2四球)の回数
Jon Lester Joey Votto
Jon Lester(ジョン・レスター)
• メジャー屈指の先発左腕、優勝請負人 ※世界一経験二回
• プレーオフ(10/9)に先発、なお負け投手
• レッドソックス(2006-2014)→アスレチックス(2014)→カブス(2015)
レスターさんの月別勝利数
• 調子いい時は4,5月で稼いでいる、8,9月も良さげだがそんなに極端ではない
• 残りの月はなんか微妙だけど傾向がアレ ちなみに7月はオールスターの為登板が少ない(レスターにかぎらず)
Joey Votto(ジョーイ・ボット)
• レッズ一筋(2007-2015)、強打の一塁手
• 選球眼が良すぎて散歩(四球)が多い、通算アダム・ダン率は38%
• 内野フライが異常に少ない。とある統計によると、2009-2012の4年間で3本(ファ!?)
塁間さんぽ(イッチVSボット)
• 月別の四球数、凡例の数字はシーズン通算
• 圧倒的にボットさんが散歩好き、特に8,9月やばい
• 神イチローはとにかく打って走るスタイル、春先はまあまあ歩いてる
イチロー ボット
マルチさんぽ(イッチVSボット)
• 1試合で2個以上四球を選んだ試合を月別にカウント
• ボットさんの回数がやばい
• 神イチローはある意味予想通り、流石天才バッター
イチロー ボット
コードは後日公開!!!
Pythonで 「俺々野球分析基盤」 を作ったハナシ
キッカケはコチラ
http://www.slideshare.net/shinyorke/agile-baseball-science-52692504
やりたかったこと
• 日本プロ野球データを元に野球統計学の話をするネタを思いつく
• だがしかし、MLBのようにオープン化されたデータなんぞない
• そうだ、データをぶっこ抜く自動的に取得して計算してレポート出せばいいじゃん!
どうやって解決したか
• スポーツのデータサイト(Y◯hoo等)から、順位表と選手成績を取得
• 取得したデータを元にセイバーメトリクス指標を算出
• 一日に一回、取得&算出を行い、Excelシートに計算結果出力&AWS S3に転送
構成(development)
構成(Provisioning)
• ぶっちゃけ当初の要件でDockerは不要だった
• しかし、将来的に「俺々野球基盤」としてServiceを立ち上げる構想があり、今のうちに試せることはためそう!と思いDockerを本番投入
• docker compose(旧名fig)でアプリとDBを一気通貫にService立ちあげする下地を作った
crontab(parse-crontab)
• DockerのPython container(Debian)、デフォルトでcrontabが使えない事が判明
• いちいち設定するのもアレだ…と思った矢先に、いい感じのライブラリーを発見!!! parse-crontab: https://github.com/josiahcarlson/parse-crontabexample : http://gaujin.jp/index.php?itemid=27 ※ @gaujin_jp さんありがとうございます!
• ピュアなPython環境でcrontab環境実現&自動実行が可能に!!!
分析と可視化
• アダム・ダン率三振・四球・ホームランでアダム・ダンらしさを評価
• 被アダム・ダン率アダム・ダンな打者を量産する可能性がある投手を見つける
Wikipedia「三振」 ※1年ぶり2回目の登場 https://ja.wikipedia.org/wiki/三振
アダム・ダン
アダム・ダン率 = (ダンらしさ) / 打数 * 100
※ダンらしさ = 本塁打 + 四球+ 三振
アダム・ダン率ランキング(P)
順位 選手名 (チーム)
ダン率 HR 四球 三振 コメント
1 中村剛也(西) 46.2 37 68 172 三振王かつ本塁打王2 メヒア(西) 42.9 27 45 153 去年の本塁打王3 ペーニャ(楽) 40.2 17 70 111 典型的な地蔵タイプ4 森友哉(西) 38.4 17 44 143 お若いのに三振多すぎぃ5 松田宣浩(ソ) 38.1 35 60 135 テラス席の申し子
※2015シーズン終了時
アダム・ダン率ランキング(C)
順位 選手名 (チーム)
ダン率 HR 四球 三振 コメント
1 丸佳浩(広) 40.4 19 94 143 三振と四球で二冠達成2 ゴメス(神) 37.1 17 72 134 キャラ通りの成績3 山田哲人(ヤ) 35.6 38 81 111 思ったより三振多い4 梶谷隆幸(D) 34.4 13 54 132 役割的に三振の数は深刻5 筒香嘉智(D) 33.5 24 68 98 まあまあ合格点
※2015シーズン終了時
被アダム・ダン率 = (ダンらしさ) / 打者数 * 100
※ダンらしさ = 被本塁打 + 与四死球 + 三振
被アダム・ダン率ランキング(P)
順位 選手名 (チーム)
ダン率 HR 四球 三振 コメント
1 大谷翔平(日) 40.6 7 46 196 本格派すぎる2 則本昂大(楽) 35.3 14 48 215 奪三振王&やや飛翔3 武田翔太(ソ) 34.8 14 59 163 やや飛翔癖あり4 中田賢一(ソ) 33 17 61 130 飛翔しすぎぃ5 西勇輝(オ) 31 11 43 143 本格派になりつつある
※2015シーズン終了時
被アダム・ダン率ランキング(C)
順位 選手名 (チーム)
ダン率 HR 四球 三振 コメント
1 藤浪晋太郎(神) 38.5 9 82 221 三振と四球で二冠達成2 メッセンジャー(神) 33.5 10 60 194 三振&四球2位3 高木勇人(巨) 29.8 16 47 131 ルーキー4 ジョンソン(広) 29 5 67 150 同僚の黒田は21.9ダン5 小川泰弘(ヤ) 28.3 18 48 128 成瀬の代わりに飛翔
※2015シーズン終了時
コードは後日公開…
しません!!! (察してください…w)
まとめ シモンズの守備ってまとめに相応しいよね
元画像: http://a.espncdn.com/photo/2013/1028/mlb_nl-gloves_06.jpg
Python + Baseball
• 「野球Hackで迷ったらPython!」
• データ分析&検証、プロトタイプ作りといった、 「不確定要素が多いproject」でのPythonは強い→スタートアップとか(野球関係ないけど…w)
• とはいえ向き・不向きや好みもあるので他の言語やFWもいい感じに柔軟に使うといいでしょう
Possibilities of Python
これからの野球Hack
• 個人として
• みんなで(コミュニティ的な意味で)
• 大切にしたいこと
これからの野球Hack(願望)
• 「データドリブン野球解説」を通じて新しい野球とスポーツの可能性を説いて生きたい!!→やきうをオープンな情報基盤に!
• 東京五輪に向けて、新しい野球・スポーツの楽しみ方を模索&リードしていきたい!!!
みんなで野球Hack!!!
• 本日の発表などを通じ、「面白い!」
「俺も(私も)やりたい!!」と思った方!是非一緒にやりましょう!!!
• 明日(10/12)のPyCon JP 2015 Sprintsで一緒に野球をHackしましょう!!!
大切にしたいこと
ビル・ジェームズ -野球統計学「セイバーメトリクス」の生みの親-
元画像: http://sportsworld.nbcsports.com/bill-james-statistical-revolution/
“”” わたしの関心事は、野球だけ。いったいなぜだろう? それは,ほかの分野の数字と違って,野球のデータには言葉と同じ力があるからだ。 “”” - 書籍「マネー・ボール」第四章より
Possibilities of 野球Hack!
ゲームセット!!!ご清聴ありがとうございました.
Shinichi Nakagawa(Twitter/Facebook/hatena:@shinyorke)