AI

MLB 투수 데이터 분석

백진암 2024. 6. 12. 11:52

야구를 보다가 생각이 들었다.

볼넷을 많이 던지는 선수는 못하는 투수일까?

전략적으로 볼넷을 던지는 경우도 있지만, 제구력이 부족해서 못던지는 경우도 있다.

 

그외에도

투수들의 전성기는 보통 몇세 쯤일까?

 

가 궁금했다.

데이터 가져오기

https://www.baseball-reference.com/leagues/majors/2023-standard-pitching.shtml

 

2023 Major League Baseball Standard Pitching | Baseball-Reference.com

Check out the standard pitching stats for all the Major League Baseball teams and players on Baseball-Reference.com

www.baseball-reference.com

2023년 메이저리그 투수들의 데이터를 G(게임플레이 수)를 기준으로 정렬해서 500명의 데이터를 가져왔다.

Google Colab에서 다운 받은 엑셀 파일을 업로드 해서 데이터를 출력해봤다.

import pandas as pd

file_path = '/content/mlb.xls'
df = pd.read_excel(file_path)

df = df[(df['G']) > 40]

print(df.head())

G(게임플레이 수)로 정렬을 했음에도 너무 플레이 수가 적은 선수들이 있어 40판 이상인 168명의 선수들의 데이터만 모아서 분석해 보겠다.

볼넷을 많이 던지는 선수들은 못하는 투수일까?

분석을 위해 볼넷 비율을 다른 값들과 비교를 해보기로 헀다.

투수들의 실력을 판가름 할 수 있는 값들을 생각해봤을 때

크게 평균자책점, 승률, 안타율, 삼진율을 꼽아봤다.

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

df_filtered = df[['Name','BB9','W-L%','ERA','SO9','H9']]

plt.figure(figsize=(14, 10))

# 볼넷과 승률
plt.subplot(2, 2, 1)
sns.scatterplot(data=df_filtered, x='BB9', y='W-L%')
sns.regplot(data=df_filtered, x='BB9', y='W-L%', scatter=False, color='red')
plt.xlabel('BB9 (Walks per 9 Innings)')
plt.ylabel('Winning Percentage')
plt.title('BB9 vs Winning Percentage')
plt.grid(True)

# 볼넷과 평균자책점
plt.subplot(2, 2, 2)
sns.scatterplot(data=df_filtered, x='BB9', y='ERA')
sns.regplot(data=df_filtered, x='BB9', y='ERA', scatter=False, color='red')
plt.xlabel('BB9 (Walks per 9 Innings)')
plt.ylabel('ERA (Earned Run Average)')
plt.title('BB9 vs ERA')
plt.grid(True)

# 볼넷과 삼진
plt.subplot(2, 2, 3)
sns.scatterplot(data=df_filtered, x='BB9', y='SO9')
sns.regplot(data=df_filtered, x='BB9', y='SO9', scatter=False, color='red')
plt.xlabel('BB9 (Walks per 9 Innings)')
plt.ylabel('SO9 (Strikeouts per 9 Innings)')
plt.title('BB9 vs SO9')
plt.grid(True)

# 볼넷과 안타
plt.subplot(2, 2, 4)
sns.scatterplot(data=df_filtered, x='BB9', y='H9')
sns.regplot(data=df_filtered, x='BB9', y='H9', scatter=False, color='red')
plt.xlabel('BB9 (Walks per 9 Innings)')
plt.ylabel('H9 (Hits per 9 Innings)')
plt.title('BB9 vs H9')
plt.grid(True)

plt.tight_layout()
plt.show()

 

승률과의 비교에서는 큰 차이를 보이지 않았다.

하지만 볼넷이 많으면 평균자책점이 높은 것을 알 수 있다.

안타가 많으면 볼넷은 적었고, 삼진이 많으면 볼넷 비율은 적었다.

 

볼넷이 평균자책점과 비교를 했을 때 정비례 한 것 만으로도 볼넷을 많이 던지는 선수는 잘하는 선수가 아니라는 것을 알 수 있다.

볼넷을 의도적으로 던지는 것보다 제구력이 부족해 볼넷을 많이 던진다고 유추해볼 수도 있을 것 같다.

투수들의 전성기는 몇 살?

이번에도 비슷하게

평균자책점이 낮은 선수 20명,

승률이 높은 선수 20명,

삼진율이 높은 선수 20명

을 뽑아서 평균을 구해보고 그 평균의 평균도 구해보자

import pandas as pd

# 필요한 열만 선택 (Name: 선수 이름, Age: 나이, W-L%: 승률, ERA: 평균자책점, SO9: 삼진)
df_filtered = df[['Name', 'Age', 'W-L%', 'ERA', 'SO9']]

# 각 성적 지표에 따라 상위 20명 찾기
top_20_win_percentage = df_filtered.nlargest(20, 'W-L%')
top_20_era = df_filtered.nsmallest(20, 'ERA')
top_20_strikeouts = df_filtered.nlargest(20, 'SO9')

# 상위 20명의 평균 나이 계산
average_age_win_percentage = top_20_win_percentage['Age'].mean()
average_age_era = top_20_era['Age'].mean()
average_age_strikeouts = top_20_strikeouts['Age'].mean()

print(f"상위 20명의 평균 나이 (승률 상위): {average_age_win_percentage:.2f}세")
print(f"상위 20명의 평균 나이 (평균자책점 상위): {average_age_era:.2f}세")
print(f"상위 20명의 평균 나이 (삼진 상위): {average_age_strikeouts:.2f}세")

average_age_total = (average_age_win_percentage + average_age_era + average_age_strikeouts) / 3
print(f"상위 20명의 평균 나이 (전체 평균): {average_age_total:.2f}세")

29.6세가 평균으로 나왔다.

조금 더 어릴 것 같았는데 생각보다 높았다.

 

투수들의 전성기는 30살쯤인 것 같다.