野球hack!~pythonを用いたデータ分析と可視化 #pyconjp

66
野球Hack!~Pythonを用いたデータ分析と可視化 - The Art Of Programming A Baseball Game! - Shinichi Nakagawa@shinyorke PyCon JP 2015 Talk Session(2015/10/11)

Upload: -

Post on 06-Jan-2017

56.926 views

Category:

Software


0 download

TRANSCRIPT

Page 1: 野球Hack!~Pythonを用いたデータ分析と可視化 #pyconjp

野球Hack!~Pythonを用いたデータ分析と可視化 - The Art Of Programming A Baseball Game! -

Shinichi Nakagawa@shinyorke PyCon JP 2015 Talk Session(2015/10/11)

Page 2: 野球Hack!~Pythonを用いたデータ分析と可視化 #pyconjp

Who am I ?

• Shinichi Nakagawa(@shinyorke)

• Recruit Sumai Company, Ltd.

• Pythonista/Agile/Baseball Scientist

• 贔屓チーム

• 北海道日本ハムファイターズ(NPB)

• オークランド・アスレチックス(MLB)

• “野生の野球アナリスト”活動

Page 3: 野球Hack!~Pythonを用いたデータ分析と可視化 #pyconjp

“野生の野球アナリスト” 活動

Page 4: 野球Hack!~Pythonを用いたデータ分析と可視化 #pyconjp

• PyCon JP 2014 Talk Session(去年のやつ)

• MLBオープンデータ分析&可視化サービスをPythonで構築

• はてブ200超え、PV 14,000以上(slideshare)

Page 5: 野球Hack!~Pythonを用いたデータ分析と可視化 #pyconjp

• PyCon JP 2014 Lightning Talk(去年のやつ)

• Agileプロセス活用、アダム・ダン率の紹介

• アダム・ダンさん、Python界隈で有名になる

Page 6: 野球Hack!~Pythonを用いたデータ分析と可視化 #pyconjp

Other…

• ブログで野球Hackの成果および考察を披露(不定期)

• MLBオープンデータの紹介と活用例紹介

• 野球データの分析&解析用のライブラリをGithubで公開(ほぼPython製)

• データドリブン野球解説 ※後ほど解説

Page 7: 野球Hack!~Pythonを用いたデータ分析と可視化 #pyconjp

最終目標(40歳までに)

• エンジニア×ビジネスマンとして、 日本プロ野球orMLBの仕事をやる!※NPB12球団+MLB30球団のオファー待ってます

• 野球データとエンジニアの知見を活かし、 2020年東京五輪でメダル獲得のサポート ※エンジニアとして(選手にはならないw)

Page 8: 野球Hack!~Pythonを用いたデータ分析と可視化 #pyconjp

Today’s Starting Member

• Pythonと野球

• MLBオープンデータ活用とPython

• Pythonで「俺々野球分析基盤」

• まとめ - これからの野球Hack

Page 9: 野球Hack!~Pythonを用いたデータ分析と可視化 #pyconjp

Pythonと野球

Page 10: 野球Hack!~Pythonを用いたデータ分析と可視化 #pyconjp

なぜ野球×Pythonなのか?

• 野球データと野球Hack

• Pythonと野球Hack

Page 11: 野球Hack!~Pythonを用いたデータ分析と可視化 #pyconjp

野球データ(嬉)

• ボックス・スコアによる正規化済みのデータが存在

• 打撃・投球・試合の成績がボックス・スコアで読みやすい・書きやすいフォーマットでまとまっている

• 使えるデータが存在

• メジャーリーグはオープンなライセンスで使えるデータが存在 (利用制限ほぼなし)

• 日本プロ野球はデータをぶっこ抜く自動的に取得する仕組みを自作することにより入手可能(当然、利用は制限される)

Page 12: 野球Hack!~Pythonを用いたデータ分析と可視化 #pyconjp

ボックス・スコア※Sportsnaviより

Page 13: 野球Hack!~Pythonを用いたデータ分析と可視化 #pyconjp

野球データ(辛)

• データの解釈

• ボックス・スコア自体は読みやすいが、解釈そのものはルールや規約を正確に読む必要がある例)振り逃げはどう記録される?  インフィールドフライの条件とは?

• ボックス・スコアには乗らないデータの存在

• 投手の球速、変化球の種類、打球の速度や着地点etc…

ボックス・スコアに乗らないデータが存在&独自のフォーマットでの記載が多く読み書きが難しい

Page 14: 野球Hack!~Pythonを用いたデータ分析と可視化 #pyconjp

野球Hackの掟

• スクラップアンドビルド

• データを読む→仮説を立てる→コードを書く→可視化する→検証→またデータを読む…の繰り返し、コードを書いては壊すを繰り返す作業が大半

• データの読み書きとルールの勉強

• 野球の記録の読み方、記録がつく理由を把握する為にルールを勉強 →ルールを正確に把握するため、公認野球規則&審判の知識が必要  ※実際本を買って勉強してます(実話)

Page 15: 野球Hack!~Pythonを用いたデータ分析と可視化 #pyconjp

Pythonと野球Hack• インフラ管理・構成

Ansibleおよびdocker compose(というよりDocker)を活用、すぐ作れる&壊せるインフラで思う存分スクラップアンドビルドを!

• バージョン&パッケージ管理 pyenv + virtualenvでバージョン&パッケージ管理をプロジェクト単位で切り替え.

→特定のPythonバージョン&パッケージに依存しない作り.

• データ分析・可視化 IPython notebook + pandas + matplotlibでカジュアルに分析&可視化.

面倒くさいQUERYなどはSQLAlchemyなどで型化.

• Webアプリ構築 サクッと作る目的でFlask/bottle、しっかり作る目的でDjangoを使う.

Page 16: 野球Hack!~Pythonを用いたデータ分析と可視化 #pyconjp

なんでや!Pythonじゃなくてもできるやろ!!※ボールの判定に不服なバルフォアさん、ではありません

元画像:http://www.sbs.com.au/

Page 17: 野球Hack!~Pythonを用いたデータ分析と可視化 #pyconjp

はい、Pythonじゃなくできます

• インフラ管理・構成部分的にVagrantを使用、ちなみにChefはやめた.

• バージョン&パッケージ管理Rubyのrenv/rbenv-gemsetなど、他の言語にも当然ながら存在.

• データ分析・可視化得意な人はR・Juliaでいいと思う、野球HackをRでやってる方もいます.(他の言語は、、、どうなんだろう?)

• Webアプリ構築APIやバッチならGolang, サイトならRuby On Rails他選択肢がたくさん有り〼

目的(と好み)に合わせて手段を柔軟に変えましょう

Page 18: 野球Hack!~Pythonを用いたデータ分析と可視化 #pyconjp

好きな言語でHackしようぜ!※キャプテン・ジーター、本当にお疲れ様でした

元画像:http://www.playbuzz.com/

Page 19: 野球Hack!~Pythonを用いたデータ分析と可視化 #pyconjp

MLBオープンデータとPython

Page 20: 野球Hack!~Pythonを用いたデータ分析と可視化 #pyconjp

元ネタ(過去ブログより) http://shinyorke.hatenablog.com/entry/

2015/04/06/190243

Page 21: 野球Hack!~Pythonを用いたデータ分析と可視化 #pyconjp

やりたかったこと

• 野球ゲーム「Fantasy Baseball」に勝つため、選手の詳細な情報(主に成績)が必要に

• MLBのオープンデータ「Retrosheet」にそれらが詰められてるらしい

ワイ「データベースつくればいいじゃん!」

Page 22: 野球Hack!~Pythonを用いたデータ分析と可視化 #pyconjp

Retrosheet is 何?

• メジャーリーグのスコアデータ集

• 1887~2014(昨シーズン)までのデータをCSVで配布

※1989以前は欠損有り

• スコアブックで得られる情報(得点、失点、スタメン、打席結果etc…)と選手情報(名前、ポジションなど)がひと目でわかる

• http://retrosheet.org/

Page 23: 野球Hack!~Pythonを用いたデータ分析と可視化 #pyconjp

やったこと

• Vagrant + AnsibleでMySQL Server構築

• SQLAlchemy + py-retrosheetでmigration

• Jupyter(IPython notebook)とpandasで分析

• matplotlibで可視化

Page 24: 野球Hack!~Pythonを用いたデータ分析と可視化 #pyconjp

構成

Simple is Best?

Page 25: 野球Hack!~Pythonを用いたデータ分析と可視化 #pyconjp

構成

Simple is Best!!! →構成を型化してイケてる感じに

Page 26: 野球Hack!~Pythonを用いたデータ分析と可視化 #pyconjp

サーバー構築とmigration

$ vagrant up$ ansible-playbook -i hosts retrosheet_server.yml

この2行でサーバーを作れるようにしました!

※VagrantとAnsibleを導入している前提です

Page 27: 野球Hack!~Pythonを用いたデータ分析と可視化 #pyconjp

PY-RETROSHEET - やきうScript

• Retrosheet専用Download&migration script

[email protected]:wellsoliver/py-retrosheet.git

• データ取得からDB(MySQLなど)へのmigrationを一気通貫に行える神ライブラリ

Page 28: 野球Hack!~Pythonを用いたデータ分析と可視化 #pyconjp

IPython notebook+pandas

• 平たく言えば、「ブラウザ上で使えるPythonその他のSandbox環境」

• データやLibraryが不確実(≒使いこなせていない)時の試し打ちとして最高すぎる環境

• pandasで前処理、matplotlibでお絵かき(グラフ描画など)

Page 29: 野球Hack!~Pythonを用いたデータ分析と可視化 #pyconjp

分析と可視化

• レスターは何月に一番勝っているのか?

• ボットのマルチ四球(=1試合2四球)の回数

Jon Lester Joey Votto

Page 30: 野球Hack!~Pythonを用いたデータ分析と可視化 #pyconjp

Jon Lester(ジョン・レスター)

• メジャー屈指の先発左腕、優勝請負人 ※世界一経験二回

• プレーオフ(10/9)に先発、なお負け投手

• レッドソックス(2006-2014)→アスレチックス(2014)→カブス(2015)

Page 31: 野球Hack!~Pythonを用いたデータ分析と可視化 #pyconjp

レスターさんの月別勝利数

• 調子いい時は4,5月で稼いでいる、8,9月も良さげだがそんなに極端ではない

• 残りの月はなんか微妙だけど傾向がアレ ちなみに7月はオールスターの為登板が少ない(レスターにかぎらず)

Page 32: 野球Hack!~Pythonを用いたデータ分析と可視化 #pyconjp

Joey Votto(ジョーイ・ボット)

• レッズ一筋(2007-2015)、強打の一塁手

• 選球眼が良すぎて散歩(四球)が多い、通算アダム・ダン率は38%

• 内野フライが異常に少ない。とある統計によると、2009-2012の4年間で3本(ファ!?)

Page 33: 野球Hack!~Pythonを用いたデータ分析と可視化 #pyconjp

塁間さんぽ(イッチVSボット)

• 月別の四球数、凡例の数字はシーズン通算

• 圧倒的にボットさんが散歩好き、特に8,9月やばい

• 神イチローはとにかく打って走るスタイル、春先はまあまあ歩いてる

イチロー ボット

Page 34: 野球Hack!~Pythonを用いたデータ分析と可視化 #pyconjp

マルチさんぽ(イッチVSボット)

• 1試合で2個以上四球を選んだ試合を月別にカウント

• ボットさんの回数がやばい

• 神イチローはある意味予想通り、流石天才バッター

イチロー ボット

Page 35: 野球Hack!~Pythonを用いたデータ分析と可視化 #pyconjp

コードは後日公開!!!

Page 36: 野球Hack!~Pythonを用いたデータ分析と可視化 #pyconjp

Pythonで 「俺々野球分析基盤」 を作ったハナシ

Page 37: 野球Hack!~Pythonを用いたデータ分析と可視化 #pyconjp

キッカケはコチラ

Page 38: 野球Hack!~Pythonを用いたデータ分析と可視化 #pyconjp

http://www.slideshare.net/shinyorke/agile-baseball-science-52692504

Page 39: 野球Hack!~Pythonを用いたデータ分析と可視化 #pyconjp

やりたかったこと

• 日本プロ野球データを元に野球統計学の話をするネタを思いつく

• だがしかし、MLBのようにオープン化されたデータなんぞない

• そうだ、データをぶっこ抜く自動的に取得して計算してレポート出せばいいじゃん!

Page 40: 野球Hack!~Pythonを用いたデータ分析と可視化 #pyconjp

どうやって解決したか

• スポーツのデータサイト(Y◯hoo等)から、順位表と選手成績を取得

• 取得したデータを元にセイバーメトリクス指標を算出

• 一日に一回、取得&算出を行い、Excelシートに計算結果出力&AWS S3に転送

Page 41: 野球Hack!~Pythonを用いたデータ分析と可視化 #pyconjp

構成(development)

Page 42: 野球Hack!~Pythonを用いたデータ分析と可視化 #pyconjp

構成(Provisioning)

Page 43: 野球Hack!~Pythonを用いたデータ分析と可視化 #pyconjp

• ぶっちゃけ当初の要件でDockerは不要だった

• しかし、将来的に「俺々野球基盤」としてServiceを立ち上げる構想があり、今のうちに試せることはためそう!と思いDockerを本番投入

• docker compose(旧名fig)でアプリとDBを一気通貫にService立ちあげする下地を作った

Page 44: 野球Hack!~Pythonを用いたデータ分析と可視化 #pyconjp

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環境実現&自動実行が可能に!!!

Page 45: 野球Hack!~Pythonを用いたデータ分析と可視化 #pyconjp

分析と可視化

• アダム・ダン率三振・四球・ホームランでアダム・ダンらしさを評価

• 被アダム・ダン率アダム・ダンな打者を量産する可能性がある投手を見つける

Page 46: 野球Hack!~Pythonを用いたデータ分析と可視化 #pyconjp

Wikipedia「三振」 ※1年ぶり2回目の登場 https://ja.wikipedia.org/wiki/三振

アダム・ダン

Page 47: 野球Hack!~Pythonを用いたデータ分析と可視化 #pyconjp

アダム・ダン率 = (ダンらしさ) / 打数 * 100

※ダンらしさ = 本塁打 + 四球+ 三振

Page 48: 野球Hack!~Pythonを用いたデータ分析と可視化 #pyconjp

アダム・ダン率ランキング(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シーズン終了時

Page 49: 野球Hack!~Pythonを用いたデータ分析と可視化 #pyconjp

アダム・ダン率ランキング(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シーズン終了時

Page 50: 野球Hack!~Pythonを用いたデータ分析と可視化 #pyconjp

被アダム・ダン率 = (ダンらしさ) / 打者数 * 100

※ダンらしさ = 被本塁打 + 与四死球 + 三振

Page 51: 野球Hack!~Pythonを用いたデータ分析と可視化 #pyconjp

被アダム・ダン率ランキング(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シーズン終了時

Page 52: 野球Hack!~Pythonを用いたデータ分析と可視化 #pyconjp

被アダム・ダン率ランキング(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シーズン終了時

Page 53: 野球Hack!~Pythonを用いたデータ分析と可視化 #pyconjp

コードは後日公開…

Page 54: 野球Hack!~Pythonを用いたデータ分析と可視化 #pyconjp

しません!!! (察してください…w)

Page 55: 野球Hack!~Pythonを用いたデータ分析と可視化 #pyconjp

まとめ シモンズの守備ってまとめに相応しいよね

元画像: http://a.espncdn.com/photo/2013/1028/mlb_nl-gloves_06.jpg

Page 56: 野球Hack!~Pythonを用いたデータ分析と可視化 #pyconjp

Python + Baseball

• 「野球Hackで迷ったらPython!」

• データ分析&検証、プロトタイプ作りといった、 「不確定要素が多いproject」でのPythonは強い→スタートアップとか(野球関係ないけど…w)

• とはいえ向き・不向きや好みもあるので他の言語やFWもいい感じに柔軟に使うといいでしょう

Page 57: 野球Hack!~Pythonを用いたデータ分析と可視化 #pyconjp

好きな言語でHackしようぜ!※大切なので二回いいました

元画像:http://www.playbuzz.com/

Page 58: 野球Hack!~Pythonを用いたデータ分析と可視化 #pyconjp

Possibilities of Python

Page 59: 野球Hack!~Pythonを用いたデータ分析と可視化 #pyconjp

これからの野球Hack

• 個人として

• みんなで(コミュニティ的な意味で)

• 大切にしたいこと

Page 60: 野球Hack!~Pythonを用いたデータ分析と可視化 #pyconjp

これからの野球Hack(願望)

• 「データドリブン野球解説」を通じて新しい野球とスポーツの可能性を説いて生きたい!!→やきうをオープンな情報基盤に!

• 東京五輪に向けて、新しい野球・スポーツの楽しみ方を模索&リードしていきたい!!!

Page 61: 野球Hack!~Pythonを用いたデータ分析と可視化 #pyconjp

みんなで野球Hack!!!

• 本日の発表などを通じ、「面白い!」

「俺も(私も)やりたい!!」と思った方!是非一緒にやりましょう!!!

• 明日(10/12)のPyCon JP 2015 Sprintsで一緒に野球をHackしましょう!!!

Page 62: 野球Hack!~Pythonを用いたデータ分析と可視化 #pyconjp

大切にしたいこと

Page 63: 野球Hack!~Pythonを用いたデータ分析と可視化 #pyconjp

ビル・ジェームズ -野球統計学「セイバーメトリクス」の生みの親-

元画像: http://sportsworld.nbcsports.com/bill-james-statistical-revolution/

Page 64: 野球Hack!~Pythonを用いたデータ分析と可視化 #pyconjp

“”” わたしの関心事は、野球だけ。いったいなぜだろう? それは,ほかの分野の数字と違って,野球のデータには言葉と同じ力があるからだ。 “”” - 書籍「マネー・ボール」第四章より

Page 65: 野球Hack!~Pythonを用いたデータ分析と可視化 #pyconjp

Possibilities of 野球Hack!

Page 66: 野球Hack!~Pythonを用いたデータ分析と可視化 #pyconjp

ゲームセット!!!ご清聴ありがとうございました.

Shinichi Nakagawa(Twitter/Facebook/hatena:@shinyorke)