ADP/통계분석

[통계분석] 분산분석(ANOVA) - 일원배치 분산분석

rtw0202 2024. 10. 10. 19:41
728x90

분산분석(ANOVA)이란?

3개 이상의 다수 집단 간 평균 차이를 비교할 때 사용

독립변수 X : 범주형 변수 (성별, 종교, 부서)

종속변수 y : 연속형 변수

 

일원배치 분산분석

하나의 요인(성별, 종교, 부서)에 따른 3개 이상의 집단 평균을 비교할 때 사용

F 검정통계량을 이용함

각 집단의 측정치는 서로 독립적이라고 가정함

 

1. 가설수립

귀무가설 : k개의 집단 간 모평균 간에는 차이가 없다.

대립가설 : k개의 집단 간 두 모평균 간에는 차이가 있다.

 

2. 유의수준 설정 (0.05)

 

3. 정규성 검정

귀무가설 : 데이터는 정규성을 만족한다.

대립가설 : 데이터는 정규성을 만족하지 않는다.

from scipy.stats as stats

stats.shapiro(X1)
stats.shapiro(X2)
stats.shapiro(Xn)

=> p-value가 유의수준(0.05)보다 작으면 '데이터는 정규성을 만족하지 않는다'라는 대립가설 채택

=> p-value가 유의수준(0.05)보다 크면 '데이터는 정규성을 만족한다'라는 귀무가설 채택

 

4. 등분산성 검정

귀무가설 : 데이터는 등분산성을 만족한다.

대립가설 : 데이터는 등분산성을 만족하지 않는다.

from scipy.stats as stats

stats.levene(X1, X2, ..., Xn)

=> p-value가 유의수준(0.05)보다 작으면 '데이터는 등분산성을 만족하지 않는다'라는 대립가설 채택

=> p-value가 유의수준(0.05)보다 크면 '데이터는 등분산성을 만족한다'라는 귀무가설 채택

 

5. 검정통계량 값 및 유의확률(p-value) 계산

1. 데이터가 주어진 경우

1-1. 데이터가 정규성과 등분산성을 만족하는 경우

stats.f_oneway(X1, X2, ..., Xn)

1-2. 데이터가 정규성만 만족하고 등분산성은 만족하지 않는 경우

pip install pingouin

import pingouin as pg

pg.welck_anova(dv='종속변수의 열 이름', Between='독립변수의 열 이름', data=전체 데이터)

 

1-3. 데이터가 정규성을 만족하지 않는 경우

stats.kruskal(X1, X2, ..., Xn)

=> p-value가 유의수준(0.05)보다 작으면 ‘k개의 집단 간 모평균 간에는 차이가 있다’라는 대립가설 채택

=> p-value가 유의수준(0.05)보다 크면 ‘k개의 집단 간 모평균 간에는 차이가 없다’라는 귀무가설 채택


2. 데이터가 주어지지 않은 경우

2-1. 검정통계량 F 계산 후 p-value 계산

# ‘k개의 집단 간 모평균 간에는 차이가 있다’라는 대립가설을 검정 (양측검정)
p-value = 2 * (1-stats.f.cdf(F_stat, dfB, dfW))

=> p-value가 유의수준(0.05)보다 작으면 ‘k개의 집단 간 모평균 간에는 차이가 있다’라는 대립가설 채택

=> p-value가 유의수준(0.05)보다 크면 ‘k개의 집단 간 모평균 간에는 차이가 없다’라는 귀무가설 채택

 

6. 사후검정

분산분석 결과, p-value가 유의수준(0.05)보다 작아 'k개의 집단 간 모평균 간에는 차이가 있다'라는 대립가설이 채택된 경우 어떤 집단들에 대해서 평균의 차이가 존재하는지 알아볼 수 있음

귀무가설 : 두 집단 사이의 평균은 차이가 없다.

대립가설 : 두 집단 사이의 평균은 차이가 있다.

# 각 집단간 평균을 그래프로 표시
from statsmodels.stats.multicomp import pairwise_tukeyhsd
from statsmodels.stats.multicomp import MultiComparison

mc = MultiComparison(data=종속변수, groups=독립변수)
tuekeyhsd = mc.tukeyhsd(alpha=0.05)
fig = tuekeyhsd.plot_simultaneous()
# 두 집단씩 짝을 지어 각각 다중비교를 수행
tuekeyhsd.summary()

=> p-value가 유의수준(0.05)보다 작으면 ‘두 집단 사이의 평균은 차이가 있다’라는 대립가설 채택

=> p-value가 유의수준(0.05)보다 크면 ‘두 집단 사이의 평균은 차이가 없다’라는 귀무가설 채택

728x90