mmings_pring_day

[통계 데이터] 분산분석 가정 본문

통계

[통계 데이터] 분산분석 가정

mming_10 2024. 10. 14. 12:35

0.  분산분석 가정

- 정규성: 종속변수는 정규분포를 함

(종속 변수가 각 독립변수에 대해 정규분포를 하면, '모델의 잔차'는 평균 0의 정규분포를 따름

= 종속변수의 각 관측값들이 집단 별로 정규분포를 따르게 되면, '모델의 잔차'는 평균 0의 정규분포를 함)

- 등분산성: 각 집단의 분포는 모두 동일한 분산을 가짐 (비슷한 경향성을 가짐)

 

0-1.  분산분석 진단

- 정규성 (정규성 과정의 '충족 여부'는)

  -> 정규 Q-Q 도표 (를 이용해 시각적으로 확인!)

  -> 샤피로-윌크검정 (를 이용해 통계적으로 검정)

- 등분산성

  -> 레벤검정

  -> 바틀렛검정

(집단별로 모두 동일한 분산을 갖는지 검정!)

 

- InsectSprays 데이터셋 = 살충제에 대한 실험 데이터가 저장되어 있는 데이터셋

  -> spray = 살충제의 종류 (독립변수)

  -> count = 살충제로부터 살아남은 해충의 갯수 (종속변수)

-> 살충효과의 평균이 동일한지 = 살충제 간에 살충효과가 같은지 통계적 검증 

 

- aov( ) 함수 

# aov()함수의 첫번째 인수(포뮬러 형식)= 종속변수(검정하고자 하는 count 변수) ~ 독립변수(집단) 지정
# aov()함수의 두번째 인수= 데이터셋 지정
# 일원분산분석 결과를 'sprays.aov'변수에 저장

sprays.aov <- aov(count ~ spray, data=InsectSprays)
summary(sprays.aov)

-> F 값 = 34.7 / p값 = 2e-16

-> p 값이 유의수준 0.05 나 0.01 에 비해서 굉장히 작기 때문에 -> 집단 간의 차이가 없다는 '귀무가설 기각'

=> 살충제 간 살충효과의 차이는 존재함

 

-> 검정 결과를 신뢰하기 위한 조건= (1) 정규성 가정 충족/ (2) 등분산성 정 충족

0-2.  분산분석 가정 (정규성 가정)

- '정규성 가정'은 정규 Q-Q 도표를 이용해 시각적으로 확인!

library(car)
windows(width=7.0, height=5.5)

# qqPlot()함수의 첫번째 인수= 분산분석 모델로부터 얻을 수 있는 잔차 지정
# qqPlot()함수의 두번째 인수(distribution 인수)= 비교하고자 하는 분포 지정
# qqPlot()함수의 추가적인 인수
# (1) pch 인수 = 산점도 상의 점을 표시하는 심볼 지정
# (2) col 인수 = 색상 지정
# (3) id 인수 = FALSE 지정 
# -> id 인수에 'TRUE'를 지정하면, 가장 극단적인 관측값 2개의 인덱스가 그래프상에 출력됨
# (4) main 인수(그래프 제목)/ xlab 인수(x축 제목)/ ylab 인수(y축 제목)

qqPlot(sprays.aov$residuals, distribution="norm", 
       pch=20, col="tomato", id=FALSE, las=1,
       main="Normal Q-Q Plot", xlab="Theoretical Quantiles", ylab="Residuals")
#잔차가 정규분포를 따라야 함!!(완전한 정규분포를 따르지는 않음)

- 함수의 표본 데이터 (잔차)를 인수로 제공하면 R 은 표준 정기분포 (평균형 표준편차가 1인 정규분포)로부터 인수로 주어진 표본 데이터 크기만큼의 이론적 표본을 추가로 생성함.

-> 두 표본의 표본 데이터를 크기 순으로 정렬하고, 정렬된 각 쌍의 데이터의 산점도? 같은 식으로 그리게 되면, 이와 같은 정규 Q-Q 도표가 완성됨!

(x축: 이론적 정규분포로부터 생성한 표본이고 (정규분포로부터 생성된 값이기에 Q-Q도표 상의 점들이 대각선을 따라 직선 상에 분포하게 되면, 인수로 주어진 표본 데이터는 정규분포를 따른다고 볼 수 있음/

, y축: 실제 부분 -> 잔차)

-> 정규 Q-Q 도표를 보면, 일부 관측값은 '정규성 직선'을 따라서 분포하고 있지 않으며, 95% 신뢰구간 밖에 존재함.

-> 정규성 가정을 충분히 충족하지 못한 것으로 보임

-> 하지만, 가운데 값의 경우 '직선을 따라서 충분히 잘 배치가 되어', 그래프상으로는 정규성 가정을 충족 여부가 명확히 드러나지 않음

=> 그래프 상의 정규성 충족 여부가 명확히 드러나는 경우가 아니라면, 시각적으로만 정규성 과정을 평가하기엔 어려울 수 있음

=> 이럴 땐, '샤피로 밀크 검정'을 통해서 정규성 가정 충족 여부를 통계적으로 검정!

# shapiro.test() 함수의 인수= 분산분석 모델로부터 얻을 수 있는 잔차 지원
shapiro.test(residuals(sprays.aov))

# outlierTest() 함수의 인수= 분산분석 모델 지정
outlierTest(sprays.aov)

-> 검정 결과에 따르면, p값 0.02226 -> 관측값이 정규분포 라는 귀무가설을 기각함

=> 정규성 가정은 충족하지 못한 것으로 판단 됨

 

'분산분석은 정규성 과정에 크게 제한을 받지 않는 것으로 알려짐/ 데이터 분포가 극단적으로 비정규성을 보이지 않는 한 그다지 걱정할 필요는 없음!

*다만, 집단을 구성하는 표본의 크기가 작을 경우엔 이상점과 같은 비정상적인 관측값이 미칠 수 있는 영향을 주의 깊게 살펴볼 필요가 있음 * (비정상적인 관측값= 평균과 표준편차에 큰 영향을 미칠 수 있기에 '비정상적인 관측값'들을 제거한 다음에, 분산분석을 수행하는 것이 바람직. '이상점 존재 여부'는  outlierTest 함수를 이용해 통계적 검정 가능! )

- outlierTest 함수 = 이상점 존재 여부에 대한 통계적 검정 함수

- 'Bonferroni p'값이 '0.8499' 로 유의수준 0.05 보다 크기 때문에, 검정 결과에 따르면 데이터셋에는 우려할 만한 이상점이 포함되어 있지 않은 것으로 판단 가능


0-3.  분산분석 가정 (등분산성 가정 진단)

- 집단간 분산의 동일성 여부 (레벤 검정/ 바틀렛검정 을 통해 확인 가능!)

# levenTest() 함수의 첫번째 인수= 종속변수 ~ 독립변수 지정
# levenTest() 함수의 두번째 인수= 데이터셋 지정
# bartlett.test() 함수의 첫번째 인수= 종속변수 ~ 독립변수 지정
# bartlett.test() 함수의 두번째 인수= 데이터셋 지정

leveneTest(count ~ spray, data=InsectSprays) #등분산이 아니다 (대립 채택택)
bartlett.test(count ~ spray, data=InsectSprays)

 

- 두 검정 함수의 p값이 모두 유의수준 0.05 에 비해서 매우 작기 때문에 

=> '집단 간의 분산이 동일하다'는  '귀무가설 기각' 

=> 'InsectSprays' 데이터셋은 '집단 간의 분산이 동일하지 않음'

 

- 등분산의 가정을 충족하지 못했을 때 사용하는 함수= oneway.test( )함수 (aov 함수가 아닌!)

# 등분산성을 충족하지 않을 때(가정하지 않을 때만 사용)
# oneway.test() 함수의 첫번째 인수= 종속변수 ~ 독립변수 지정
# oneway.test() 함수의 두번째 인수= 데이터셋 지정
oneway.test(count ~ spray, data=InsectSprays)

-> 결과) 집단 간의 분산이 동일하다는 가정을 하지 않은 상태에서 나온 결과

-> p 값이 작은 것으로 보아 '귀무가설 기각 (귀무= 살충제 간에 살충효과가 동일하다)' 

* 이 검정 결과는 aov 함수 에서의 검정 결과와 동일!

(하지만, F값이나 p 값에서 aov 함수를 이용한 결과와 차이가 있음을 확인 -oneway.test( )함수가 '집단 간의 등분산'을 가정하지 않기 때문에!)

#등분산성을 충족할 때(가정할 때 사용)= aov() 함수
oneway.test(count ~ spray, data=InsectSprays, var.equal=TRUE)

- 'var.equal = TRUE' -> 등분산을 가정한 상태에서 분산분석을 하게 되면, 보다 덜 보수적인 (보다 적극적으로) 귀무가설을 기각하려는 검증 결과를 얻을 수 있음

- oneway.test( ) 함수= 등분산 가정 여부를, 이처럼 인수로 지정할 수 있기 때문에 '항상 등분산을 가정하는 aov 함수에 비해서 더 유연함! (하지만, aov 함수에서 사용했던 TukeyHSD( ) 함수를 이용한 '다중비교'는 수행할 수 없음)

 

=> 'InsectSprays' 데이터셋의 '집단 간 분산'이 동일하지 않기 떄문에, 집단 간 등분산 을 가정하는 'aov( ) 함수'보다는, '집단 간 등분산'을 가정하지 않는 경우에 사용할 수 있는 oneway.test( ) 함수를 이용하는 것이 보다 나은 선택이 될 수 있음