bskyvision RSS 태그 관리 글쓰기 방명록
2021-03-10 08:35:03
728x90

오늘은 1999년에 보로스 맥크라켄이라는 사람이 발표한 스탯, BABIP에 대해서 알아보도록 하겠습니다. BABIP은 batting average on balls in play의 약어로서, 인플레이 타구가 안타가 될 타율을 나타내는 지표입니다. 타율은 야구에 조금이라도 관심이 있는 분들이라면 모두 아실 것입니다. 

 

타율 = 안타 / 타수

 

인플레이 타구란?

BABIP의 정의 속 "인플레이 타구"는 무슨 뜻일까요? 인플레이 타구라는 것은 타자가 친 공이 페어 영역에 떨어진 것(상대수비가 잡아서 아웃이 되었든, 안타가 되었든)을 뜻합니다. 즉, 공을 쳤는데 홈런이나 파울이 되지 않고 아래 그림에서 색칠한 영역으로 공이 날아간 경우를 인플레이 타구라고 부릅니다.

 

 

BABIP이란?

그러한 인플레이 타구 중에서 안타로 연결될 확률이 바로 BABIP입니다. 

 

BABIP = (안타 - 홈런) / 인플레이 타구

         = (안타 - 홈런) / (타수 - 삼진 - 홈런 + 희생플라이)

 

BABIP은 투수와 타자 모두에게 적용될 수 있는 지표입니다. 투수의 BABIP은 낮을 수록 좋고, 타자의 BABIP은 높을 수록 좋습니다. 

 

맥크라켄의 주장은 다음과 같습니다.

 

"인플레이 타구가 안타가 되게 할 확률은 투수(또는 타자)의 실력이 아니라 운과 수비력에 크게 영향을 받는다."

 

물론 이 주장은 열띈 논쟁과 분석을 통해 조금 수정되긴 했지만, 여전히 큰 맥락에서는 유효합니다. 

 

"투수(또는 타자)의 실력이 인플레이 타구가 안타가 될 확률에 영향을 조금 미치긴 하지만, 여전히 운과 수비력에 영향을 많이 받는다."

 

투수의 경우 매년 비슷한 BABIP을 기록하다가 만약 어떤 해의 BABIP이 이상하게 높았다면 운이 나쁜 해였다고 평가할 수 있습니다. 빗맞은 안타가 많이 나왔다던가 수비 도움을 많이 못 받은 해는 BABIP이 높게 나옵니다. 그런 경우에는 다음 해의 성적은 나아질 것을 예상할 수 있습니다. 올해처럼 또 운이 나쁘지 않다면 말입니다. 

 

운의 영향을 크게 받는 투수의 BABIP에 비해, 타자의 BABIP은 타자의 유형 또는 실력의 영향을 좀 더 받습니다. 땅볼을 쳤더라도 발이 빠른 선수는 내야 안타로 살아나갈 수 있고, 라인드라이브와 같은 양질의 타구를 날리는 선수라면 인플레이 타구를 날렸을 때 안타가 될 확률이 좀 더 높기 때문입니다. 

 

추신수 선수의 BABIP

다음 그림은 추신수 선수의 BABIP와 MLB 타자 평균 BABIP을 보여줍니다. 250 타수 이상 기록한 해의 BABIP만 구했습니다. 참고로 타자의 BABIP은 높을 수록 좋습니다. 

 

 

추신수 선수는 발이 빨라서 그런지, 타구의 질이 좋아서 그런지, 컨택 능력이 좋아서 그런지 몰라도 BABIP은 리그 평균보다 전반적으로 높은 편입니다. 운도 어느 정도 따라줬던 것 같습니다. 

 

류현진 선수의 BABIP

류현진 선수의 BABIP은 다음과 같습니다. 투수의 BABIP은 낮을 수록 좋습니다. 

 

 

류현진 선수의 BABIP는 점차적으로 좋아졌습니다. 초창기에는 수비 도움을 다소 못 받은 편이었던 것 같고, 운도 나빴던 것 같습니다. 투수의 BABIP도 어느 정도 실력을 반영하기 때문에, 앞으로 지속적으로 리그 평균보다 낮은 BABIP을 기록한다면, 지금보다 더 좋은 선수로 평가받을 것 같습니다. 

 

소스 코드

추신수 선수와 류현진 선수의 BABIP은 다음과 같은 파이썬 코드로 구했습니다. 필요하신 분은 참고하시기 바랍니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
import sqlite3
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import font_manager, rc
 
# 한글 폰트 사용을 위해서 세팅
font_path = "C:/Windows/Fonts/ngulim.ttf"
font = font_manager.FontProperties(fname=font_path).get_name()
rc('font', family=font)
 
with sqlite3.connect("lahmansbaseballdb.sqlite"as con:
    cur = con.cursor()
    cur.execute('''
    SELECT yearID, round( (H - HR + 0.00) / (AB + SF - SO - HR), 3) AS BABIP FROM batting WHERE playerID == 'choosh01' and AB >= 250;
    ''')
    Choo = cur.fetchall()
 
    cur.execute('''
        SELECT yearID, round(avg( (H - HR + 0.00) / (AB + SF - SO - HR)), 3) AS BABIP FROM batting WHERE AB >= 250 and yearID >= 2008 and yearID != 2016 GROUP BY yearID;
        ''')
    MLB = cur.fetchall()
 
    year = np.zeros((len(Choo)))
    Choo_BABIP = np.zeros((len(Choo)))
    MLB_batter_BABIP = np.zeros((len(MLB)))
 
    for i in range(len(Choo)):
        year[i] = Choo[i][0]
        Choo_BABIP[i] = Choo[i][1]
        MLB_batter_BABIP[i] = MLB[i][1]
 
    plt.plot(year, Choo_BABIP, 'r*-')
    plt.plot(year, MLB_batter_BABIP, 'r*--')
    plt.title('추신수 선수의 BABIP 추이')
    plt.xlabel('년도')
    plt.ylabel('BABIP')
    plt.legend(['추신수 BABIP''MLB 타자 평균 BABIP'])
    plt.grid(True)
    plt.show()
 
    cur = con.cursor()
    cur.execute('''
        SELECT yearID, round( (H - HR + 0.00) / (BFP - SO - BB - SH - HR), 3) AS BABIP FROM pitching WHERE playerID == 'ryuhy01' and BFP >= 250;
        ''')
    Ryu = cur.fetchall()
 
    cur.execute('''
            SELECT yearID, round(avg( (H - HR + 0.00) / (BFP - SO - BB - SH - HR)), 3) AS BABIP FROM pitching WHERE BFP >= 250 and yearID >= 2013 and yearID != 2015 and yearID != 2016 GROUP BY yearID;
            ''')
    MLB = cur.fetchall()
 
    year = np.zeros((len(Ryu)))
    Ryu_BABIP = np.zeros((len(Ryu)))
    MLB_pitcher_BABIP = np.zeros((len(MLB)))
 
    for i in range(len(Ryu)):
        year[i] = Ryu[i][0]
        Ryu_BABIP[i] = Ryu[i][1]
        MLB_pitcher_BABIP[i] = MLB[i][1]
 
    plt.plot(year, Ryu_BABIP, 'r*-')
    plt.plot(year, MLB_pitcher_BABIP, 'r*--')
    plt.title('류현진 선수의 BABIP 추이')
    plt.xlabel('년도')
    plt.ylabel('BABIP')
    plt.legend(['류현진 BABIP''MLB 투수 평균 BABIP'])
    plt.grid(True)
    plt.show()
cs

 

bskyvision의 추천글

[세이버메트릭스] 타타타자로 시작하는 말-타석, 타수, 타율

 

참고자료

[1] terms.naver.com/entry.nhn?docId=3572533&cid=58905&categoryId=58916, 네이버 지식백과, "BABIP란 무엇인가"

[2] library.fangraphs.com/pitching/babip/, 팬그래프, "BABIP"

[3] gist.github.com/wesrice/f1cc48fa8d18d17bc2de, wesrice의 깃헙, "sabermetrics_batting.sql"

댓글

방문해주신 모든 분들을 환영합니다.

* 글을 읽던 중에 궁금했던 부분은 질문해주세요.

* 칭찬, 지적, 의문, 격려, 감사표현 등을 남겨주세요.

* 최대한 답변 드리도록 노력하겠습니다.

* 욕설과 광고를 담은 댓글은 가차없이 삭제합니다.


  1. 꼬장스카이비전@2021.03.11 08:33 ~$ 예전에는 웹 관련 내용이라 그나마 회사에서 볼만했는데 점점 야구내용이 많아져서 회사에서 블로그 몰래봐야함 ㅋㅋ [댓글주소]  [수정/삭제]  [답글작성]
guest@이름 ~$
guest@패스워드 ~$
guest@홈페이지주소작성 ~$

guest@댓글작성 ~$




bskyvision. Designed by bskyvision.