Pythonではじめる野球プログラミング PyCon JP 2014 9/14 Talk Session

32
Shinichi Nakagawa(リクルート住まいカンパニー) Pythonではじめる野球プログラミング Python×オープンデータでセイバーメトリクスをはじめよう

description

Pycon JP 2014発表資料です。 ピタゴラス勝率とBABIPについて、Django他で可視化しました。

Transcript of Pythonではじめる野球プログラミング PyCon JP 2014 9/14 Talk Session

Page 1: Pythonではじめる野球プログラミング PyCon JP 2014 9/14 Talk Session

Shinichi Nakagawa(リクルート住まいカンパニー)

Pythonではじめる野球プログラミング

Python×オープンデータでセイバーメトリクスをはじめよう

Page 2: Pythonではじめる野球プログラミング PyCon JP 2014 9/14 Talk Session

自己紹介

• 名前:Shinichi Nakagawa(中川伸一)

• 別名:野生の野球アナリスト

• Twitter: @shinyorke

• 所属:リクルート住まいカンパニー

• 仕事:Engineer, Lean Startup/Agile Coach(仮)

Page 3: Pythonではじめる野球プログラミング PyCon JP 2014 9/14 Talk Session

• きっかけ

• データはどこにある?

• 野球データベースをつくろう

• Djangoでアプリをつくろう

• セイバーメトリクスを可視化

• まとめ

本日のスタメン

Page 4: Pythonではじめる野球プログラミング PyCon JP 2014 9/14 Talk Session

きっかけ

大好きなソーシャル野球ゲームで勝ちたいんや!!! !

→勝つためには優秀な選手・調子いい選手が必要 !

→オススメの選手を紹介するサービスを思いつく !

→まずは選手とチームの成績を可視化しよう!←今ここ

Page 5: Pythonではじめる野球プログラミング PyCon JP 2014 9/14 Talk Session

ソーシャル野球ゲーム

Yahoo Fantasy Baseball http://baseball.fantasysports.yahoo.com/

Page 6: Pythonではじめる野球プログラミング PyCon JP 2014 9/14 Talk Session

データはどこにある?

メディア 形式 使い勝手 備考

MLB.com 公開データなし -ライセンス+αの理由で使えない(察し)

Baseball Reference

Web Site (html) ☓

スクレイピング前提、ライセンス的に使えない

Yahoo Social APIs

REST (json or XML) △

アプリから使いやすいが、取得可能な情報が少ない

Sean Lahman CSV,SQL他 ◯ CC3.0ライセンス、情報が

充実、コレなら使える!

Web上で公開されている主要な野球データ(MLBのみ)

Page 7: Pythonではじめる野球プログラミング PyCon JP 2014 9/14 Talk Session

Sean Lahman Database

http://www.seanlahman.com/baseball-archive/statistics/

・1871~2013までのMLB選手・球団のデータ ・CSV/SQL/Microsoft Access Database ・Creative Commons 3.0 License

Page 8: Pythonではじめる野球プログラミング PyCon JP 2014 9/14 Talk Session

野球データベースをつくろう• Serverを立てる

• MySQLをインストール

• Schemeをつくる

• SchemeからModelを自動生成

• CSVデータを投入

sqlacodegen

Page 9: Pythonではじめる野球プログラミング PyCon JP 2014 9/14 Talk Session

• Serverをコードで管理

• DB Serverの構築に活用

• Virtual Box上にUbuntu 14.04 LTSのイメージを立てるコードを実装

• ついでにChef soloの起動も

• vm.boxを変えればそのままProduction環境も作れる

Page 10: Pythonではじめる野球プログラミング PyCon JP 2014 9/14 Talk Session

Chef solo• ミドルウェアをコードで管理

• インフラ作業をrecipe化

• MySQLをインストール

• Pythonをインストール

• Scheme作成のシェル実行

• コードでインフラを書く喜び(^o^)

Page 11: Pythonではじめる野球プログラミング PyCon JP 2014 9/14 Talk Session
Page 12: Pythonではじめる野球プログラミング PyCon JP 2014 9/14 Talk Session
Page 13: Pythonではじめる野球プログラミング PyCon JP 2014 9/14 Talk Session

sqlacodegen• DB SchemeからSQLAlchemyのModelコードを自動生成

• pipでインストール可能

• MySQL/PostgreSQL/SQLite3などに対応

• https://pypi.python.org/pypi/sqlacodegen

• 全テーブル(約20個!)のModelが瞬殺で完成\(^o^)/

Page 14: Pythonではじめる野球プログラミング PyCon JP 2014 9/14 Talk Session

出力結果まあ楽ちん!

Page 15: Pythonではじめる野球プログラミング PyCon JP 2014 9/14 Talk Session

• O/R Mapper Python代表

• なんやかんやで使いやすい

• Webアプリは勿論、他のプロダクトでも普通に使える

• http://www.sqlalchemy.org/

• 選手および球団データをMySQLに投入するコードの中で使用しました

Page 16: Pythonではじめる野球プログラミング PyCon JP 2014 9/14 Talk Session

Djangoでアプリをつくろう• Python3.4 + Django 1.7でアプリ構築

• MySQLの接続にハマる

• Bootstrapで楽ちんデザイン

• morris.jsで折れ線グラフを描く

• HIGHCHARTSで散布図を描く

PyMySQL

morris.js

HIGHCHARTS

Page 17: Pythonではじめる野球プログラミング PyCon JP 2014 9/14 Talk Session

• Web Applicationフレームワーク

• 競合:Ruby On Railsなど

• MTV(Model Template View)と呼ばれるアーキテクチャで実装されている

• https://www.djangoproject.com/

• アプリ本体は全部Djangoで実装

• でも本当はFlaskの方が好み(小声)

Django

Page 18: Pythonではじめる野球プログラミング PyCon JP 2014 9/14 Talk Session

• ConnectorはPyMySQLを使いましょう

• PyMySQL3だと動きません!

• Django内で使う時は__init__.py内におまじないをかけましょう(写真)

• ここが一番のハマりポイントでした…←丸一日潰しました

[Tips]MySQLとの付き合い方

Page 19: Pythonではじめる野球プログラミング PyCon JP 2014 9/14 Talk Session

Start Bootstrap• http://startbootstrap.com/

• Bootstrapのtemplate集

• ランディングページ、Admin(管理)など、種類が抱負

• フリーと有料の両方アリ

• 野球アプリのtemplateとしてAdminのイメージを使用

Page 20: Pythonではじめる野球プログラミング PyCon JP 2014 9/14 Talk Session

morris.js• Javascript製グラフ描画ライブラリ

• http://morrisjs.github.io/morris.js/

• 非常にシンプルで楽

• レスポンシブデザインに対応

• 折れ線グラフ描画に使用

Page 21: Pythonではじめる野球プログラミング PyCon JP 2014 9/14 Talk Session

HIGHCHARTS• Javascript製のビジュアライゼーションライブラリ

• レスポンシブデザインに対応

• http://www.highcharts.com/

• 折れ線、棒、散布図etc…ほとんどのグラフがかける

• morris.jsで描けない散布図を描画

Page 22: Pythonではじめる野球プログラミング PyCon JP 2014 9/14 Talk Session

セイバーメトリクスを可視化

• 選手のプロフィールを見やすく表示

• BABIP : プレーの運・不運を可視化

• ピタゴラス勝率 : 得点と失点からチーム勝率を予測

Page 23: Pythonではじめる野球プログラミング PyCon JP 2014 9/14 Talk Session

デモその① 「プロフィールを表示」

Page 24: Pythonではじめる野球プログラミング PyCon JP 2014 9/14 Talk Session
Page 25: Pythonではじめる野球プログラミング PyCon JP 2014 9/14 Talk Session

BABIP• 正式名「Batting Average on Balls In Play」

• 本塁打を除くグラウンド内に飛んだ打球が安打になった割合を指標化したもの。別名「インプレー打率」

• .300前後が平均値。平均値を外れた場合は何らかの外的要因があると考える(運、守備の巧拙etc…)

• 式:(安打-本塁打)÷(打数-三振-本塁打+犠飛)

Page 26: Pythonではじめる野球プログラミング PyCon JP 2014 9/14 Talk Session

デモその② 「BABIPと打率を比較」

Page 27: Pythonではじめる野球プログラミング PyCon JP 2014 9/14 Talk Session
Page 28: Pythonではじめる野球プログラミング PyCon JP 2014 9/14 Talk Session

ピタゴラス勝率

• “得点と失点が等しい時の勝率は5割である”という仮説に基づき生み出された指標

• 総得点と総失点から予想勝率を算出

• 式:(総得点の二乗)÷(総得点の二乗+総失点の二乗)

• ラグビー、サッカー等、他の球技でも使える

Page 29: Pythonではじめる野球プログラミング PyCon JP 2014 9/14 Talk Session

デモその③ 「ピタゴラス勝率」

Page 30: Pythonではじめる野球プログラミング PyCon JP 2014 9/14 Talk Session
Page 31: Pythonではじめる野球プログラミング PyCon JP 2014 9/14 Talk Session

学びとTips• Python + オープンデータでDIYな可視化とデータ解析ができる!

• 改めて知った「野球データの奥深さ」

• 【提案】好きなデータを好きな言語でHackすると楽しいよ\(^o^)/

• ソースコードは後日Githubで公開しますので、真似するなりforkしてやってみてください!

Page 32: Pythonではじめる野球プログラミング PyCon JP 2014 9/14 Talk Session

walk-off home run!!!ご清聴ありがとうございました!さようなら!!! Blog: http://shinyorke.hatenablog.com/