Daily Data Log

[Day 5] 머신러닝을 활용한 프리미어리그 선수 경기당 득점 예측

parkdongchan 2025. 3. 10. 11:09
728x90
반응형

premier_league_large_stats.csv
0.04MB

📌 개요

이번 포스팅에서는 머신러닝을 활용하여 프리미어리그 선수들의 경기당 득점을 예측하는 모델을 개발해 보겠습니다.

머신러닝의 개념부터 데이터 전처리, 모델 훈련, 성능 평가까지 단계별로 상세하게 설명하여 초보자들도 쉽게 따라할 수 있도록 구성하였습니다.

간단한 설명 이후, 가상의 Data 를 생성하여 직접 실습해보겠습니다!


1️⃣ 머신러닝이란?

머신러닝은 데이터에서 패턴을 학습하여 미래를 예측하는 기술입니다. 지도학습(Supervised Learning), 비지도학습(Unsupervised Learning), 강화학습(Reinforcement Learning) 등의 방법이 있으며, 이번 포스팅에서는 **지도학습(Regression, 회귀분석)**을 사용하여 경기당 득점(Goals per 90)을 예측해 보겠습니다.

🔹 머신러닝의 주요 개념

  • 특성(Feature): 모델이 학습할 수 있도록 제공하는 데이터의 속성 (ex: 슈팅 수, 경기 수, 어시스트) - X값
  • 레이블(Label): 모델이 예측해야 하는 정답값 (ex: 경기당 득점 수) - Y값
  • 훈련 데이터(Train Set): 모델이 학습하는 데이터
  • 테스트 데이터(Test Set): 학습한 모델이 실제로 얼마나 잘 예측하는지 평가하는 데이터

2️⃣ 데이터 로드 및 전처리

먼저 데이터를 로드하고, 머신러닝 모델에 적합하도록 전처리를 수행하겠습니다.

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler

# 데이터 로드
df = pd.read_csv("premier_league_large_stats.csv")

# 필요없는 컬럼 제거
df = df[['Goals per 90', 'Assists', 'Shots', 'Goal Conversion', 'Shot Accuracy']]

# 결측치 확인
df.dropna(inplace=True)

# 훈련 데이터와 테스트 데이터 분할
X = df.drop(columns=['Goals per 90'])  # 입력 변수 (특성)
y = df['Goals per 90']  # 예측할 목표 변수

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

📌 코멘트:

  • Goals per 90을 예측해야 하므로, 이를 y(레이블)로 설정하였습니다.
  • 특성(Feature)으로 Assists, Shots, Goal Conversion, Shot Accuracy를 사용했습니다.
  • 데이터의 크기를 표준화하는 스케일링(Scaling) 기법을 적용하면 모델 성능이 향상될 수 있습니다.

3️⃣ 머신러닝 모델 훈련 및 평가

🔹 선형 회귀(Linear Regression) 모델 학습

from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_absolute_error, mean_squared_error

# 모델 생성 및 훈련
lr_model = LinearRegression()
lr_model.fit(X_train, y_train)

# 예측 수행
y_pred = lr_model.predict(X_test)

# 성능 평가
mae = mean_absolute_error(y_test, y_pred)
mse = mean_squared_error(y_test, y_pred)
rmse = np.sqrt(mse)
print(f"MAE: {mae:.4f}, RMSE: {rmse:.4f}")

📌 결과 예시:

MAE: 0.07, RMSE: 0.10

코멘트:

  • 선형 회귀 모델은 변수 간의 관계가 선형일 때 잘 동작합니다.
  • RMSE(평균 제곱근 오차)가 낮을수록 모델의 예측이 정확하다는 의미입니다.

🔹 랜덤 포레스트(Random Forest) 모델 학습

from sklearn.ensemble import RandomForestRegressor

# 랜덤 포레스트 모델 생성 및 훈련
rf_model = RandomForestRegressor(n_estimators=200, random_state=42)
rf_model.fit(X_train, y_train)

# 예측 수행
y_pred_rf = rf_model.predict(X_test)

# 성능 평가
mae_rf = mean_absolute_error(y_test, y_pred_rf)
mse_rf = mean_squared_error(y_test, y_pred_rf)
rmse_rf = np.sqrt(mse_rf)
print(f"Random Forest - MAE: {mae_rf:.4f}, RMSE: {rmse_rf:.4f}")

📌 결과 예시:

Random Forest - MAE: 0.04, RMSE: 0.07

코멘트:

  • 랜덤 포레스트는 여러 개의 결정 트리를 결합하여 예측력을 높이는 모델입니다.
  • 선형 회귀 모델보다 낮은 RMSE를 보이며, 성능이 더 우수할 수 있습니다.

4️⃣ 모델 성능 비교 및 개선 방안

🔹 모델 성능 비교

모델MAE(평균 절대 오차)RMSE(평균 제곱근 오차)

모델 MAE(평균 절대 오차) RMSE(평균 제곱근 오차)
선형 회귀 0.07 0.10
랜덤 포레스트 0.04 0.07

 

랜덤 포레스트 모델이 더 낮은 RMSE를 보이며, 성능이 더 우수함을 확인할 수 있습니다.

🔹 모델 성능 개선 방법

  1. 더 많은 특성 추가: 선수의 포지션, 출전 시간 등 추가 변수를 포함하면 예측력이 향상될 수 있습니다.
  2. 하이퍼파라미터 튜닝: 랜덤 포레스트의 트리 개수(n_estimators), 최대 깊이(max_depth) 등을 최적화하면 성능을 개선할 수 있습니다.
  3. 다른 모델 실험: XGBoost, LightGBM 같은 모델을 테스트하여 비교할 수 있습니다.

📌 마무리

이번 포스팅에서는 프리미어리그 선수들의 경기당 득점을 예측하는 머신러닝 모델을 구축했습니다.

  • 선형 회귀 모델과 랜덤 포레스트 모델을 비교하며 성능을 분석했습니다.
  • 랜덤 포레스트 모델이 더 좋은 성능을 보였으며, 모델 개선 방안을 제시했습니다.

다음 포스팅에서는 하이퍼파라미터 튜닝을 통한 모델 최적화를 진행하겠습니다! 🚀

728x90
반응형