분산 분석, ANOVA..
내 경험 상, 논문에서 아주 흔하게 볼 수 있는 검정법이다.
뭐든 이론을 파면 복잡하지만,
ANOVA는 친숙한 이미지에 비해 상당히 난해한 이론을 가진 듯..
하지만, 포스팅의 목적이 "사용"에 초점이 맞춰져있기 때문에 이론은 가볍게 패스하도록 하자.
이름은 '분산' 분석이지만,
실제론 평균을 비교하는 검정법이다.
평균 검정이라고하면 독립 표본 T검정도 평균을 비교하는 검정법이었다.
2개의 차이는 무엇일까?
독립 표본 T검정은 집단이 2개일 때 사용하는 분석이고,
ANOVA는 3개 이상일 때 사용한다.
"ANOVA는 집단이 2개일때 쓰면 안되나?" 하는 궁금증은 접어두도록 하자.
필자도 예전에 이런 궁금증으로 고민을 하다가
2개일 때는 T검정이 조금 더 유리하다는 결론을 냈었다.
자세한 내용은 기억 안 남....
어쨌든 ANOVA의 가정을 보자.
1. 정규성 : 각 그룹에서 표본은 정규성을 만족한다.
2. 등분산성 : 각 그룹의 분산은 서로 동일해야 한다.
3. 독립성 : 표본은 서로 독립적이어야 한다.
독립 표본 T검정의 가정과 거의 같다고 볼 수 있다.
가설의 경우에도 거의 동일하다.
차이가 있다면 그룹의 수가 조금 더 일반화되었다는 것.
- 귀무 가설 : 모든 모집단의 평균은 동일하다.
- 대립 가설 : 모든 모집단의 평균이 동일한 것은 아니다.
대립 가설이 살짝 말장난 같은데..
단 하나의 집단만 다르더라도 귀무가설이 기각된다는 뜻이다.
반드시 모든 집단의 평균이 서로 다를 필요는 없다.
이 부분에 대해서는 예제를 보며, 사후 분석에 대해 추가로 이야기하겠다.
# 데이터 불러오기
sample = read.csv("F:/Sw-tastics/Statistics Analysis/example/07. ANOVA.csv", header = T)
table(sample$group)
boxplot(data = sample,
time ~ group)
# 정규성 검정(shapiro-wilks test)
shapiro.test(sample[sample$group == "A", "time"])
shapiro.test(sample[sample$group == "B", "time"])
shapiro.test(sample[sample$group == "C", "time"])
# 등분산성 검정
library(lawstat)
levene.test(sample$time, sample$group, location = "mean")
# ANOVA
model = aov(time ~ group, data = sample)
summary(model)
# post-hoc analysis
library(agricolae)
scheffe.test(model, "group", alpha = 0.05, console =T)
"그룹"과 "시간" 2개의 변수로 이루어진 간단한 데이터이다.
"그룹"별로 "시간"의 평균이 차이가 있는지 확인해보자.
# 데이터 불러오기
sample = read.csv("F:/Sw-tastics/Statistics Analysis/example/07. ANOVA.csv", header = T)
table(sample$group)
boxplot(data = sample,
time ~ group)
그룹별 관측치 갯수는 위와 같고,
그룹별 변수의 분포는 박스 플랏을 참고하면 좋다.
누가봐도 A와 B의 평균은 같고, C만 다른 상황...이지만,
눈으로 끝내는 것이 아니라 수치적 근거를 만드는 것이 통계 분석이라고 생각한다.
진짜 다른지 확인해보자.
# 정규성 검정(shapiro-wilks test)
shapiro.test(sample[sample$group == "A", "time"])
shapiro.test(sample[sample$group == "B", "time"])
shapiro.test(sample[sample$group == "C", "time"])
모든 그룹에서 정규성 만족.
# 등분산성 검정
library(lawstat)
levene.test(sample$time, sample$group, location = "mean")
등분산성도 만족.
독립성은 만족한다고 하자.
# ANOVA
model = aov(time ~ group, data = sample)
summary(model)
빨간색 네모만 보면 된다.
헷갈리니까 다른건 보지말자.
* 갯수에 대한 설명이 아래에 있는데, p-value가 낮을수록 *이 많다.
최대 3개까지 있을 수 있다.
따라서, group은 아주 유의한 변수라는 뜻.
따라서, 귀무가설을 기각하고,
모든 그룹의 평균이 같지 않다는 대립가설을 채택한다.
근데, 모든 그룹의 평균이 같은 것은 아니다...
적어도 하나는 다르다는 뜻인데, 상당히 제한적인 정보다.
우린 3개 그룹을 비교했는데, 그냥 이 중 하나가 다르다고만 하면 무책임한 느낌?
이럴 때 사용하는 것이 사후검정이다.
어렵게 생각할것없다.
뭔가 하나가 다르다는 것을 알게 되었으니,
이제는 1:1로 다 비교해줘서 뭐가 뭐랑 다른지 확인하는 작업이다.
사후 검정에도 방법은 많으나, Scheffe 검정으로 해보겠다.
(프로세스 이해를 돕기 위해 하는 것이므로 특별한 이유 없이 골랐다... 그냥 가장 먼저 떠올라서..)
# post-hoc analysis
library(agricolae)
scheffe.test(model, "group", alpha = 0.05, console =T)
결과만 보자면, 마지막 네모박스만 보면 된다.
우측 groups라는 열에 새롭게 그룹화한 결과를 볼 수 있다.
C는 a그룹으로, B와 A는 b그룹으로 묶여있다.
즉, A와 B는 평균이 같고, C만 다르다는 뜻인데,
이는 우리가 그린 박스 플랏만 봐도 충분히 납득가능하다.
결과적으로,
A와 B의 시간의 평균은 차이가 없고,
C는 차이가 있다는 결론을 낼 수 있다.
경험적으로 ANOVA는 가정에 별로 구애받지 않는다고 한다..
예전에 관련 내용이 궁금해서 공부할 때,
시뮬레이션을 통해 가정 충족 여부와 검정력에 관한 논문을 본 것 같다.
가정이 충족되지 않아도 검정력이 괜찮았다는 것으로 기억한다.
가정 충족..이라는 이야기를 하다보니,
ANOVA 본문보다 길어질 것 같아 이까지 끝내고 다음에 따로 포스팅해야겠다.
'Statistical Analysis > R' 카테고리의 다른 글
[R] Welch's t-test, Welch's T 검정 (0) | 2022.06.27 |
---|---|
[R] Kruskal Wallis test, 크루스칼 왈리스 검정 (0) | 2022.06.24 |
[R] Wilcoxon rank sum test, 윌콕슨 순위합 검정 (0) | 2022.06.21 |
[R] Wilcoxon signed rank test, 윌콕슨 부호 순위 검정 (0) | 2022.06.21 |
[R] Paired Sample t-test, 대응 표본 t 검정 (0) | 2022.06.19 |