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

track feed ueblog