본문 바로가기
6. 평균비교(3집단 이상) | 모수/1) 일원분산분석

R에서 일원 분산분석 및 사후분석 하는 방법

by makhimh 2020. 6. 1.
반응형

코드만 급하신 분

#분산분석
result=aov(종속변수~독립변수,전체데이터)

#p값 확인
summary(result)

 

일원분산분석이란?

분산분석은 3개 이상의 그룹의 평균을 비교할 때 사용하는 검정방법입니다. 독립변수와 종속변수의 수에 따라 아래와 같이 나뉩니다. 


이번글에서 다루는 일원분산분석은 독립변수가 1개이고 종속변수도 1개인 경우입니다. 예를 들면 '세 반의 수학점수 평균 비교' 가 있습니다. 이 때 독립변수는 반의 종류이고 종속변수는 수학점수입니다. 

일원분산분석의 귀무가설과 대립가설은 아래와 같습니다. 

귀무가설 : 세 집단의 평균이 같다.
대립가설 : 적어도 어느 한 모집단은 다른 모집단과 평균이 다르다. 

 

일원 분산분석의 조건

일원분산분석은 세가지 조건을 만족해야 합니다.

1) 독립성
2) 정규성
3) 등분산성

집단 사이에 독립성을 만족하지 않고 대응되어 있는 경우 '반복측정 분산분석'을 사용합니다. 각 집단이 정규성을 만족하지 않는 경우 Kruskal-Wallis test 를 사용합니다. 집단 사이에 등분산성을 만족하지 않는 경우 Welch 의 강건한 분산분석을 합니다. 세 집단 이상의 등분산 검정은 barlett.test 를 통해 수행합니다. 

 

예제

1) 데이터 전처리

A반, B반, C반의 수학점수를 비교해 볼 것입니다. 수학점수는 아래와 같습니다. 총 30명인데,10명만 표시했습니다. 




데이터 엑셀 파일은 아래와 같습니다. 

 

1way_ANOVA_R.xlsx
0.01MB

 

 

 

데이터를 R에서 열어봅시다. 코드는 아래와 같습니다. 

 

library(readxl)

md <- read_excel("파일경로/1way_ANOVA_R.xlsx") 

md=as.data.frame(md)

 

View 함수로 열어보면 아래와 같습니다. 

 

View(md)

 

 

 

위 데이터에서 독립변수와 종속변수를 구분해봅시다. 독립변수는 '반'이고, 종속변수는 '점수'입니다. 데이터를 R에서 사용하려면 아래와 같은 형태로 바꿔주어야 합니다. 

 

 

위와 같이 바꾸는 코드는 아래와 같습니다. 

 

#각 반의 데이터를 독립변수, 종속변수 형태로 만들어줌

classA=data.frame(rep("A",length(md$A)),md$A)
classB=data.frame(rep("B",length(md$B)),md$B)
classC=data.frame(rep("C",length(md$C)),md$C)

#열 이름을 통일해줌
colnames(classA)=c("x","y")
colnames(classB)=c("x","y")
colnames(classC)=c("x","y")

#세 반의 데이터를 행 방향으로 합쳐줌
md2=rbind(classA,classB,classC)

 

View 함수로 다시 열어보면 아래와 같습니다. 

 

 

변경이 잘 되었습니다. 

 

2) 분산분석

분산분석에는 aov 함수가 사용됩니다. 사용 형식은 아래와 같습니다. 

 

aov(종속변수~독립변수,데이터)

 

위 데이터에 적용하면 아래와 같습니다. 

 

> aov(y~x,md2)
Call:
   aov(formula = y ~ x, data = md2)

Terms:
                      x Residuals
Sum of Squares   9677.4   33218.6
Deg. of Freedom       2        87

Residual standard error: 19.54029
Estimated effects may be unbalanced

 

p값을 출력하는 방법은 아래와 같습니다. summary 함수를 이용합니다. 

 

> summary(aov(y~x,md2))
            Df Sum Sq Mean Sq F value   Pr(>F)    
x            2   9677    4839   12.67 1.48e-05 ***
Residuals   87  33219     382                     
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

 

p값이 0.05보다 작으므로, 유의차가 있습니다. 하지만 ANOVA 만으로는 어느 그룹간의 유의차가 있는지를 알 수 없습니다. 적어도 두 그룹 모집단의 평균이 서로 다르다는 것만 알 수 있습니다.

어느 그룹간에 유의차가 있는지는 '사후분석'을 통해 알 수 있습니다. 

 

3) 사후분석

사후분석은 여러 종류가 있습니다.

 

 

가장 많이 사용되는 쉐페(Scheffe) 방법을 사용 해봅시다. 먼저 라이브러리를 설치하고 불러옵니다. 먼저 라이브러리를 설치하고 불러옵니다. 

install.packages("DescTools")
library(DescTools)


분산분석 결과를 저장합니다. 

my_aov=aov(y~x,md2)


Scheffe 검정은 아래와 같이 수행합니다. 

 

> ScheffeTest(my_aov)

  Posthoc multiple comparisons of means: Scheffe Test 
    95% family-wise confidence level

$x
    diff    lwr.ci   upr.ci    pval    
B-A 14.6  2.034725 27.16527  0.0184 *  
C-A 25.3 12.734725 37.86527 1.6e-05 ***
C-B 10.7 -1.865275 23.26527  0.1116    

---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

 

A와 B 사이에는 차이가 있고, A와 C 사이에도 차이가 있는 것으로 나옵니다. 

 

 

#전체 코드

library(readxl)
md <- read_excel("경로/1way_ANOVA_R.xlsx")


#각 반의 데이터를 독립변수, 종속변수 형태로 만들어줌

classA=data.frame(rep("A",length(md$A)),md$A)
classB=data.frame(rep("B",length(md$B)),md$B)
classC=data.frame(rep("C",length(md$C)),md$C)

#열 이름을 통일해줌
colnames(classA)=c("x","y")
colnames(classB)=c("x","y")
colnames(classC)=c("x","y")

#세 반의 데이터를 행 방향으로 합쳐줌
md2=rbind(classA,classB,classC)

#ANOVA
my_aov=aov(y~x,md2)
summary(my_aov) #p-value

#scheffe test
library(DescTools)
ScheffeTest(my_aov)
반응형

댓글