SlideShare a Scribd company logo
野球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他選択肢がたくさん有り
目的(と好み)に合わせて手段を柔軟に変えましょう
好きな言語でHackしようぜ!
※キャプテン・ジーター、本当にお疲れ様でした
元画像:http://www.playbuzz.com/
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

git@github.com: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-crontab

example : 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もいい感じに柔軟に使うといいでしょう
好きな言語でHackしようぜ!
※大切なので二回いいました
元画像:http://www.playbuzz.com/
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)

More Related Content

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