본문 바로가기
R 주제/R 기초 및 통계 강의

[R강의] 122. 분산분석 (일원분산분석)

by 만다린망고 2021. 8. 31.
반응형

 

 

t검정은 두 집단의 평균을 비교할 때 사용하는 통계분석이었습니다. 만약 세 그룹 이상을 비교하려면 어떤 검정 방법을 사용해야 할까요? 이런 경우 사용하는 방법이 '분산분석'입니다. 

 

분산분석은 세 집단 이상의 평균을 비교할 때 사용하는 통계분석입니다. 분산분석은 독립변수의 개수와 종속변수의 개수에 따라 여러 종류로 나뉩니다. 

 

 

가장 간단한 형태의 분산분석은 독립변수도 하나이고, 종속변수도 하나인 '일원분산분석'입니다. 영어로는 One-way ANOVA 입니다. 

 

예를 들어 A,B,C 세 반의 수학점수 비교에 사용되는 방법이 일원분산분석입니다. 독립변수는 반의 종류, 종속변수는 수학점수 입니다. 

 

독립변수(반의 종류) = {A,B,C}

종속변수(점수) = 0~100 인 정수

 

독립변수는 범주형, 종속변수는 수치형임을 알 수 있습니다. 

 

분산분석의 귀무가설은 아래와 같습니다.

귀무가설 : 모든 그룹의 평균은 같다.

대립가설 : 평균이 서로 다른 그룹이 존재한다. 

귀무가설이 기각된다는 것은 세 집단의 평균이 전부 같지는 않다는 것입니다. 분산분석 만으로는 어느 집단 간에 차이가 있는지를 알 수는 없습니다. 이를 알기 위해 하는 분석이 '사후분석'입니다. 

 

일원분산분석의 조건

일원분산분석은 아래 세가지 조건을 만족한 경우 사용 가능합니다.

1) 독립성 : 각 그룹은 서로 독립
2) 정규성 : 각 그룹은 정규분포를 따름
3) 등분산성 : 그룹들의 분산은 동일함

 

 

분산분석 실습

1) 데이터 불러오기

아래 데이터를 다운받아서 R 스튜디오에서 불러오면 됩니다. 세 반의 평균데이터입니다. 

 

R_OneWay_ANOVA.xlsx
0.01MB

 

R스튜디오를 열고 [File]-[Import Dataset]-[From Excel] 클릭

 

 

파일 저장경로를 찾아 열어줍니다. 우측 아래의 코드 프리뷰 내용을 복사합니다. 

 

 

R 스크립트에 붙여넣어줍니다. 

 

library(readxl)
R_OneWayANOVA <- read_excel("여러분경로/R_OneWayANOVA.xlsx")
View(R_OneWayANOVA)

 

실행시켜보면 View 창이 뜹니다. 세 반 학생의 점수입니다. 

 

 

데이터 변수 이름이 너무 길어서 아래와 같이 수정하였습니다. 디폴트가 티플이라 데이터프레임 형식으로 바꿔줍니다. 

 

library(readxl)
dt <- read_excel("여러분경로/R_OneWayANOVA.xlsx")
dt=as.data.frame(dt)

 

 

2) 데이터 변형

아래 형태의 데이터로 변형해야합니다. 

 

독립변수(반) 종속변수(점수)
A 67
A 58

 

아래와 같이 변형합니다. 

 

ind = c(rep("A", 30), rep("B", 30), rep("C", 30))
dep = c(dt[,2], dt[,3], dt[,4])

dt_f=data.frame(ind,dep)


> head(dt_f)
  ind dep
1   A  76
2   A  89
3   A  64
4   A  99
5   A  80
6   A  80

 

 

3) 상자수염그림 (boxplot)

상자수염그림도 그려봅시다. 

 

boxplot(dep~ind,dt_f)

 

4) 등분산검정

 

levene's 검정을 합니다. 등분산 가정이 가능합니다. 

 

#등분산 검정
#install.packages("lawstat")
library(lawstat)
levene.test(dt_f$dep,dt_f$ind,location="mean")


> levene.test(dt_f$dep,dt_f$ind,location="mean")

	Classical Levene's test based on the absolute deviations from the mean ( none not applied because the
	location is not set to median )

data:  dt_f$dep
Test Statistic = 0.20515, p-value = 0.8149

 

 

5) 분산분석

aov함수를 이용합니다. 아래 형식으로 사용하면 됩니다. 

 

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

 

my_aov=aov(dep~ind,dt_f)

> my_aov
Call:
   aov(formula = dep ~ ind, data = dt_f)

Terms:
                   ind Residuals
Sum of Squares  9526.4    8388.1
Deg. of Freedom      2        87

Residual standard error: 9.819111
Estimated effects may be unbalanced

 

p 값을 추출하려면 summary 함수를 사용해야합니다. 유의차가 있다고 나옵니다. 

 

> summary(my_aov)
            Df Sum Sq Mean Sq F value   Pr(>F)    
ind          2   9526    4763    49.4 4.62e-15 ***
Residuals   87   8388      96                     
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

 

어느반과 어느반이 사이에 유의차가 있는 것인지 모르기 때문에 사후분석을 해야합니다. 


코드 모아보기

library(readxl)
dt <- read_excel("여러분 경로/R_OneWayANOVA.xlsx")
dt=as.data.frame(dt)


#데이터 변형
ind = c(rep("A", 30), rep("B", 30), rep("C", 30))
dep = c(dt[,2], dt[,3], dt[,4])
dt_f=data.frame(ind,dep)


#boxplot 그려보기
boxplot(dep~ind,dt_f)


#등분산 검정
#install.packages("lawstat")
library(lawstat)
levene.test(dt_f$dep,dt_f$ind,location="mean")


#분산분석
my_aov=aov(dep~ind,dt_f)
summary(aov(dep~ind,dt_f))

 

반응형

댓글