본문 바로가기
[수학]/R로 배우는 통계학

[통계학/R] 분산분석 (ANOVA:Analysis of Variance) : 분산분석 용어, 분산분석을 사용하는 경우, ANOVA 분석에 필요한 세가지 가정, 분산분석 실습 코드

by seom-j 2023. 7. 17.

 

📌 분산분석 용어 정리

독립변수 : 영향을 주는 변수

종속변수 : 영향을 받는 변수

요인 : 독립변수 (ANOVA에서만 해당 의미로 사용)

원 : 요인의 줄임말

 

일원분산분석(one factor ANOVA, one way ANOVA) : 요인이 하나인 경우

이원분산분석(two factor ANOVA, two way ANOVA) : 요인이 두개인 경우

 

 

📌 분산분석을 사용하는 경우

범주형 변수 → 수치형 변수의 영향 검정

(각 범주에 따른 차이 여부)

 

ex)

성별에 따른 음주량 차이

학년에 따른 성적 차이

 

귀무가설 : 모든 그룹의 평균은 같다 (요인 수준에 따른 차이가 없다)

대립가설 : 모든 그룹의 평균이 다 같은 것은 아니다. (요인 수준에 따른 차이가 존재한다)

 

이때, 대립가설에 유의

모두가 다를 경우도 존재할 수 있지만, 둘 이상이 다름이 맞는 말

따라서 대립가설이 옳다고 판단될 경우 어떤 변수간의 차이가 있는지 추가 분석 필요

 

 

📌 ANOVA

분산분석의 세가지 가정

  • 각 요인수준에 대응하는 모집단은 동일한 분산을 가짐
  • 각 요인수준에 대응하는 모집단은 정규분포임
  • 각 요인수준에 대한 관찰치들은 임의로 얻어지는 것이며 독립적임

 

또한 p-value가 0.05보다 작을 경우, (모든 그룹의 평균이 다 같은 것이 아닐 경우)

“사후분석(Post Hoc Analysis)” 시행

Tuckey(자연과학에서 사용)와 Scheffe’s Method(사회과학에서 사용) 등 여러 방법이 있음

 

<T-test와 ANOVA의 차이>

"독립변수가 되는 범주 데이터의 수"

범주 데이터가 2개일 때 ANOVA의 특수한 형태라고 볼 수 있음

 

📌 ANOVA 실습 코드

일원분산분석(one factor ANOVA, one way ANOVA) 

: Rstudio에 있는 PlantGrowth 데이터 셋 사용하여 분석 진행

# --- 전체 데이터 구조 파악 ---
View(PlantGrowth)
str(PlantGrowth) 
# 30개의 행, 2개의 열 (그룹 & 무게)
# num형(수치형), Factor형(범주형/3종류 그룹)
# group -> weight 중, 각 그룹별 무게와의 연관성 분석 ! (분산분석의 목적)

summary(PlantGrowth)
# 범주형 데이터의 경우 범주의 종류와 Frequency(빈도) 정보를 알려줌



# --- 그룹별 데이터 구조 파악 ---
install.packages("dplyr") 
library(dplyr)
# 필요한 패키지 설치 및 불러오기 (dplyr 패키지)

PlantGrowth %>%
  group_by(group) %>% # group의 열에 대해 데이터 분할
  summarise(
    count = n(), # n : 행의 수 계산
    mean = mean(weight), # 그룹에 대한 weight의 평균
    sd = sd(weight) # 그룹에 대한 weight의 표준편차
  ) 
# summary와 다름 ! 분할된 데이터 각 집단에 대한 따로따로 명령어 적용!
# 각 평균과 표준편차가 차이가 있는데, 이게 의미있는 차이인가? 
# difference? statistically significant? 통계학적으로 차이가 있다고 이야기할 수 있는가?



# --- 분산분석 시행 ---
res.aov <- aov(weight~group, data = PlantGrowth)
# aov : anova 분석 시행 함수
# res.aov 변수에 해당 내용 저장

summary(res.aov)
# 확인해보니, 0.0159로 0.05보다 작음 
# 대립가설이 옳음
# 종속변수 값에 차이 존재 ! -> 사후분석 필요



# --- 사후분석 시행 ---
# 1. TukeyHSD
TukeyHSD(res.aov)
# H0 : no difference
# H1 : difference existst
# trt1과 trt2 차이 존재 ! (trt2>trt1, 0.865)

# 2. Scheffe's Method
install.packages("DescTools")
library(DescTools)
ScheffeTest(res.aov)
# 위와 동일한 결과 얻을 수 있음



# --- 분산 동질성, 정규성 확인(ANOVA검정 가능성 확인) ---
# 1. 분산 동질성 확인
install.packages("car")
library(car)
leveneTest(weight~group, data = PlantGrowth)
# 0.05 보다 크므로 분산에 차이가 없음

# 2. 정규성 확인
aov_residuals <- residuals(object = res.aov)
shapiro.test(x = aov_residuals)
# 0.05보다 크므로 정규성을 나타냄

# 결론적으로 ANOVA분석 가능 !

➡️ 그룹에 따른 무게 차이가 존재함을 확인할 수 있음

 

이원분산분석(two factor ANOVA, two way ANOVA)

: Rstudio에 있는 ToothGrowth 데이터 셋 사용하여 분석 진행

# --- 전체 데이터 구조 파악 ---
str(ToothGrowth)
View(ToothGrowth)
summary(ToothGrowth)
# num, Factory, num
# 그러나 마지막 num은 세개의 수로 구성되어, 사실상 범주형인 수치임을 확인



# --- 수치형 범주형 변수 범주화 ---
my_data <-ToothGrowth
my_data$dose <- factor(my_data$dose,
                      levels = c(0.5, 1, 2),
                      labels = c("D0.5", "D1", "D2"))
head(my_data)
table(my_data$supp, my_data$dose)
# 교차 표 생성 후 확인



# --- 분산분석 시행 ---
res.aov2 <- aov(len ~ supp + dose, data = my_data)

summary(res.aov2)
# 두 범주 모두 독립변수에 따라 종속변수 값에 차이가 있음
# 대립가설이 옳음
# 종속변수 값에 차이 존재 ! -> 사후분석 필요



# --- 사후분석 시행 (TukeyHSD 사용) ---
TukeyHSD(res.aov2, which = "dose")
# 요인이 두개이므로 선택하여 사후분석 시행
# 셋 모두 차이난다는 것을 확인할 수 있음
# D2-D0.5가 가장 차이가 큰 것을 확인할 수 있음



# --- 분산 동질성, 정규성 확인(ANOVA검정 가능성 확인) ---
# 1. 분산 동질성 확인
install.packages("car")
library(car)
leveneTest(len ~ supp*dose, data = my_data)
# 0.05 보다 크므로 분산에 차이가 없음

# 2. 정규성 확인
aov_residuals <- residuals(object = res.aov2)
shapiro.test(x = aov_residuals)
# 0.05보다 크므로 정규성을 나타냄

# 결론적으로 ANOVA분석 가능 !

➡️ supp, dose에 따른 len의 차이가 존재함을 확인할 수 있음

 

 

<R 문법 : pipe>

# [%>%] : pipe라 부르며, 왼쪽 수행 결과를 오른쪽으로 전달
PlantGrowth %>% View() # View(PlantGrowth)