【wOBA】NPB(2019)セイバーメトリクス野手指標の算出①



Page content

打者の得点への貢献度を表すwOBAを算出し追加する。




追加する指標

wOBA (weighted On-Base Average)

  • 打者の得点貢献度
  • 出塁率と同等の基準で評価

1打席あたりの得点貢献を表す指標。スケールは出塁率に合うように調整されており、.320程度が平均とされる。

同じく打者の得点能力を表す指標としてOPSがあるが、OPSは出塁率と長打率を同スケールで扱うため、高い値が出やすい長打率の影響が大きく、ロングヒッターが高評価されやすいという欠点がある。

一方wOBAでは、実際の試合経過から、各打席結果が得点期待値にどの程度影響を与えたかを算出し、それぞれに係数として掛け合わせる。これにより、OPS以上に得点相関が高い指標として導出される。

そのため係数はリーグやシーズンによって異なるが、今回はDELTA Inc.で紹介されているNPB版の式を利用する。

計算式

0.692×()+0.73× +0.865×+1.334× +1.725×+2.065× ÷(+++)


wOBA(Basic)

  • 係数を固定したwOBA
  • 打席結果のみを考慮する

「シーズンやリーグごとに係数を変えても影響は微々たるもの」として、上記係数を固定したStandard wOBA

打席結果のみ考慮するBasic版。

計算式

0.7×(+)+0.9× +1.3×(+)+2.0× ÷()


wOBA(Speed)

  • 係数を固定したwOBA
  • 打席結果と盗塁の成否を考慮する

「シーズンやリーグごとに係数を変えても影響は微々たるもの」として、上記係数を固定したバージョンのwOBA

盗塁を加味するSpeed版。

計算式

(0.7×(+)+0.9× +1.25×+1.6× +2.0×+0.25×0.5×) ÷()


なお、

失策出塁に関してはデータの入手が難しいため、手に入らない場合は無視してもよいとしている。(Wikipedia)

この記述に甘え、失策出塁を無視させていただくことに。


実装

WOBA_BB = 0.692
WOBA_HBP = 0.73
WOBA_SINGLE = 0.865
WOBA_DOUBLE = 1.334
WOBA_TRIPLE = 1.725
WOBA_HR = 2.065


def _single(hitter):
    return (Decimal(hitter['安打']) - Decimal(hitter['二塁打']) -
            Decimal(hitter['三塁打']) - Decimal(hitter['本塁打']))


def woba(hitter):
    denominator = Decimal(hitter['打数']) + Decimal(
        hitter['四球']) - Decimal(hitter['故意四球']) + Decimal(
            hitter['死球']) + Decimal(hitter['犠飛'])
    if not denominator:
        return '0'
    numerator = WOBA_BB * (Decimal(hitter['四球']) - Decimal(
        hitter['故意四球'])) + WOBA_HBP * Decimal(hitter[
            '死球']) + WOBA_SINGLE * _single(hitter) + WOBA_DOUBLE * Decimal(
                hitter['二塁打']) + WOBA_TRIPLE * Decimal(
                    hitter['三塁打']) + WOBA_HR * Decimal(
                        hitter['本塁打'])
    woba = numerator / denominator
    return str(woba)


def woba_basic(hitter):
    denominator = Decimal(hitter['打席']) - Decimal(
        hitter['故意四球']) - Decimal(hitter['犠打'])
    if not denominator:
        return '0'
    numerator = Decimal('0.7') * (
        Decimal(hitter['四球']) + Decimal(hitter['死球']) -
        Decimal(hitter['故意四球'])) + Decimal('0.9') * _single(hitter) + Decimal('1.3') * (
            Decimal(hitter['二塁打']) + Decimal(hitter['三塁打'])
        ) + Decimal('2.0') * Decimal(hitter['本塁打'])
    woba_b = numerator / denominator
    return str(woba_b)


def woba_speed(hitter):
    denominator = Decimal(hitter['打席']) - Decimal(
        hitter['故意四球']) - Decimal(hitter['犠打'])
    if not denominator:
        return '0'
    numerator = Decimal('0.7') * (
        Decimal(hitter['四球']) + Decimal(hitter['死球']) -
        Decimal(hitter['故意四球'])) + Decimal('0.9') * _single(
            hitter) + Decimal('1.25') * Decimal(hitter['二塁打']) + Decimal('1.6') * Decimal(
                hitter['三塁打']) + Decimal('2.0') * Decimal(
                    hitter['本塁打']) + Decimal('0.25') * Decimal(
                        hitter['盗塁']) - Decimal('0.5') * Decimal(
                            hitter['盗塁死'])
    woba_s = numerator / denominator
    return str(woba_s)

最新の成績は以下から閲覧できます。


おわり

成績をかき集める際にリーグ全体成績も取得するようにすると、wRAA, wRCも算出できるようになる。