*검정 주제: 프로야구에서 장타율에 따른 승률 분석
1. 데이터 불러오기(경기데이터.xlsx)
import pandas as pd
#데이터불러오기
data = pd.read_excel("경기데이터.xlsx", sheet_name = "프로야구")
data.head()

2. 장타율 범주화
* 장타율 데이터를 범주화 시키는 이유는, ANOVA 검정 자체가 연속형 변수와 범주형 변수 사이의 관계를 분석하기 위한 방법인데
장타율(연속형) 승률(연속형)
두 변수 모두 연속형이기 때문에 장타율을 범주형 변수로 바꿔주기 위함!
** ANOVA 분석예시) 1,2,3반의 수학 점수 비교 / 귀무가설: 세 반의 평균점수가 같다.
import numpy as np
#장타율을 범주화 시키기
data['장타율_zscore'] = (data['장타율'] - data['장타율'].mean()) / data['장타율'].std()
# 조건 설정
conditions = [
data['장타율_zscore'] > 0.5,
(data['장타율_zscore'] >= -0.5) & (data['장타율_zscore'] <= 0.5),
data['장타율_zscore'] < -0.5
]
# 각 조건에 해당하는 값
choices = [1, 2, 3]
# numpy.select 함수를 사용하여 새로운 변수 생성
data['장타율_zscore_category'] = np.select(conditions, choices)
data.head()
*위의 코드를 qcut함수를 통해 한 줄로 ⤵️
#ver 2 장타율 범주화 (3개의 범주로 나눔)
data['장타율_category'] = pd.qcut(data['장타율'], q=3, labels=[1, 2, 3])

3. 등분산성 검증
from scipy import stats
result = stats.levene(data.승률[data.장타율_zscore_category == 1],
data.승률[data.장타율_zscore_category == 2],
data.승률[data.장타율_zscore_category == 3])
print('LeveneResult(F) : %.3f \np-value : %.3f' % (result))
#p-value가 0.05 이상이므로 등분산성 만족

4. ANOVA 검정
from statsmodels.formula.api import ols
from statsmodels.stats.anova import anova_lm
model = ols('승률 ~ C(장타율_zscore_category)', data).fit()
anova_lm(model)
#PR값이 0.05 보다 작으면 차이가 있다 -> 사후검증 진행

*ANOVA 검정 결과, 세 집단 간 유의한 차이가 있다고 나타나면 사후검증 진행
** 사후검증이란? 세 집단 중 어떤 집단 간에 차이가 있는지 추가적으로 살펴보는 분석법
5. 사후검정(*보편적으로 많이 사용하는 Tukey방식 사용)
from statsmodels.stats.multicomp import pairwise_tukeyhsd
hsd = pairwise_tukeyhsd(data['승률'], data['장타율_zscore_category'], alpha=0.05)
print(hsd)
#reject가 True 일 때만 차이가 있다는 뜻

*Tukey HSD 사후검증 결과 1그룹(M=0.530)이 3그룹(M=0.475)보다 승률이 더 높은 것으로 나타남
6. 기술통계량 구하기
#기술통계량 구하기
round(data.groupby('장타율_zscore_category').describe()['승률'],3)


반응형