각종 스포츠/KBO

스탯티즈) 투수 스탯 중 상관 관계가 높은 스탯들은?

강청색 2024. 3. 16. 22:39

타자 편  - https://undefined00.tistory.com/43

타자 편에 이어서

스탯티즈를 분석해서 글을 써보고자 한다.

import pandas as pd

url = "http://www.statiz.co.kr/stat.php?opt=0&sopt=0&re=1&ys=1982&ye=2023&se=0&te=&tm=&ty=0&qu=auto&po=0&as=&ae=&hi=&un=&pl=&da=1&o1=WAR&o2=OutCount&de=1&lr=1&tr=&cv=&ml=1&sn=30&si=&cn="
tables = pd.read_html(url)
print(len(tables),"개의 테이블이 있습니다")
df_list = pd.read_html(url)
df = df_list[0]
df

이런 식으로 투수가 나온다.

# 두 번째 레벨의 컬럼명만 선택하여 사용
df.columns = df.columns.get_level_values(2)
#30번째 행 다 삭제 진행
index_of_column_30 = 30
df = df.iloc[:, :index_of_column_30 + 1]  
df

정렬을 진행하면  411 rows × 31 columns의 항목이 뜨게 된다.

# df 이름 항목에서 이름이 있는 행 제거
df = df[~df['이름'].str.contains('이름')]
#다음 해당하는 컬럼 삭제
columns_to_drop = ['순', '2타', '3타','WAR']
df = df.drop(columns=columns_to_drop)
df.info()
# 팀 이름을 제외한 나머지 열은 int로 변환
int_columns = df.columns.difference(['이름','이닝', 'ERA', 'FIP', 'WHIP', 'ERA+','FIP+'])
df[int_columns] = df[int_columns].astype(int)
float_columns = ['이닝', 'ERA', 'FIP', 'WHIP', 'ERA+','FIP+']
df[float_columns] = df[float_columns].astype(float)
df.info()

 

우선적으로 실점과 상관이 있는 스탯들은 무엇이 있는지 궁금해서 시각화를 진행하게 되었다.

# 2번쨰 컬럼부터 진행(object 제거)
df = df.iloc[:,1:]
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

# 폰트 설정
plt.rc('font', family='Malgun Gothic')

# 선택한 항목들
selected_columns = ['승', '패', '세', '이닝', '자책', '안타', '홈런', '볼넷', '삼진', 'ERA', 'FIP', 'WHIP', 'ERA+', 'FIP+', '홀드', '타자']

# 색상 설정
colors = ['red', 'orange', 'yellow', 'green', 'blue', 'purple', 'brown', 'pink', 'gray', 'cyan', 'magenta', 'lime', 'teal', 'lavender', 'coral', 'lightblue']

# 4행 4열의 그리드 생성
fig, axs = plt.subplots(nrows=4, ncols=4, figsize=(10, 10))

# 각 항목을 그리드에 순서대로 표시
for i, column in enumerate(selected_columns):
    row = i // 4  # 현재 항목의 행 인덱스
    col = i % 4   # 현재 항목의 열 인덱스
    sns.scatterplot(x='실점', y=column, data=df, color=colors[i], ax=axs[row, col])
    axs[row, col].set_xlabel('실점')
    axs[row, col].set_ylabel(column)
    axs[row, col].grid(True)

# 그리드 간의 간격 조절
plt.tight_layout()
plt.show()

실점과 가장 연관이 있는 스탯은 자책, ERA가 높은 것으로 나타났다.

타자와 마찬가지로 실점에 대해 히트맵을 진행했다.

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

# 득점과 다른 열 간의 상관관계만 추출
corr_with_score = df.corr()['실점'].drop('실점')

# 상관관계 크기를 기준으로 내림차순 정렬
sorted_corr = corr_with_score.sort_values(ascending=False)

# 폰트 설정
plt.rc('font', family='Malgun Gothic')

# 히트맵 생성
plt.figure(figsize=(4, 7))
sns.heatmap(pd.DataFrame(sorted_corr), annot=True, cmap='coolwarm', fmt=".2f", cbar=False)
plt.title('Correlation Heatmap with 실점')
plt.show()

가장 높은 연관 스탯은 자책, 안타, ERA, FIP, 타자로 나타났으며, 음의 상관관계에 있는 완투, 완봉, 팀, ERA+, FIP+로 나타났다. 완투, 완봉을 한다고 실점을 낮출 수는 있어도 연관은 없나 보다.

다른 스탯들을 추가(삼진, 승, 패, ERA) 해보았다.

이 중에서 팀은 연도를 말하기 때문에 빼고 선정했다.

삼진 - 양의 상관관계 : 이닝, 선발, 타자, 출장, 폭투 / 음의 상관관계 : 완투, 완봉, 보크, 고4, FIP

승- 양의 상관관계 : 세, ERA+, 삼진, 이닝, FIP+ / 음의 상관관계 : 패, 완투, WHIP, ERA, 완봉

패 - 양의 상관관계 : 실점, 자책, ERA, WHIP, 안타 / 음의 상관관계 : ERA+, FIP+, 승, 완봉, 완투, 세

ERA - 양의 상관관계 : 실점, 자책, FIP, WHIP, 홈런 / 음의 상관관계 : ERA+, 완봉, FIP+, 완투, 승

로 나타났다.

양의 상관관계에서는 공통적으로 들어있는 것은 거의 없었으나 음의 상관관계에서는 완투, 완봉이 공통적으로 들어가 있었다.

 

결론

실점과 연관 있는 스탯은 자책, 안타, ERA, FIP, 타자로 나타났다.

추가로 조사한 항목(삼진, 승, 패, ERA)에선 완투와 완봉이 큰 영향이 없는 것으로 나타났다.

애초에 완투 완봉이 적기도 하고 완투, 완봉을 하더라도 선발이 8~9이닝을 먹고 이런 게 기본으로 깔려있다 보니 나타난 거 아닐까 싶다.