2017年12月23日土曜日

xwOBAの中身拝見

xwOBAの記述に関して、幾つかの記事が正確ではないのでは的なツイートがちょっと前にTLに流れていて記事に気づいたので今回はxwOBAについて。

http://column.sp.baseball.findfriends.jp/?pid=column_detail&id=097-20171017-22
https://www.baseballchannel.jp/mlb/41406/
https://full-count.jp/2017/11/22/post94206/

これらの記事ではxwOBAはコンタクトの質を測る指標的な説明がなされていますが、実際にはコンタクトの質も利用しますが、それに加えて非コンタクトの打撃結果を利用している指標です。これはStatcastのデータを利用してMLBが公開しており、現在主流の打撃指標であるwOBAの派生の一つと言っていいと思います。wOBA自体わからん!という場合、1.02の記事などを参照願います。
http://1point02.jp/op/gnav/glossary/gls_explanation.aspx?eid=20004

xwOBAのMLB.comの用語集での説明が↓にあります
http://m.mlb.com/glossary/statcast/expected-woba

まずwOBAについて説明されています。やや見づらいのでまずざっくりした構造にすると以下のようになります。

wOBA = [wOBA分子] / [wOBA分母]

ここで、分子は以下を含む。
非故意四球の係数 x 非故意四球の数 +
死球の係数 x 死球の数 +
単打の係数 x 単打の数 +
二塁打の係数 x 二塁打の数 +
三塁打の係数 x 三塁打の数 +
本塁打の係数 x 本塁打の数

また、分母は以下を含む。
打席数 +
非故意四球の数 +
犠飛の数 +
死球の数

分子には得失点の増加に関連する主要な打席結果が含まれています。それぞれのイベントの係数は、イベントごとの得点期待値の大きさから決定されており、具体例としてはNPBでの上記の1.02での解説を参照のこと。分母はなんかややこしい感じですが、要するに打数 (PA) だと思ってもらえば良いと思います。

さて、ここまではxwOBAの基となるwOBAの説明でしたが、MLBの用語集ではxwOBAについて、打球に関連する結果では実際の結果ではなく、打球データから期待される結果を使うと説明されています。ここで用いる打球のパラメータとしては、打球の速度と角度を利用しています (こことこれ以後では、「角度」は基本的に地面に対する角度のこと。右に打つかとか左に打つか的な左右の角度ではないです)。また、四球、死球、三振に関しては各選手の実データを用いると説明されています。つまり、仮に打球を150個飛ばした打者を考えて、分子を書き改めると、
非故意四球の係数 x 非故意四球の数 +
死球の係数 x 死球の数 +
打球1の期待される価値 + 打球2の期待される価値+ .... +打球150の期待される価値
となります。

四球と死球は分子にも分母にも含まれており、xwOBAでもwOBAでも同様に考慮されていることがわかります。三振については、分母には打席数が入っており、これは三振の数を含んでいます。分子には三振の値は指定されていませんので、増えようが増えまいが0です。分母は増えるので結果、三振が増えるとxwOBAの値は (wOBAでの値と同じだけ) 低下します。イメージとしては、分子では三振の係数が0となっていると想像すればいいかもしれません。

というわけで、打球以外の主要な打席結果も含まれていることが確認できました (注1)。

そもそも、xwOBAが何の略語か、ということを考えると、これらを含めることは必要なことだったと思われます。xwOBAはexpected wOBAの略であり、「本来あるべきだったwOBA」のような意味合いになっています。このため、wOBAが含んでいるイベントであり、またかなり大きい影響を持つ四球や三振を含めないと、あるべきだったwOBAとはとても言えないような指標になるはずです。

ついでなのでMLBとしてはこのxwOBAで何を測定したいと考えているか、あるいは実際の打球の価値がどんな感じになっているかについて、もうちょっと説明します。

wOBAとxwOBAの違いは、打球の評価に打撃結果を使うか、打球の質で結果を予測して使うか、の違いであり、これによって打者や投手の技術をより直接的に測定したい、という意図があるようです (注2)。例えば、打球がフィールド内に飛んでしまえば、その結果は守備などの影響が大きいため、いい当たりを飛ばしてファインプレーでアウトにされても、内野へのポップフライを打っても、取られてしまえば等しくアウトになってしまいます。ここで、打球が発生したところまでが打者や投手の責任範囲だと考えて、打球の速度と角度を打球の質に応じて、それに妥当な価値を与えることができれば守備などの影響を取り除くことができます。

具体的な計算例で確認してみます。下はStatcastデータにおける、とある試合での結果の一部で、wOBAとxwOBAの計算に関連する部分だけ取り出しました。例えば、投球でも打撃結果を生じなかったものは除いています。wOBA値はイベントのwOBAでの計算での価値 (の十分良い近似) を、推定wOBA値は、打球の速度と角度からMLBAMが推定した打球の価値を示しています。
図1. xwOBA計算に関連する項目の具体例

wOBAとxWOBAで与えられる価値は似ているものもあれば、かなり差がある打球もあります。例えば、結果の上から2行目 (AB_#17) では単打が記録されていますが、これはwOBAでは単打の得点期待値から0.9の価値があると計算され、xwOBAでは0.726と計算されており、少し評価が抑えめになっていますが概ね一致しています。

wOBAとxwOBAで大きな違いが見られるのは下から3行目 (AB_#22) で、これは比較的強いあたりのライナー性の打球が、野手に取られたためにアウトになったというイベントです。wOBAではこれはただのアウトとして価値を0としていますが、推定wOBAでは0.667であり、AB_#17の単打とほとんど同じ価値を認めています。同じアウトでも、下から4行目では、角度も上がり過ぎで、速度もそれほどではなく、推定wOBAでも0.108と、wOBAの0とよく似た値になっているのとは対照的です。

実際に投手のxwOBAをStatcastデータから計算してみます。wOBAを計算するときには、定義に従ってwOBAの値を足して分母で割ってやれば出てきますが、xwOBAでは推定wOBA値をそのまま使うことはできません。これは、推定wOBA値は打球に対してのみ適切な数値を割り当てているためです。xwOBAを計算するためには打球 (type = X) では推定wOBA値を、それ以外ではwOBA値を持つような列を作り、それを使って計算すれば良さそうです。これが上の図1の右端のxwOBA値。

こちらの計算結果と、baseballsavantで検索して得られた値を比較してみます。下は、savantでxwOBAを投手ごとに調べた結果 (500打数以上の上位15人)と、それらの投手に関してこちらでの計算した結果を並べました。そのままコピーしたわけではないことをアピるために桁数をあえて変えています。
図2. 2017MLBにおけるxwOBA上位15名 (500PA以上)

ちゃんとあっているようなので、基本的にはここで示した計算方法と同じことをしていると思われます (注3)。

もう少し詳しく、wOBA値と推定wOBA値を比較してみましょう。下は、打球を位置ごとにプロットし、それぞれの打球の価値を色で示しています。色と数値の対応関係については図の右のゲージを参照。打球が多すぎると見づらくなるので適当な期間だけに絞っています。
図3. 野手が打球を捕った位置と打球価値評価の関係

内野と外野の間と思われる領域 (hc_y 100 ~ 150あたり) で値の大きな違いが見られます。wOBAではこの部分で高い価値になっており、外野手の定位置あたりの打球 (hc_y 50 ~ 100あたり) に比べて高いですが、xwOBAでは比較的位置に関係なくそこそこ高い数値で評価されているようです。xwOBAでは、野手のいないところに打球を打つというようなスキルが存在しない、あるいはあっても小さい場合にどうなるかを推定している感じです (注4)。

下はそれぞれの打球の速度、角度についてプロットし、やはり価値を色で示しています。
図4. 打球の速度+角度と打球価値の関係

全体的な傾向としてはよく似ており、打球速度100以上、角度が25~37.5あたりの非常に価値が高い部分 (いわゆるバレル; 注5) と、その下から打球速度60で角度25くらいのあたりへ繋がっていく、比較的価値の高いベルト状の領域 (ほとんどは単打; 注6) と、それ以外の価値が低い領域、の3つの領域が認識できます。しかし、xwOBAではこれらの領域の境界で数値がなだらかに変化する点に差がありそうです。この部分を強調するために打球価値0.3以上0.89以下の打球だけに絞ると以下のようになります。
図5. xwOBAにおける中程度の価値を持つ打球の速度+角度

wOBAではアウトが0、安打が0.9以上の価値になるので、この区間には打球が存在しません。一方、xwOBAではバレルの端や、バレルの下のベルト領域、またその周辺部に多くの打球が存在しています。xwOBAではバレルとベルトの周辺では、離れていくほど価値が低下している様子が見て取れます。また、ベルト領域は基本的に0.9以下の数値になっており、少なくとも該当期間では全ての打球が残っています。これは、xwOBAでは単打性の当たりで運悪くアウトになった打球の価値を認めるのと同時に、単打になりそうな打球が運悪くアウトになる可能性も考慮するため、このゾーンでは0.9より低くなっていのでしょう。

また、図4をみるとwOBAでは価値が低い領域 (例えば打球速度50で角度-50 ~ 50など) でも、価値の高い打球がまばらに存在していますが、xwOBAでは見られません。これらの打球は恐らく内野安打やポテンヒットで、xwOBAではこれらを発生させた打球の価値はかなり低く評価されているということです。xwOBAでは内野安打やポテンヒットが無視されているかというとそういうわけではなく、このような打球がヒットになる確率が低く、類似の打球で平均的に価値をわけるとその値が小さくなっているのだと思われます。これは、既に説明した図1で示した具体例の下から4行目の値などからも確認できます。このような評価基準では、とにかくバットに当てたことが三振よりは高く評価されるようになります。下図は上の図で価値が0.05以上のものだけをプロットしています。
図6. 0.05以上の価値を持つ打球の速度+角度

wOBAの計算ではアウト (価値0) が全て除かれますが、xwOBAでは結構広い領域が残っています。xwOBA値0.5未満の打球の分布をヒストグラムと密度分布で示します。
図7. xwOBAにおける低価値打球の分布

価値の低い打球が多く存在してることがわかります。調べた期間内では価値0の打球は存在せず、とりあえずバットに当てれば価値は正の値にはなっているようでした (注7)。実際には、ピークとなっている0.1前後などは0みたいなものだと思いますが。

この、とりあえず前に飛ばせば三振よりはマシ、というのは直感的にも理にかなっているような感じがしますし、良い点でもあるわけですが、現状では悪い点とも関連があります。問題としては、内野安打は足の早い選手で起こりやすく、全打者に平均的に起こるわけでは無いわけですが、走力を無視しているために、走力と無関係に内野安打の期待値を割り振ってしまっています。内野安打に限らず走力の無視はxwOBAの問題点となりうる部分で、Craig EdwardsはxwOBAはwOBAと比較した時に、走力の高い選手を低く、走力の低い選手を高く評価するバイアスがあると示しています。
Craig Edwards, How to Beat Statcast’s Hitting Metric, Fangraphs, 2017.
https://www.fangraphs.com/blogs/how-to-beat-statcasts-hitting-metric/
それなりに影響の大きいバイアスかもしれないと個人的には思えます (注8)。

まとめると、xwOBAは:

  1. (wOBAと同様に) 打席結果を全体的に評価する
  2. 打球の関連するイベントでは結果を切り離して、角度と速度から推定した期待値を利用する。これは守備など、打球が発生した後の、打者や投手がコントロールできない要因を排除する意図がある
  3. それ以外ではwOBAと同じ数値を利用する
  4. 現状では走力を考慮していないのが欠点かもしれない

といったところです。
<参考>
Statcast search@baseballsavant
https://baseballsavant.mlb.com/statcast_search
____________________________________________________________________
注1.
ちなみに少なくとも元記事の一つでは、KluberのxwOBAが低いことの大きな要因は空振りが取れることだとかなりはっきりと書いています (7番目のパラグラフ)。
https://www.mlb.com/news/statcast-breaks-down-2017-cy-young-finalists/c-261136682

注2.
おそらく打者に関しては、実際に年度間相関はwOBAよりも高いようです。
Craig Edwards, What Can Statcast Tell Us This Early in the Season?, Fangraphs, 2017.
https://www.fangraphs.com/blogs/what-can-statcast-tell-us-this-early-in-the-season/
このことは本人の能力と無関係な影響を取り除けている可能性を示唆していますが、それが指標としていいかどうかはまた別の問題。

注3.
もしかしたらちょっと違うかもしれないのは、ここではイベントが発生した時の投球をした選手にイベントを割り当てていますが、これはMLBの計算とは異なる可能性があります。具体例で示した1番下の行ではAJ Coleが四球を出したことになっていますが、途中までScherzerが投げて複数ボールを出しているため、公式記録ではScherzerの四球になっていると思います (ちなみに2017/9/30の試合)。ウチの計算ではそのへんはルールを良く知らないので対応していませんが、MLBがStatcastの計算でちゃんと対応していれば、ここでの計算と厳密には一致しません。そうそう起こることではないので、ほとんど影響は無いはずですが。他にもこちらで思いつかない細かいルールがあるかも。

注4.
↓の4, 5パラグラフ目にspray angleに関してまとまったコメントあり。
Tango Tiger, Statcast Lab: Was Collin McHugh the unluckiest pitcher in MLB in 2016?, 2016.
http://tangotiger.com/index.php/site/comments/statcastlab-was-collin-mchugh-the-unluckiest-pitcher-in-mlb-in-2016#comments

注5.
Tango Tigerによるバレルの定義は正確には
where (launch_speed * 1.5 - launch_angle) >= 117
and (launch_speed + launch_angle) >= 124
and launch_angle <= 50
and launch_speed >= 98

Tango Tiger, Statcast Lab: Barrels, 2016.
http://tangotiger.com/index.php/site/comments/statcast-lab-barrels

用語集はココ↓
http://m.mlb.com/glossary/statcast/barrel

注6.
打席結果ごとに角度、速度でプロット。
併殺打が打球タイプごとに細かく分けられているので注意。
2017における打球によって生じた各イベントのxwOBA価値の平均とSD。

HRと単打の平均価値は2.45倍で、wOBAでの2.1倍より高くなっている。HRの影響を高く評価するのは、打者では将来のwOBAとの関係を強くしそうですが、投手だと弱くなる可能性もあるかも。
Glenn DuPaul , Reinforcing the power of predictive FIP, The Hardballtimes, 2012.
https://www.fangraphs.com/tht/reinforcing-the-power-of-predictive-fip/

二塁打と三塁打にほとんど差がないとか、バントで0.131の価値が認められているとか、色々興味深いです。二塁打と三塁打は本文でも書いた走力との関係でしょうか。まずはサンプル増やすべきでしょうけど。

分散が非常に大きいのは注目すべきでしょう。打席結果が打球の速度と角度以外の影響をいかに大きく受けているかを示唆しています。上のテーブルでは要約し過ぎでよくわからないので箱ひげ図で。丸は外れ値。
とてつもないバラツキの大きさだと言っていいでしょう。一応書いておくと、バラツキがあるからといってこのパラメータが駄目だとは必ずしも言えないはずです。

注7.
この期間にxwOBA値が0のものが無いのは偶然です (0はほとんど無いので、短い期間をてきとうに取り出した時に存在しないのはある意味偶然ではないですが)。2017全体で調べると価値0とされている打球が13個ありました。一つのグループは、打球の角度か速度がNAになっている打球で、これらは5つありました。これらは全てバントして内野安打になったケースでwOBAでは価値は0.9になっています。これ以外の残りの8つは角度67前後, 速度75弱ぐらいで、MLBAMが打球価値を決める時のデータでこの辺の打球が全てアウトだったんだろうなあと想像。

注8.
wOBAと一致しないから駄目かというとそうとも言い切れない。足の速い選手は内野安打で単打を増やしたり、外野への打球で1つ先の塁を奪って2塁打を増やしたりできますが、こういう足で稼いだ打球が持つ走者を進める効果は、それぞれ他の単打や2塁打より低いはずで、wOBAが過大評価している言えなくもない。逆に足の遅い選手だと、二塁打と同じぐらい走者を進める効果のある打球が単打になって、過小評価されているはず (ただし、少なくとも後者に関しては、以前アマダー (楽天) の年度成績をぼんやり眺めて見積もった感じでは影響はとても小さい気がしている)。

一応書いておくと (2回目)、xwOBAに問題が無いと言っているわけではなくて、その理由はwOBAの数値と一致しないからではなくて、均等に割り当てるべきでないものを均等に割り当てており、かつ、それがまあまあ大きな影響がありうることと考えたほうが適切だろう、ということです。

それ以前に投手では、wOBAが前提としている平均的な得点環境が成立しないことが多いので、wOBA系の指標使ってもあまり旨味 (得失点への変換) が無いような。コンタクトを考えるならxwOBAcon (はじめに引用した日本語の記事がxwOBAだと思っていたもの?) にしてしまうほうがわかりやすいと思う。
Tango Tiger, Barrels and launch characteristics, Or, what about Baez v Kershaw?, 2016.
http://tangotiger.com/index.php/site/article/barrels-and-launch-characteristics-or-what-about-baez-v-kershaw

2 件のコメント:

  1. 先日の選手ごとの角度推定wOBAconを出す件ですが上手くいきました。
    ありがとうございます。

    またコードに関する質問なのですが

    >xwOBAを計算するためには打球 (type = X) では推定wOBA値を、それ以外ではwOBA値を持つような列を作り、それを使って計算すれば良さそうです。

    このような列をRで作成するにはどのようなコードを書けばよいのでしょうか。

    返信削除
    返信
    1. 匿名様

      これはifelse()を使うのが簡単だと思います。statcastのデータがdfとして存在するときに、dplyr::mutate()の中で使う場合こうなります。
      ###############
      df %>% mutate(xwoba_value = ifelse(type == "X", estimated_woba_using_speedangle, woba_value))
      ################
      変数typeがXの場合 (つまり打球の場合)、estimated_woba_using_speedangleを持ち、そうでない場合woba_valueを持つ、新しい変数 "xwoba_value" を作っています。
      これは昔書いた、"内野守備シフト効果のざっくりとした測定"
      https://rpubs.com/snin/if_shift_1
      から拾ってきて余計な部分を除いたのですが、xwOBAの計算以外でも前処理でifelse()を多用しています。

      削除