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

![Image](https://upload.cafenono.com/image/slashpagePost/20260116/180646_qeeLI9uVEP8jnLqvEG?q=80&s=1280x180&t=outside&f=webp)

### Data & Code : [https://github.com/yandusty/Wassup-AI-Project-WPB](https://github.com/yandusty/Wassup-AI-Project-WPB)

# 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`

### 📌 경기 정보

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

> 🔗 참고

- KBO 기록실: [http://www.koreabaseball.com/Record](http://www.koreabaseball.com/Record), [STATIZ](https://statiz.sporki.com/)

- MLB 데이터: [https://www.fangraphs.com](https://www.fangraphs.com/), [https://baseballsavant.mlb.com](https://baseballsavant.mlb.com/)

---

### 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)

![Image](https://upload.cafenono.com/image/slashpagePost/20260116/180827_cbzMSYjgVGCvXtccEE?q=80&s=1280x180&t=outside&f=webp)

2023_데이터_왜도_첨도_승팀

![Image](https://upload.cafenono.com/image/slashpagePost/20260116/180847_apOnL8IQYLYGGKjgW9?q=80&s=1280x180&t=outside&f=webp)

2024_데이터_왜도_첨도_승팀

![Image](https://upload.cafenono.com/image/slashpagePost/20260116/180852_9gQ3Q2YOyIGqW5rt92?q=80&s=1280x180&t=outside&f=webp)

2023_데이터_왜도_첨도_패팀

![Image](https://upload.cafenono.com/image/slashpagePost/20260116/180859_d2ND7WbNdAzGfm1Uls?q=80&s=1280x180&t=outside&f=webp)

2024_데이터_왜도_첨도_패팀

- 승패여부에 따른 각 지표의 분포에 대해서 대충 볼 수 있다.

- 승팀과 패팀의 첨도 차이가 분명하다.

- 

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

- t-stat : 승 | 패 팀 간의 지표는 얼만큼 떨어져있는가?

- p-value : 이렇게 우연하게 될 수 있는 확률은?

- 위의 p-value 분포를 보면 알 수 있듯이 승패와 연관된 지표가 대부분이다. 
- → 잘 선택할 필요가 있다. (아니면 추가적인 지표에 대해서 알아볼 필요가 있다.)

- p-value, t-stat

![Image](https://upload.cafenono.com/image/slashpagePost/20260116/180912_EALyOzyitEhUsBgJXE?q=80&s=1280x180&t=outside&f=webp)

-   2023_p-value_sorted

![Image](https://upload.cafenono.com/image/slashpagePost/20260116/180919_LdYMKlBBLXjX2hYsQA?q=80&s=1280x180&t=outside&f=webp)

2024_p-value_sorted

- 변수 간 분포, 범위 확인

- 타격/수비 변수와 타겟 변수와 관계가 있다는 것만 파악.

### 상관관계 (correlation)

- 히트맵 시각화로 선정한 주요 지표 간 상관관계 파악

    - 공격/득점 관련 지표

```javascript
'bat_OPS', 'bat_WPA', 'bat_R', 'bat_RE24', 'bat_HR','bat_BB',
'bat_SO', 'bat_HBP', 'bat_LOB', 'bat_GDP', 'bat_GO', 'bat_FO'
```

    - 수비/투수력 관련 지표

```javascript
'pit_K', 'pit_BB', 'pit_HR', 'pit_ERA', 'pit_WHIP', 'pit_RE24'
```

    - 주요 지표간 상관관계 히트맵

![Image](https://upload.cafenono.com/image/slashpagePost/20260116/180927_a8C7gCfy6CpfOgUZCG?q=80&s=1280x180&t=outside&f=webp)

---

### (1) 데이터 수집

- **출처**: KBO 기록실, STATIZ

- **구성**: 경기별 box score를 타자/투수/수비 지표로 분리 (승/패/무 포함, 총 9개 파일)

- **기간**: 2023~2024 시즌 전 경기

### (2) 데이터 전처리

- 데이터 통합

[Code](https://www.notion.so/Code-24d7c3909404803bb016d3d5b925a86a?pvs=21) 

- **특성명 정규화**: 예) `R` → `bat_R`

[Code](https://www.notion.so/Code-24d7c390940481e3baacee3c21685488?pvs=21) 

- **홈/원정 구분 변수 추가**: `home_type`

[Code](https://www.notion.so/Code-24d7c390940481979953c2a7d338e3ff?pvs=21) 

- **결측치 처리**: `dropna()` + 크롤링 누락 경기 제거

- **Leakage Feature 제거**: 승패 정보가 결과에 직접 반영되는 변수 제외 (e.g. `pit_WPA`, `bat_RBI`, `pit_ERA` 등)

### (3) 파생 변수 생성

[Code](https://www.notion.so/Code-24d7c390940480f4a813d71d143aaed3?pvs=21) 

[Code](https://www.notion.so/Code-24d7c390940480fb8f4cfcbed357a631?pvs=21) 

- **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** 유지, 고상관 변수 제거

![Image](https://upload.cafenono.com/image/slashpagePost/20260116/180957_1XKpQUDgQvbIatALHB?q=80&s=1280x180&t=outside&f=webp)

2023년도 파생지표, 사용되지 않은 지표 VIF

![Image](https://upload.cafenono.com/image/slashpagePost/20260116/181007_ikuoFi8dgREjnkTNdW?q=80&s=1280x180&t=outside&f=webp)

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 (혼동행렬)

![Image](https://upload.cafenono.com/image/slashpagePost/20260116/181126_x2QC0OV8GEkJVFDucx?q=80&s=1280x180&t=outside&f=webp)

Logistic Regression Confusion matrix heatmap

![Image](https://upload.cafenono.com/image/slashpagePost/20260116/181143_RM7kvEow8QxU9LT5r8?q=80&s=1280x180&t=outside&f=webp)

Logistic Regression Confusion matrix

![Image](https://upload.cafenono.com/image/slashpagePost/20260116/181150_AZLF9IiT8uyWsXSa2I?q=80&s=1280x180&t=outside&f=webp)

RF_best, threshold = 0.3

![Image](https://upload.cafenono.com/image/slashpagePost/20260116/181158_Cgomouh3cOffiEF6c8?q=80&s=1280x180&t=outside&f=webp)

best threshold = 0.3

- ROC-AUC Curve

![Image](https://upload.cafenono.com/image/slashpagePost/20260116/181205_rRGnowGVCbtOox9jVj?q=80&s=1280x180&t=outside&f=webp)

Logistic regression ROC-AUC curve

![Image](https://upload.cafenono.com/image/slashpagePost/20260116/181212_293wu05LVcXk9ohO7I?q=80&s=1280x180&t=outside&f=webp)

Random Forest ROC-AUC curve

# 6. 분석 insight

- **타격 지표**(bat_OPS, bat_RC)와 승률 간 높은 양의 상관관계 확인

- **수비/투수 지표**(pit_LOB%, pit_BB_K)는 접전 경기 승률에 직접적 영향

- 기대 승률과 실제 승률의 괴리가 큰 팀 → 운·불펜 변동성 요인 존재

For the site tree, see the [root Markdown](https://slashpage.com/sonbo.md).
