MLBのデータを使って、はじめてのR
October 15, 2010 at 10:07 PM | View CommentsRとは
Rとは統計計算とグラフィック出力を提供する言語?。スクリプトでいろいろ計算、描画ができる。
ちなみに、僕は前にインストールしたことはありますが、ちゃんとRを使うのは初めてです。
Rのインストール
Windowsだとインストーラーがあったので一発インストール可能でした。64bitのWindows7なのですが、64bit版もあり問題なし。
Rについての解説
を参考にしました。
はじめてのR
準備
以前のエントリーで使ったMLBのデータを使う。
条件は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はどうか?
なかなか簡単にいろいろな計算やグラフを描画することができました。
かなり良いのではないのでしょうか??
まだまだいろいろな機能があるようなので、統計学の勉強をしながら触ってみたいと思います。




