Subscribe

📚 Project & TIL

Project [Personal]
2
SONTAROT
Project [Personal]
  • Jaenoo
Python
4
Basic Python
Python
  • Jaenoo
Advanced Python
Python
  • Jaenoo
Numpy
Python
  • Jaenoo
SQL
1
JAVA
3
Basic JAVA
JAVA
  • Jaenoo
Advanced JAVA
JAVA
  • Jaenoo
Scala
1

[EST soft]정형프로젝트 #KBO 프로야구

Status
Project [EST soft]
Assignee
  • Jaenoo
Created by
  • Jaenoo

1. 프로젝트 개요

KBO 프로야구 경기 데이터를 기반으로 팀별 미래 승률을 예측하는 머신러닝 모델을 개발하였습니다.
세이버메트릭스(Sabermetrics) 지표와 파생 변수(Feature Engineering)를 결합하여 득점·실점 패턴을 분석하고, 다양한 분류 모델과 앙상블 기법을 통해 높은 예측 정확도를 달성했습니다.

2. 주요 목표

실제 승률 vs 기대 승률 비교 분석
→ 팀 전력 분석 및 운·변수 요인 평가
세이버메트릭스 기반 파생 변수 설계
→ 선수·팀 퍼포먼스의 숨은 패턴 반영
다양한 분류 모델 실험 및 성능 비교
→ Logistic Regression, Random Forest, XGBoost, Stacking Ensemble
하이퍼파라미터 최적화(GridSearchCV)
→ 모델 예측력 향상

3. 데이터 파이프라인

(0) EDA✨

⚾ 야구 데이터 도메인 연구 정리

1. 야구 데이터 구조 파악

📌 타격 (Batting)

개인 지표: AVG, OBP, SLG, OPS, HR, RBI, BB, SO, HBP, SB
팀 지표: 팀 득점, 팀 타율, 득점권 타율 등

📌 투수 (Pitching)

개인 지표: ERA, WHIP, K/9, BB/9, HLD, SV, FIP, WPA, RE24
특수 지표: IR, IS, TBF, LI (Leverage Index)

📌 수비 (Fielding)

기본 지표: E(실책), PO, A, DP
고급 지표: UZR, DRS, RF/9

📌 경기 정보

팀명, 날짜, 홈/원정, 이닝별 점수, 승패 여부 등
🔗 참고

2. 피타고라스 승률 공식의 개념 이해

📌 기본 공식

$$
\frac{R^2}{R^2 + RA^2}
$$
R: 팀의 득점 (Runs Scored)
RA: 팀의 실점 (Runs Allowed)

지수 조정 공식 (Exponent-adjusted version)

$$
\frac{R^\gamma}{R^\gamma + RA^\gamma}
$$
일반적으로 γ ≒1.83 을 사용
팀/리그 특성에 따라 γ를 조정하면 예측 정확도 향상 가능

📌 개념 요약

득점(R), 실점(RA)만으로 기대 승률 예측
실제 성적과 다른 팀의 운 요소 판단 가능
팀 전력 평가나 예측 모델에 활용

📌 참고 문헌

The Bill James Baseball Abstract
The Book: Playing the Percentages in Baseball

3. KBO 리그 순위 기준 구조 및 변수 비교

📌 KBO 리그 순위 결정 방식

공식: 승 / (승 + 패)
승률이 동일한 경우: 승자승 → 상대 전적 비교

📌 피타고라스 승률과의 비교

항목
KBO 기준
피타고라스 기준
기준
실제 경기 결과
득점/실점
운 영향
적음
예측 정확성
제한적
통계적으로 신뢰 가능

📌 분석 활용

기대 승률이 높고 실제 승률이 낮은 팀 → 운이 없었거나 불펜 문제
반대면 운이 좋았거나 클러치 상황 강함

4. 세이버메트릭스 기반 선행 연구 조사

📌 추천 키워드

"Pythagorean expectation baseball"
"KBO league win prediction"
"Sabermetrics machine learning"

📌 주요 연구 예시

Baumer & Matthews (2013) - OpenWAR
Marchi & Albert (2013) - Analyzing Baseball Data with R
국내 예시:
김성훈 외 (2018), KBO 리그 성적에 영향을 미치는 요인 분석, 대한통계학회지

📌 적용 기법

선형 회귀 (득점, 실점 → 승률 예측)
분류 모델 (XGBoost, Random Forest 등)
클러스터링 (공격형/수비형 팀 분류)

첨도, 왜도 확인하기 (skewness, kurtosis)

2023_데이터_왜도_첨도_승팀
2024_데이터_왜도_첨도_승팀
2023_데이터_왜도_첨도_패팀
2024_데이터_왜도_첨도_패팀
승패여부에 따른 각 지표의 분포에 대해서 대충 볼 수 있다.
승팀과 패팀의 첨도 차이가 분명하다.

승 | 패 팀 지표간 우연성 확인 (p-value)

t-stat : 승 | 패 팀 간의 지표는 얼만큼 떨어져있는가?
p-value : 이렇게 우연하게 될 수 있는 확률은?
위의 p-value 분포를 보면 알 수 있듯이 승패와 연관된 지표가 대부분이다.
→ 잘 선택할 필요가 있다. (아니면 추가적인 지표에 대해서 알아볼 필요가 있다.)
p-value, t-stat
2023_p-value_sorted
2024_p-value_sorted
변수 간 분포, 범위 확인
타격/수비 변수와 타겟 변수와 관계가 있다는 것만 파악.

상관관계 (correlation)

히트맵 시각화로 선정한 주요 지표 간 상관관계 파악
공격/득점 관련 지표
'bat_OPS', 'bat_WPA', 'bat_R', 'bat_RE24', 'bat_HR','bat_BB', 'bat_SO', 'bat_HBP', 'bat_LOB', 'bat_GDP', 'bat_GO', 'bat_FO'
수비/투수력 관련 지표
'pit_K', 'pit_BB', 'pit_HR', 'pit_ERA', 'pit_WHIP', 'pit_RE24'
주요 지표간 상관관계 히트맵

(1) 데이터 수집

출처: KBO 기록실, STATIZ
구성: 경기별 box score를 타자/투수/수비 지표로 분리 (승/패/무 포함, 총 9개 파일)
기간: 2023~2024 시즌 전 경기

(2) 데이터 전처리

데이터 통합
특성명 정규화: 예) Rbat_R
홈/원정 구분 변수 추가: home_type
결측치 처리: dropna() + 크롤링 누락 경기 제거
Leakage Feature 제거: 승패 정보가 결과에 직접 반영되는 변수 제외 (e.g. pit_WPA, bat_RBI, pit_ERA 등)

(3) 파생 변수 생성

bat_RC: Runs Created (득점 창출력)
pit_GSC_50: Game Score 50 이상 기록 비율
bat_BB_K: 볼넷/삼진 비율
pit_IS_IR_rate: 불펜 주자 실점 비율
field_error_rate: 수비 에러율
(총 11개 파생 지표 설계)

(4) 다중공선성 검증 (VIF 분석)

Logistic Regression 적용 시 계수 해석 왜곡 방지
VIF < 5 유지, 고상관 변수 제거
2023년도 파생지표, 사용되지 않은 지표 VIF
2024년도 파생지표, 사용되지 않은 지표 VIF (2023과 거의 동일)
그 외

⚾ 연장전 및 악천후 경기 중단 시 영향을 받는 지표 정리

✅ 크게 영향을 받는 지표들 (이닝 수에 따라 민감함)

지표
설명
bat_PA, bat_AB, bat_H, bat_R, bat_HR, bat_RBI, bat_BB, bat_HBP, bat_SO, bat_GO, bat_FO, bat_NP, bat_GDP, bat_LOB
타자의 타석 수 및 결과 지표 (경기 이닝 수에 따라 변동 큼)
pit_TBF, pit_H, pit_R, pit_ER, pit_BB, pit_HBP, pit_K, pit_HR, pit_NP, pit_GO, pit_FO
투수의 상대 타자 수, 피칭 결과 지표 (이닝 수에 따라 민감)
field_PO, field_Ass, field_E, field_cE, field_tE, field_gPO, field_aPO
수비 기회에 따라 누적되는 지표들
pit_GSC, pit_IP
선발 투수의 이닝 소화 및 퍼포먼스 관련 지표 (우천 중단 시 낮아짐, 연장전 시 늘어남)

⚠️ 비율형이지만 분모가 적으면 불안정해지는 지표들

지표
설명
bat_BB_K, bat_BB_PA, bat_LOB_rate
타석 수가 적으면 극단적인 비율이 나올 수 있음
pit_BB_K, pit_IS_IR_rate
투구 수나 주자 상황이 적으면 신뢰도 낮아짐
field_error_rate
실책 1개의 영향이 커짐
pit_ERA, pit_WHIP, bat_AVG, bat_OPS, pit_WPA, pit_RE24, bat_WPA, bat_RE24
비율형이지만 경기량 부족 시 왜곡 가능

🧘 상대적으로 영향이 덜한 지표들 (스케일링 or 맥락 중심)

지표
설명
pit_GSC_50
GSC를 50으로 나눈 지표로, 정규화돼 있으나 이닝 수에 간접 영향
bat_RBI_R_per_PA, bat_RC, pit_LOB%
비율 기반으로 비교적 안정적이나 표본 작으면 주의
pit_LI, bat_LI
상황 중요도 기반 지표 (경기 길이보다 맥락 영향이 큼)

🚨 상황별 특이사항 요약

📌 연장전

투구 수, 타석 수, WPA/RE24 등 누적 지표가 과대평가될 수 있음
선발 외 투수의 기여도/피로도 과도하게 증가 가능

📌 우천 중단/콜드게임

전체 이닝/기회가 줄어들어 비율 지표가 왜곡
타자의 비율 지표(AVG, OPS 등)나 투수의 ERA, WHIP 등은 표본 수 부족으로 신뢰도 하락

✅ 분석 실무 팁

이닝 수 기준 정규화 추천: 예) bat_R per 27 아웃, pit_ER per 9 이닝
비율 중심 지표 위주 분석으로 연장/우천 영향 축소 가능
경기 상황 플래그 추가 (rain_shortened, extra_inning 등)로 구분 분석
RE24, WPA와 같은 맥락 기반 누적 지표 활용도 고려

4. 모델링

적용 모델

Logistic Regression
Random Forest
XGBoost
Stacking Ensemble
→ Base Model: LR, RF, XGB / Meta Model: LR

하이퍼파라미터 튜닝

GridSearchCV로 최적 파라미터 탐색
예시:
LR: C, solver, max_iter
RF: n_estimators, max_depth, min_samples_split, min_samples_leaf
XGB: n_estimators, max_depth, learning_rate, subsample, colsample_bytree

5. 성능 평가

모델
Accuracy
ROC-AUC
비고
Logistic Regression
0.959
0.96↑
기본 해석력 우수
Random Forest
0.946
0.94↑
특성 중요도 분석
XGBoost
0.924
0.92↑
학습 속도·성능 균형
Stacking Ensemble
0.943
0.93↑
과적합 방지, 안정적 성능
Confusion Matrix: 승/패 예측 정확도 및 오분류 패턴 분석
ROC-AUC Curve: 분류 경계값 조정(Threshold=0.3)으로 민감도 향상
confusion matrix (혼동행렬)
Logistic Regression Confusion matrix heatmap
Logistic Regression Confusion matrix
RF_best, threshold = 0.3
best threshold = 0.3
ROC-AUC Curve
Logistic regression ROC-AUC curve
Random Forest ROC-AUC curve

6. 분석 insight

타격 지표(bat_OPS, bat_RC)와 승률 간 높은 양의 상관관계 확인
수비/투수 지표(pit_LOB%, pit_BB_K)는 접전 경기 승률에 직접적 영향
기대 승률과 실제 승률의 괴리가 큰 팀 → 운·불펜 변동성 요인 존재