📌 분산분석 용어 정리
독립변수 : 영향을 주는 변수
종속변수 : 영향을 받는 변수
요인 : 독립변수 (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)
』