R을 이용한 ANOVA: 일원 분산 분석 및 이원 분산 분석 (예제 포함)
⚡ 스마트 요약
R에서 ANOVA는 전체 변동을 그룹 간 변동과 그룹 내 변동으로 나누어 세 개 이상의 그룹 평균을 비교합니다. 이 가이드에서는 poisons 데이터셋에 대해 일원 분산 분석과 이원 분산 분석을 실행하고, 가정을 검증하며, Tukey HSD를 사용하여 차이가 나는 그룹 쌍을 찾아냅니다.

분산 분석이란 무엇입니까?
분산 분석 분산 분석(ANOVA)은 두 개 이상의 그룹 평균을 비교하는 데 사용되는 통계 기법입니다. 이 검정은 측정값의 전체 변동을 그룹 구성원 자격으로 설명되는 부분과 무작위 잡음으로 남은 부분으로 나누어 분석합니다. 따라서 R에서 ANOVA는 적어도 하나의 그룹 평균이 다른 그룹 평균과 다른지 여부를 알려주며, 어느 그룹 평균인지는 알려주지 않습니다. 이는 기존의 통계적 검정 기법을 직접적으로 확장한 것입니다. t- 검정 요인 변수에 두 개 이상의 수준이 있는 상황에 적용됩니다.
테스트를 실행하기 전에, 어떤 ANOVA 분석법이 여러분의 설계에 적합한지 아는 것이 도움이 됩니다.
R에서 사용할 수 있는 ANOVA 테스트 유형
"ANOVA"는 단일 절차가 아니라 여러 검정 방법을 아우르는 개념입니다. 적절한 검정 방법을 선택하는 것은 요인의 개수와 데이터 수집 방식에 따라 달라집니다.
| Test | 사용시기 | R 호출 |
|---|---|---|
| 일원 분산 분석 | 3개 이상의 수준을 가진 하나의 요인 | aov(y ~ x, data = df) |
| 이원 분산 분석 | 두 개의 독립적인 요인 | aov(y ~ x1 + x2, 데이터 = df) |
| 양방향 상호작용 | 한 요인의 영향은 다른 요인에 따라 달라진다 | aov(y ~ x1 * x2, data = df) |
| 반복 측정 분산 분석 | 동일한 대상을 두 번 이상 측정했습니다. | aov(y ~ x + Error(주제/x)) |
| 안 코바 | 연속형 공변량은 통제되어야 합니다. | aov(y ~ x + 공변량, 데이터 = df) |
| 마노바 | 두 개 이상의 반응 변수를 동시에 | manova(cbind(y1, y2) ~ x) |
이 튜토리얼에서는 처음 세 가지 변형을 다룹니다. 나머지 변형들도 동일한 aov() 인터페이스를 사용하므로, 하나의 출력 테이블을 읽는 방법을 알면 나머지도 모두 읽을 수 있습니다.
R에서 ANOVA와 T-검정의 주요 차이점
두 검사 모두 평균을 비교하는 것이므로, 어느 검사가 다른 검사를 대체하는지 정확하게 밝히는 것이 중요합니다.
| 기준 | T 테스트 | 분산 분석 |
|---|---|---|
| 그룹 수 | 정확히 두 개 | 2 명 이상 |
| 테스트 통계 | t | 두 그룹이 있을 때 F는 t의 제곱과 같습니다. |
| 결과 | 차이의 방향을 나타냅니다. | 차이가 존재한다는 보고만 합니다. |
| 후속 조치가 필요합니다 | 없음 | Tukey HSD와 같은 사후 검정 |
| R 함수 | t.test() | aov() |
세 그룹을 비교할 때 세 번의 개별 t-검정을 실행하고 싶은 유혹이 들 수 있습니다. 하지만 그러지 마십시오. 각 검정에는 5%의 오류율이 있으므로 세 번의 비교는 위양성 확률을 약 14%까지 높입니다. 분산 분석(ANOVA)은 단일 검정으로 동일한 질문에 대한 답을 제공하며, Tukey HSD는 오류율을 통제한 상태에서 쌍별 세부 비교를 처리합니다. 두 그룹의 경우를 참조하십시오. t-검정 튜토리얼.
일원 분산 분석
여러 그룹 간의 평균을 비교해야 하는 상황이 많이 있습니다. 예를 들어, 마케팅 부서에서는 세 팀의 판매 실적이 동일한지 알고 싶어합니다.
- 팀: 3단계 요소: A, B, C
- 판매: 성과의 척도
ANOVA 검정을 통해 세 그룹의 성과가 비슷한지 알아볼 수 있습니다.
데이터가 동일한 모집단에서 나온 것인지 명확히 하기 위해 다음을 수행할 수 있습니다. 단방향 분산 분석 (이하 일원분산분석). 다른 통계 검정과 마찬가지로, 이 검정은 귀무가설(H0)을 기각할 수 있는지 여부에 대한 근거를 제공합니다. 귀무가설을 기각하지 못한다고 해서 귀무가설이 참이라는 것을 증명하는 것은 아니라는 점에 유의하십시오.
일원배치 분산분석(one-way ANOVA) 검정에서의 가설
- H0: 그룹 간 평균이 동일합니다.
- H1: 적어도 한 그룹의 평균은 다르다
즉, 귀무가설(H0)을 기각하지 못한다는 것은 어떤 집단의 평균도 다른 집단의 평균과 다르다고 결론 내릴 충분한 증거가 없다는 것을 의미합니다.
이 검정은 t-검정과 유사하지만, 그룹이 두 개 이상일 경우에는 ANOVA가 더 적합합니다. 그룹이 정확히 두 개인 경우에는 두 검정이 동일하며, F-통계량은 t-통계량의 제곱과 같습니다.
가정
일원 분산 분석(ANOVA)은 세 가지 조건에 기반합니다. 첫째, 관측치는 무작위로 추출되었고 서로 독립적이어야 합니다. 둘째, 각 그룹 내 잔차는 대략적으로 정규 분포를 따라야 합니다. 셋째, 모든 그룹의 분산이 동일해야 합니다(분산 동질성). 아래의 가정 검증 섹션에서는 R을 사용하여 각 가정을 검정하는 방법을 보여줍니다.
ANOVA 테스트 해석
F-통계량은 데이터가 상당히 다른 모집단, 즉 다른 표본 평균에서 나온 것인지 테스트하는 데 사용됩니다.
F-통계량을 계산하려면 다음을 나누어야 합니다. 그룹 간 변동성 이상 그룹 내 변동성.
The 그룹 간 변동성은 각 그룹 평균이 전체 평균에서 얼마나 떨어져 있는지를 나타냅니다. 아래 두 그래프를 비교하여 개념을 이해해 보세요.
왼쪽 그래프는 세 그룹 간의 차이가 매우 작음을 보여주며, 따라서 세 그룹의 평균값은 모두 근소한 차이를 보입니다. 전체 평균.
오른쪽 그래프는 서로 멀리 떨어져 있고 겹치는 부분이 없는 세 개의 분포를 나타내므로 전체 평균과 각 그룹 평균 간의 차이가 큽니다.
The 그룹 내 변동성은 개별 관측값이 해당 그룹의 평균에서 얼마나 벗어나는지를 측정합니다. 일부 지점은 그룹 평균에서 상당히 벗어나 있으며, 그룹 내 항은 바로 이러한 편차, 즉 표본 오차를 나타냅니다.
그룹 내 가변성의 개념을 시각적으로 이해하려면 아래 그래프를 살펴보십시오.
왼쪽 부분은 서로 다른 세 그룹의 분포를 나타냅니다. 각 표본의 분산이 증가했고, 개별 분산이 크다는 것이 분명합니다. F 통계량이 감소했으므로 귀무 가설을 기각할 수 없습니다.
오른쪽 부분은 평균은 같지만 분산이 훨씬 작은 표본들을 보여줍니다. 이는 F 통계량을 높여 대립 가설을 지지하는 근거가 됩니다.
두 측정값을 모두 사용하여 F-통계량을 구성할 수 있습니다. F-통계량을 이해하는 것은 매우 직관적입니다. 분자가 증가하면 그룹 간 변동성이 높다는 의미이며 표본의 그룹이 완전히 다른 분포에서 추출될 가능성이 높습니다.
즉, F 통계량이 낮다는 것은 그룹 평균 간에 의미 있는 차이가 거의 없거나 전혀 없음을 나타냅니다.
예시 일원 분산 분석 테스트
여러분은 단방향 ANOVA 테스트를 구현하기 위해 poison 데이터 세트를 사용할 것입니다. 데이터 세트에는 48개 행과 3개 변수가 포함되어 있습니다.
- 시간: 동물의 생존 시간
- 독: 사용된 독의 유형: 요인 수준: 1,2 및 3
- treat: 사용된 치료 유형: 요인 수준: 1,2 및 3
ANOVA 테스트를 계산하기 전에 다음과 같이 데이터를 준비해야 합니다.
- 1단계: 데이터 가져오기
- 2단계: 불필요한 변수 제거
- 3단계: Poison 변수를 순서화된 수준으로 변환합니다.
library(dplyr) PATH <- "https://raw.githubusercontent.com/guru99-edu/R-Programming/master/poisons.csv" df <- read.csv(PATH) %>% select(-X) %>% mutate(poison = factor(poison, ordered = TRUE)) glimpse(df)
출력:
## Observations: 48 ## Variables: 3 ## $ time <dbl> 0.31, 0.45, 0.46, 0.43, 0.36, 0.29, 0.40, 0.23, 0.22, 0... ## $ poison <ord> 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 1, 1, 1, 1, 2, 2, 2... ## $ treat <fctr> A, A, A, A, A, A, A, A, A, A, A, A, B, B, B, B, B, B, ...
우리의 목표는 다음 가정을 테스트하는 것입니다.
- H0: 그룹간 생존시간 평균에는 차이가 없다
- H1: 생존 시간 평균은 적어도 하나의 그룹에서 다릅니다.
다시 말해, 기니피그에게 투여한 독의 종류에 따라 생존 시간의 평균값에 통계적 차이가 있는지 알고 싶다는 것입니다.
다음과 같이 진행하게 됩니다:
- 1단계: 포이즌 변수의 형식 확인
- 2단계: 요약 통계 인쇄: 개수, 평균 및 표준 편차
- 3단계: 상자 그림 그리기
- 4단계: 일원배치 분산분석 테스트 계산
- 5단계: Tukey HSD를 사용하여 쌍별 비교를 실행합니다.
단계 1) 아래 코드를 사용하여 독성 수준을 확인하세요. `mutate` 동사가 열을 순서가 지정된 요소로 변환했기 때문에 세 개의 문자 값이 표시될 것입니다.
levels(df$poison)
출력:
## [1] "1" "2" "3"
단계 2) 평균과 표준편차를 계산합니다.
df %>% group_by(poison) %>% summarise( count_poison = n(), mean_time = mean(time, na.rm = TRUE), sd_time = sd(time, na.rm = TRUE) )
출력:
## # A tibble: 3 x 4 ## poison count_poison mean_time sd_time ## <ord> <int> <dbl> <dbl> ## 1 1 16 0.617500 0.20942779 ## 2 2 16 0.544375 0.28936641 ## 3 3 16 0.276250 0.06227627
단계 3) XNUMX단계에서는 분포에 차이가 있는지 그래픽으로 확인할 수 있습니다. 지터링된 점이 포함되어 있습니다.
ggplot(df, aes(x = poison, y = time, fill = poison)) + geom_boxplot() + geom_jitter(shape = 15, color = "steelblue", position = position_jitter(0.21)) + theme_classic()
출력:
단계 4) aov 명령어로 일원 분산 분석(one-way ANOVA) 테스트를 실행할 수 있습니다. ANOVA 테스트의 기본 구문은 다음과 같습니다.
aov(formula, data)
Arguments:
- formula: The equation you want to estimate
- data: The dataset used
수식의 구문은 다음과 같습니다.
y ~ X1+ X2+...+Xn # X1 + X2 +... refers to the independent variables y ~ . # use all the remaining variables as independent variables
이제 여러분은 투여된 독의 종류에 따라 기니피그의 생존 시간에 차이가 있는지 여부에 대한 질문에 답할 수 있습니다.
모델을 객체에 저장하고 해당 객체를 summary() 메서드에 전달하면 읽기 쉬운 형식으로 결과가 출력됩니다.
anova_one_way <- aov(time~poison, data = df) summary(anova_one_way)
Code 설명
- aov(time ~ poison, data = df): 다음 공식을 사용하여 ANOVA 테스트를 실행합니다.
- summary(anova_one_way): 테스트 요약을 출력합니다.
출력:
## Df Sum Sq Mean Sq F value Pr(>F) ## poison 2 1.033 0.5165 11.79 7.66e-05 *** ## Residuals 45 1.972 0.0438 ## --- ## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
p값은 7.66e-05로, 일반적인 유의수준인 0.05보다 훨씬 낮으며, 세 개의 별표는 가장 강력한 유의성을 나타냅니다. 따라서 귀무가설(H0)을 기각하고 적어도 하나의 독성 물질 투여군은 평균 생존 시간이 다르다고 결론 내릴 수 있습니다.
R에서 ANOVA 가정을 확인하는 방법
ANOVA p값은 앞서 언급한 세 가지 조건이 모두 충족될 때만 신뢰할 수 있습니다. 각 조건은 R에서 직접 확인할 수 있으며, 모두 적합된 모델 객체를 대상으로 실행됩니다.
1. 관찰의 독립성. 이는 데이터 자체가 아니라 연구 설계의 특성이므로 어떤 검정으로도 해결할 수 없습니다. 각 실험 동물은 한 번만 측정하고 무작위로 그룹에 배정해야 합니다. 만약 동일한 피험자가 여러 행에 나타난다면, 반복 측정 모델을 사용해야 합니다.
2. 잔차의 정규성. ANOVA는 원시 데이터가 아닌 잔차가 대략적으로 정규 분포를 따른다고 가정합니다. QQ 플롯을 검토하고 샤피로-윌크 검정을 통해 이를 확인하십시오.
par(mfrow = c(2, 2)) plot(anova_one_way) # four diagnostic plots shapiro.test(residuals(anova_one_way))
정규 QQ 도표의 대각선에 인접한 점들은 잔차가 정규 분포를 따른다는 것을 나타냅니다. 샤피로-윌크 p값이 0.05보다 크면 정규성 가설을 기각할 수 없습니다.
3. 분산의 동질성. 모든 그룹은 비슷한 분포를 보여야 합니다. 잔차 대 적합값 그래프는 깔때기 모양이 아닌 평평한 띠 모양을 보여야 합니다. 바틀렛 검정보다 비정규성에 더 강건한 레빈 검정을 사용하여 이를 확인하십시오.
library(car)
leveneTest(time ~ poison, data = df)
bartlett.test(time ~ poison, data = df)
p값이 0.05보다 크면 등분산성을 지지합니다.
가정이 틀렸을 때 어떻게 해야 할까요? 분산이 같지 않으면 Welch 보정을 적용하는 oneway.test(time ~ poison, data = df, var.equal = FALSE)를 실행합니다. 잔차가 명백히 정규분포를 따르지 않고 표본 크기가 작으면 Kruskal-Wallis 순위 검정(kruskal.test(time ~ poison, data = df))으로 전환합니다. 표본 크기가 크고 균형이 잘 잡힌 경우, ANOVA는 정규성에서 약간 벗어나는 경우에도 상당히 강건하므로 Shapiro-Wilk 검정 결과가 경계선에 있더라도 치명적인 경우는 드뭅니다.
쌍별 비교
유의미한 F 검정은 그룹 평균이 모두 같지 않다는 것을 알려주지만, 어떤 쌍이 다른지는 알려주지 않습니다. Tukey의 정직 유의차 검정은 전체 오류율을 제어하면서 모든 쌍을 비교하여 어떤 쌍이 다른지 알려줍니다.
TukeyHSD(anova_one_way)
출력:
출력 결과를 쌍별로 한 행씩 읽으세요. diff 해당 열은 두 그룹 평균의 차이를 나타냅니다. lwr 업르 그 차이에 대한 95% 신뢰구간을 구하고, p adj p값은 다중 비교를 고려하여 조정된 값입니다. 두 쌍의 통계적 유의성은 신뢰구간이 0을 포함하지 않을 때, 즉 p adj 값이 0.05 미만일 때 나타납니다. 이 데이터 세트에서는 독성 물질 3과 관련된 비교가 유의미하며, 이는 박스 플롯과 일치합니다. 그룹 3은 그룹 1 및 2보다 평균 생존 시간이 확연히 짧지만, 그룹 1과 2는 통계적으로 유의미한 차이를 보이지 않습니다.
이원 분산 분석
이원 분산 분석은 공식에 두 번째 요인을 추가합니다. 이는 일원 분산 분석과 정확히 같은 방식으로 작동하지만 공식만 변경됩니다.
y ~ x1 + x2
여기서 y는 양적 반응 변수이고, x1과 x2는 모두 범주형 요인입니다.
2방향 ANOVA 검정의 가설
- H0: 두 요인 변수에 대한 그룹 평균은 동일합니다.
- H1: 두 요인 중 적어도 하나에 대해 적어도 한 집단의 평균이 다르다
모델에 치료 변수를 추가합니다. 이 변수는 기니피그에게 투여된 치료를 기록합니다. 아래의 가산 공식은 각 요인이 다른 요인을 고려한 후 생존 시간에 개별적으로 영향을 미치는지 여부를 검정합니다.
첫 번째 독립 변수 옆에 treat를 추가하여 코드를 수정하세요.
anova_two_way <- aov(time~poison + treat, data = df) summary(anova_two_way)
출력:
## Df Sum Sq Mean Sq F value Pr(>F) ## poison 2 1.0330 0.5165 20.64 5.7e-07 *** ## treat 3 0.9212 0.3071 12.27 6.7e-06 *** ## Residuals 42 1.0509 0.0250 ## ---
두 p값(독극물의 경우 5.7e-07, 치료의 경우 6.7e-06) 모두 0.05보다 훨씬 작으므로 두 요인 모두에 대해 귀무가설(H0)을 기각하고 독극물이나 치료법을 변경하면 생존 시간에 영향을 미친다고 결론짓습니다.
상호작용항 추가
위의 가산 모델은 독의 효과가 처리 방식과 관계없이 동일하다고 가정합니다. 이 가정을 검증하려면 더하기 기호(+)를 별표(*)로 바꾸면 주효과와 상호작용 효과 모두에 적용됩니다.
anova_interaction <- aov(time~poison * treat, data = df) summary(anova_interaction)
독성:처리 행이 유의미하지 않다면, 가산 모델이 더 적은 자유도를 사용하기 때문에 더 나은 선택입니다.
R에서의 ANOVA: 빠른 테스트 참조
아래 표는 위에서 사용된 각 테스트, 해당 테스트를 실행하는 R 호출, 그리고 평가하는 가설을 나열합니다.
| Test | Code | 가설 | P 값 |
|---|---|---|---|
| 일원배치 분산분석(One way ANOVA) |
aov(y ~ X, data = df)
|
H1: 평균은 적어도 하나의 그룹에서 다릅니다. | 0.05 |
| 쌍으로 |
TukeyHSD(ANOVA summary) |
0.05 | |
| 이원 분산 분석(Two way ANOVA) |
aov(y ~ X1 + X2, data = df)
|
H1: 적어도 한 그룹의 평균이 두 요인 중 하나에서 차이를 보인다 | 0.05 |




