来年は...\横浜優勝/なんだ(^○^)
今年もプロ野球とMLB終わっちゃいましたねこんばんは.*1
プロ野球は日ハム,MLBはアスレチックス推しの私ですが両方共8月から教育リーグに旅立ってしまったので(涙)*2,
イチ野球ファンとして何のプレッシャーもなく楽しんだ日本シリーズ...に出場したホークスとベイスターズについて,
- 打撃
- 投球
- お金(年俸)
をもとに,何故日本シリーズで\横浜優勝/できなかったのか?,をふりかえりたいと思います.
結論をざっくりいうと
最後まで読めない方はここをさっくり読んでグラフを眺めてもらえるといいかもです.
- ホークス強すぎぃ,下克上はそもそも無理ゲーだった, 今年は!
- ベイスターズは(地味に)打撃でもベイスボールをしていた,なお打線はかなりイケてる
- 投手陣は質量ともにホークス
- とはいえホークスは圧倒的投資で勝ってる,投資対効果はベイスターズの方がイケてる!?
- コストパフォーマンスで.\横浜優勝/...なんだ(^○^)(事実)
(上積みを含めると)来年は横浜優勝信じてもいいかなと思いました!(なお日本一は日ハムな模様)*3
おしながき
\横浜優勝/が未遂に終わった件をデータでふりかえる
評価方法について
今回は投打をセイバーメトリクスの指標と年俸をかけ合わせて評価しました.
打撃成績は100打席以上出場した選手のwRAA(Weighted Runs Above Average),
投球成績は10試合以上出場した選手のRSAA(Runs Saved Above Average)を用いて比較・評価しました.
「ああなるほど」と思ったアナタ,野球データに強い方と思われるのでそのまま分析のページを御覧ください.
再現性担保という観点で一応情報を残します.
データについて
PyConJP 2017で発表した野球分析基盤のデータを使っています.
- 以下の条件で選手データを抽出
- 成績および年俸はネット上から独自に収集,リーグ戦終了(2017/10/12)時点のデータを利用
- セイバーメトリクス指標(wRAA,RSAAなど)は独自に計算
- wRAA,RSAAともに「セ・パをあわせて一つのリーグ」として計算
- wRAAのリーグ平均wOBAは.320で固定,得点期待値は適当に割り振り
- 上記理由により,DELTAやデータスタジアムが算出・公開している数値とは異なります,ご了承ください(雰囲気程度に見てもらえれば)
- データはMySQL上に格納,分析はPythonライブラリ(Jupyter notebook, pandas, bokeh)を駆使して行った
打撃成績(wRAA)
以前,以下のエントリーで紹介したwRAAという指標を用いて評価しました.
今年の4月終了時点の数字とともに解説を載せているのでこちらをご参考にどうぞ.
数字の読み方はこんなかんじです.
- 30以上は球界代表クラスと言ってもOK
- 20以上はリーグ代表クラス
- 10以上はチームの重要な得点源!!!
- プラスの選手はスタメン
- ゼロはリーグ平均な得点力,スタメンで居座っていると危険*6
- マイナスの選手は守備が下手なら誰かと取り替えるべき!!!(≒足を引っ張っている)
投球成績(RSAA)
RSAAはこのブログでは初めて登場する指標です.
一言で言うと,
平均的な投手と比べてどの程度失点を抑えたか
を表す指標となります.
計算のベースとして,失点率(失点÷投球回×9=失点率)を用います.
計算式と数字の読み方
リーグ平均失点率から評価したい選手の失点率を引き算し,投球イニングを掛ける&(一試合分に相当する)9イニングで割ることにより,「量」として投手を評価します.
RSAA=(リーグ平均失点率-失点率)×投球イニング÷9
数字の読み方はほぼwRAAと同じです.
- 30以上は球界代表クラスと言ってもOK
- 20以上はリーグ代表クラス
- 10以上はチームの主力
- プラスの選手はローテorベンチに置くべき
- ゼロはリーグ平均,敗戦処理とか谷間先発かな?*7
- マイナスの選手は取り替えるorクビを検討しましょう
特徴(長所と欠点)
結構読みやすい指標ですが,失点を元にしているので守備と球場影響がノイズとして入るのが欠点です.*8
- 長所
- 投手の貢献度を「量」として表現・評価できる
- スコアブック上の既存指標値の掛け合わせで算出できる
- 式が単純で計算が楽*9
- 欠点
- 純粋に投手の実力として測る指標としてはイマイチ
- 失点をベースとしているため,野手の守備力・球場の広さがノイズとして入る
- イニングが関係するので先発投手がどうしても数字良くなる*10
詳細はウィキペディア「RSAA (野球) - Wikipedia」をご覧頂けるとわかると思います.
打撃
前置きが長くなりましたがやっと分析と結果です!
wRAA比較(図)
うーーーん...ギータすごすぎでは
その中で次点・筒香は素晴らしいですね!
グラフでわかること
ざっくりと気がついたこと
- 【総評】打撃でもベイスボールだった???*11
- ベイスターズはスタメンクラスで5人プラス(筒香,ロペス,宮崎,桑原,梶谷)
- ホークスはスタメンクラスで7人プラス(ギータ,デスパイネ,内川,松田,川島,今宮,上林)
- ベイスターズはスタメンでマイナスがちらほら(倉本,柴田,etc...)
- ホークスはマイナスいるけどさほど大きくない,意外なのは中村晃がマイナス
今年のベイスターズ,打撃はかなりイケてると思ってましたがやっぱホークス強杉内でしたorz
今回はデータがリーグ戦な為,日本シリーズでの貢献度とはまた変わってくるかと思いますが,倉本さんがもっとバッティングを磨いたらかなり良くなりそうな気がします.*12
一方ホークスは相変わらずセカンドが穴っぽいですが,外野三人が文句ない数字残しているのでしばらくは安泰な気がします.*13
合算すると?
本来は足し算する指標ではありませんが,チームのwRAA合計(100打席以上出場)を足して比較すると,
ベイスターズ 25.3 - 54.8 ホークス
でした...orz
ダブルスコア以上ですね汗
投球
同じノリで投手も分析&評価します
RSAA比較(図)
RSAAってクローザー不利なのですがサファテ何やねん!(プラス20オーバー)
グラフでわかること
- 【総評】ベイスボールだった(断言)*14
- 千賀・今永両軍エースはさすがの数字
- ラスボスことサファテ,ハマの守護神ヤスアキ(山崎)は共にプラスでクローザーとして大きく貢献
- ベイスターズは左腕王国イメージあるが,失点ベースだと右P頑張ってる
- 総じて両軍ともに投手は軒並みプラスが多い...が,ベイスターズがマイナス多め...orz
RSAAの特性上,投手の純粋な実力と関係ない守備の影響も入るので,おそらくベイスボールの影響がでています(断言)
合算すると?
本来は足し算する指標ではありませんが,チームのRSAA合計(10試合以上出場)を足して比較すると,
ベイスターズ 16.0 - 94.4 ホークス
...なんもいえねー
年俸
これはお遊びというか参考までに.
こんな記事が出ていたので年俸も見てみました.
格差云々は興味ないのですが*15,打者と投手,それぞれに分けて年俸の分布を散布図で表現してみました.
横軸(X軸)が成績(打者:wRAA 投手:RSAA),
縦軸(Y軸)が年俸(単位:100万円)となります.
打撃・投球成績同様,打者は100打席以上,投手は10試合以上の出場選手のみを対象にしています.
なお,読み方はだいたいこんな感じで見てもらえればと思います.*16
※例は打者ですが,投手でも同じです!
成績×年俸ゾーンの参照方法
選手年俸サイクル
打者
というわけで,打者の散布図です!
プラス以上の選手だとコスパで圧倒的に\横浜優勝/してました!
ベイスターズ内で高給取りな筒香・ロペスが合格点以上の成績,今年ブレークの宮崎はかなりお買い得な感じになってます.
ホークスは3億以上の選手がのき南活躍している一方,年俸が低い選手はそれなりの成績っぽいです.*17
なお,ここに出ている選手の年俸を合算すると,
ベイスターズ 8億5700万円 - 21億5900万円 ホークス
...おかしくないすか?(震え声)
投手
続いて投手
コスパは\横浜優勝/ですが...結果はホークスな感じがします(札束で殴ってる)
ルーキーの濱口はじめ,他の選手が今永に近づくと本気で横浜優勝な気がしますが,ホークスの千賀・東浜の先発二軸にセットアッパー岩嵜がかなりイケてる以上,この辺に差があるみたいです.
あと,サファテ・バンデンは仕事してるのと,(仕事しているとは言え)五十嵐が案外高い.*18
打者同様,ここに出ている選手の年俸を合算すると,
ベイスターズ 7億6470万円 - 18億5400万円 ホークス
なお,分析対象を10試合以上出場に絞った結果,ホークスは年俸4億の選手三名がこっから漏れています*19.
まとめ
\横浜優勝/が未遂に終わった理由 #とは
- そら(打線が地味にベイスボールだったし)
- そう(投手は守備含めてお察しだったし)
- よ(未遂におわるに決まってるじゃないか)
とはいえ,
- 打撃で足を引っ張ってる選手はベイスターズは若手が多い
- 日本シリーズでの経験でもっと伸びてくるはず
- 投手陣は明確な左腕補強な方針&全体レベルは悪くない
ので,
来年は...\横浜優勝/なんだ(^○^)
は結構信じて良いと思いました!
ホークスはやはり札束で殴れるだけの資金力に王会長はじめフロントの練度が違うので地力で押し切った感を感じます.
来年は日ハムVSベイスターズの日本シリーズになればいいなあ...
【続きのハナシ】この分析の続きを「Baseball Play Study 2017冬(仮)」でやります!
今回は日本シリーズふりかえりと称してベイスターズVSホークスでやりましたが,
この話の12球団バージョンをBaseball Play Study 2017冬(仮)でやらせて頂く予定です.
- 2017/12/19(火) 19:00プレイボール,場所は未定
- 主催の佐藤治夫(@haru860)さん,ござ先輩(@gothedistance), 最所あさみ(@qzqrnln)さん他,IT業界で野球愛&分析・考察に長けた猛者が多数登場
- その他,強いゲストも来るらしいよ???
12球団版に向けて,データの精度向上とネタ仕込みに励もうと思います.
※ちなみに前回の2017春はこちらです.
FA戦線に契約更改と野球はまだまだ続きます,熱い冬にしていきましょう!
最後になりましたが,
福岡ソフトバンクホークス日本一おめでとうございます&横浜DeNAベイスターズ日本シリーズ進出お疲れ様でした!!
素晴らしい試合をありがとうございました!(&ネタにしてすいません...orz)
【Appendix】参考文献など(分析したい方へのオススメ)
今回の分析にあたり,以下の資料を参考にしました.
セイバーメトリクス・野球統計
wRAAおよび,RSAAの考え方・概念などを参考にした本です.
DELTAから毎年出版されているセイバーメトリクス関連のレポート誌を参考にしました.(今年からタイトル変わった)
プロ野球を統計学と客観分析で考える デルタ・ベースボール・リポート1
- 作者: 岡田友輔,市川博久,大南淳,水島仁,蛭川皓平,Student,神事努,神原謙悟,竹下弘道,高多薪吾
- 出版社/メーカー: 水曜社
- 発売日: 2017/09/27
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
いずれ書評を書きたいと思いますがここでは一言
セイバーメトリクスおよび野球統計学好き・実践を目指す人は必読の一冊です!
エンジニアリング
今回も例のごとくPythonを中心としたデータ分析環境を構築&活用しました.
こちらは #Jupyterbook を大いに参考にさせていただきました!
- 作者: 池内孝啓,片柳薫子,岩尾エマはるか,@driller
- 出版社/メーカー: 技術評論社
- 発売日: 2017/09/09
- メディア: 大型本
- この商品を含むブログ (1件) を見る
どんな本なのか・実際使ってみて...の感想はこちらをご覧ください(手前味噌)
その他(過去資料より引用)
年俸の可視化・分析は先月のfin-py studyというイベントで発表したスライドから引用しました.
分析・可視化の全体像はPyConJP 2017より.
【Appendix】分析に使ったコード
データサイエンティストおよびエンジニア向けの参考です.
なお今日のレベルであればギリギリExcelでも可能です...が,やっぱプログラミングでやった方が楽です(覚えるコスト込みでも).
DBスキーマ(雰囲気)
実際のは内緒です(とはいえ実際に限りなく近い)
スクレイピング等をしてデータを収集,うまくこのスキーマに突っ込む&以下のコードに従い実行すると再現できると思います.
# 打撃成績 | |
CREATE TABLE `player_batting` ( | |
`id` bigint(20) NOT NULL AUTO_INCREMENT, | |
`name` varchar(128) COLLATE utf8_unicode_ci DEFAULT NULL, | |
`number` varchar(3) COLLATE utf8_unicode_ci DEFAULT NULL, | |
`team` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL, | |
`year` int(11) DEFAULT NULL, | |
`date` datetime DEFAULT NULL, | |
`games` int(11) DEFAULT NULL, | |
`pa` int(11) DEFAULT NULL, | |
`ab` int(11) DEFAULT NULL, | |
`r` int(11) DEFAULT NULL, | |
`h` int(11) DEFAULT NULL, | |
`2b` int(11) DEFAULT NULL, | |
`3b` int(11) DEFAULT NULL, | |
`hr` int(11) DEFAULT NULL, | |
`tb` int(11) DEFAULT NULL, | |
`rbi` int(11) DEFAULT NULL, | |
`so` int(11) DEFAULT NULL, | |
`bb` int(11) DEFAULT NULL, | |
`ibb` int(11) DEFAULT NULL, | |
`hbp` int(11) DEFAULT NULL, | |
`sh` int(11) DEFAULT NULL, | |
`sf` int(11) DEFAULT NULL, | |
`sb` int(11) DEFAULT NULL, | |
`cs` int(11) DEFAULT NULL, | |
`dp` int(11) DEFAULT NULL, | |
`e` int(11) DEFAULT NULL, | |
`ba` float DEFAULT NULL, | |
`babip` float DEFAULT NULL, | |
`slg` float DEFAULT NULL, | |
`ba_risp` float DEFAULT NULL, | |
`obp` float DEFAULT NULL, | |
`ops` float DEFAULT NULL, | |
`rc` float DEFAULT NULL, | |
`rc27` float DEFAULT NULL, | |
`woba` float DEFAULT NULL, | |
`wraa` float DEFAULT NULL, | |
`adam_dunn` float DEFAULT NULL, | |
`create_date` datetime DEFAULT NULL, | |
`update_date` datetime DEFAULT NULL, | |
PRIMARY KEY (`id`), | |
KEY `idx_year_date_team_player_batting` (`year`,`date`,`team`), | |
KEY `ix_player_batting_team` (`team`), | |
KEY `idx_year_name_player_batting` (`year`,`name`), | |
KEY `idx_year_team_player_batting` (`year`,`team`), | |
KEY `ix_player_batting_year` (`year`), | |
KEY `idx_year_name_date_player_batting` (`year`,`name`,`date`), | |
KEY `idx_year_team_date_player_batting` (`year`,`team`,`date`), | |
KEY `ix_player_batting_date` (`date`), | |
KEY `idx_year_date_player_batting` (`year`,`date`), | |
KEY `ix_player_batting_name` (`name`) | |
) ENGINE=InnoDB AUTO_INCREMENT=28946 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; | |
# 投球成績 | |
CREATE TABLE `player_pitching` ( | |
`id` bigint(20) NOT NULL AUTO_INCREMENT, | |
`name` varchar(128) COLLATE utf8_unicode_ci DEFAULT NULL, | |
`number` varchar(3) COLLATE utf8_unicode_ci DEFAULT NULL, | |
`team` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL, | |
`year` int(11) DEFAULT NULL, | |
`date` datetime DEFAULT NULL, | |
`games` int(11) DEFAULT NULL, | |
`gs` int(11) DEFAULT NULL, | |
`cg` int(11) DEFAULT NULL, | |
`sho` int(11) DEFAULT NULL, | |
`qs` int(11) DEFAULT NULL, | |
`win` int(11) DEFAULT NULL, | |
`lose` int(11) DEFAULT NULL, | |
`sv` int(11) DEFAULT NULL, | |
`hld` int(11) DEFAULT NULL, | |
`hp` int(11) DEFAULT NULL, | |
`w_per` float DEFAULT NULL, | |
`ip` float DEFAULT NULL, | |
`bf` int(11) DEFAULT NULL, | |
`ab` int(11) DEFAULT NULL, | |
`h` int(11) DEFAULT NULL, | |
`hr` int(11) DEFAULT NULL, | |
`bb` int(11) DEFAULT NULL, | |
`hbp` int(11) DEFAULT NULL, | |
`k` int(11) DEFAULT NULL, | |
`k_per` float DEFAULT NULL, | |
`wp` int(11) DEFAULT NULL, | |
`bk` int(11) DEFAULT NULL, | |
`r` int(11) DEFAULT NULL, | |
`er` int(11) DEFAULT NULL, | |
`era` float DEFAULT NULL, | |
`bb9` float DEFAULT NULL, | |
`k9` float DEFAULT NULL, | |
`k_bb` float DEFAULT NULL, | |
`ba` float DEFAULT NULL, | |
`whip` float DEFAULT NULL, | |
`fip` float DEFAULT NULL, | |
`create_date` datetime DEFAULT NULL, | |
`update_date` datetime DEFAULT NULL, | |
PRIMARY KEY (`id`), | |
KEY `ix_player_pitching_date` (`date`), | |
KEY `idx_year_date_player_pitching` (`year`,`date`), | |
KEY `ix_player_pitching_name` (`name`), | |
KEY `idx_year_date_team_player_pitching` (`year`,`date`,`team`), | |
KEY `ix_player_pitching_team` (`team`), | |
KEY `idx_year_name_player_pitching` (`year`,`name`), | |
KEY `idx_year_team_player_pitching` (`year`,`team`), | |
KEY `ix_player_pitching_year` (`year`), | |
KEY `idx_year_name_date_player_pitching` (`year`,`name`,`date`), | |
KEY `idx_year_team_date_player_pitching` (`year`,`team`,`date`) | |
) ENGINE=InnoDB AUTO_INCREMENT=25970 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; | |
# 年俸 | |
CREATE TABLE `salary` ( | |
`id` bigint(20) NOT NULL AUTO_INCREMENT, | |
`name` varchar(128) COLLATE utf8_unicode_ci DEFAULT NULL, | |
`team` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL, | |
`year` int(11) DEFAULT NULL, | |
`salary` int(11) DEFAULT NULL, | |
`up_down` int(11) DEFAULT NULL, | |
`salary_text` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL, | |
`up_down_text` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL, | |
`create_date` datetime DEFAULT NULL, | |
`update_date` datetime DEFAULT NULL, | |
PRIMARY KEY (`id`), | |
KEY `ix_salary_name` (`name`), | |
KEY `ix_salary_salary` (`salary`), | |
KEY `ix_salary_up_down` (`up_down`), | |
KEY `idx_year_name_salary` (`year`,`name`), | |
KEY `ix_salary_team` (`team`), | |
KEY `ix_salary_year` (`year`) | |
) ENGINE=InnoDB AUTO_INCREMENT=684 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; | |
コード(Jupyter notebook)
こちらのGistをご参考ください.
*1:今年は一回しか球場に行ってない,来年はもっと行きたい
*2:とはいえドラフト会議で清宮幸太郎くんクジを引いた瞬間はガッツポーズしました!あとはFA多い今年の日ハム,いい感じに戦力の整理をお願い!
*3:日ハムファンなので...ってのもありますが,清宮幸太郎・(報道では騒いでるけど誰もメジャー行きとは言ってない)大谷翔平のパフォーマンス次第でリーグ戦二位からの逆転はあると思います(リーグ優勝とは怖くて言えない)
*4:守備専の選手が入らないリスクがありますが,今回は打撃のみ評価なのでちょうどいい,ホントは200打席でもいいかも
*5:なので,ソフトバンクの背番号18は入りません,良かったね
*6:足も引っ張らないけど貢献もしない
*7:足も引っ張らないけど貢献もしない(二回目)
*8:この辺の話はややこしいので,気になる方はDIPSを参照ください(野手・球場に影響されない,投手の実力を評価する概念と手法)DIPS (野球) - Wikipedia
*9:fipや野手のwOBA・wRAAと異なり,定数・補正値が入らないので楽.再現性も高い
*10:基本,試合に長く出ている選手が評価されるべきなのである意味正しいのですが,中継ぎ・クローザーは投球の「質」とアウトを確実に奪う力を評価すべきなのでRSAAで評価はちょっとかわいそうかも
*12:とはいえ倉本は開幕からフル出場,日本シリーズでのバッティングそして守備の経験を積んだので来年上手く行けば宮崎みたいになるかも?
*13:余談ですが,ホークスの外野は守備がアレです.球場が狭い分ある種カバーできてますが,ギータはホントにライトに回して欲しい...
*15:投資先が違うっていうだけだと思う,マジレスすると
*16:過去に分析をしたこちらから引用しました. プロ野球におけるお金とセイバーメトリクスの話(横浜優勝記念) // Speaker Deck
*17:これは球団のスタイルもありますが,主力が長年居座って若手の出場機会が限られているのも要因の一つな気がします
*18:とはいえ五十嵐は同い年なのでなんだか嬉しい
*19:摂津,和田...背番号18(察し)