STATCAST で遊ぶ vol.6

　使用しているデータのダウンロード

 - 以下のリンクをクリックして、「CUSTOM COLUMNS (180)」になっていることを確認して「Download CSV」をクリック
 - ファイル名を stats.csv から 2015-2024_batting_all.csv へ変更
 - RStudio へ読み込む
   `player_batting_all <- read.csv("2015-2024_batting_all.csv")`

　[2015年〜2024年STATCAST規定到達打者データ](https://baseballsavant.mlb.com/leaderboard/custom?year=2024%2C2023%2C2022%2C2021%2C2020%2C2019%2C2018%2C2017%2C2016%2C2015&type=batter&filter=&min=q&selections=player_age%2Cab%2Cpa%2Chit%2Csingle%2Cdouble%2Ctriple%2Chome_run%2Cstrikeout%2Cwalk%2Ck_percent%2Cbb_percent%2Cbatting_avg%2Cslg_percent%2Con_base_percent%2Con_base_plus_slg%2Cisolated_power%2Cbabip%2Cb_rbi%2Cb_lob%2Cb_total_bases%2Cr_total_caught_stealing%2Cr_total_stolen_base%2Cb_ab_scoring%2Cb_ball%2Cb_called_strike%2Cb_catcher_interf%2Cb_foul%2Cb_foul_tip%2Cb_game%2Cb_gnd_into_dp%2Cb_gnd_into_tp%2Cb_gnd_rule_double%2Cb_hit_by_pitch%2Cb_hit_ground%2Cb_hit_fly%2Cb_hit_into_play%2Cb_hit_line_drive%2Cb_hit_popup%2Cb_out_fly%2Cb_out_ground%2Cb_out_line_drive%2Cb_out_popup%2Cb_intent_ball%2Cb_intent_walk%2Cb_interference%2Cb_pinch_hit%2Cb_pinch_run%2Cb_pitchout%2Cb_played_dh%2Cb_sac_bunt%2Cb_sac_fly%2Cb_swinging_strike%2Cr_caught_stealing_2b%2Cr_caught_stealing_3b%2Cr_caught_stealing_home%2Cr_defensive_indiff%2Cr_interference%2Cr_pickoff_1b%2Cr_pickoff_2b%2Cr_pickoff_3b%2Cr_run%2Cr_stolen_base_2b%2Cr_stolen_base_3b%2Cr_stolen_base_home%2Cb_total_ball%2Cb_total_sacrifices%2Cb_total_strike%2Cb_total_swinging_strike%2Cb_total_pitches%2Cr_stolen_base_pct%2Cr_total_pickoff%2Cb_reached_on_error%2Cb_walkoff%2Cb_reached_on_int%2Cxba%2Cxslg%2Cwoba%2Cxwoba%2Cxobp%2Cxiso%2Cwobacon%2Cxwobacon%2Cbacon%2Cxbacon%2Cxbadiff%2Cxslgdiff%2Cwobadiff%2Cavg_swing_speed%2Cfast_swing_rate%2Cblasts_contact%2Cblasts_swing%2Csquared_up_contact%2Csquared_up_swing%2Cavg_swing_length%2Cswords%2Cexit_velocity_avg%2Claunch_angle_avg%2Csweet_spot_percent%2Cbarrel%2Cbarrel_batted_rate%2Csolidcontact_percent%2Cflareburner_percent%2Cpoorlyunder_percent%2Cpoorlytopped_percent%2Cpoorlyweak_percent%2Chard_hit_percent%2Cavg_best_speed%2Cavg_hyper_speed%2Cz_swing_percent%2Cz_swing_miss_percent%2Coz_swing_percent%2Coz_swing_miss_percent%2Coz_contact_percent%2Cout_zone_swing_miss%2Cout_zone_swing%2Cout_zone_percent%2Cout_zone%2Cmeatball_swing_percent%2Cmeatball_percent%2Cpitch_count_offspeed%2Cpitch_count_fastball%2Cpitch_count_breaking%2Cpitch_count%2Ciz_contact_percent%2Cin_zone_swing_miss%2Cin_zone_swing%2Cin_zone_percent%2Cin_zone%2Cedge_percent%2Cedge%2Cwhiff_percent%2Cswing_percent%2Cpull_percent%2Cstraightaway_percent%2Copposite_percent%2Cbatted_ball%2Cf_strike_percent%2Cgroundballs_percent%2Cgroundballs%2Cflyballs_percent%2Cflyballs%2Clinedrives_percent%2Clinedrives%2Cpopups_percent%2Cpopups%2Cpop_2b_sba_count%2Cpop_2b_sba%2Cpop_2b_sb%2Cpop_2b_cs%2Cpop_3b_sba_count%2Cpop_3b_sba%2Cpop_3b_sb%2Cpop_3b_cs%2Cexchange_2b_3b_sba%2Cmaxeff_arm_2b_3b_sba%2Cn_outs_above_average%2Cn_fieldout_5stars%2Cn_opp_5stars%2Cn_5star_percent%2Cn_fieldout_4stars%2Cn_opp_4stars%2Cn_4star_percent%2Cn_fieldout_3stars%2Cn_opp_3stars%2Cn_3star_percent%2Cn_fieldout_2stars%2Cn_opp_2stars%2Cn_2star_percent%2Cn_fieldout_1stars%2Cn_opp_1stars%2Cn_1star_percent%2Crel_league_reaction_distance%2Crel_league_burst_distance%2Crel_league_routing_distance%2Crel_league_bootup_distance%2Cf_bootup_distance%2Cn_bolts%2Chp_to_1b%2Csprint_speed&chart=false&x=player_age&y=player_age&r=no&chartType=beeswarm&sort=xwoba&sortDir=desc)

## 確率

　確率(probability) は、任意の現象が起こる確かさの程度を割合で表したものです。例えば、MLB シーズンの中で、出場選手の打率等のある成績が起こる確かさの程度を割合といったことです。

　よく確率の説明で出てくるのが、サイコロの目の話ですが、各出目が起こる確かさの程度は、６分の１、約0.1667、約16.67%というのは、直感的にわかります。これを以下のように表現します。
```math
P(X = 1) = 0.1667
```
```math
P(X = 2) = 0.1667
```
```math
P(X = 3) = 0.1667
```
```math
P(X = 4) = 0.1667
```
```math
P(X = 5) = 0.1667
```
```math
P(X = 6) = 0.1667
```
```math
但し、X はサイコロの目
```
　サイコロを6回振って、各目が1回ずつ出るということは、なかなかないですけど、600万回振れば、だいたいこの通りになるでしょう。これは、ある現象を何度も繰り返していくうちに、その結果は、本来の確率に近づいていくということで、これを大数の法則といいます。
　vol.4 でやった打率の度数分布表をもう一度やってみましょう。
```
batting_avg <- as.numeric(player_batting_all$batting_avg, year="2024")
batting_avg_meta <- hist(batting_avg)
classified_names <- NULL # 変数を用意
for (i in 1:n) {
    classified_names[i] <- paste(
        paste(substring(sprintf("%0.3f", batting_avg_meta$breaks[i]), 2, 4), "0", sep = ""),
        " - ",
        paste(substring(sprintf("%0.3f", batting_avg_meta$breaks[i + 1]), 2, 4), "0", sep = "")
    )
}
classified_names
```
```
[1] ".180  -  .200" ".200  -  .220" ".220  -  .240" ".240  -  .260"
[5] ".260  -  .280" ".280  -  .300" ".300  -  .320" ".320  -  .340"
```
```
batting_avg_relative <- batting_avg_meta$counts / sum(batting_avg_meta$counts)
batting_avg_rtable <- data.frame(打率=classified_names, 度数=batting_avg_relative)
batting_avg_rtable
```
```
           打率        度数
1 .180  -  .200 0.007751938
2 .200  -  .220 0.062015504
3 .220  -  .240 0.147286822
4 .240  -  .260 0.387596899
5 .260  -  .280 0.209302326
6 .280  -  .300 0.131782946
7 .300  -  .320 0.031007752
8 .320  -  .340 0.023255814
```

　相対度数の度数分布表は、各階級の確率を表していて、ある現象（この場合、MLB 2024 シーズンのSTATCAST規定到達打者の打率）は確率分布するといいます。
 確率分布の特徴は
 - 各確率は、どれも0 と 1の間にある
 - 確率はマイナスにはならない
 - 確率は1を超えない
 - 確率分布の全ての確率を足すと1になる

　`batting_avg` は母集団ですから、母集団分布と言い換えることもできます。

## 無作為標本抽出

 `batting_avg` は、データ個数129個の母集団ですから、全部、調べるのも、そんなに苦にはなりませんが、母集団が大きく、すべてを調べることが困難な場合、母集団から標本（sample）を抽出して、母集団の傾向を推測することがあります。
 もっとも、MLB STATCAST の場合、母集団は有限（有限母集団）で、データとしてすべて取得可能なので、そんな心配はいらないのですが、統計学の知識としてやってみましょう。

 標本抽出(sampling) をする方法で良いとされているのは、無作為標本抽出（random sampling）です。これによって抽出した標本を無作為標本(random sample)といいます。

　無作為標本抽出には２種類の方法があります。
 - 復元抽出法
 - 非復元抽出法

　何やら分かりにくい言葉ですが、復元抽出とは、抽出した標本を母集団に戻す（replace）ことをいいます。
 そうすると、非復元抽出とは、戻さないということになります。
 　どう違うかというと、戻した場合、同じものをもう一度抽出する可能性があるということです。非復元の場合は、それはあり得ませんよね。
　復元抽出法が有効なケースというのは、母集団が無限で、標本抽出できる母集団が限られている時に、復元抽出すると、無限母集団から抽出したのと似たような結果になると言われています。

  この場合、そういうケースではないので、非復元抽出法による無作為標本抽出で良いということになります。

　それでは、やってみたいと思いますが、条件を決めます。
 - 標本サイズ（size of sample） いくつ抽出するのか
 - 標本の数（number of sample） 標本を何セット作るのか

　それでは、標本サイズ 10 で、標本の数は4セットということにしておきましょう。

```
batting_avg_sample1 <- sample(batting_avg, 10, replace = FALSE)
batting_avg_sample2 <- sample(batting_avg, 10, replace = FALSE)
batting_avg_sample3 <- sample(batting_avg, 10, replace = FALSE)
batting_avg_sample4 <- sample(batting_avg, 10, replace = FALSE)
```
```
batting_avg_sample1
```
```
 [1] 0.302 0.246 0.310 0.256 0.243 0.242 0.267 0.314 0.267 0.246
```
```
batting_avg_sample2
```
```
 [1] 0.241 0.233 0.262 0.248 0.299 0.246 0.275 0.281 0.246 0.250
```
```
batting_avg_sample3
```
```
 [1] 0.253 0.269 0.247 0.279 0.231 0.273 0.219 0.292 0.241 0.282
```
```
batting_avg_sample4
```
```
 [1] 0.224 0.219 0.267 0.252 0.273 0.278 0.253 0.302 0.282 0.256
```
```
summary(batting_avg_sample1)
```
```
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
 0.2420  0.2460  0.2615  0.2693  0.2933  0.3140 
```
```
summary(batting_avg_sample2)
```
```
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
 0.2330  0.2460  0.2490  0.2581  0.2717  0.2990 
```
```
summary(batting_avg_sample3)
```
```
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
 0.2190  0.2425  0.2610  0.2586  0.2775  0.2920 
```
```
summary(batting_avg_sample4)
```
```
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
 0.2190  0.2522  0.2615  0.2606  0.2767  0.3020
```

　４つの標本セットが出来ました。繰り返しますが、これは方法を説明しているだけで、STATCAST を利用する上では、あまり意味のないことです。
 試しに、母集団と比べてみましょう。

```
length(batting_avg)
```
```
[1] 129
```
```
summary(batting_avg)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
 0.1960  0.2420  0.2560  0.2581  0.2750  0.3320 
```

　たまたま、`batting_avg_sample2`の標本の平均と一致してしまいましたが、偶然です。また、標本抽出は母集団を調査できないからやるわけですから、`batting_avg_sample2` が優秀だから、これを使うというようなこともできませんよね。

 複数の標本セットを作る意味は、標本平均値の平均、分散を取ると、母集団の平均、分散に近づくことがわかっているからです。

```
mean(c(0.2693, 0.2581, 0.2586, 0.2606))
```
```
[1] 0.26165
```

　今回の場合、標本サイズ 10 と小さいので、信頼性はないですし、STATCAST の利用上、意味はありません。

 　試しに、標本サイズ50 で、標本の数 2 でやってみましょうか。

```
summary(batting_avg_sample1)
```
```
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
 0.2140  0.2412  0.2555  0.2578  0.2720  0.3230 
```
```
summary(batting_avg_sample2)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
 0.2140  0.2420  0.2565  0.2589  0.2750  0.3220 
```
```
mean(c(0.2578, 0.2589))
[1] 0.25835
```

　かなり近づきましたが。これはチートに近いですね。母集団129しかなくて、50個ですからね。現実的な調査じゃないです。50個を2回調べられるなら、最初っから全数調査でいいと思います。

 　今回は、かなり強引な感じが否めませんが、何かに応用していただければ嬉しいです。