MLBのデータを使って、はじめてのR

October 15, 2010 at 10:07 PM | View Comments

Rとは

Rとは統計計算とグラフィック出力を提供する言語?。スクリプトでいろいろ計算、描画ができる。

ちなみに、僕は前にインストールしたことはありますが、ちゃんとRを使うのは初めてです。

Rのインストール

Windowsだとインストーラーがあったので一発インストール可能でした。64bitのWindows7なのですが、64bit版もあり問題なし。

Rについての解説

R-Tips

を参考にしました。

はじめてのR

準備

以前のエントリーで使ったMLBのデータを使う。

ueBLOG | 打者9人が全員イチローだったら?

条件は350打席以上のみ抽出。

テキストは数値は整数の方が好ましいようだったので、打率などの小数点以下は1000倍。RC27は10倍して整数にする。

ファイルからデータセットを作る

  • ファイル名 c:tmprc27.csv
  • 区切り t
  • 1行目 ヘッダーあり
  • 行を名前(NAME)でアクセスできるように設定
  • mlbplayers という名前に入れる

の場合、Rのコンソールから以下のようにしてデータをセットする。

mlbplayers <- read.csv2("c:\\tmp\\rc27.csv", header=TRUE, sep="\t", row.name="NAME")

テキストのサンプル

NAME                   TEAM    G       AB      H       BB      SB      HBB     AVG     OBP     SLG     AVG2    OPS     RC27
J_Hamilton             TEX     133     518     186     43      8       229     359     411     633     373     1044    96
J_Votto                CIN     150     547     177     91      16      268     324     424     600     472     1024    94
K_Youkilis             BOS     102     362     111     58      4       169     307     411     564     428     975     87
A_Pujols               STL     159     587     183     103     14      286     312     414     596     484     1010    85
C_Gonzalez             COL     145     587     197     40      26      237     336     376     598     375     974     83
P_Konerko              CWS     149     548     171     72      0       243     312     393     584     403     977     83
J_Bautista             TOR     161     569     148     100     9       248     260     378     617     548     995     81
N_Cruz                 TEX     108     399     127     38      17      165     318     374     576     396     950     76
J_Werth                PHI     156     554     164     82      13      246     296     388     532     408     921     75

のようなファイル

データの概要を見る

summary(データ)で概要を出力することができる。

Min    最小値
1st Qu 第一四分位数
Median 中央値
Mean   平均値
3rd Qu 第三四分位数
Max    最大値

平均値は、データ合計 ÷ データ個数。学校でならう普通の平均。中央値は、データを順番に並べたときに真ん中の値。100個データがあったら50番目のデータのこと(奇数の場合はどうするのかわからない)。1st Qu, 3rd Qu.はそれぞれ25%,75%のデータ値。100個だったら25番目、75番目。

> summary(mlbplayers)
      TEAM           G               AB              H               BB              SB
 COL    : 10   Min.   : 75.0   Min.   :301.0   Min.   : 66.0   Min.   : 13.0   Min.   : 0.000
 BOS    :  9   1st Qu.:117.0   1st Qu.:386.2   1st Qu.: 99.5   1st Qu.: 33.0   1st Qu.: 2.000
 CHC    :  9   Median :137.0   Median :477.5   Median :127.0   Median : 45.0   Median : 6.000
 LAD    :  9   Mean   :132.6   Mean   :473.9   Mean   :128.1   Mean   : 47.6   Mean   : 9.865
 NYY    :  9   3rd Qu.:150.8   3rd Qu.:561.8   3rd Qu.:152.0   3rd Qu.: 59.0   3rd Qu.:13.000
 PHI    :  9   Max.   :162.0   Max.   :680.0   Max.   :214.0   Max.   :114.0   Max.   :68.000
 (Other):175
      HBB             AVG             OBP             SLG             AVG2            OPS
 Min.   : 88.0   Min.   :196.0   Min.   :240.0   Min.   :268.0   Min.   :110.0   Min.   : 533.0
 1st Qu.:139.2   1st Qu.:252.2   1st Qu.:317.2   1st Qu.:378.0   1st Qu.:222.5   1st Qu.: 697.5
 Median :169.5   Median :268.0   Median :337.0   Median :422.5   Median :270.0   Median : 753.5
 Mean   :175.7   Mean   :269.2   Mean   :338.7   Mean   :425.9   Mean   :277.3   Mean   : 764.6
 3rd Qu.:211.8   3rd Qu.:284.8   3rd Qu.:358.8   3rd Qu.:467.0   3rd Qu.:335.0   3rd Qu.: 820.8
 Max.   :286.0   Max.   :359.0   Max.   :424.0   Max.   :633.0   Max.   :548.0   Max.   :1044.0

      RC27
 Min.   :18.00
 1st Qu.:42.00
 Median :50.00
 Mean   :51.05
 3rd Qu.:59.00
 Max.   :96.00

ヒストグラムの出力

Rはデータセット$カラム名で、列にアクセスできる。

> mlbplayers$AVG
  [1] 359 324 307 312 336 312 260 318 296 312 315 300 280 319 307 307 284 261 290 287 275 270 302 321 294 327
 [27] 268 260 300 288 300 277 304 284 272 278 276 292 269 288 286 305 283 285 270 276 256 291 277 273 318 303
 [53] 269 283 318 281 274 296 302 265 278 315 268 263 286 248 297 300 307 308 273 259 257 280 297 247 279 271
 [79] 254 255 290 255 258 281 237 264 275 293 293 259 310 243 273 285 281 263 255 282 285 273 256 321 259 247
[105] 266 246 260 299 270 284 256 291 245 291 282 243 284 269 244 288 262 237 256 275 256 268 304 292 196 300
[131] 260 265 269 238 269 298 198 238 263 243 284 263 261 255 251 249 249 271 275 240 248 267 277 241 246 264
[157] 275 268 279 270 250 247 268 248 264 252 271 251 248 240 294 269 249 262 247 268 282 237 248 251 265 254
[183] 249 255 276 252 245 256 265 263 249 207 261 267 246 259 276 218 256 276 237 235 253 259 239 231 262 244
[209] 263 253 270 259 224 221 265 270 205 247 256 242 251 230 256 235 258 217 223 266 230 218

hist関数でヒストグラムを描画できる。ヒストグラムはデータの分布状況を視覚的に認識するものだ。

hist(mlbplayers$AVG)
送信者 R

打率は2割後半が最も多いことがわかる。

相関関係を見る

レッドソックス式第二の打率(AVG2)と相関関係が強いといわれるRC27の関係を描画してみる。 plot関数を使う。

> plot(AVG2 ~ RC27, data=mlbplayers)

相関関係とは 〇が小なら×も小、〇が大なら×も大というように、規則性が見られるかどうか。相関関係があると直線に近い集まりになる。

見てみると、AVG2とRC27には相関関係がありそうだ。

送信者 R

ちなみに、AVG2はAVGから単打の特性を除いたものなので、相関関係がないと予想される。実際に出力してみると、、、

> plot(AVG ~ AVG2, data=mlbplayers)
送信者 R

予想通り、規則性のない図になった。

AVG(打率) OBP(出塁率) SLG(長打率) AVG2(第二の打率) OPS(出塁率+長打率) RC27(1試合あたり得点能力) の関係をそれぞれ調べると思ったとき、この方法で何回も描画するのは面倒。その場合はpairsを使う。

> pairs(mlbplayers[, 8:13], main="MLG 2010", pch=21, bg=c("red", "green", "blue"))

8:13 は列の8番目から13番目という意味。

すると、以下のような表が描画される。

送信者 R

OPSとRC27の相関関係はかなり高く、AVGとAVG2の相関関係はひくい。

図あ視覚的にはわかりやすいが、数値の方が良い場合もある。その場合はcor関数を使う。

> cor(mlbplayers[8:13])
           AVG       OBP       SLG      AVG2       OPS      RC27
AVG  1.0000000 0.7139030 0.5279550 0.1454165 0.6462002 0.6869889
OBP  0.7139030 1.0000000 0.6012699 0.6160611 0.8013381 0.8765793
SLG  0.5279550 0.6012699 1.0000000 0.7849449 0.9597992 0.8799444
AVG2 0.1454165 0.6160611 0.7849449 1.0000000 0.8037622 0.7919205
OPS  0.6462002 0.8013381 0.9597992 0.8037622 1.0000000 0.9666373
RC27 0.6869889 0.8765793 0.8799444 0.7919205 0.9666373 1.0000000

箱ひげ図でシアトルマリナーズとニューヨークヤンキースを比べる

summaryで出力した

Min    最小値
1st Qu 第一四分位数
Median 中央値
Mean   平均値
3rd Qu 第三四分位数
Max    最大値

を図に描画するにはboxplot関数を使う。

まず各チームのデータを取得するには以下のようにする

> mlbplayers[mlbplayers$TEAM=="NYY",]
                TEAM   G  AB   H BB SB HBB AVG OBP SLG AVG2 OPS RC27
R_Cano           NYY 160 626 200 57  3 257 319 381 534  310 914   71
N_Swisher        NYY 150 566 163 58  1 221 288 359 511  327 870   63
A_Rodriguez      NYY 137 522 141 59  4 200 270 341 506  356 847   61
M_Teixeira       NYY 158 601 154 93  0 247 256 365 481  379 846   61
B_Gardner        NYY 150 477 132 79 47 211 277 383 379  367 762   61
J_Posada         NYY 120 383  95 59  3 154 248 357 454  368 811   58
C_Granderson     NYY 136 466 115 53 12 168 247 324 468  361 792   55
A_Kearns         NYY 120 403 106 46  4 152 263 351 395  256 746   46
D_Jeter          NYY 157 663 179 63 18 242 270 340 370  222 710   44

今回はOPS(出塁率+長打率)で評価するので$OPSでデータを取得する。

> mlbplayers[mlbplayers$TEAM=="NYY",]$OPS
[1] 914 870 847 846 762 811 792 746 710

boxplot関数にSEAとNYYのデータを入れる。(この方法は面倒なのでもっといい方法があるかもしれない)。

boxplot(mlbplayers[mlbplayers$TEAM=="SEA",]$OPS, mlbplayers[mlbplayers$TEAM=="NYY",]$OPS)

すると、以下のような図が表示される。

送信者 R

1がマリナーズで2がヤンキーズ。

上下が最大値と最小値、箱の上と下が 第一四分位数と第三四分位数、真ん中の線が中央値。

得点に影響欲があるOPSでこれだけ差があると、イチロー個人がどうより、チーム体制を考えた方が良いかもしれない。

Rはどうか?

なかなか簡単にいろいろな計算やグラフを描画することができました。

かなり良いのではないのでしょうか??

まだまだいろいろな機能があるようなので、統計学の勉強をしながら触ってみたいと思います。

categories: r, statistics
Read and Post Comments

打者9人が全員イチローだったら?

October 13, 2010 at 01:03 AM | View Comments

さて、今回もメジャーリーグを数字で見るシリーズ。

これまで、

  • 安打数 + 四球
  • 出塁率
  • レッドソックス式の第二の打率

を算出して、イチローや日本人選手を見てきました。

これまでのわかったことは、

  • 1番バッターは出塁率が重要というが、スラッガーの方が出塁率は高い
  • 安打数ナンバーワンのイチローだが、他の一番バッターと比較すると出塁率は上位だが一番ではない。

ということでした。

今回はRC27と、最近特に重要といわれるOPSで評価してみたいと思う。

RC27は1番から9番まで同じ打者だった場合の1試合の得点数

RC (野球) - Wikipedia

WikiPediaによると

RC:

(出塁能力A × 進塁能力B)/ 出塁機会Cを基に構成されている。
チームの全打者のRCを合計すると、シーズン中のチームの総得点とほぼ一致するように式が作られている。

RC27:

RC27(Runs Created per 27 outs)はRCを元にある特定の選手1人で構成された打線で試合を行った場合、
27アウト(9イニング×3アウト=1試合)で平均何点とれるかを算出した指標。
この数値が大きいほど、その選手の総合的な得点能力が優れているとされる。

ということらしい。

リンク先の方程式をみるとわかると思いますが、この式は確立などではなく、一般公開されている安打数や塁打、盗塁、四球などのデータを元に、実際の得点となるべく一致するようにそれら変数と定数を掛け合わせたものになっている。

また別の機会で書こうと思うが、ちゃんとした統計学と、こじつけのような計算がごちゃまぜになって評価や予想を行っているところが、個人的にセイバーメトリックスが面白いと感じるポイントだ。

では、ESPNで1番とされている打者(50試合以上出場、安打数80本)の選手たちのRC27ベストは以下の通りになる。

イチローは出塁率と同じく4位。1番から9番まで全部イチローだったら、一試合あたり5.9点得点できると予想される。と、いうことだ。

NO Name        Team    G       H      BB       SB     H+BB     AVG     OBP     SLG     AVG2    OPS     RC27
 1 R Furcal    LAD     97      115     40      22      155     0.300   0.366   0.460   0.321   0.826   6.6
 2 K Johnson   ARI     154     166     79      13      245     0.284   0.370   0.496   0.369   0.865   6.5
 3 R Weeks     MIL     160     175     76      11      251     0.269   0.366   0.464   0.329   0.830   6.4
 4 I Suzuki    SEA     162     214     45      42      259     0.315   0.359   0.394   0.207   0.754   5.9
 5 C Crisp     OAK     75      81      30      32      111     0.279   0.342   0.438   0.372   0.779   5.9
 6 A Torres    SF      139     136     56      26      192     0.268   0.343   0.479   0.373   0.823   5.9
 7 M Prado     ATL     140     184     40      5       224     0.307   0.350   0.459   0.227   0.809   5.8
 8 A Jackson   DET     151     181     47      27      228     0.293   0.345   0.400   0.227   0.745   5.4
 9 S Victorino PHI     147     152     53      34      205     0.259   0.327   0.429   0.319   0.756   5.4
10 S Podsednik KC      95      121     29      30      150     0.310   0.353   0.400   0.241   0.753   5.4
11 D Fowler    COL     132     114     57      13      171     0.260   0.347   0.410   0.310   0.757   5.2
12 J Reyes     NYM     133     159     31      30      190     0.282   0.321   0.428   0.254   0.749   5.1
13 F Lewis     TOR     110     112     38      17      150     0.262   0.332   0.414   0.280   0.745   4.9
14 B Phillips  CIN     155     172     46      16      218     0.275   0.332   0.430   0.254   0.762   4.9
15 C Coghlan   FLA     91      96      33      10      129     0.268   0.335   0.383   0.235   0.718   4.9
16 M Bourn     HOU     141     142     59      52      201     0.265   0.341   0.346   0.288   0.686   4.8
17 C Patterson BAL     90      83      20      21      103     0.269   0.315   0.406   0.269   0.721   4.8
18 R Davis     OAK     143     149     26      50      175     0.284   0.320   0.377   0.238   0.697   4.7
19 M Scutaro   BOS     150     174     53      5       227     0.275   0.333   0.388   0.204   0.721   4.6
20 J Pierre    CWS     160     179     45      68      224     0.275   0.341   0.316   0.215   0.657   4.4
21 D Jeter     NYY     157     179     63      18      242     0.270   0.340   0.370   0.222   0.710   4.4
22 D Span      MIN     153     166     60      26      226     0.264   0.331   0.348   0.221   0.679   4.3
23 S Schumaker STL     137     126     43      5       169     0.265   0.328   0.338   0.174   0.667   4.1
24 J Bartlett  TB      135     119     45      11      164     0.254   0.324   0.350   0.216   0.675   4.1
25 E Andrus    TEX     148     156     64      32      220     0.265   0.342   0.301   0.199   0.643   4.0
26 N Morgan    WSH     136     129     40      34      169     0.253   0.319   0.314   0.206   0.633   3.8
27 J Hairston  SD      119     105     31      9       136     0.244   0.299   0.353   0.202   0.652   3.7
28 E Aybar     LAA     138     135     35      22      170     0.253   0.306   0.330   0.184   0.636   3.6
29 R Theriot   LAD     150     158     41      20      199     0.270   0.321   0.312   0.147   0.633   3.5
30 T Crowe     CLE     122     111     29      20      140     0.251   0.302   0.333   0.192   0.634   3.3
G試合数 H安打数 BB四球 SB盗塁 AVG打率 OBP出塁率 SLG長打率 AVG第二の打率 OPS出塁率+長打率 RC27

チーム方針として盗塁禁止のアスレチックPradoが出塁率より順位が落ちた程度かな?

正直、1番で比較しても面白くないので最後に全体のベスト100をのせておきます。

この方程式は 「走力 = 盗塁力」なので、実際の走力は反映されていないのではないかと思う。

走力がものを言うのは、塁に出ているときにヒットが生まれてたときの得点の期待値だからだ。

OPSは出塁率と長打率の足し算

OPSの算出方法をみて唖然とした。なんと率と率の単純な足し算なのだ。

OPS (野球) - Wikipedia

しかも、そんないかにも適当そうな数値が得点との相関関係が高く、非常に重視されているというのだ。

<追記>

よく考えたら 打率も長打率も同じ分母 AB(打数)なので足し算はOKでした。

AVG + OBP = (H/AB) + ((H + 1*2B + 2*3B + 3*HR) / AB) = (2*H + 1*2B + 2*3B + 3*HR) / AB

<追記おわり>

OPS:

OPS(オーピーエス)はOn-base plus sluggingの略であり、野球において打者を評価する指標の一つ。
セイバーメトリクスの祖、ビル・ジェームズがディック・クレイマー、ピート・パーマーと共同開発した指標。
on-baseとは出塁、sluggingとは強打(長打)の意味で、出塁率と長打率とを足し合わせた値である。
得点との相関関係の強さと簡単な算出方法により、現代の米国野球において、非常に重視されている打撃指標である。

「イチローは内野安打が多い」という批判も多いのだけど、長打は得点につながるという認識がアメリカでは多いことからきているのではないだろうか?実際にこの評価でイチローを評価すると厳しい。

RC27ベスト100

ではRC27のベスト100(出場数50以上、安打80本以上)。

81試合しかでていない MorneauがRC27もOPSも驚異的な数字を叩き出している。レッドソックスのYoukilisは四球と長打率に優れていることから4位にランキング。

現役最高の打者といわれるPujolsが5位。

ちなみにイチローは64位。松井57位、福留は67位だった。

NO Name                Team    G       H      BB       SB     H+BB     AVG     OBP     SLG     AVG2    OPS     RC27
01 J Morneau           MIN     81      102     50      0       152     0.345   0.437   0.618   0.443   1.055   10.0
02 J Hamilton          TEX     133     186     43      8       229     0.359   0.411   0.633   0.373   1.044   9.6
03 J Votto             CIN     150     177     91      16      268     0.324   0.424   0.600   0.472   1.024   9.4
04 K Youkilis          BOS     102     111     58      4       169     0.307   0.411   0.564   0.428   0.975   8.8
05 A Pujols            STL     159     183     103     14      286     0.312   0.414   0.596   0.484   1.011   8.6
06 C Gonzalez          COL     145     197     40      26      237     0.336   0.376   0.598   0.375   0.974   8.4
07 P Konerko           CWS     149     171     72      0       243     0.312   0.393   0.584   0.403   0.977   8.4
08 J Bautista          TOR     161     148     100     9       248     0.260   0.378   0.617   0.548   0.995   8.2
09 N Cruz              TEX     108     127     38      17      165     0.318   0.374   0.576   0.396   0.950   7.6
10 J Werth             PHI     156     164     82      13      246     0.296   0.388   0.532   0.408   0.921   7.6
11 M Holliday          STL     158     186     69      9       255     0.312   0.390   0.532   0.351   0.922   7.6
12 T Tulowitzki        COL     122     148     48      11      196     0.315   0.381   0.568   0.379   0.949   7.5
13 S Choo              CLE     144     165     83      22      248     0.300   0.401   0.484   0.375   0.885   7.4
14 G Soto              CHC     105     90      62      0       152     0.280   0.393   0.497   0.410   0.890   7.2
15 W Betemit           KC      84      82      36      0       118     0.297   0.378   0.511   0.344   0.889   7.2
16 R Cano              NYY     160     200     57      3       257     0.319   0.381   0.534   0.310   0.914   7.2
17 C Crawford          TB      154     184     46      47      230     0.307   0.356   0.495   0.343   0.851   7.1
18 R Zimmerman         WSH     142     161     69      4       230     0.307   0.388   0.510   0.343   0.899   7.1
19 L Scott             BAL     131     127     59      2       186     0.284   0.368   0.535   0.387   0.902   7.0
20 P Fielder           MIL     161     151     114     1       265     0.261   0.401   0.471   0.408   0.871   7.0
21 A Huff              SF      157     165     83      7       248     0.290   0.385   0.506   0.374   0.891   7.0
22 D Uggla             FLA     159     169     78      4       247     0.287   0.369   0.508   0.360   0.877   6.9
23 C Utley             PHI     115     117     63      13      180     0.275   0.387   0.445   0.348   0.832   6.9
24 D Ortiz             BOS     145     140     82      0       222     0.270   0.370   0.529   0.417   0.899   6.8
25 C Ruiz              PHI     121     112     55      0       167     0.302   0.400   0.447   0.294   0.847   6.8
26 A Beltre            BOS     154     189     40      2       229     0.321   0.365   0.553   0.304   0.919   6.8
27 E Longoria          TB      151     169     72      15      241     0.294   0.372   0.507   0.364   0.879   6.7
28 J Mauer             MIN     137     167     65      1       232     0.327   0.402   0.469   0.271   0.871   6.7
29 J Willingham        WSH     114     99      67      8       166     0.268   0.389   0.459   0.395   0.848   6.7
30 A Dunn              WSH     158     145     77      0       222     0.260   0.356   0.536   0.414   0.892   6.7
31 H Ramirez           FLA     142     163     64      32      227     0.300   0.378   0.475   0.352   0.853   6.7
32 D Pedroia           BOS     75      87      37      9       124     0.288   0.367   0.493   0.358   0.860   6.6
33 R Furcal            LAD     97      115     40      22      155     0.300   0.366   0.460   0.321   0.826   6.6
34 J Heyward           ATL     142     144     91      11      235     0.277   0.393   0.456   0.375   0.849   6.6
35 R Braun             MIL     157     188     56      14      244     0.304   0.365   0.501   0.310   0.866   6.6
36 K Johnson           ARI     154     166     79      13      245     0.284   0.370   0.496   0.369   0.865   6.5
37 J Cust              OAK     112     95      68      2       163     0.272   0.395   0.438   0.367   0.834   6.5
38 T Hafner            CLE     118     110     51      2       161     0.278   0.374   0.449   0.306   0.824   6.5
39 C Rasmus            STL     144     128     63      12      191     0.276   0.361   0.498   0.384   0.859   6.5
40 A Ethier            LAD     139     151     59      2       210     0.292   0.364   0.493   0.319   0.857   6.5
41 R Weeks             MIL     160     175     76      11      251     0.269   0.366   0.464   0.329   0.830   6.4
42 N Swisher           NYY     150     163     58      1       221     0.288   0.359   0.511   0.327   0.870   6.4
43 A McCutchen         PIT     154     163     70      33      233     0.286   0.365   0.449   0.344   0.814   6.4
44 B Posey             SF      108     124     30      0       154     0.305   0.357   0.505   0.273   0.862   6.3
45 D Wright            NYM     157     166     69      19      235     0.283   0.354   0.503   0.370   0.856   6.3
46 S Rolen             CIN     133     134     50      1       184     0.285   0.358   0.497   0.321   0.854   6.2
47 A Rodriguez         NYY     137     141     59      4       200     0.270   0.341   0.506   0.356   0.847   6.2
48 R Howard            PHI     143     152     59      1       211     0.276   0.353   0.505   0.338   0.859   6.2
49 M Teixeira          NYY     158     154     93      0       247     0.256   0.365   0.481   0.379   0.846   6.2
50 D Murphy            TEX     138     122     45      14      167     0.291   0.358   0.449   0.298   0.806   6.1
51 B Gardner           NYY     150     132     79      47      211     0.277   0.383   0.379   0.367   0.762   6.1
52 D Barton            OAK     159     152     110     7       262     0.273   0.393   0.405   0.342   0.798   6.1
53 D DeJesus           KC      91      112     34      3       146     0.318   0.384   0.443   0.230   0.827   6.1
54 M Ordonez           DET     84      98      40      1       138     0.303   0.378   0.474   0.297   0.852   6.1
55 B McCann            ATL     143     129     74      5       203     0.269   0.375   0.453   0.349   0.828   6.1
56 C Hart              MIL     145     158     45      7       203     0.283   0.340   0.525   0.335   0.865   6.1
57 B Butler            KC      158     189     69      0       258     0.318   0.388   0.469   0.267   0.857   6.1
58 J Bruce             CIN     148     143     58      5       201     0.281   0.353   0.493   0.336   0.846   6.1
59 H Matsui            LAA     145     132     67      0       199     0.274   0.361   0.459   0.324   0.820   6.0
60 N Walker            PIT     110     126     34      2       160     0.296   0.349   0.462   0.251   0.811   6.0
61 V Martinez          BOS     127     149     40      1       189     0.302   0.351   0.493   0.274   0.844   5.9
62 C Jones             ATL     95      84      61      5       145     0.265   0.381   0.426   0.369   0.806   5.9
63 S Drew              ARI     151     157     62      10      219     0.278   0.352   0.458   0.308   0.810   5.9
64 I Suzuki            SEA     162     214     45      42      259     0.315   0.359   0.394   0.207   0.754   5.9
65 C Crisp             OAK     75      81      30      32      111     0.279   0.342   0.438   0.372   0.779   5.9
66 A Torres            SF      139     136     56      26      192     0.268   0.343   0.479   0.373   0.823   5.9
67 K Fukudome          CHC     130     94      64      7       158     0.263   0.371   0.439   0.374   0.809   5.9
68 I Kinsler           TEX     103     112     56      15      168     0.286   0.382   0.412   0.307   0.794   5.9
69 J Posada            NYY     120     95      59      3       154     0.248   0.357   0.454   0.368   0.811   5.9
70 N Markakis          BAL     160     187     73      7       260     0.297   0.370   0.436   0.266   0.805   5.8
71 V Guerrero          TEX     152     178     35      4       213     0.300   0.345   0.496   0.261   0.841   5.8
72 M Prado             ATL     140     184     40      5       224     0.307   0.350   0.459   0.227   0.809   5.8
73 C Johnson           HOU     94      105     15      3       120     0.308   0.337   0.481   0.226   0.818   5.8
74 V Wells             TOR     157     161     50      6       211     0.273   0.331   0.515   0.337   0.847   5.7
75 M Stanton           FLA     100     93      34      5       127     0.259   0.326   0.507   0.357   0.833   5.7
76 C Young             ARI     156     150     74      28      224     0.257   0.341   0.452   0.370   0.793   5.6
77 R Raburn            DET     113     104     27      2       131     0.280   0.340   0.474   0.272   0.814   5.6
78 R Hernandez         CIN     97      93      29      0       122     0.297   0.364   0.428   0.224   0.792   5.6
79 C Granderson        NYY     136     115     53      12      168     0.247   0.324   0.468   0.361   0.792   5.6
80 R Spilborghs        COL     134     95      39      4       134     0.279   0.360   0.437   0.284   0.797   5.6
81 J Damon             DET     145     146     69      11      215     0.271   0.355   0.401   0.278   0.756   5.5
82 T Colvin            CHC     135     91      30      6       121     0.254   0.316   0.500   0.346   0.816   5.5
83 B Abreu             LAA     154     146     87      24      233     0.255   0.352   0.435   0.373   0.787   5.5
84 A Pagan             NYM     151     168     44      37      212     0.290   0.340   0.425   0.275   0.765   5.5
85 D Stubbs            CIN     150     131     55      30      186     0.255   0.329   0.444   0.354   0.773   5.4
86 A Soriano           CHC     147     128     45      5       173     0.258   0.322   0.496   0.339   0.818   5.4
87 J Buck              TOR     118     115     16      0       131     0.281   0.314   0.489   0.247   0.802   5.4
88 R Branyan           SEA     109     89      46      1       135     0.237   0.323   0.487   0.375   0.810   5.4
89 D Valencia          MIN     85      93      20      2       113     0.311   0.351   0.448   0.211   0.799   5.4
90 I Davis             NYM     147     138     72      3       210     0.264   0.351   0.440   0.319   0.791   5.4
91 R Ibanez            PHI     155     154     68      4       222     0.275   0.349   0.444   0.298   0.793   5.4
92 M Byrd              CHC     152     170     31      5       201     0.293   0.346   0.429   0.198   0.775   5.4
93 A Jackson           DET     151     181     47      27      228     0.293   0.345   0.400   0.227   0.745   5.4
94 S Victorino         PHI     147     152     53      34      205     0.259   0.327   0.429   0.319   0.756   5.4
95 S Podsednik         KC      95      121     29      30      150     0.310   0.353   0.400   0.241   0.753   5.4
96 C Quentin           CWS     131     110     50      2       160     0.243   0.342   0.479   0.351   0.821   5.4
97 G Sanchez           FLA     151     156     57      5       213     0.273   0.341   0.448   0.283   0.788   5.4
98 C McGehee           MIL     157     174     50      1       224     0.285   0.337   0.464   0.262   0.801   5.4
99 T Hunter            LAA     152     161     61      9       222     0.281   0.354   0.464   0.305   0.819   5.4
100 J Jaso             TB      109     89      59      4       148     0.263   0.372   0.378   0.301   0.750   5.4
G試合数 H安打数 BB四球 SB盗塁 AVG打率 OBP出塁率 SLG長打率 AVG第二の打率 OPS出塁率+長打率 RC27

算出方法

算出方法はメジャーリーグ公式HPから取得してpythonで計算している。

スクレイピングが面倒そうだったので、16ページ分を手でコピーしてテキストに落としてからデータ化している。

来年もやるのでスクレイピング部分を書いてから、どこかにUPしようかと思う。

#! /usr/bin/env python
#! vim: fileencoding=utf8
import csv
import decimal
class Player(object):
       def set_name(self, name):
               self.name = name
               self.key = name
               self.lis = []

       def set_stat(self, lis):
               self.TEAM = lis[0]       #チーム
               self.POS = lis[1]        #ポジション
               self.G = int(lis[2])     #試合数
               self.AB = int(lis[3])    #打数
               self.R = int(lis[4])     #得点
               self.H = int(lis[5])     #ヒット数
               self.B2B = int(lis[6])   #2ベースヒット
               self.B3B = int(lis[7])   #3ベースヒット
               self.HR = int(lis[8])    #ホームラン
               self.RBI = int(lis[9])   #打点
               self.TB = int(lis[10])   #塁打数
               self.BB = int(lis[11])   #四球
               self.SO = int(lis[12])   #三振
               self.SB = int(lis[13])   #盗塁
               self.CS = int(lis[14])   #盗塁失敗
               self.OBP = float(lis[15])#出塁率
               self.SLG = float(lis[16])#長打率
               self.AVG = float(lis[17])#打率
               self.lis += lis
               self.lis.append(self.HBB)
               self.lis.append(".%03d" % (self.AVG2*100))

       def set_stat2(self, lis):
               lis = lis[2:]
               self.SF = int(lis[0])  #犠飛
               self.SH = int(lis[1])  #犠打
               self.HBP = int(lis[2]) #死球
               self.IBB = int(lis[3]) #故意四球
               self.GDP = int(lis[4]) #併殺打
               self.TPA = int(lis[5]) #打席
               self.NP = int(lis[6])  #打者に投げられた投球数
               self.XBH = int(lis[7]) #単打以外の安打
               self.SBper = float(lis[8]) #盗塁成功率 盗塁÷(盗塁+盗塁死)
               self.GO = int(lis[9])  #ゴロアウト
               self.AO = int(lis[10]) #フライアウト
               self.GO_AO = float(lis[11])   #フライ1つに対するゴロ
               self.OPS = float(lis[12]) #出塁率+長打率
               self.lis += lis
               self.lis.append(self.SBD)


       @property
       def HBB(self):
               """ 安打 + 四球 """
               return self.H + self.BB

       @property
       def AVG2(self):
               """ 第二の打率 """
               if self.AB > 0:
                       result = decimal.Decimal(str(((self.TB - self.H + self.BB + self.SB)*1.0)  / self.AB))
                       return float(result.quantize(decimal.Decimal('.000'), rounding=decimal.ROUND_HALF_UP))
               return 0

       @property
       def SBD(self):
               """ 盗塁死 """
               if self.SBper > 0:
                       result = decimal.Decimal(str(((self.SB * 1.0) / (self.SBper / 100)) - self.SB))
                       return float(result.quantize(decimal.Decimal('.000'), rounding=decimal.ROUND_UP))
               return 0

       @property
       def RC(self):
               """
               A = 安打 + 四球 + 死球 - 盗塁死 - 併殺打
               B = 塁打 + 0.26 ×(四球 + 死球) + 0.53 ×(犠飛 + 犠打) + 0.64 × 盗塁 - 0.03 × 三振
               C = 打数 + 四球 + 死球 + 犠飛 + 犠打

               """
               a = self.H + self.BB + self.HBP - self.SBD - self.GDP
               b = self.TB + 0.26 * (self.BB + self.HBP) + 0.53 * (self.SF + self.SH) + 0.64 * self.SB - 0.03 * self.SO
               c = self.AB + self.BB + self.HBP + self.SF + self.SH
               return (((a + 2.4*c) * (b + 3*c)) / (9 * c)) - (0.9 * c)

       @property
       def RC27(self):
               """
               TO = 打数 - 安打 + 犠打 + 犠飛 + 盗塁死 + 併殺打
               (27 * RC) / TO
               """
               to = self.AB - self.H + self.SF + self.SH + self.GDP
               return (27 * self.RC) / to


       def __str__(self):
               return " ".join([str(i) for i in [self.name] + self.lis])


class PlayerShelf(object):

       def __init__(self):
               #self.lis = []
               self.dic = {}

       def append(self, player):
               self.dic[player.key] = player
               #self.lis.append(player)

       def get_player(self, key):
               if key in self.dic:
                       return self.dic[key]
               return None

       @property
       def lis(self):
               return self.dic.values()


       @property
       def HBBbest(self):
               return sorted(self.lis, cmp=lambda x, y:cmp(y.HBB, x.HBB))

       def sortby(self, item, func=None):
               if func:
                       l = self.lis
                       if type(func) != list:
                               func = [func]
                       for f in func:
                               l = [i for i in l if f(i) is True]
               else:
                       l = self.lis
               return sorted(l, cmp=lambda x, y:cmp(getattr(y, item), getattr(x, item)))

def create():
       rf = open(r"c:\tmp\major.txt", "rb")
       result = PlayerShelf()
       for c, lis in enumerate(csv.reader(rf, delimiter="\t")):
               if c % 3 == 1:
                       p = Player()
                       p.set_name(lis[-1])
               if c % 3 == 2:
                       p.set_stat(lis)
                       result.append(p)
       rf.close()
       rf = open(r"c:\tmp\major2.txt", "rb")
       for c, lis in enumerate(csv.reader(rf, delimiter="\t")):
               if c % 3 == 1:
                       p = result.get_player(lis[-1])
                       if p is None:
                               print lis
                               continue
               if c % 3 == 2:
                       p.set_stat2(lis)
                       result.append(p)

       return result

def HBBbest(hoge, fs):
       a = hoge
       c = 0
       for i in a.sortby('HBB'):
               c += 1
               fs.write("%s %s\n" % (c, " ".join([str(i) for i in [i.name, i.TEAM, i.H, i.BB, i.HBB, i.AVG]])))
               if c > 100:
                       break


def BBbest(hoge, fs):
       a = hoge
       c = 0
       for i in a.sortby('BB'):
               c += 1
               fs.write("%s %s\n" % (c, " ".join([str(i) for i in [i.name, i.TEAM, i.H, i.BB, i.SB, i.HBB, i.AVG]])))
               if c > 100:
                       break




def OBPbest(hoge, fs):
       a = hoge
       c = 0
       for i in a.sortby('OBP', [lambda x:x.H>=80, lambda x:x.name in First_list]):
               c += 1
               fs.write("%02d %s\n" % (c, " ".join([str(i) for i in [i.name, i.TEAM, i.G, i.H, i.BB, i.SB, i.HBB, i.AVG, i.OBP, i.AVG2]])))
               if c > 100:
                       break


def AVG2best(hoge, fs):
       a = hoge
       c = 0
       for i in a.sortby('AVG2', lambda x:x.H>=80):
               c += 1
               fs.write("%s %s\n" % (c, " ".join([str(i) for i in [i.name, i.TEAM, i.G, i.H, i.BB, i.SB, i.HBB, i.AVG, i.OBP, i.AVG2]])))
               if c > 100:
                       break


def RC27best(hoge, fs):
        a = hoge
        c = 0
        for i in a.sortby('RC27', lambda x:x.H>=80):
                c += 1
                fs.write(" %02d %s\n" % (c, "\t".join([str(i) for i in [i.name.ljust(14), i.TEAM, i.G, i.H, i.BB, i.SB, i.HBB, "%1.3f" % i.AVG, "%1.3f" % i.OBP, "%1.3f" % i.SLG, "%1.3f" % i.AVG2, "%1.3f" % i.OPS, "%1.1f" % i.RC27]])))
                if c > 100:
                        break



def RC27best2(hoge, fs):
        a = hoge
        c = 0
        for i in a.sortby('RC27', [lambda x:x.H>=80, lambda x: x.name in First_list]):
                c += 1
                fs.write("%s %s\n" % (c, "\t".join([str(i) for i in [i.name, i.TEAM, i.G, i.H, i.BB, i.SB, i.HBB, "%1.3f" % i.AVG, "%1.3f" % i.OBP, "%1.3f" % i.SLG, "%1.3f" % i.AVG2, "%1.3f" % i.OPS, "%1.1f" % i.RC27]])))
                if c > 100:
                        break

First_list = [
'M Scutaro', 'B Roberts', 'C Patterson', 'D Jeter', 'J Bartlett',
'F Lewis', 'T Snider', 'M Prado', 'C Coghlan', 'J Reyes',
'S Victorino', 'N Morgan', 'C Patterson', 'J Pierre', 'T Crowe',
'A Jackson', 'S Podsednik', 'D Span', 'R Theriot', 'B Phillips',
'M Bourn', 'R Weeks', 'A McCutchen ', 'S Schumaker', 'E Aybar',
'C Crisp', 'R Davis', 'E Andrus', 'K Johnson', 'D Fowler',
'R Furcal', 'J Hairston', 'A Torres',

'I Suzuki']

if __name__ == "__main__":
       a = create()
       hbb = open(r"c:\tmp\hbb.csv", "w")
       obp = open(r"c:\tmp\obp2.csv", "w")
       avg2 = open(r"c:\tmp\avg2.csv", "w")
       bb = open(r"c:\tmp\bb.csv", "w")
       rc27 = open(r"c:\tmp\rc27.csv", "w")
       rc272 = open(r"c:\tmp\rc27_2.csv", "w")
       HBBbest(a, hbb)
       BBbest(a, bb)
       OBPbest(a, obp)
       AVG2best(a, avg2)
       RC27best(a, rc27)
       RC27best2(a, rc272)
       hbb.close()
       bb.close()
       obp.close()
       avg2.close()
       rc27.close()
       rc272.close()
categories: statistics
Read and Post Comments

イチローは最高の一番バッターか?

October 11, 2010 at 12:29 AM | View Comments

前回書いた ueBLOG | イチローはなぜ四球が少ないと批判されるのか? というエントリーがはてぶやTwitterで反響がありました。ありがとうございます。

いろいろな意見があったのだけど、

  • 一番打者同士で比べないと…
  • 因みに「リードオフは速さより出塁」がセイバー的定石だが、今季のAL1番打者でイチローより出塁率高い選手はいないっぽい。2番まで含めるとOAKのバートンが上回るが。ただ、フィギンスと入れ替えてみたくはあるかな
  • イチローの出塁率は、盗塁を40以上している8人の中で2位、30以上している19人の中で4位だった。四球が多い上位20人に盗塁30個以上の選手は一人。出塁率が高いのはやっぱ足の遅いスラッガーだよね。

などの意見が気になった。

確かに、出塁率の高いのはリードオフマンよりスラッガーが高い気がしたので、ESPNのチーム情報→Roster→Lineupから1番の選手を抜き出して、昨日のデータに当ててみた。そもそもESPNのデータが正しいのかわからないし、名前でぶつけているので変な部分があるかもしれないが、とりあえずの指標にはなるだろう。

この選手を入れたほうがいい、という意見があったら、はてなブックマークやメール (ueblog [a] gmail.com) などで教えてほしい。

No Name       TEAM G   H   BB SB H+BB AVG   OBP   AVG2
01 K Johnson   ARI 154 166 79 13 245  0.284 0.370 0.37
02 R Weeks     MIL 160 175 76 11 251  0.269 0.366 0.33
03 R Furcal    LAD  97 115 40 22 155  0.300 0.366 0.32
04 I Suzuki    SEA 162 214 45 42 259  0.315 0.359 0.21
05 S Podsednik KC   95 121 29 30 150  0.310 0.353 0.24
06 M Prado     ATL 140 184 40  5 224  0.307 0.350 0.23
07 D Fowler    COL 132 114 57 13 171  0.260 0.347 0.31
08 A Jackson   DET 151 181 47 27 228  0.293 0.345 0.23
09 A Torres    SF  139 136 56 26 192  0.268 0.343 0.37
10 E Andrus    TEX 148 156 64 32 220  0.265 0.342 0.20
11 C Crisp     OAK  75  81 30 32 111  0.279 0.342 0.37
12 J Pierre    CWS 160 179 45 68 224  0.275 0.341 0.22
13 M Bourn     HOU 141 142 59 52 201  0.265 0.341 0.29
14 D Jeter     NYY 157 179 63 18 242  0.270 0.340 0.22
15 C Coghlan   FLA  91  96 33 10 129  0.268 0.335 0.23
16 M Scutaro   BOS 150 174 53  5 227  0.275 0.333 0.20
17 B Phillips  CIN 155 172 46 16 218  0.275 0.332 0.25
18 F Lewis     TOR 110 112 38 17 150  0.262 0.332 0.28
19 D Span      MIN 153 166 60 26 226  0.264 0.331 0.22
20 S Schumaker STL 137 126 43  5 169  0.265 0.328 0.17
21 S Victorino PHI 147 152 53 34 205  0.259 0.327 0.32
22 J Bartlett  TB  135 119 45 11 164  0.254 0.324 0.22
23 R Theriot   LAD 150 158 41 20 199  0.270 0.321 0.15
24 J Reyes     NYM 133 159 31 30 190  0.282 0.321 0.25
25 R Davis     OAK 143 149 26 50 175  0.284 0.320 0.24
26 N Morgan    WSH 136 129 40 34 169  0.253 0.319 0.21
27 C Patterson BAL  90  83 20 21 103  0.269 0.315 0.27
28 E Aybar     LAA 138 135 35 22 170  0.253 0.306 0.18
29 T Crowe     CLE 122 111 29 20 140  0.251 0.302 0.19
30 J Hairston  SD  119 105 31  9 136  0.244 0.299 0.20
G試合数 H安打数 BB四球 SB盗塁 AVG打率 OBP出塁率 AVG2第二の打率

このランキングではイチローの出塁率は4位。盗塁も4位。3割バッターがイチローを含めて4人しかいない。

リードオフの役目は出塁、、と、頭から思っていたけど、昨日のデータとあわせて考えると、どうも出塁率よりも他の能力が求められていると思われる。

いくら出塁率が高くても120kgもあるフィルダーの息子が一番バッターというのは考えられない。走力なんだろうけど、盗塁というよりも1塁、2塁にいた時にヒットが生まれたときの得点に結びつく期待値じゃないかと思う。

そういった指標はあるのだろうけど、昨日の今日では見つけることができなかった。

また、盗塁が多い選手の、長打力+盗塁能力を求めるの第二の打率が低いことを考えると、盗塁は長打力に比べるとあまり影響のない能力かもしれない。

このランキングでイチローが上位になったので少し安心した。走力や守備力を含めてイチローはスーパースターなのかもしれない。

マネーボールについて

はてなブックマークのコメントをみると、セイバーメトリックスに詳しい人から「マネーボールは古い」との指摘が多かった。

アスレチックのセイバーメトリックスは確かに研究されたし、四球の多い選手のサラリーも高騰してしまった。確かに古くなってしまっている。

しかし、アスレチックの成功とあの本が選球眼の良い選手のサラリーとファンたちの見方を変えてしまったのは、サラリーの高騰をみても明らかなので、四球が少ないことに対する批判の背景としての答えとして間違ってないのではないかと思う。

ちなみにアスレチックがセイバーメトリックスの評価でドラフトで獲得する選手を決めはじめたのが2002年。イチローがメジャーに行ったのが2001年なので、

  • 『マネーボール』流セイバーメトリクスが持て囃されたのはあくまでイチロー、松井出現前だと思うが。大体その頃はイチロー並みに走る選手もそんなに少なかったと記憶している。

というのは違うと思う。

マネーボールは、それまで勘と経験で行われてきた選手評価を、数学的分析を持ち込み始めたときの話なので、野球に興味がない人ほど面白い読み物だと思う。内容の古さはひとまず置いておいて、数学が何かを変えた物語に興味のある人は一読した方が良いと思う。

マネー・ボール (ランダムハウス講談社文庫)
マイケル・ルイス
ランダムハウス講談社
売り上げランキング: 2432

あと、BTというのが良くわかりませんでした。セイバーについてのHPでしょうか???

categories: statistics
Read and Post Comments

イチローはなぜ四球が少ないと批判されるのか?

October 10, 2010 at 12:36 AM | View Comments

10年連続で200本安打という史上初の偉業を達成したイチロー。素晴らしい。

海外のメディアも偉業を称えてるが、一方で、

  • 四球が少ない
  • 内野安打が多い

と、批判する内容も多い。

日本の野球解説を見て「四球が少ない」という話題はほとんど聞いたことがないので不思議に思っていました。

調べると2000年代に入り、金欠球団アスレチックが選手評価にセイバーメトリクスという統計学を用いた手法を取り入れ成功したこと、また、その手法が「マネーボール」という本で広く紹介されたことにより、それまで注目されていなかった四球数が重要視されるようになった結果とのことだ。

アスレチック流セイバーメトリクスは

  • 打率の高い選手のサラリーは高額なので、四球数が多く出塁率の高い選手を安く獲得
  • 送りバント厳禁
  • 盗塁厳禁

という特徴がある。

2000年代のアスレチックは、レギュラーシーズンにおいて金持球団ヤンキーズ並の成績を収めたことにより、他の球団も四球に注目するようになった(サラリーが高騰した)ということだ。

マネー・ボール (ランダムハウス講談社文庫)
マイケル・ルイス
ランダムハウス講談社
売り上げランキング: 2432

イチローは打率よりも安打数を何より重視しているので、安打数+四球で調べてみる。

すると、最多安打だったイチローが8位まで下がってしまう。

No  Name        TEAM H   BB  H+BB AVG
 1  A Pujols    STL  183 103  286 0.312
 2  A Gonzalez  SD   176  93  269 0.298
 3  M Cabrera   DET  180  89  269 0.328
 4  J Votto     CIN  177  91  268 0.324
 5  P Fielder   MIL  151 114  265 0.261
 6  D Barton    OAK  152 110  262 0.273
 7  N Markakis  BAL  187  73  260 0.297
 8  I Suzuki    SEA  214  45  259 0.315
 9  B Butler    KC   189  69  258 0.318
10  R Cano      NYY  200  57  257 0.319
H 安打数 BB四球 AVG 打率

イチローの四球はわずか45。ところが、日本でも活躍したフィルダーの息子は114もの四球を選んでいる。イチローが苦心して200本の安打を打つのに対し、その半分も四球を選んでいる、これはかなり大きい。

ちなみに四球ベスト10はこちら

No  Name        TEAM H   BB  H+BB AVG
 1 P Fielder    MIL 151  114 265 0.261
 2 D Barton     OAK 152  110 262 0.273
 3 A Pujols     STL 183  103 286 0.312
 4 J Bautista   TOR 148  100 248 0.260
 5 A Gonzalez   SD  176   93 269 0.298
 6 M Teixeira   NYY 154   93 247 0.256
 7 B Zobrist    TB  129   92 221 0.238
 8 J Votto      CIN 177   91 268 0.324
 9 J Heyward    ATL 144   91 235 0.277
10 M Cabrera    DET 180   89 269 0.328
H 安打数 BB四球 AVG 打率

打率3割が3人であとの7人は2割。7位のB Zobristの打率は.238しかないのにもかかわらずベスト10に入っている。お買い得な選手なのかもしれない。

故障せずに全試合出場するというのはイチローの美学なのだが、やはり絶対数より率で見たほうが公平に評価できる。次に50試合以上出場していて80本以上ヒットを打っている選手の出塁率を調べる。

No  Name        TEAM  G  H   BB H+BB AVG   OBP
 1 J Morneau    MIN  81 102  50 152  0.345 0.437
 2 J Votto      CIN 150 177  91 268  0.324 0.424
 3 M Cabrera    DET 150 180  89 269  0.328 0.420
 4 A Pujols     STL 159 183 103 286  0.312 0.414
 5 J Hamilton   TEX 133 186  43 229  0.359 0.411
 6 K Youkilis   BOS 102 111  58 169  0.307 0.411
 7 J Mauer      MIN 137 167  65 232  0.327 0.402
 8 P Fielder    MIL 161 151 114 265  0.261 0.401
 9 S Choo       CLE 144 165  83 248  0.300 0.401
10 C Ruiz       PHI 121 112  55 167  0.302 0.400
G試合数 H安打数 BB四球 AVG打率 OBP出塁率

フィルダーの息子はここでも8位にランクイン。あまりの肥満のために体型にはこだわらないアスレチックですらドラフト対象からはずしたといわれるフィルダー息子は超一流バッターに成長したことが伺える。

1位のMorneauは試合数が81試合と少ないが、162試合出れば204安打、100四球とリーグトップになる、、。しかし、休み休み使えばいいのでこれでいいのかもしれない。

さて、ここで注目は「マネーボール」で「四球のギリシア神」といわれた K Youkilis。安打数は111とイチローの半分、打率3割を超えてはいるがそれほど目立つほどではない、しかし、セイバーメトリクスで最も重要視される出塁率で6位と期待通りの仕事をしているのがわかる。

さて、イチローはというと、、、なんと60位。四球の少なさが出塁率を大きく下げる結果になっている。ちなみにこれは同じ日本人選手の41位の福留、57位の松井よりも下だ。

No  Name        TEAM  G  H  BB H+BB  AVG   OBP
41 K Fukudome   CHC 130  94 64 158  0.263 0.371
57 H Matsui     LAA 145 132 67 199  0.274 0.361
60 I Suzuki     SEA 162 214 45 259  0.315 0.359

福留、松井両名とも良いシーズンでなかったといわれるが、両名ともそれなりの成績を収めていたことがわかる。

<追記> リードオフマンの出塁率はそれほど高くないのでは?という意見が多かったので、各球団の1番打者の出塁率をしらべてみました。

ueBLOG | イチローは最高の一番バッターか?

結果を言うと、1番打者のなかではかなり良い出塁率でした。

<追記おわり>

さて、セイバーメトリクスといえばアスレチックだったのだが、ここ数年、セイバーメトリクスで好調な成績を収めている球団はなんと言ってもレッドソックスだ。

レッドソックスはアスレチックと違い、盗塁などの機動力を重視する。そしてアスレチック同様、四球と長打力を重視する。

そんなアスレチックの評価の一つに第二の打率というのがある。

(累打数 - 安打+四球+盗塁)/打数

塁打数というのは シングルヒット + 2塁打 * 2 + 3塁打 * 3 + ホームラン * 4

なので、塁打数 - 安打 はシングルヒットを無効にした数値(長打力を測定するため)、それに四球と盗塁を付与したものだ。

同じく 50試合以上、80本以上ヒットで算出すると、、、

No  Name        TEAM  G  H   BB SB H+BB  AVG   OBP  AVG2
 1 J Bautista   TOR 161 148 100  9 248 0.260  0.378 0.55
 2 A Pujols     STL 159 183 103 14 286 0.312  0.414 0.48
 3 J Votto      CIN 150 177  91 16 268 0.324  0.424 0.47
 4 M Cabrera    DET 150 180  89  3 269 0.328  0.420 0.46
 5 J Morneau    MIN  81 102  50  0 152 0.345  0.437 0.44
 6 K Youkilis   BOS 102 111  58  4 169 0.307  0.411 0.43
 7 D Ortiz      BOS 145 140  82  0 222 0.270  0.370 0.42
 8 P Fielder    MIL 161 151 114  1 265 0.261  0.401 0.41
 9 A Dunn       WSH 158 145  77  0 222 0.260  0.356 0.41
10 J Werth      PHI 156 164  82 13 246 0.296  0.388 0.41
G試合数 H安打数 BB四球 SB盗塁 AVG打率 OBP出塁率 AVG2第二の打率

となる。

100四球、9盗塁のBautistaが1位になっている。レッドソックスの選手が2名いることも興味深い。フィルダー息子はここでも8位。

第二の打率はシングルヒッター以外の選手の特徴を知るための批評なので仕方ないが、イチローはベスト100に入らない。

日本人選手は福留が35位、松井が77位

No  Name        TEAM  G  H   BB SB H+BB  AVG   OBP  AVG2
35 K Fukudome   CHC  130  94 64 7  158  0.263 0.371 0.37
77 H Matsui     LAA  145 132 67 0  199  0.274 0.361 0.32

松井はもう少し上の成績を残したかったところだろうが、この成績ならまだまだ必要とするチームはあるだろう。 福留はかなり不本意なシーズンを送ったといわれるが、この批評だとかなり良い成績を残している。 契約終了すれば日本へ復帰との噂もあるが、メジャー球団が手放さないのではないかと思う。

セイバーメトリクスの指標からするとイチローにとって厳しい評価となったが、 もちろんセイバーメトリクスが絶対という訳ではない。

今回のエントリーを書くにあって、各選手の数値はメジャーリーグ公式HPを参考にした。

categories: statistics
Read and Post Comments

「数学で犯罪を解決する」を読んだ

October 03, 2010 at 11:29 PM | View Comments

統計学の知識を得たい。ここ最近いろいろ思うところがあってそう思うようになり、いろいろ本を読んでいるのだけど、まともな高等数学を勉強したことがない僕にとってはかなり難しい。

そもそも統計学でいいのかもよく分からない、データマイニング、確立、ベイズ推論、パターン抽出、、、これらをひっくるめると統計学でいいのか?もっと違う言い方があるのか?統計学という言い方で合っているので分からないので、ここでは統計学(仮)ということにする。

今思うのはそれらの知識を得ると抱えている問題をより良く解決できる予感がするということだ。

と言うわけで、いろいろ統計学(仮)についての本を手にとって読んでみたが難しい。どうも頭に入ってこない、、、なんとなく分かる気もするが、こういうのは大体勘違いというのが相場だ。

そもそも前提知識や理解力少ないことは大きな理由だが、ここまで頭に入ってこないのは統計学(仮)への愛情が少ない、好きさが足りない、、と思う。と言うか、あまりにも理解できないので、そう思いたい。

ということで、統計学(仮)の入門書はいったん置いて置いて、統計学(仮)をもっと愛せるような本を読むことにする。今回読んだ「数学で犯罪を解決する」は、そういった意味でなかなかよい本だった。

そもそも統計学(仮)は世の中のいろいろな場面で役に立っている。例えば、

  • Gmailの迷惑メール自動判別

Gmail以前に使っていたOutlookみたいなメーラーは、自分で差出人が〇〇のもの、、件名に××という単語があるもの、、とルールをきめて迷惑メールを削除していた。

ところがGmailの迷惑メール自動判別機能は、「このメールは迷惑メール」「このメールは迷惑メールでない」というのを世界中の人が判別することで、かなりの確立で迷惑メールを迷惑メールとして扱ってくれる。よく分からないが、これはベイズなんとかという統計学(仮)の考え方を使っているらしい。

例えば、レッドソックスの岡島。

日本でそこそこの選手と思われていた岡島がメジャーリーグの名門レッドソックスからオファーがあったとき、同時に入団した松坂の話し相手として取ったのだろうさえ言われた。

ところが、松坂に劣らないというか、チームへの貢献度では確実に松坂を上回る活躍をみせた。コストパフォーマンスは確実に松坂より上だ。レッドソックスは松坂のついでに岡島を獲得したのではなくセイバーメトリックスと呼ばれる統計学(仮)を利用した選手分析の手法で岡島の価値を発見したのだ。

(ちなみに岡島の価値は四球と奪三振の比率から算出したらしい)

統計学(仮)は楽しそうだ。ちょっと好きになってきた。

「数学で犯罪を解決する」は、アメリカの連続ドラマ「NUMB3RS」で使われている数学を解説した本だ。

数学で犯罪を解決する
キース・デブリン ゲーリー・ローデン
ダイヤモンド社
売り上げランキング: 51896

「NUMB3RS」というドラマは、、Wikipediaによると

FBI特別捜査官ドン・エプス(ロブ・モロー)と、数学の天才で犯罪者の行動を予測する公式を導き出す弟のチャールズ・エプス(デイビッド・クロムホルツ)の活躍を描くドラマである。

となっている。このドラマのウリは使われる数学がキテレツなものではなく、実際の犯罪捜査でも使われるちゃんとした数学ということだ。

ナンバーズ 天才数学者の事件ファイル シーズン1 コンプリートDVD-BOX (4枚組)
パラマウント ホーム エンタテインメント ジャパン (2009-06-12)
売り上げランキング: 7719

ドラマの中で

スプリンクラーから落ちる次の水滴は分からない、でもスプリンクラーの場所が分からないとすると、これまで落ちた水滴からスプリンクラーの場所を割り出すことはできる。この犯罪犯でも同じだ。

数学者の弟はこういって黒板に方程式を書き、連続殺人事件の犯人の居場所をつきとめた。

それはドラマだからだ!

と、言いたくなるが、実はこれは実際の話を元に作られた話で、使われた数式も同じものだと言う。

実際に数式を使って連続殺人犯をつきとめたのはカナダの警察のキム・ロスモという人物だった。先ほどのスプリンクラーの話はキム・ロスモ氏自身が地理的プロファイリングを説明するときに使う比喩ということだ。

地理的プロファイリング―凶悪犯罪者に迫る行動科学
D.キム ロスモ
北大路書房
売り上げランキング: 38210

この方程式は、犯罪は犯罪者の拠点から離れると増えるが、あまり遠くなると減るという現象を元に

方程式は地図に座標をふって、任意の(i,j)に対し

  • 犯罪が起きた(x,y)と(i,j)との距離を全て図り、任意の関数をあてる
  • バッファー(犯罪が増えて減るまでの幅)から、先ほどの距離を引いて、先ほどと違う関数をあてる
  • 任意の重みをつける
  • 過度に特徴が出ないように単位をまとめる

(理解できてないので上手く説明できない上にこれであっているか分からない)

というように「それぞれの犯罪の貢献を合計して、(ij)グリッドの確立を求める」方程式をつくり、それを全ての座標で行い、確立が高いエリアに色をつける。そのエリアを中心に捜査を行う。

どの事件も同じ計算でOKというわけではなく、任意の関数や重みなどをそれぞれの事件の特性によって変える必要がある。

実際のキム・ロスモの事件では、特定した住所を調べた結果、犯人はいなかった、、、しかし、タレコミのあった警察関係者を調べたところ、その人物はそのエリアから引っ越していたことが分かり、さらに証拠が出て逮捕された。

「数学で犯罪を解決する」はこのように、ドラマ「NUMB3RS」で数学がどのように使われ、その数学がどういうものなのか、実際にも使われているか、、、を、数学の知識のない人でも分かるように分かりやすく解説している。

統計学(仮)ではないが、RSA,SHA-1,MD5などの仕組みはこれまで読んだ解説のなかで一番分かりやすかったし、指紋神話(同じ指紋は世の中に存在しない)はかなり根拠が危ういなど、、興味深い話も多く、この本は買ってよかった。

おかげで統計学(仮)への愛情が少し増した。

また、和訳された本書には、それぞれのChapterに出てくる数学をより知りたい人向けのための参考本の紹介を訳者がしてくれている。

ちなみに暗号に関する参考文献では結城浩先生の「暗号技術入門 - 秘密の国のアリス」が紹介されてあって個人的に好感が持てた。

暗号技術入門-秘密の国のアリス
結城 浩
ソフトバンククリエイティブ
売り上げランキング: 114465
数学で犯罪を解決する
キース・デブリン ゲーリー・ローデン
ダイヤモンド社
売り上げランキング: 51896
categories: statistics, book
Read and Post Comments

track feed ueblog