STATCAST で遊ぶ vol.3

　環境、データともに前回からのものを引き続き利用します。
 [STATCAST で遊ぶ vol.2](https://qiita.com/RemixWorksLLC/items/782e8d5ad744dc0aacd3)

 # バレル率とホームラン数

　MLB STATCAST において、バレル（Barrels）とは、打球速度（初速）と発射角（打球の打ち出し角度）が完璧な組み合わせを持つ打球で、最低期待打率 .500、期待長打率 1.500 と定義されています。

 　バレル率は、ある打者が、バレルで打った数 ÷ 全打球で計算されます。

　バレル率が高ければ高いほど、打率は上がり、長打も多くなるわけですからバレル率とホームランは相関していそうです。相関とは、この場合「バレル率の高い選手ほど、ホームラン数も多い」という関係のことを表現しています。

 　では、前回の復習になりますが、CSV データから、バレル率とホームラン数を数値変数にしてみましょう。
 
```
player_batting <- read.csv("./2024_batting_d-bs-s.csv")
barrel_batted_rate <- as.numeric(player_batting$barrel_batted_rate)
home_run <- as.numeric(player_batting$home_run)
```

　バレル率（barrel_batted_rate）とホームラン数（home_run）の変数ができたので、これを散布図にしてみましょう。

```
plot(home_run, barrel_batted_rate)
```

![2c62e818-e569-4d55-8aca-7b741512a5f1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3833520/86f4dd9d-a986-53ae-6c8e-fdc63e361b85.png)


　ざっくり図を見て理解できるのは、バレル率（Y軸）が高ければ、ホームラン数（X軸）も多いということがわかると思います。このように散布図が右肩上がりのときは、相関していると見ていいでしょう。

 　試しに、バレル率と相関していなそうなデータで調べてみましょう。選手の年齢との関係を調べてみましょう。

```
player_age <- as.numeric(player_batting$player_age)
plot(player_age, barrel_batted_rate)
```

![326af0df-61eb-4d64-ad77-9b853000ce27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3833520/1e9884d7-724d-5063-f3bd-410f732f9797.png)

　全然、関係なさそうですね。バレル率が高いからと言って、年齢も高いということは言えなそうですね。

 ## 標準化してみる

 　さて、バレル率は、率というくらいですから比率のデータで、ホームラン数は、積み上げた値です。
このように、単位の違うものを見比べるときに、スコア化されているとわかりやすくなります。

　よく用いられるのは、 z得点と偏差値ですが、まず、バレル率とホームラン数を z得点で標準化します。 z得点は平均すると0、標準偏差は1になるように変換することです。式は、次のようになります。

 ```math
 z得点 = \frac{x - μ}{σ}
 ```

 　x は、データの値、μ（ミュー） は平均、σ（シグマ）は標準偏差です。
  ということで、バレル率とホームラン数の平均と標準偏差を求める必要がありますね。
  ここでは、標本＝母集団なので、標本分散を採用しましょう。
　平均、分散、標準偏差の順番に求めて、z得点を求めてみましょう。

```
barrel_batted_rate_avg <- mean(barrel_batted_rate) # バレル率平均
barrel_batted_rate_avg
```
```
[1] 9.16124
```
```
home_run_avg <- mean(home_run) # ホームラン数平均
home_run_avg
```
```
[1] 21.67442
```
```
barrel_batted_rate_varp <- var(barrel_batted_rate) * (length(barrel_batted_rate) - 1) / length(barrel_batted_rate) # バレル率分散
barrel_batted_rate_varp
```
```
[1] 17.19943
```
```
home_run_varp <- var(home_run) * (length(home_run) - 1) / length(home_run) # ホームラン数分散
home_run_varp
```
```
[1] 82.79322
```
```
barrel_batted_rate_stdevp <- sqrt(barrel_batted_rate_varp) # バレル率標準偏差
barrel_batted_rate_stdevp
```
```
[1] 4.147219
```
```
home_run_stdevp <- sqrt(home_run_varp) # ホームラン数標準偏差
home_run_stdevp
```
```
[1] 9.099078
```
```
z_barrel_batted_rate <- (barrel_batted_rate - barrel_batted_rate_avg) / barrel_batted_rate_stdevp
z_barrel_batted_rate
```
```
  [1]  1.239085594 -0.135329306  0.853284920 -0.087104222
    〜略〜
[125] -0.641692690 -1.268618785  1.070297799 -0.665805233
[129] -0.882818112
```
```
z_home_run <- (home_run - home_run_avg) / home_run_stdevp
z_home_run
```
```
  [1]  1.13479424  1.90410295  0.47538678 -0.51372442
    〜略〜
[125] -0.07411944 -1.06323064  1.24469549  0.47538678
[129] -0.84342815
```

　検算してみます。平均が 0、標準偏差が 1になればいいわけですから、各z得点の平均を式に含めて、標準偏差を計算して、1になれば、合っていると言えそうです。

```
sqrt(mean((z_barrel_batted_rate - mean(z_barrel_batted_rate)) ** 2))
```
```
[1] 1
```
```
sqrt(mean((z_home_run - mean(z_home_run)) ** 2))
```
```
[1] 1
```

((z得点 - z得点の平均)を２乗し、その平均を取るということは、二乗和 ÷ データ個数と同じことになります。その平方根を取れば、標準偏差になります。

　どちらも 1でした。合っていそうです。

z得点同士で、散布図を描いてみましょう。

```
plot(z_barrel_batted_rate, z_home_run)
```

 繰り返しになりますので、画像は載せませんが、X軸、Y軸の目盛りの数字以外は、同じ図が描けていると思います。

## 偏差値

　z得点が求まっていれば、偏差値を計算するのは簡単です。
 偏差値は、平均が50、標準偏差が10になるように標準化するものですから、求めたz得点を10倍し、50を足すことで求められます。z得点は、平均が0、標準偏差が1ですから、10倍すれば標準偏差は10になります。そして、50を足せば、平均も50になるということです。

```
sts_barrel_batted_rate <- z_barrel_batted_rate * 10 + 50
sts_barrel_batted_rate
```
```
  [1] 62.39086 48.64671 58.53285 49.12896 42.85970 56.84497
    〜略〜
[121] 51.05796 47.44108 45.27095 41.41294 43.58307 37.31381
[127] 60.70298 43.34195 41.17182
```
```
sts_home_run <- z_home_run * 10 + 50
sts_home_run
```
```
  [1] 61.34794 69.04103 54.75387 44.86276 45.96177 48.15979
    〜略〜
[121] 52.55584 51.45683 52.55584 40.46671 49.25881 39.36769
[127] 62.44695 54.75387 41.56572
```
```
summary(sts_barrel_batted_rate)
```
```
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  29.84   43.34   49.13   50.00   56.84   92.77 
```
```
summary(sts_home_run)
```
```
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  28.38   43.76   48.16   50.00   54.75   89.92 
```
```
sqrt(mean((sts_barrel_batted_rate - mean(sts_barrel_batted_rate)) ** 2))
```
```
[1] 10
```
```
sqrt(mean((sts_home_run - mean(sts_home_run)) ** 2))
```
```
[1] 10
```

　どちらも、平均値が 50、標準偏差 10 になっていますね。

## 大谷翔平はどうなってるのか？

　バレル率とホームラン数の標準化をやってみましたが、算出できたデータセットの要約と大谷翔平のデータと比べてみましょう。
　61番目が大谷翔平のデータです。

```
summary(z_barrel_batted_rate)
```
```
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
-2.0161 -0.6658 -0.0871  0.0000  0.6845  4.2773 
```
```
summary(z_home_run)
```
```
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
-2.1622 -0.6236 -0.1840  0.0000  0.4754  3.9922 
```
```
z_barrel_batted_rate[61]
```
```
[1] 2.975189
```
```
z_home_run[61]
```
```
[1] 3.552622
```

　平均は 0なのですから、大谷翔平が、バレル率、ホームラン数ともに大きく上回っています。でも、summary を見ると、最大値は、大谷翔平を大きくバレル率で上回る選手がいるようですね。
 誰でしょうか。まあ、予想通りなんですが、アーロン・ジャッジです。
 　ジャッジのデータは91番目。

```
z_barrel_batted_rate[91]
```
```
[1] 4.277266
```
```
z_home_run[91]
```
```
[1] 3.992227
```

## まとめ

　今回は、単純化して、バレル率のみを取り上げましたが、STATCAST には、打球速度の平均、発射角の平均等の面白い、かつ使えるデータが沢山あります。
 　平均値であるとはいえ、初速と発射角が分かれば、到達距離が計算できますよね。また、大谷、ジャッジとホームランバッターばかりを取り上げましたが、打者にも色々なタイプがいます。
  その辺も、今後、探っていきたいと思います。