投打の左右を考慮した球種別球速帯別変化グループのRV/100
RV/100とはストライクを取る、凡打にさせたなど相手の得点を防いだ事象についてはマイナスの得点価値が、ボール球を投げる、安打を許すなど相手の得点の見込みを増やす事象についてはプラスの得点価値が与えられる指標で投手にとっては低ければ低いほど得点を防ぐことを意味する指標だ。
そのRV/100を各球種の各球速帯、各変化グループにグループ分けをした。グループ化の方法は球速は5km/hで刻み、ボール変化グループは各球速帯の平均変化量より7.5cm未満ならNOMAL、横変化については利き手側に7.5cm以上変化してるならARM、グラブ側に7.5cm以上変化してるならGLOVE、縦変化については上方向に7.5cm以上変化するならRISE、7.5cm以上下方向に落下してるならDROPとする。
これは先行研究であるデルタ・ベースボール・リポート4(水曜社:2021年)『変化量とRun Valueが示す本当に有効なボールとは? (八代 久通)』と全く同じである。
今回はそれに加えて投打の左右が一致した場合としていない場合で場合分けしてRV/100を算出した。
フォーシーム
フォーシームは左右の一致に関わらずRISE型が優勢となっている。横変化についてはRISEするか否か利き手が一致するか否かで効果が大きく異なる。一致する場合でGLOVE側に変化する場合はRISEすると失点リスクを大きく抑えられるが、DROPすると逆に大きく失点のリスクが増加する。一致しない場合はARM側に変化する場合、RISEすると失点リスクを大きく抑えられるが、DROPしてしまうと途端に失点のリスクが跳ね上がる。フォーシームについてRISEするか否かが失点リスクを大きく左右するようだ。
シンカー(ツーシーム)
シンカーについては投打の左右が一致する場合はARM-DROP型が最も有効となる。打者に食い込みながら大きく沈むボールが理想という、いわゆるシンカーらしい動きのボールだ。投打の左右が一致しない場合は、そもそもシンカーというボールが有効ではないようだ。シンカーボーラーはそもそも投打の左右が一致しない場合は苦戦しそうだ。
スライダー
スライダーは球速が速くなると横変化は小さく(ARM側に変化)なりやすく縦変化はRISEする傾向にある。
各球速帯の平均変化量よりGLOVE側に変化する球は基本的に有効となる。縦変化については、利き手が一致し球速が140未満の場合は効果が高くなる。球速が140を超えた場合、投打の左右が一致しない場合はDROPする球質が有効となる。投打の左右が一致しない場合は抑えるためには140km/h以上の球速があると好ましい。
スライダーをフォーシームと近い変化量で投げると、打者に見分けが付きづらくなって打ちにくいと言われることがあるが、単純に変化量で見てみるとフォーシームに近い変化量である、ARM-RISE型のスライダーは効果が芳しくない。
カーブ
カーブは変化タイプより球速の影響が大きく速くなればなるほど失点のリスクが小さくなる。GLOVE-DROPが左右が一致する場合は効果が低いのに対し一致しない場合は効果が高くなっている。
チェンジアップ(スプリット含む)
チェンジアップは左右ともARM-DROPが有効な変化量となる。ARM-RISEは投打の左右が一致する場合は打者にとって絶好球となる一方で、一致しない場合は失点を抑えられるボールになり効果が異なる。ARM-RISEに変化する場合は相手打者の左右によって使い方をはっきり分けたほうが良さそうだ。
今回の分析にはMLB17-20のstatcastデータを利用した。データはBaseball Savantから入手した。
Rのコード
library(tidyverse)
#dfには2017-2020のMLBのデータが入っている
df <- df %>%
mutate(velocity = release_speed * 1.609,
pfx_x_cm = ifelse(p_throws == "R",pfx_x*30.48,pfx_x*-30.48),
pfx_z_cm = pfx_z*30.48,
pitch_type = case_when(
pitch_type == "FF" ~ "FF",
pitch_type == "FT" | pitch_type == "SI" ~ "SI",
pitch_type == "SL" ~ "SL",
pitch_type == "FC" ~ "FC",
pitch_type == "CU" | pitch_type == "KC" ~ "CU",
pitch_type == "CH" | pitch_type == "FS" ~ "CH"),
strike_count = ifelse(strikes == 2,"2strikes","non2strikes"),
throw_stand = ifelse(p_throws == "R" & stand == "R" | p_throws == "L" & stand == "L" ,"same","difference"))
Group <- seq(120,160,5)
df$velocity_bin <- with(df,cut(velocity,Group))
pitch_type <- df %>%
group_by(pitch_type,velocity_bin)%>%
dplyr::summarise(mean_x = mean(pfx_x_cm,na.rm=TRUE),
mean_z = mean(pfx_z_cm,na.rm=TRUE))
df <- left_join(df,pitch_type)
df <- df %>%
mutate(
h_mov = case_when(
pfx_x_cm <= mean_x +7.5 & pfx_x_cm >= mean_x - 7.5 ~ "NOMAL",
pfx_x_cm > mean_x + 7.5 ~ "GLOVE",
pfx_x_cm < mean_x - 7.5 ~ "ARM",
TRUE ~ "ELSE"),
v_mov = case_when(
pfx_z_cm <= mean_z + 7.5 & pfx_z_cm >= mean_z - 7.5 ~ "NOMAL",
pfx_z_cm > mean_z + 7.5 ~ "RISE",
pfx_z_cm < mean_z - 7.5 ~ "DROP",
TRUE ~ "ELSE"),
move_type = paste(h_mov,"-",v_mov))
move_type_RV <- df %>%
group_by(velocity_bin,pitch_type,throw_stand,move_type)%>%
dplyr::summarise(N=n(),
RV_100 = round(mean(delta_run_exp,na.rm=TRUE)*100,2))%>%
filter(N>=500)%>%
select(velocity_bin,pitch_type,move_type,RV_100)
write_csv(move_type_RV,"変化タイプ別RV.csv")
write_csv(pitch_type,"球速帯別変化量.csv")
この記事が気に入ったらサポートをしてみませんか?