기본 콘텐츠로 건너뛰기

R의 고전 검사 - 3개 이상 그룹에서 평균값의 비교 One Way ANOVA



 3개 이상의 집단에서 평균을 비교하는 경우 t 검정 대신 분산분석 (ANOVA)를 사용합니다. 일원배치 분산분석 (One Way ANOVA) 역시 통계 분석의 기본적인 방법으로 널리 사용됩니다. 앞서 예제를 확장해서 각 30명 씩, A,B,C 반 남학생의 키를 측정했다고 가정합니다. 


 일단 테스트를 위한 가상 데이터를 만듭니다. 


> set.seed(1234)
> A<-rnorm span="">
> set.seed(123)
> B<-rnorm span="">
> set.seed(12345)
> C<-rnorm span="">


 문제는 이러면 각각의 A/B/C 라는 벡터만 만들어졌다는 것입니다. 이대로 anova에 사용되는 aov를 입력하면 에러가 납니다. 

> out=aov(A,B,C)
Error: $ operator is invalid for atomic vectors

 이제 데이터 프레임을 만드는 방법에 대해서 설명드리겠습니다. 우리는 아래와 같은 데이터를 만들어야 합니다. 


       키 (height)  반 (class)

1         173         A
2         171         B
3         168         C
.......

 이와 같은 형태의 데이터는 실제 우리가 다루는 데이터에서 흔히 볼 수 있는 구조이며 이를 정돈된 데이터 혹은 말끔한 데이터 (Tidy data)라고 합니다. 물론 우리가 보는 기초 자료 가운데는 이렇게 잘 정리되지 않은 것도 상당수라 실제로는 정리하는 과정을 거쳐야 합니다. 여기서는 A/B/C 세 반 자료를 정돈된 형태로 바꿔보겠습니다. 


 방법은 각 반의 가상 데이터를 위의 형태로 정리한 후 rbind 명령어로 붙이는 것입니다. data.frame 명령어를 이용해서 3개의 데이터 프레임을 만들고 합칠 것입니다. 우선 data.frame을 만들겠습니다. 


> DFA<-data .frame="" class="" height="" span="">
> DFA
   height....A Class.....A.
1     163.9647            A
2     171.3871            A
3     175.4222            A
4     158.2715            A
5     172.1456            A
6     172.5303            A
7     167.1263            A
8     167.2668            A
9     167.1777            A
10    165.5498            A
11    167.6140            A
12    165.0081            A
13    166.1187            A
14    170.3223            A
15    174.7975            A
16    169.4486            A
17    167.4450            A
18    165.4440            A
19    165.8141            A
20    182.0792            A
21    170.6704            A
22    167.5466            A
23    167.7973            A
24    172.2979            A
25    166.5314            A
26    162.7590            A
27    172.8738            A
28    164.8817            A
29    169.9243            A
30    165.3203            A


 위에서 data.frame을 이용해서 각각 A 데이터에 있는 키와 여기에 속한 그룹에 A라는 범주형 데이터를 붙였습니다. 다만 나중에 합치기 위해서는 변수명도 통일해야 합니다. colnames 명령어를 이용해서 height와 class로 통일하겠습니다. 


DFA<-data .frame="" class="" height="" span="">
colnames(DFA)<-c height="" lass="" span="">
DFA
DFB<-data .frame="" class="" height="" span="">
colnames(DFB)<-c height="" lass="" span="">
DFB
DFC<-data .frame="" class="" height="" span="">
colnames(DFC)<-c height="" lass="" span="">
DFC

 이렇게 만든 데이터 프레임 셋을 연결합니다. 


DF2<-rbind span="">


 이제 DF2라는 데이터 프레임에 90개의 관측치와 2개의 변수 (키와 반)를 지닌 데이터를 성공적으로 만들었습니다. (DF2를 R에서 실행시키면 알 수 있습니다) 일원배치 분산 분석을 해보겠습니다. 


> out=aov(height~Class, data=DF2)
> summary(out)
            Df Sum Sq Mean Sq F value   Pr(>F)    
Class        2  560.4  280.18   12.65 1.51e-05 ***
Residuals   87 1927.1   22.15                     
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1


 방법은 간단합니다. aov(결과변수~독립변수, data=데이터프레임 이름) 으로 객체를 만들고 summary로 내용을 보면 됩니다. 여기서는 반에 따라서 키의 차이가 있는지 보는 것이기 때문에 독립변수는 반이 되고 결과(종속)변수는 키가 됩니다. 


 결과에서 F 값이 12.65에 P 값은 1.51e-05가 나왔습니다. 즉 P=0.0000151입니다. P<0 .05="" nbsp="" span="">


 다음에는 이 내용에 대해서 좀 더 깊이있게 들어가 보겠습니다. 

댓글