今年のカープはなんで点が取れなかったのか検証してみた

広島東洋カープ Advent Calendar 2012」の12月21日担当です。
なんか一人だけ空気読まずにガチでコード書いてもにょもにょしてますが、まあスルーの方向でw

2012年、例によって9月に大失速して4位に終わったカープですが、シーズン通しての敗因として「得点力不足」が挙げられると思います。野村なんて防御率1点台なのに9勝ですよ!! あやまれ打撃陣!!! あやまれ!!!!

てなわけで、なんで今年こんなに点取れなかったのか分析しましょう。

1. 得点推定モデルをつくる

一般的に、あるチームの得点力が少ない原因として「出塁できない」「長打が出ない」「機動力が使えない」「チャンスに弱い」などさまざまな要因が考えられます。これをきちんと分析するには、主観じゃなくてしっかりデータで客観的に捉えないといけません。

で、普通に各種チーム成績(チーム打率とかチーム本塁打とか)を平均と比べて、「カープはチーム打率が低いから点が取れんのだ!」とか言ってもいいんですが、もうちょっと面白いことをやりましょう。
てなわけで、今回は重回帰分析により安打数や本塁打数、盗塁数などがチームの得点にどれくらい寄与しているかを明らかにします。これによって「盗塁が1つ増えるとチーム得点が0.2点増えるのに対し、ホームラン1本だと1点増える。つまり盗塁5個とホームラン1本の価値は等しい」みたいなことがわかるので「松井とイチローどっちが凄い?」的な質問にも答えられるわけです。

1-1. データの収集

NPB公式サイトで取ってこれる、2005年〜2012年のチーム別個人成績を使います。手入力だと死んでしまうので、クローラースクレイパー書いて自動でcsv化しました。

設定ファイル
https://gist.github.com/4353340

クローラー
https://gist.github.com/4353334

スクレイパー
https://gist.github.com/4353286

ベイスターズがああなって球団名が変わった関係で、URLが一部変わってるのに注意ですね。

1-2. サンプルの単位は?

取得したデータをもとに、得点が従属変数、安打・二塁打三塁打、、、が独立変数として重回帰をやります。当たり前ですが得点は個人で取るものではなくチームで取るものなので、サンプルは個人単位ではなくチーム単位です。
「2005年のカープのチーム打撃成績は安打が1374本で二塁打が221本で、、、」が1サンプルなので、サンプル数は8年×12チームで96となります。

1-3. 計算しよう!

PandasというPythonのものすごいライブラリを使えば一瞬です。
コードはたったのこれだけ
https://gist.github.com/4353349

結果はこれです。

-----------------------Summary of Estimated Coefficients------------------------
      Variable       Coef    Std Err     t-stat    p-value    CI 2.5%   CI 97.5%
--------------------------------------------------------------------------------
        安打     0.4170     0.0430       9.70     0.0000     0.3327     0.5012
     二塁打     0.4232     0.1257       3.37     0.0012     0.1769     0.6695
     三塁打     1.1368     0.4284       2.65     0.0095     0.2971     1.9765
     本塁打     0.9864     0.0936      10.54     0.0000     0.8030     1.1698
        盗塁     0.2402     0.1065       2.26     0.0267     0.0316     0.4489
--------------------------------------------------------------------------------
     盗塁刺    -0.3303     0.3275      -1.01     0.3163    -0.9722     0.3117
        犠打    -0.0435     0.0905      -0.48     0.6323    -0.2208     0.1339
        犠飛     0.9788     0.4034       2.43     0.0174     0.1881     1.7695
        四球     0.3236     0.0543       5.96     0.0000     0.2172     0.4299
        死球     0.1745     0.1943       0.90     0.3717    -0.2063     0.5554
--------------------------------------------------------------------------------
        三振    -0.0654     0.0335      -1.95     0.0546    -0.1311     0.0004
     併殺打    -0.1494     0.1843      -0.81     0.4199    -0.5105     0.2118
     intercept  -275.8241    59.6665      -4.62     0.0000  -392.7704  -158.8778
---------------------------------End of Summary---------------------------------

つまり、「ヒット1本はチーム得点を0.42点上げるのに貢献する」「盗塁1つはチーム得点を0.24点上げるのに貢献する」といった意味です。
一見したところ、安打と二塁打がほぼ同じだったり、三塁打本塁打より上だったり、犠打がマイナスだったり、犠飛がやたら高かったりといろいろ怪しいところがあって、そのうちのいくつかは説明できるんですが、ここでは割愛します。

2. で、結局のところカープは何がいけなかったのか

モデルができたので、本題に入りましょう。まずは12球団平均の打撃成績の平均とカープの打撃成績を比べてみます。

得点 安打 二塁打 三塁打 本塁打 盗塁 盗塁刺 犠打 犠飛 四球 死球 三振 併殺打
12球団平均 469 1166 186 20 73 82 40 141 31 390 50 898 91
カープ 427 1077 192 13 76 79 39 175 26 374 57 912 86
-42 -89 +6 -7 +3 -3 -1 +34 -5 -16 +7 +24 -5

平均より40点も得点が少ないですね。このマイナス40点にノムスケや(シーズン序盤の)バリントンは泣いたわけです。カープは投手陣がいい(と言われている)ので、チーム得点が平均並みになれば十分Aクラス入りは可能なはずです。じゃあ、得点を40点増やすにはどうすればいいんでしょう?

1. ヒットを100本増やす

ヒットが1本増えるとチーム得点がちょうど0.4点増えるので、チーム得点が40点増えるにはヒットが100本増えればいいです。ちなみに今季のカープのチーム打率は.233ですが、打数が同じでヒットが100本増えたと仮定すると、チーム打率は.255になります。これは今季の巨人とほぼ同じ水準。

2. ホームランを40本増やす

ホームラン1本はほぼ1点の貢献度です(本当はもっと大きいのですが、理由は割愛、、)なんで40本増えればOKですね。
ちなみに40本もチーム本塁打増えたら12球団でダントツの本塁打数になりますね、、、


えーっと、なんつーか、まともな分析になってませんねw データ集めて重回帰やったところで力尽きましたww(Pandasまともに触ったの初めてだったので)

他に気になるデータとしては

  • なんでズムスタなのに三塁打数が平均より7本も少ないの?
  • 犠打多すぎじゃね?

といったあたりでしょうか。今回、数字出してみて意外だったのは、純粋な長打の数では他球団に決して劣ってない、というところですね。二塁打本塁打は平均上回ってますし。ただしヒットの数が圧倒的に少ない。
犠打に関してはセイバーな方々の間でも意見が別れるところです。ですが「ヒットは少ないけど長打はそこそこ出る」チームなら、バントで塁進めるよりランナー溜めて長打に期待した方が点取れそうな気がするんですが。どうなんでしょうノムケンさん。