tak's data blog

분산분석(ANOVA) - 피파4 공식경기등급에 따른 패스스탯차이 본문

통계 관련

분산분석(ANOVA) - 피파4 공식경기등급에 따른 패스스탯차이

hyuntaek 2022. 10. 4. 22:38
반응형
SMALL

 

지난시간 카이제곱 검정 포스팅을 이후로 통계분석 포스팅을 또 진행하겠습니다. 

 

이번에는 분산분석에 대해 다뤄보도록 하겠습니다.

 

분산분석

정의: 분산분석이란 서로 다른 그룹(3개 이상)의 평균에서 분산값을 비교하는 데 사용되는 통계 공식입니다.

 서로 다른 그룹의 평균간에 차이가 있는지 확인하는 방법.

 

집단간분산/집단내분산 기반의 F분포를 활용함

 

만약 집단내분산이 크다면 집단간 평균차이를 확인하는 것이 어렵다. 분산분석에서는 집단간의 분산의 동질성을 가정하고 하기 때문에 만약 분산의 차이가 크다면 그 차이를 유발한 변인을 찾아 제거해야 한다. 그렇지 못하면 분산분석의 신뢰도는 나빠진다.

 

분산분석을 위해서는 아래와 같은 가정이 필요합니다.

1. 정규성

2. 분산의 동질성

3. 독립성

 

분산분석의 종류

1. 일원분산분석(one-way ANOVA)

종속변인이 1개이며, 독립변인의 집단도 1개인 경우이다. 분산분석에서는 독립변인을 요인으로 표현한다.

예) 피파온라인4 공식 경기 등급(월드클래스, 세미프로 등)에 따라 패스 스텟의 차이 비교.

등급은 독립변인이고 집단이 2개 이상이므로 사후분석 실시.

종속변인은 패스 스텟이다.

 

2. 이원분산분석(two-way ANOVA)

독립변인의 수가 2개 이상일 때 집단 간 차이가 유의한지를 검증하는 데 사용.

예) controller(키보드, 패드), 공식경기 등급(월드클래스, 세미프로 등)에 따른 패스 스텟의 차이를 분석한다면 이 때 controller, 공식경기 등급은 독립변인이고 종속변인은 패스 스텟이 된다.

이원분산분석은 주효과와 상호작용효과를 분석할 수 있다. 주효과는 controller(a), 공식경기등급(b)이라면 상호작용효과는 이를 곱한 a*b이다.

 

3. 다원변량분산분석(MANOVA)

단순한 분산분석을 확장하여 2개 이상의 종속변인이 서로 관계된 상황에 적용시킨 것이다. 둘 이상의 집단간 차이를 검증 할 수 있다.

 

4. 공분산분석(ANCOVA)

다원변량분산분석에서 특정한 독립변인에 초점을 맞추고 다른 독립변인은 통제변수로 하여 분석하는 방법이다. 특정한 사항을 제한하여 분산분석을 하는 것이다.

 

추가검사

샘플집단간의 분석에서 샘플간의 값의 차이가 어떠한 영향을 결과적으로 보여주는지 추가적으로 검사할 필요가 분산분석에서는 더 요구된다. 사후검사 또는 다중비교라고도 하는 추가검사에는 본페로니 교정, 세페 방법, 투키 HSD등이 있다.

 

분산분석의 설명은 이정도로하고 실제 데이터를 가지고 실행하는 과정을 가지겠습니다.

 

 

 

일원분산분석(one-way ANOVA)

프로 = nextfield7[(nextfield7['division'] >= 2300)&(nextfield7['division'] <= 2500)]
월드클래스 = nextfield7[(nextfield7['division'] >= 2000)&(nextfield7['division'] <= 2200)]
챌린지 = nextfield7[(nextfield7['division'] >= 1100)&(nextfield7['division'] <= 1300)]

division = pd.concat([프로, 월드클래스, 챌린지])
division['공경등급'] = " "

division.loc[(division['division'] >= 2300)&(division['division'] <= 2500) , '공경등급'] ='프로'
division.loc[(division['division'] >= 2000)&(division['division'] <= 2200) , '공경등급'] ='월드클래스'
division.loc[(division['division'] >= 1100)&(division['division'] <= 1300) , '공경등급'] ='챌린지'

api를 통해 수집된 피파온라인4 데이터를 공식경기등급에 따라 다음과 같이 나누었습니다.

 

각각의 공식경기등급(3가지 집단)에 따라 패스스텟(passSuccess)를 종속변인으로 두고 분산분석을 실시하도록 하겠습니다.

 

 

 

정규성 검정

sns.displot(data= division, x= 'passSuccess', hue='공경등급')

sns.boxplot(x="공경등급", y='passSuccess', data=division)

- 우선 그룹간의 분포가 다음과 같고

- 그룹간 패스 성공횟수에서 큰 차이를 보이고 있진 않습니다.

 

 

kolmogorov-smirnov test

import scipy.stats as stats

stats.kstest(division[division['공경등급'] == '프로'].passSuccess, 'norm')
## KstestResult(statistic=0.968421052631579, pvalue=1.5366798180799805e-285)

stats.kstest(division[division['공경등급'] == '월드클래스'].passSuccess, 'norm')
## KstestResult(statistic=0.9967637540453075, pvalue=0.0)

stats.kstest(division[division['공경등급'] == '챌린지'].passSuccess, 'norm')
## KstestResult(statistic=1.0, pvalue=0.0)

정규성 검정을 위해서는

kolmogorov-smirnov 방법과 shapiro-wilk 방법이 존재합니다.

각각 표본이 50개 이상일 때 전자/ 50개 미만일 때 후자를 가정합니다.

집단별로 표본이 충분하다고 생각하여 kolmogorov-smirnov 방법을 사용하였습니다.

 

결과적으로 3가지 집단 모두 p값이 유의수준 0.05보다 작아 귀무가설을 기각해 정규성을 가지지 않는다고 판단할 수 있겠습니다.

하지만 분산분석의 경우 정규성을 만족해야 했는데 위와 같이 만족하지 않는 경우에는

 

비모수적 방법인 kruskal wallis test를 사용합니다.

이는 표본의 중위수가 같은지를 검정하여 그룹들이 같은지 판단하게 됩니다. 데이터 표본들의 순위를 매기고, 그 순위 값을 이용한 공식을 통해 검정합니다.

 

 

 

 kruskal wallis test

stats.kruskal(division[division['공경등급'] == '프로'].passSuccess,
             division[division['공경등급'] == '월드클래스'].passSuccess,
             division[division['공경등급'] == '챌린지'].passSuccess)
             
## KruskalResult(statistic=17.628166290260626, pvalue=0.00014862515721902878)

위의 검정결과 p값이 유의수준 0.05보다 작으므로 공식경기등급에 따라 패스성공횟수가 통계적으로 유의한 차이가 있다고 해석할 수 있겠습니다.

 

 

 

등분산 검정

stats.levene(division[division['공경등급'] == '프로'].passSuccess,
             division[division['공경등급'] == '월드클래스'].passSuccess,
             division[division['공경등급'] == '챌린지'].passSuccess)
## LeveneResult(statistic=1.1385558507389733, pvalue=0.32069896631864253)

등분산 검정은 데이터의 분포가 정규성을 따르면 bartlett's 검정 / 그렇지 않다면 levene 검정을 활용합니다.

위에서 정규성을 만족하지 못했으므로 등분산 검정은 levene 검정을 활용하였습니다.

p값이 0.05보다 크므로 귀무가설 채택 즉, 세 집단간의 등분산성을 가정할 수 있습니다.

 

 

 

독립성 검정

표본은 랜덤 추출되었으므로 독립성을 가정할 수 있습니다.

 

 

 

일원배치 분산분석

F_statistic, pVal = stats.f_oneway(division[division['공경등급'] == '프로'].passSuccess,
             division[division['공경등급'] == '월드클래스'].passSuccess,
             division[division['공경등급'] == '챌린지'].passSuccess)

print('ANOVA 결과: F={0:.1f}, p={1:.5f}'.format(F_statistic, pVal))
if pVal < 0.05:
    print('P-value가 충분히 작기 때문에 그룹 평균값이 통계적으로 유의하게 차이난다.')
    
ANOVA 결과: F=11.5, p=0.00001
P-value가 충분히 작기 때문에 그룹 평균값이 통계적으로 유의하게 차이난다.

위와 같은 결론을 내릴 수 있었습니다.

3가지 집단(프로, 월드클래스, 챌린지 등급)에 따라 패스스텟의 차이가 있다는 결론을 내렸습니다.

 

 

 

사후검정

그리고 비모수적 분산분석에서는 t검정 비모수 방법인 Mann Whiteny U-test를 통하여 각각 2개의 그룹으로 나누어 계산하면 된다라고 공부할 수 있었습니다.

Mann-Whiteny U-test

from scipy.stats import mannwhitneyu

mannwhitneyu(division[division['공경등급'] == '프로'].passSuccess,
             division[division['공경등급'] == '월드클래스'].passSuccess)
## MannwhitneyuResult(statistic=51207.5, pvalue=0.003829126995677661)


mannwhitneyu(division[division['공경등급'] == '프로'].passSuccess,
             division[division['공경등급'] == '챌린지'].passSuccess)
## MannwhitneyuResult(statistic=13459.5, pvalue=1.7124228715391858e-05)


mannwhitneyu(division[division['공경등급'] == '월드클래스'].passSuccess,
             division[division['공경등급'] == '챌린지'].passSuccess)
## MannwhitneyuResult(statistic=50919.0, pvalue=0.005139047463996399)


p값이 0.05보다 작으므로 집단간의 평균값이 다르다. 귀무가설 기각

 

그러나 프로, 월드클래스 / 월드클래스, 챌린지 / 챌린지, 프로 등급간 ttest를 여러번 실행하면 다중검정문제가 발생한다고 합니다.

비교대상이 증가할수록 신뢰수준이 낮아지고, 1종 오류가 증가하게 된다고 공부할 수 있었습니다.

 

 

기억해야할 점

- 분산분석시 모수적/비모수적 방법에따라 다른 검정 방법

- 표본수에 따라 다른 정규성, 등분산 검정

- 다중검정문제의 위험성

 

 

 

 

참고자료: 

https://ko.wikipedia.org/wiki/%EB%B6%84%EC%82%B0_%EB%B6%84%EC%84%9D

https://brunch.co.kr/@linecard/632

https://m.blog.naver.com/statsol/221472155248

반응형
LIST

'통계 관련' 카테고리의 다른 글

python 카이제곱검정  (0) 2022.09.16
간단한 통계 개념 복습-2  (2) 2022.09.16
python t검정  (0) 2022.09.15
간단한 통계 개념 복습-1  (2) 2022.09.15