Lean Baseball

Engineering/Baseball/Python/Agile/SABR and more...

プロ野球の打者における「得点力」を長方形の面積で求めてみる #野球Hack #Python

日米ともに贔屓チームが蚊帳の外におかれて辛い私ですこんにちは.*1

PyCon JP 2017の準備(詳しくは最後に触れます!)の際に興味深い野球ネタを見つけた&早速真似したので披露したいと思います.

優勝争いしているチームのファンもそうじゃないファンもお楽しみいただければと思います!

要約すると

  • 野球選手の得点力は長方形の面積の公式(たての長さ×よこの長さ)にあてはめることにより、視覚的に求めることができる
  • 得点力の公式(ざっくり) = 攻撃力 × 出場機会
  • 攻撃力はwOBA(Weighted On-Base Average, 重み付き出塁率)、出場機会は打席数で求めるのが望ましい
  • 丸(広島)と小林(巨人)、ギータ(ソフトバンク)と中島卓也(日ハム)の差は(察し
  • なお、攻撃力だけで野手の価値が決まるわけではない(守備もかなり重要)

おしながき

参考文献

今回はこちらの書籍のエントリーを参考に,私がデータを集めて真似をしました.*2

プロ野球を統計学と客観分析で考えるセイバーメトリクス・リポート5

プロ野球を統計学と客観分析で考えるセイバーメトリクス・リポート5

  • 作者: 岡田友輔,道作,三宅博人,蛭川皓平,高多薪吾,Student,水島仁,神事努,森下義隆,神原謙悟,竹下弘道,市川博久,大南淳
  • 出版社/メーカー: 水曜社
  • 発売日: 2016/05/25
  • メディア: 単行本(ソフトカバー)
  • この商品を含むブログ (1件) を見る

上級者向けの書籍ではありますが,野球をデータと統計の側面で知ることができる良著です.

かなりオススメします!

今回はどこかのページに記載があったwOBAと打席の長方形の話についてそのまま引用させていただきました.

得点力を長方形の面積にあてはめる考え方

今回の考え方を絵で表すとこうなります.

f:id:shinyorke:20170829155712p:plain

自分で言うのもアレですがかなりシンプルです.

中身を追って解説します.

攻撃力(たての長さ)

タテ軸は野手の純粋な攻撃力(得点に絡む打撃ができるか)になります.

攻撃力 #とは

一般的に野手の攻撃力は以下の成績・指標で評価されることが多いです.

  • 打率
  • 出塁率
  • 長打率(塁打数)
  • OPS(出塁率+長打率)

一般的に使う数字(打率、出塁率、長打率)に野球統計学が出てきてから有名になった数字(OPS)とよりどりみどりです.

ではこの長方形理論の攻撃力もこのどれかで…と思ってしまいますが、

  • 打率はヒットしか反映されない*3
  • 出塁率は「アウトにならない率」という安定感を測るのにはベストだが、「どこまで塁を落としたか」を表現できない*4
  • 長打率は純粋な塁打の積み上げで数字があがる=打者評価とも比例するが、「アウトカウント・走者状況で打ったヒットの重み」みたいなモノは取れない←ココ重要
  • OPSは出塁率+長打率の足し算で主に出塁率では足りない「塁打」を補完しているが、長打率(または塁打)の欠点を補っているわけではない

野球の得点力は純粋に塁に出たり打ったりするだけでなく、「1アウト3塁の貴重な場面でヒットが出て得点した」とか、「2アウト走者なしから粘ってホームランした 」…というプレーを決める決める野手が評価されるべきであるので、

状況(アウトカウント×走者の数 = 24通り)の成績を元に攻撃力を評価したい!という気持ちになります.

Linear Weightsと得点期待値(Run Expectancy)、得点価値(Run Value)

じゃあそんな状況別に評価する方法ってあるんかいっ!

…と思う方もいるかと思いますが、実は既にあったりします.

それがLiner Weights(通称LWTS)という考え方です.

Linear Weights - Wikipedia

LWTSの基礎概念として、得点期待値(Run Expectancy)というものがあり、

  • 塁上のランナー(走者なし〜満塁までの8通り)とアウトカウント(0-2アウト)の状況を分類
  • 分類した状況(24通り)を「得点数/状況が起こった回数」で期待値を算出

することにより、

「プレーの前後で変化した期待値」の差分を使って攻撃力を評価

が可能になります!これを野球統計学の世界では「得点期待値(Run Value)」と呼んでいます.

何を言ってるかさっぱりかもですが、先ほどの例

  • 1アウト3塁の貴重な場面でヒットが出て得点した
  • 2アウト走者なしから粘ってホームランした

を数値化して評価できる、とだけこのエントリーを読む際には把握していただければ大丈夫です*5

wOBA(Weighted On-Base Average, 重み付き出塁率)

得点価値はそのまま使うより、他の指標の係数として用いるのが一般的です.

中でも出塁率前後の数字(0.250〜0.400ぐらい)にscaleするように定義された、

wOBA(Weighted On-Base Average, 重み付き出塁率)

はよく使われます.

wOBA (NPB) = {0.69×(四球-敬遠)+0.73×死球+0.92×失策出塁+0.87×単打+1.29×二塁打+1.74×三塁打+2.07×本塁打}÷(打数 + 四球 – 敬遠 + 犠飛 + 死球)

※Wikipediaより引用

なお,指標に掛けている係数はリーグや年度,算出元のさじ加減により変わります.*6

計算するとわかるのですが,限りなく出塁率に近い数字が出ます.

これで「状況(アウトカウント×走者の数 = 24通り)の成績を元に攻撃力を評価」に近しいことが可能となります!

出場機会(よこの長さ)

いくら攻撃力があっても試合に出て打席に立たないと意味はありません.

同じwOBA(いや、打率や出塁率でもいい)でも,毎日試合に出てシーズンで500打席程度立つ打者と,シーズン半分を故障して200打席程度で収まる打者が同じ価値を出しているとは言えません.

というわけで、今回はバッターボックスに立った回数「打席数(PA)」を出場機会として捉えます.

実例

算出方法

  • 予めクローラーで集めたデータを元にwOBAを算出,MySQLに保存
  • 適当にクエリーで抽出してwOBA上位と下位の選手で比較
  • 実行環境はPython 3.6.2、jupyter,pandas,numpy,matplotlibを使用
  • データは8/28(月)時点のデータを利用,wOBAの係数はWikipediaと異なります*7

なお、サンプルコードは最後に添付しています.

セ・リーグ

セ・パ共に,敢えて結果が開くような打者をチョイスしてみてみます.

打撃も守備も最高にイケてる丸佳浩外野手(広島)と、日本代表捕手(なおシーズンは)の小林誠司捕手(巨人)を比べた結果です.

f:id:shinyorke:20170829165353p:plain

パッと見だけでも面積が倍以上開いてる感あります(汗

丸は出場機会も多く,打撃も守備もいい数字が出ているので貢献度が半端ない一方,小林さんはやはりバットの湿り具合は深刻なようです.

パ・リーグ

続いてパ・リーグはギータこと柳田悠岐(ソフトバンク)と先日人生初ホームランを放った中島卓也(日ハム)で比較してみます.

f:id:shinyorke:20170829170813p:plain

去年の揺り戻し?で打棒爆発なギータと今年はとにかく不調な卓也とで差が出ています.

数字の雰囲気から察するに,面積で得点力評価は機能していそうです!

4人の指標と面積

最後に結果の数字を共有します.

参考数値として(今回の評価と全く関係ないですが)打率・本塁打・打点のデータも合わせて置きます.

名前 wOBA 打席数 面積 打率 本塁打 打点
丸 佳浩 0.405 545 220.73 0.315 21 81
小林 誠司 0.233 357 83.18 0.201 0 20
柳田 悠岐 0.445 487 216.71 0.317 29 91
中島 卓也 0.23 331 76.13 0.208 1 13

数字的にはギータが圧倒的(wOBA含め)ですが,チーム貢献(=試合に出ている)という意味で丸が面積的に勝っていますね.

そして個人的には中島卓也が小林誠司にも負けていることorz

この面積については全選手で取ってみると面白そうだなと思いました.

結論

(攻撃力と出場機会の面積で得点力を可視化できるのは)見てのとおりですね(金本監督風に

非常にシンプルな可視化ですが、すごく意味がありそう、というのがわかりました.

単に数字を求めるだけでなく、可視化をシンプルかつ工夫して駆使するのは大切ですね!

気をつけるべきこと〜野手は得点力が全てではない!

これで野手を全員評価できる!…訳では実は無くて,この方式だと

  • 走塁、特に盗塁の貢献度はほぼ無視される(盗塁・盗塁死は変数に入ってない)*8
  • 守備力は完全無視

面積が猫の額の用に小さい選手でも、守備で人より守って十分貢献していることも考えられる(中島卓也は間違いなくそう)ので、wOBAや長方形の面積だけで選手の評価はキケンです!ということは付け加えておきます.

野球を科学するための技術ハナシを「PyConJP 2017」の初日にやらせていただきます!

…といったような野球Hackやデータ分析を9/8(金)から始まる「PyCon JP 2017」の初日のトップバッターとして、登壇・発表させて頂きます!

pycon.jp

技術面ではPythonを用いたデータ集めや基盤の運用、統計ライブラリ作成の話を、野球についてはこのエントリー同様LWTSの話をメインに演る予定です.

気がつけば今年で4年連続の登壇*9となりますが相も変わらず、

技術(と野球)に感動しよう!

をテーマに真面目に楽しく皆さんと「やきうの時間」を過ごせればと思っております.

会場に行く方は是非見に来てください&来られない方もYouTube LIVE(PyCon JP)などでチェックいただけるとうれしいです!

お後がよろしいようで.

【Appendix】サンプルコード

  • Python 3.6.2
  • pandas + matplotlib + pymysql ほか

で作ったサンプルです.

データは上手く自分で集めてください(そこが一番むずかしいかも)

wOBAと打席数の長方形で選手の得点力を出すサンプル

*1:アスレチックスは夏季西海岸教育リーグへ,日ハムも同じく夏季北海道教育リーグへ旅立ちました(察し

*2:計算そのものよりデータ集めに苦労しました.詳しくはPyCon JP 2017で!

*3:セイバーメトリクスの初歩「打率は思ったよりあてにならない」というやつです.理由を知りたい方はマネーボールを読みましょう.

*4:四球で一塁に進んでも右中間を真っ二つに割る三塁打を放っても数字は変わらない

*5:Wikipediaおよび野球統計学の本にもあんまり言及がないのですが、マネーボールで「センターをジョニー・デーモンからテレンス・ロングに変えたら何失点増えるか(減るか)」の問に対する答えをLWTSで出しています。

*6:理由としては「得点価値はリーグやシーズンによって変動がある」から.NPBとMLB,投高打低か打高投低かによって変動します,という意味.なおあまり変動されても困るので一般的には5〜10年分の得点期待値・得点価値を利用して算出します

*7:自作ライブラリで係数を少しいじってます

*8:補足すると、長打は入ってるのでベースランニングの巧拙は反映されます.ちなみに犠打も含まれません(これは個人的にアウトと同義なのでいいと思う).

*9:自分でもここまで続くとは思ってなかった