R ANOVA 튜토리얼: 단방향 및 양방향(예제 포함)
분산 분석이란 무엇입니까?
분산 분석 (ANOVA)는 두 개 이상의 그룹 평균 간의 차이를 연구하는 데 일반적으로 사용되는 통계 기법입니다. ANOVA 테스트는 일반적인 변수의 다양한 변동 소스에 중점을 둡니다. R의 ANOVA는 주로 그룹 간의 평균 동등성의 존재에 대한 증거를 제공합니다. 이 통계적 방법은 t-테스트의 확장입니다. 요인 변수에 두 개 이상의 그룹이 있는 상황에서 사용됩니다.
일원 분산 분석
여러 그룹 간의 평균을 비교해야 하는 상황이 많이 있습니다. 예를 들어, 마케팅 부서에서는 세 팀의 판매 실적이 동일한지 알고 싶어합니다.
- 팀: 3단계 요소: A, B, C
- 판매: 성과의 척도
ANOVA 검정을 통해 세 그룹의 성과가 비슷한지 알아볼 수 있습니다.
데이터가 동일한 모집단에서 나온 것인지 명확히 하기 위해 다음을 수행할 수 있습니다. 단방향 분산 분석 (이하 일원배치 분산분석). 이 테스트는 다른 통계적 테스트와 마찬가지로 H0 가설을 수용할 수 있는지 기각할 수 있는지에 대한 증거를 제공합니다.
일원배치 분산분석(one-way ANOVA) 검정에서의 가설
- H0: 그룹 간 평균이 동일합니다.
- H3: 적어도 한 그룹의 평균은 다르다
즉, H0 가설은 그룹(요인)의 평균이 다른 그룹과 다르다는 것을 증명할 충분한 증거가 없음을 의미합니다.
이 테스트는 t-테스트와 유사하지만, 2개 이상의 그룹이 있는 상황에서는 ANOVA 테스트가 권장됩니다. 다만, t-테스트와 ANOVA는 유사한 결과를 제공합니다.
가정
우리는 각 요인이 무작위로 추출되고 독립적이며 알 수 없지만 등분산을 갖는 정규 분포 모집단에서 나온다고 가정합니다.
ANOVA 테스트 해석
F-통계량은 데이터가 상당히 다른 모집단, 즉 다른 표본 평균에서 나온 것인지 테스트하는 데 사용됩니다.
F-통계량을 계산하려면 다음을 나누어야 합니다. 그룹 간 변동성 이상 그룹 내 변동성.
이 어플리케이션에는 XNUMXµm 및 XNUMXµm 파장에서 최대 XNUMXW의 평균 출력을 제공하는 그룹 간 변동성은 전체 모집단 내 그룹 간의 차이를 반영합니다. 그룹 간 분산의 개념을 이해하려면 아래 두 그래프를 살펴보십시오.
왼쪽 그래프는 세 그룹 사이에 거의 변동이 없음을 보여 주며, 세 가지 평균이 다음과 같은 경향이 있을 가능성이 매우 높습니다. 전체 평균(즉, 세 그룹에 대한 평균).
오른쪽 그래프는 세 개의 분포를 멀리 떨어져 표시하며 어느 것도 겹치지 않습니다. 전체 평균과 그룹 평균의 차이가 클 가능성이 높습니다.
이 어플리케이션에는 XNUMXµm 및 XNUMXµm 파장에서 최대 XNUMXW의 평균 출력을 제공하는 그룹 내 변동성은 그룹 간의 차이를 고려합니다. 변화는 개별 관찰에서 비롯됩니다. 일부 포인트는 그룹 평균과 완전히 다를 수 있습니다. 그만큼 그룹 내 변동성은 이 효과를 포착하고 샘플링 오류를 참조합니다.
그룹 내 가변성의 개념을 시각적으로 이해하려면 아래 그래프를 살펴보십시오.
왼쪽 부분은 세 가지 다른 그룹의 분포를 나타냅니다. 각 표본의 산포를 늘렸으며 개인 분산이 큰 것이 분명합니다. 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: 그룹간 생존시간 평균에는 차이가 없다
- H3: 생존 시간 평균은 적어도 하나의 그룹에서 다릅니다.
즉, 기니피그에게 투여한 독의 종류에 따라 생존시간의 평균에 통계적인 차이가 있는지 알고자 합니다.
다음과 같이 진행하게 됩니다:
- 1단계: 포이즌 변수의 형식 확인
- 2단계: 요약 통계 인쇄: 개수, 평균 및 표준 편차
- 3단계: 상자 그림 그리기
- 4단계: 일원배치 분산분석 테스트 계산
- 5단계: 쌍별 t-검정 실행
단계 1) 다음 코드로 독의 레벨을 확인할 수 있습니다. mutate 동사로 factor로 변환하기 때문에 세 개의 문자 값이 표시되어야 합니다.
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)
코드 설명
- 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-값은 일반적인 임계값인 0.05보다 낮습니다. "*"로 표시된 그룹 간에 통계적 차이가 있다고 확신할 수 있습니다.
쌍별 비교
일원 분산 분석 테스트는 어느 그룹이 다른 평균을 가지고 있는지 알려주지 않습니다. 대신 TukeyHSD() 함수로 Tukey 테스트를 수행할 수 있습니다.
TukeyHSD(anova_one_way)
출력:
이원 분산 분석
이원 ANOVA 테스트는 공식에 또 다른 그룹 변수를 추가합니다. 이는 일원 ANOVA 테스트와 동일하지만 공식은 약간 변경됩니다.
y=x1+x2
with는 양적 변수이고 and는 범주형 변수입니다.
2방향 ANOVA 검정의 가설
- H0: 두 변수(예: 요인 변수)에 대한 평균이 동일합니다.
- H3: 두 변수 모두 평균이 다릅니다.
우리 모델에 치료 변수를 추가합니다. 이 변수는 기니피그에게 주어진 치료를 나타냅니다. 당신은 기니피그에 투여된 독극물과 치료 사이에 통계적 의존성이 있는지 확인하고 싶습니다.
다른 독립 변수와 함께 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 ## ---
독약과 치료법이 모두 통계적으로 0과 다르다는 결론을 내릴 수 있습니다. NULL 가설을 기각하고 치료법이나 독약을 변경하면 생존 시간에 영향을 미친다는 것을 확인할 수 있습니다.
요약
아래 표에 테스트를 요약했습니다.
Test | 암호 | 가설 | P 값 |
---|---|---|---|
일원배치 분산분석(One way ANOVA) |
aov(y ~ X, data = df) |
H3: 평균은 적어도 하나의 그룹에서 다릅니다. | 0.05 |
쌍으로 |
TukeyHSD(ANOVA summary) |
0.05 | |
이원 분산 분석(Two way ANOVA) |
aov(y ~ X1 + X2, data = df) |
H3: 두 그룹 모두 평균이 다릅니다 | 0.05 |