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



Page content

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




追加する指標

wOBA (weighted On-Base Average)

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

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

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

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

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

計算式

${0.692 \times (四球 - 故意四球) + 0.73 \times 死球\\\ + 0.865 \times 単打 + 1.334 \times 二塁打\\\ + 1.725 \times 三塁打 + 2.065 \times 本塁打}\\\ \div (打数 + 四球 - 故意四球 + 死球 + 犠飛)$


wOBA(Basic)

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

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

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

計算式

${0.7 \times (四球 + 死球 - 故意四球) + 0.9 \times 単打\\\ + 1.3 \times (二塁打 + 三塁打) + 2.0 \times 本塁打}\\\ \div (打席 - 故意四球 - 犠打)$


wOBA(Speed)

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

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

盗塁を加味するSpeed版。

計算式

$(0.7 \times (四球 + 死球 - 故意四球) + 0.9 \times 単打\\\ + 1.25 \times 二塁打 + 1.6 \times 三塁打\\\ + 2.0 \times 本塁打 + 0.25 \times 盗塁 - 0.5 \times 盗塁死)\\\ \div (打席 - 故意四球 - 犠打)$


なお、

失策出塁に関してはデータの入手が難しいため、手に入らない場合は無視してもよいとしている。(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も算出できるようになる。