t검정은 두 집단의 평균을 비교할 때 사용하는 통계분석이었습니다. 만약 세 그룹 이상을 비교하려면 어떤 검정 방법을 사용해야 할까요? 이런 경우 사용하는 방법이 '분산분석'입니다.
분산분석은 세 집단 이상의 평균을 비교할 때 사용하는 통계분석입니다. 분산분석은 독립변수의 개수와 종속변수의 개수에 따라 여러 종류로 나뉩니다.
가장 간단한 형태의 분산분석은 독립변수도 하나이고, 종속변수도 하나인 '일원분산분석'입니다. 영어로는 One-way ANOVA 입니다.
예를 들어 A,B,C 세 반의 수학점수 비교에 사용되는 방법이 일원분산분석입니다. 독립변수는 반의 종류, 종속변수는 수학점수 입니다.
독립변수(반의 종류) = {A,B,C}
종속변수(점수) = 0~100 인 정수
독립변수는 범주형, 종속변수는 수치형임을 알 수 있습니다.
분산분석의 귀무가설은 아래와 같습니다.
귀무가설 : 모든 그룹의 평균은 같다.
대립가설 : 평균이 서로 다른 그룹이 존재한다.
귀무가설이 기각된다는 것은 세 집단의 평균이 전부 같지는 않다는 것입니다. 분산분석 만으로는 어느 집단 간에 차이가 있는지를 알 수는 없습니다. 이를 알기 위해 하는 분석이 '사후분석'입니다.
일원분산분석의 조건
일원분산분석은 아래 세가지 조건을 만족한 경우 사용 가능합니다.
1) 독립성 : 각 그룹은 서로 독립
2) 정규성 : 각 그룹은 정규분포를 따름
3) 등분산성 : 그룹들의 분산은 동일함
분산분석 실습
1) 데이터 불러오기
아래 데이터를 다운받아서 R 스튜디오에서 불러오면 됩니다. 세 반의 평균데이터입니다.
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))
'R 주제 > R 기초 및 통계 강의' 카테고리의 다른 글
[R강의] 124. 카이제곱검정 하는 방법 (+ Yates' continuity correction 무엇인가) (0) | 2021.09.09 |
---|---|
[R강의] 123. 사후검정 (Tukey test) (0) | 2021.09.09 |
[R강의] 121. 축제거, 눈금제거, 축이름제거 (0) | 2021.08.13 |
[R강의] 120. for문에서 스킵할때 쓰는 next (0) | 2021.08.13 |
[R강의] 119. 정수를 쪼개서 각각의 숫자를 벡터로 만들기 (strsplit) (0) | 2021.07.12 |
댓글