야구 분석/Python

타율이 높은 선수는 홈런도 많이 칠까? 2023 시즌 데이터로 본 상관관계

sam_j_s 2024. 5. 25. 18:08
728x90
반응형

시각화 주제

KBO를 보다가 MLB를 보게 되면 신기한 장면들을 많이 볼 수 있습니다. 투수들은 100마일이 넘는 강속구를 던지고 타자들은 그 공을 잘 쳐내는 모습들을 볼 수 있습니다. 또한, 2할이 채 되지 않는 타자인데 출루율은 4할이 넘거나 홈런을 30개 이상씩 치며 KBO만 본 사람한테는 이해할 수 없는 지표를 기록하는 선수들이 많이 나옵니다. 그래서 한국 야구처럼 타율이 높은 선수는 홈런도 많이 치는지 궁금해져 23 시즌 메이저리그 선수들의 홈런과 타율의 상관관계를 보도록 하겠습니다.

 

 데이터 출처

메이저리그에서 제공하는 공식 API인 MLB Stats API를 이용하였습니다. 이 API를 통해 실시간 경기 결과, 선수 통계, 팀 정보, 시즌 데이터, 경기 일정 등 다양한 데이터를 가져올 수 있습니다.

 

데이터 분석

패키지 임포트

import statsapi
import pandas as pd
import plotly.express as px
import plotly.graph_objects as go
from scipy.stats import pearsonr

 

 

홈런 데이터 불러오기

홈런 데이터의 구조가 어떻게 생겼는지 확인해보겠습니다.

# 2023 시즌의 홈런 리더 데이터를 가져오기
season = 2023
leaders = statsapi.league_leader_data('homeRuns', season=season)

# 데이터 구조 확인
for player in leaders:
    print(player)
    break

 

그럼 이제 홈런 상위 100명의 선수들을 출력해 주겠습니다.

import statsapi
import pandas as pd

# 2023 시즌의 홈런 리더 데이터를 가져오기
season = 2023
leaders = statsapi.league_leader_data('homeRuns', season=season, limit=100)

# 홈런 데이터를 저장할 리스트
hr_data = []
for player in leaders:
    hr_data.append({
        'Rank': player[0],
        'Player': player[1],
        'Team': player[2],
        'HomeRuns': player[3]
    })

# 데이터프레임으로 변환
df_hr = pd.DataFrame(hr_data)

# 데이터프레임 출력
df_hr

20 홈런으로 92등에 있는 선수들이 많아 102명의 선수들이 출력된 것을 알 수 있습니다.

 

타율 데이터 불러오기

홈런과 똑같이 구조를 확인하고 100명의 선수의 데이터를 가져오겠습니다.

# 2023 시즌의 타율 리더 데이터를 가져오기
season = 2023
leaders = statsapi.league_leader_data('battingAverage', season=season)

# 데이터 구조 확인
for player in leaders:
    print(player)
    break

 

# 2023 시즌의 타율 리더 데이터를 가져오기
batting_average_leaders = statsapi.league_leader_data('battingAverage', season=season, limit=100)

# 타율 데이터를 저장할 리스트
ba_data = []
for player in batting_average_leaders:
    ba_data.append({
        'Rank': player[0],
        'Player': player[1],
        'Team': player[2],
        'BattingAverage': player[3]
    })

# 타율 데이터프레임으로 변환
df_ba = pd.DataFrame(ba_data)

# 데이터프레임 출력
df_ba

홈런과 달리 딱 100명의 선수만 나온 것을 알 수 있습니다.

 

홈런과 타율 데이터 합치기

홈런과 타율의 상관관계를 보기 위해 두 개의 데이터를 합쳐주겠습니다.

# 홈런 데이터프레임과 타율 데이터프레임 병합
df_combined = pd.merge(df_hr, df_ba, on=['Player', 'Team'])

# 숫자형 데이터로 변환
df_combined['HomeRuns'] = pd.to_numeric(df_combined['HomeRuns'])
df_combined['BattingAverage'] = pd.to_numeric(df_combined['BattingAverage'])

#데이터 프레임 출력
df_combined

홈런 상위 100명과 타율 상위 100명의 선수들의 데이터를 합쳤을 때 61명의 선수만 나오는 것을 알 수 있습니다.

 

상관관계 확인하기

합친 데이터로 상관관계를 확인해 보도록 하겠습니다.

# 산점도 시각화
fig = px.scatter(df_combined, x='BattingAverage', y='HomeRuns', text='Player', title='Home Runs vs Batting Average (2023 Season)')
fig.update_traces(textposition='top center')

# 그래프 출력
fig.show()

 

산점도 그래프만으로는 제대로 상관관계를 확인할 수 없어 상관관계 선을 그려주고 상관관계의 값도 출력해 주겠습니다.

 

# 상관계수 계산
correlation, _ = pearsonr(df_combined['BattingAverage'], df_combined['HomeRuns'])

# 산점도 시각화
fig = px.scatter(df_combined, x='BattingAverage', y='HomeRuns', text='Player', title=f'Home Runs vs Batting Average (2023 Season) - Correlation: {correlation:.2f}')
fig.update_traces(textposition='top center')

# 상관관계 선 추가
fig.add_trace(
    go.Scatter(
        x=df_combined['BattingAverage'],
        y=df_combined['BattingAverage'] * df_combined['HomeRuns'].mean() / df_combined['BattingAverage'].mean(),
        mode='lines',
        name='Trend Line'
    )
)

# 그래프 출력
fig.show()

 

상관관계가 0.26으로 약하게 나타나는 것을 알 수 있습니다. 약간의 관계는 존재하지만 강력하지는 않아서 타율이 높다고 해서 반드시 홈런 수가 많지 않고 홈런 수가 많다고 해서 반드시 타율이 높은 것을 아니라고 볼 수 있습니다.

반응형

'야구 분석/Python'의 다른글

  • 현재글 타율이 높은 선수는 홈런도 많이 칠까? 2023 시즌 데이터로 본 상관관계

관련글