KBO 야구 경기를 보면서 문득 전광판에 보여지는 투수와 타자의 지표들에 호기심이 생겼다.
야구는 “세이버 메트릭스”라는 전문 분야가 존재할 만큼 어떤 스포츠보다 수리적, 통계학적 이론을 적극 활용하고 있는데,
선수의 가치를 평가하고, 팀을 구성하고, 승리하기 위해 사용하는 지표들이 실제 팀의 승리에 얼마나 영향을 줄까?
그리고 경기 승패를 예측한다면 어느정도 예측이 가능할까?
1. 데이터 수집
우선 예측을 위해 KBO 과거 경기 기록 데이터가 필요했는데, 다행히 KBO 공식 사이트에 경기 기록이 잘 정리되어 있었다.
수집한 데이터는 23년 4월부터 24년 4월까지 약 1년의 경기 기록 데이터이고, 원활한 데이터 관리를 위해 수집한 데이터는SQL DB를 구성하여 해당 DB에 저장했다.
https://www.koreabaseball.com/Schedule/Schedule.aspx
2. 데이터 분석
이제 데이터를 수집했으니, 데이터를 분석할 차례이다.
1) 홈 & 어웨이 경기 분석
우선 홈 & 어웨이 경기가 승리에 얼마나 영향을 주는지 알아보았는데, 대부분의 구단이 홈 경기를 할때 승률이 높았다.
평균 승률은 약 55%로 큰 차이는 아니지만, 분명 홈에서 경기를 할 때 승률이 높다는 것을 확인할 수 있었다.
상대구단에 따라서도 승률이 많이 다를까? 승률을 확인해보니, 생각보다 차이가 큰 구단들도 있었다.
특히 최근 1년간 SSG(SK)는 두산(OB)과의 경기에서 79%를 승리했다. (아..이승엽 감독님 화이팅!)
그 외에도 승률이 70%가 넘는 매치들도 있었는데, 구단들간의 차이를 볼 수 있어 흥미롭기도 하면서 씁쓸했다. (한화...)
2) 야구 대표 지표와 승리와의 상관관계
타자의 대표적인 지표인 OPS는 승리에 얼마나 영향을 줄까?
OPS는 OBP(출루율)과 SLG(장타율)의 합으로 대표적인 타자의 지표이다.
그 외에도 AVG(타율), BABIP(인플레이 타율)등 다른 지표들도 살펴보았는데, 가장 상관계수가 높았던 지표는 OPS였다.
상관계수는 두 변수간의 선형강도를 수치화한 측도로, OPS가 승리한 경기와 0.51의 양의 상관관계를 띄고 있다.
(보통 상관계수가 0.3 ~ 0.4이상이면 상관관계가 있다고 보는 것 같다.)
투수의 지표를 어떨까?
대표적인 ERA(평균자책점)과 WHIP(1이닝당 홈에서 떠나보낸 타자의 예상 숫자)를 살펴보면, 승리와의 상관계수는 -0.5이거나 이상으로 음의 상관관계를 보이고 있다.
WHIP의 대해서 좀 더 알아보자. WHIP은 [(피안타+볼넷) / 이닝]으로 산정된다.
KBO의 정규시즌 경기에서 비중이 높은 WHIP의 수치는 대략 1.0 ~ 2.0으로 나타났고, WHIP이 1.0보다 낮으면 전체 경기 중, 승리한 경기의 비중이 많다는 것을 확인할 수 있다.
반면 WHIP이 1.0을 넘어가면 승리한 경기의 비중이 줄어들기 시작한다. 즉 야구경기에서 WHIP 1.0이 넘지 않도록 관리한다면 승률이 높아진다는 의미이다.
타자와 투수의 대표적인 지표인 OPS와 ERA는 어떨까?
OPS와 ERA 모두 ± 0.5이상의 상관계수를 보이며, 상관관계가 있다는 것을 확인하였는데,
이를 2차원 평면 그래프에 산점도로 나타내고, 경기 결과를 색상으로 구분해보면 좀 더 명확히 확인할 수 있다.
아래와 같이 붉은 점선을 기준으로 대략적으로 승패 여부가 구분되는 것을 확인할 수 있고,
OPS와 ERA의 수치가 경기 승패와 관련이 높은 지표라는 것을 확인할 수 있다.
3. 경기승률 예측 모델 구현
앞서 분석한 내용을 바탕으로 모델 구현에 활용할 학습용 데이터를 아래와 같이 선정하고,
알고리즘 선정과 파라미터 수정 과정을 통해 모델을 최적화하는 과정을 진행할 차례이다.
승률을 예측하기 위해서 우선 승패를 분류할 대표적 분류 알고리즘 5개의 Accuracy Score를 비교하였는데,
평균은 높고, 표준편차는 낮은 XGBoost가 모델에 가장 적합할 것으로 보여진다. 그리고 성능 최적화를 위해 XGBoost의 파라미터값을 수정하는 과정을 진행했다. Accuracy Score는 0.9이상으로 아주 높은 수치가 나왔다.
해당 과정을 통해 학습에 활용한 각 야구 지표들이 승리에 큰 영향을 준다는 것을 다시 확인할 수 있었다.
하지만, 안타깝게도 모델에 학습한 OPS, ERA, WHIP값은 각 경기결과에 대한 실제값이므로 이 모델을 활용하기 위해서는 경기 전에 실제 OPS, ERA, WHIP값을 확인해야 한다는 것이다. (미리 값을 알려면 예지능력이 있어야....)
실제 OPS, ERA, WHIP값은 경기 전에 알 수 없지만, 예측값은 경기 전에 구할 수 있다.
과거 경기결과를 토대로 예측값을 산정하여 모델에 학습시키면 예측값으로 모델을 구현할 수 있고 성능을 예측할 수 있다.
그렇다면 예측값을 구하기 위해 어느정도 범위의 경기결과를 가져오는게 좋을까?
최적의 알고리즘과 데이터 범위 설정을 위해 각 분류 알고리즘과 경기수의 조합을 비교해보았다.
가장 성능이 높았던 조합은 15번 조합의 GradientBoost 알고리즘이었는데,
전체적으로는 LogisticRegression의 성능이 높게 나타났고, 18번 조합은 표준편차도 가장 낮아 안정적인 결과를 보였다.
즉 OPS는 과거 13일의 데이터로, ERA와 WHIP은 과거 10일의 데이터로 모델을 구현하는 것이 성능이 가장 좋았다.
결과적으로 예측값을 활용한 야구 승패 예측 모델의 성능은 약 0.56 수준으로 나타났다.
실제값을 활용한 모델의 성능에 비해 한참 낮은 수치이지만, 야구 경기에 사용할 수준은 되었다.
5월 2일자 실제 경기에 활용해보자.
예측 모델을 통해 예측한 승리팀과 승률에 대한 결과는 아래 오른쪽 표와 같다.
결과적으로는 5경기 중 2경기만 맞추었고, 나머지 3경기는 다른 결과가 나왔다....ㅠㅜ
EDA와 모델 구현에 시간을 투자해서 성능을 높이면 좋겠지만, 다른 주제와 알고리즘도 다룰 예정으로
추후에 기회가 된다면 더 심층적으로 분석해보고 싶다.
'Project' 카테고리의 다른 글
프로젝트 팀 운영 가이드라인 (1) | 2024.12.09 |
---|---|
[Project] 전력사용량 예측 프로젝트 (feat. LSTM) (2) | 2024.08.27 |
[Project] 좋은 주식 찾기 프로젝트 (feat. yfinance) (0) | 2024.08.10 |
[Tableau] KBO OPS 타자지표 분석 (0) | 2024.08.01 |