Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

87,814 views

Published on

PyCon JP 2015 Talk Session発表資料

Published in: Software
  • Be the first to comment

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

  1. 1. 野球Hack!~Pythonを用いたデータ分析と可視化 - The Art Of Programming A Baseball Game! - Shinichi Nakagawa@shinyorke PyCon JP 2015 Talk Session(2015/10/11)
  2. 2. Who am I ? • Shinichi Nakagawa(@shinyorke) • Recruit Sumai Company, Ltd. • Pythonista/Agile/Baseball Scientist • 贔屓チーム • 北海道日本ハムファイターズ(NPB) • オークランド・アスレチックス(MLB) • “野生の野球アナリスト”活動
  3. 3. “野生の野球アナリスト” 活動
  4. 4. • PyCon JP 2014 Talk Session(去年のやつ) • MLBオープンデータ分析&可視化サービスをPythonで構築 • はてブ200超え、PV 14,000以上(slideshare)
  5. 5. • PyCon JP 2014 Lightning Talk(去年のやつ) • Agileプロセス活用、アダム・ダン率の紹介 • アダム・ダンさん、Python界隈で有名になる
  6. 6. Other… • ブログで野球Hackの成果および考察を披露(不定期) • MLBオープンデータの紹介と活用例紹介 • 野球データの分析&解析用のライブラリを
 Githubで公開(ほぼPython製) • データドリブン野球解説 ※後ほど解説
  7. 7. 最終目標(40歳までに) • エンジニア×ビジネスマンとして、
 日本プロ野球orMLBの仕事をやる!
 ※NPB12球団+MLB30球団のオファー待ってます • 野球データとエンジニアの知見を活かし、
 2020年東京五輪でメダル獲得のサポート
 ※エンジニアとして(選手にはならないw)
  8. 8. Today’s Starting Member • Pythonと野球 • MLBオープンデータ活用とPython • Pythonで「俺々野球分析基盤」 • まとめ - これからの野球Hack
  9. 9. Pythonと野球
  10. 10. なぜ野球×Pythonなのか? • 野球データと野球Hack • Pythonと野球Hack
  11. 11. 野球データ(嬉) • ボックス・スコアによる正規化済みのデータが存在 • 打撃・投球・試合の成績がボックス・スコアで読みやすい・書きや すいフォーマットでまとまっている • 使えるデータが存在 • メジャーリーグはオープンなライセンスで使えるデータが存在
 (利用制限ほぼなし) • 日本プロ野球はデータをぶっこ抜く自動的に取得する仕組みを自作 することにより入手可能(当然、利用は制限される)
  12. 12. ボックス・スコア ※Sportsnaviより
  13. 13. 野球データ(辛) • データの解釈 • ボックス・スコア自体は読みやすいが、解釈そのものはルールや規約を 正確に読む必要がある
 例)振り逃げはどう記録される?
   インフィールドフライの条件とは? • ボックス・スコアには乗らないデータの存在 • 投手の球速、変化球の種類、打球の速度や着地点etc…
 ボックス・スコアに乗らないデータが存在
 &独自のフォーマットでの記載が多く読み書きが難しい
  14. 14. 野球Hackの掟 • スクラップアンドビルド • データを読む→仮説を立てる→コードを書く→可視化する→検証→ またデータを読む
 …の繰り返し、コードを書いては壊すを繰り返す作業が大半 • データの読み書きとルールの勉強 • 野球の記録の読み方、記録がつく理由を把握する為にルールを勉強
 →ルールを正確に把握するため、公認野球規則&審判の知識が必要
  ※実際本を買って勉強してます(実話)
  15. 15. Pythonと野球Hack • インフラ管理・構成
 Ansibleおよびdocker compose(というよりDocker)を活用、
 すぐ作れる&壊せるインフラで思う存分スクラップアンドビルドを! • バージョン&パッケージ管理
 pyenv + virtualenvでバージョン&パッケージ管理をプロジェクト単位で切り替え.
 →特定のPythonバージョン&パッケージに依存しない作り. • データ分析・可視化
 IPython notebook + pandas + matplotlibでカジュアルに分析&可視化.
 面倒くさいQUERYなどはSQLAlchemyなどで型化. • Webアプリ構築
 サクッと作る目的でFlask/bottle、しっかり作る目的でDjangoを使う.
  16. 16. なんでや!Pythonじゃなくてもできるやろ!! ※ボールの判定に不服なバルフォアさん、ではありません 元画像:http://www.sbs.com.au/
  17. 17. はい、Pythonじゃなくできます • インフラ管理・構成
 部分的にVagrantを使用、ちなみにChefはやめた. • バージョン&パッケージ管理
 Rubyのrenv/rbenv-gemsetなど、他の言語にも当然ながら存在. • データ分析・可視化
 得意な人はR・Juliaでいいと思う、野球HackをRでやってる方もいます.
 (他の言語は、、、どうなんだろう?) • Webアプリ構築
 APIやバッチならGolang, サイトならRuby On Rails他選択肢がたくさん有り 目的(と好み)に合わせて手段を柔軟に変えましょう
  18. 18. 好きな言語でHackしようぜ! ※キャプテン・ジーター、本当にお疲れ様でした 元画像:http://www.playbuzz.com/
  19. 19. MLBオープンデータとPython
  20. 20. 元ネタ(過去ブログより) http://shinyorke.hatenablog.com/entry/ 2015/04/06/190243
  21. 21. やりたかったこと • 野球ゲーム「Fantasy Baseball」に勝つため、 選手の詳細な情報(主に成績)が必要に • MLBのオープンデータ「Retrosheet」に
 それらが詰められてるらしい
 
 ワイ「データベースつくればいいじゃん!」
  22. 22. Retrosheet is 何? • メジャーリーグのスコアデータ集 • 1887~2014(昨シーズン)までのデータをCSVで配布 
 ※1989以前は欠損有り • スコアブックで得られる情報(得点、失点、スタメン、打席 結果etc…)と選手情報(名前、ポジションなど)がひと目 でわかる • http://retrosheet.org/
  23. 23. やったこと • Vagrant + AnsibleでMySQL Server構築 • SQLAlchemy + py-retrosheetでmigration • Jupyter(IPython notebook)とpandasで分析 • matplotlibで可視化
  24. 24. 構成 Simple is Best?
  25. 25. 構成 Simple is Best!!! →構成を型化してイケてる感じに
  26. 26. サーバー構築とmigration $ vagrant up $ ansible-playbook -i hosts retrosheet_server.yml この2行でサーバーを作れるようにしました! ※VagrantとAnsibleを導入している前提です
  27. 27. PY-RETROSHEET - やきうScript • Retrosheet専用Download&migration script
 git@github.com:wellsoliver/py-retrosheet.git • データ取得からDB(MySQLなど)へのmigrationを一気通貫に行える神ライブラリ
  28. 28. IPython notebook+pandas • 平たく言えば、「ブラウザ上で使えるPythonその他のSandbox環境」 • データやLibraryが不確実( 使いこなせていない)時の試し打ちとして最高すぎる環境 • pandasで前処理、matplotlibでお絵かき(グラフ描画など)
  29. 29. 分析と可視化 • レスターは何月に一番勝っているのか? • ボットのマルチ四球(=1試合2四球)の回数
 Jon Lester Joey Votto
  30. 30. Jon Lester(ジョン・レスター) • メジャー屈指の先発左腕、優勝請負人 ※世界一経験二回 • プレーオフ(10/9)に先発、なお負け投手 • レッドソックス(2006-2014)→アスレチックス(2014)→カブス(2015)
  31. 31. レスターさんの月別勝利数 • 調子いい時は4,5月で稼いでいる、8,9月も良さげだがそんなに極端ではない • 残りの月はなんか微妙だけど傾向がアレ
 ちなみに7月はオールスターの為登板が少ない(レスターにかぎらず)
  32. 32. Joey Votto(ジョーイ・ボット) • レッズ一筋(2007-2015)、強打の一塁手 • 選球眼が良すぎて散歩(四球)が多い、通算アダム・ダン率は38% • 内野フライが異常に少ない。とある統計によると、2009-2012の4年間で3本(ファ!?)
  33. 33. 塁間さんぽ(イッチVSボット) • 月別の四球数、凡例の数字はシーズン通算 • 圧倒的にボットさんが散歩好き、特に8,9月やばい • 神イチローはとにかく打って走るスタイル、春先はまあまあ歩いてる イチロー ボット
  34. 34. マルチさんぽ(イッチVSボット) • 1試合で2個以上四球を選んだ試合を月別にカウント • ボットさんの回数がやばい • 神イチローはある意味予想通り、流石天才バッター イチロー ボット
  35. 35. コードは後日公開!!!
  36. 36. Pythonで 「俺々野球分析基盤」 を作ったハナシ
  37. 37. キッカケはコチラ
  38. 38. http://www.slideshare.net/shinyorke/agile-baseball-science-52692504
  39. 39. やりたかったこと • 日本プロ野球データを元に野球統計学の話を するネタを思いつく • だがしかし、MLBのようにオープン化された データなんぞない • そうだ、データをぶっこ抜く自動的に取得し て計算してレポート出せばいいじゃん!
  40. 40. どうやって解決したか • スポーツのデータサイト(Y⃝hoo等)から、
 順位表と選手成績を取得 • 取得したデータを元にセイバーメトリクス指標 を算出 • 一日に一回、取得&算出を行い、Excelシートに 計算結果出力&AWS S3に転送
  41. 41. 構成(development)
  42. 42. 構成(Provisioning)
  43. 43. • ぶっちゃけ当初の要件でDockerは不要だった • しかし、将来的に「俺々野球基盤」としてService を立ち上げる構想があり、今のうちに試せること はためそう!と思いDockerを本番投入 • docker compose(旧名fig)でアプリとDBを
 一気通貫にService立ちあげする下地を作った
  44. 44. crontab(parse-crontab) • DockerのPython container(Debian)、
 デフォルトでcrontabが使えない事が判明 • いちいち設定するのもアレだ…と思った矢先に、
 いい感じのライブラリーを発見!!!
 parse-crontab: https://github.com/josiahcarlson/parse-crontab
 example : http://gaujin.jp/index.php?itemid=27 
 ※ @gaujin_jp さんありがとうございます! • ピュアなPython環境でcrontab環境実現&自動実行が可能に!!!
  45. 45. 分析と可視化 • アダム・ダン率
 三振・四球・ホームランでアダム・ダンらしさ を評価 • 被アダム・ダン率
 アダム・ダンな打者を量産する可能性がある 投手を見つける
  46. 46. Wikipedia「三振」 ※1年ぶり2回目の登場 https://ja.wikipedia.org/wiki/三振 アダム・ダン
  47. 47. アダム・ダン率 = (ダンらしさ) / 打数 * 100 
 ※ダンらしさ = 本塁打 + 四球+ 三振
  48. 48. アダム・ダン率ランキング(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シーズン終了時
  49. 49. アダム・ダン率ランキング(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シーズン終了時
  50. 50. 被アダム・ダン率 = (ダンらしさ) / 打者数 * 100 
 ※ダンらしさ = 被本塁打 + 与四死球 + 三振
  51. 51. 被アダム・ダン率ランキング(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シーズン終了時
  52. 52. 被アダム・ダン率ランキング(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シーズン終了時
  53. 53. コードは後日公開…
  54. 54. しません!!! (察してください…w)
  55. 55. まとめ シモンズの守備ってまとめに相応しいよね 元画像: http://a.espncdn.com/photo/2013/1028/mlb_nl-gloves_06.jpg
  56. 56. Python + Baseball • 「野球Hackで迷ったらPython!」 • データ分析&検証、プロトタイプ作りといった、
 「不確定要素が多いproject」でのPythonは強い
 →スタートアップとか(野球関係ないけど…w) • とはいえ向き・不向きや好みもあるので他の言語 やFWもいい感じに柔軟に使うといいでしょう
  57. 57. 好きな言語でHackしようぜ! ※大切なので二回いいました 元画像:http://www.playbuzz.com/
  58. 58. Possibilities of Python
  59. 59. これからの野球Hack • 個人として • みんなで(コミュニティ的な意味で) • 大切にしたいこと
  60. 60. これからの野球Hack(願望) • 「データドリブン野球解説」を通じて新しい野球とスポーツの可能性を説いて生きたい!! →やきうをオープンな情報基盤に! • 東京五輪に向けて、新しい野球・スポーツの楽しみ方を模索&リードしていきたい!!!
  61. 61. みんなで野球Hack!!! • 本日の発表などを通じ、
 「面白い!」
 「俺も(私も)やりたい!!」
 と思った方!是非一緒にやりましょう!!! • 明日(10/12)のPyCon JP 2015 Sprintsで
 一緒に野球をHackしましょう!!!
  62. 62. 大切にしたいこと
  63. 63. ビル・ジェームズ -野球統計学「セイバーメトリクス」の生みの親- 元画像: http://sportsworld.nbcsports.com/bill-james-statistical-revolution/
  64. 64. “”” わたしの関心事は、野球だけ。 いったいなぜだろう? それは,ほかの分野の数字と 違って,野球のデータには
 言葉と同じ力があるからだ。 “”” - 書籍「マネー・ボール」第四章より
  65. 65. Possibilities of 野球Hack!
  66. 66. ゲームセット!!! ご清聴ありがとうございました. Shinichi Nakagawa(Twitter/Facebook/hatena:@shinyorke)

×