【WHIP, K/BB他】NPB(2019)セイバーメトリクス投手指標の算出①



Page content

以前取得したプロ野球の個人成績に、簡単な計算で算出できる投手指標をいくつか追加する。




今回追加するのはごくごく簡単な指標6つ。

というか3つは既に取れているので実施3つ



追加する指標

QS率

$\frac{QS}{先発登板}$

  • 先発登板のうちQS(6回以上3失点以内)に抑えた割合

K/BB

  • 投手の三振奪取力と制球力の総合指標

$\frac{奪三振}{与四球}$


K/9

  • 9イニングあたり何奪三振とるか(奪三振率)

$奪三振 \times \frac{9}{投球回}$


BB/9

  • 9イニングあたり何四球与えるか

$与四球 \times \frac{9}{投球回}$


HR/9

  • 9イニングあたり何本塁打打たれるか

$被本塁打 \times \frac{9}{投球回}$


K%

  • 打者と対戦し奪三振を取る確率
  • K/9(奪三振率)は味方守備力の影響を受けるのに対し、こちらは純粋に投手の奪三振能力のみを評価できる
    • こちらのほうが本来の意味で「奪三振率」ともいえる

$\frac{奪三振}{打席}$


BB%

  • 打者と対戦し四球を与える確率
  • BB/9は味方守備力の影響を受けるのに対し、こちらは純粋に投手の四球回避能力のみを評価できる

$\frac{四球}{打席}$


WHIP

  • 1イニングあたり何人(安打と四球の)走者を出すか

$\frac{与四球 + 被安打}{投球回}$


実装

FULL_OUTCOUNTS = Decimal('27')

def _return_outcounts(innings):
    int_innings = int(innings)
    dec_innings = innings - int_innings
    return 3 * int_innings + 10 * dec_innings


def qs_rate(pitcher):
    start = Decimal(pitcher['先発'])
    if not start:
        return '0'
    qsrate = Decimal(pitcher['QS']) * 100 / start
    return str(qsrate)


def k_per_bb(pitcher):
    bb = Decimal(pitcher['与四球'])
    k = Decimal(pitcher['奪三振'])
    if not k:
        return '0'
    elif not bb:
        return '99.99'
    k_per_bb = k / bb
    return  str(k_per_bb)


def k_per_nine(pitcher):
    innings = Decimal(pitcher['投球回'])
    outcounts = return_outcounts(innings)
    if not outcounts:
        return '0'
    k_per_n = Decimal(pitcher['奪三振']) * FULL_OUTCOUNTS / outcounts
    return str(k_per_n)


def bb_per_nine(pitcher):
    bb = Decimal(pitcher['与四球'])
    innings = Decimal(pitcher['投球回'])
    outcounts = return_outcounts(innings)
    if not bb:
        return '0'
    elif not outcounts:
        return '99.99'
    bb_per_n = bb * FULL_OUTCOUNTS / outcounts
    return str(bb_per_n)


def hr_per_nine(pitcher):
    hr = Decimal(pitcher['被本塁打'])
    innings = Decimal(pitcher['投球回'])
    outcounts = return_outcounts(innings)
    if not hr:
        return '0'
    elif not outcounts:
        return '99.99'
    hr_per_n = hr * FULL_OUTCOUNTS / outcounts
    return str(hr_per_n)


def whip(pitcher):
    runner = Decimal(pitcher['与四球']) + Decimal(pitcher['被安打'])
    innings = Decimal(pitcher['投球回'])
    outcounts = return_outcounts(innings)
    if not runner:
        return '0'
    elif not outcounts:
        return '99.99'
    whip = runner * 3 / outcounts
    return str(whip)

おわり

特筆すべきこともない実装ですが、今後ぽつぽつと指標は追加していきたい。