R Code Description for One-way ANOVA
이 장에서 공부하게 될 내용은 두 모집단뿐 아니라
셋 이상의 모집단 간의 평균을 비교
하는 방법으로서 널리 사용되는분산분석(Analysis of Variance, ANOVA)
이라는 통계분석 기법이다. 분산분석은 여러 모집단에서의 관측자료를 효과적으로 분석하고 해석하게 해 주는 아주 유용한 분석방법이다. 실제 부딪히게 되는 통계자료의 많은 부분이 분산분석 기법을 필요로 하고 있다. 예를 들어, 소비자 단체에서는 여러 종류의 건전지 중에서 어느 건전지의 수명이 오래가는지 또는 어느 농업 연구가는 여러 품종의 볍씨 중 어느 종의 수확량이 가장 높은지 등에 관심이 있을 수 있다. 여기서 “건전지”와 “볍씨”는 “요인”으로 실험에서 관측값에 영향을 준다고 생각되는 원인이며, 실험을 하기 위한 요인의 조건을 “수준”이라고 한다. 이와 같은 문제를 해결하기 위한 첫 단계에서 바로 분산분석의 기법이 쓰이게 된다.
분산분석은 관측한 자료값들이 다양하게 나타나는 것을 체계적으로 설명하려는 하나의 통계기법이라고 할 수 있다. 즉, 관측값들이 달라지는 것을 여러 요인으로 나누어 각 요인들이 얼마나 변화의 정도에 기여하였는가를 분석하는 것이다. 분산분석의 기법은 실제로 상당히 복잡한 문제에도 적용할 수 있으나 이 장에서는세 집단 이상의 모평균을 비교
하기 위하여 전체의 변동을 두 가지 변동 요인, 즉, 모집단 간의 변동과 모집단 내의 변동으로만 나누어 분석하는 방법만을 공부해 보기로 한다.
자료를 얻는 순서는 완전 랜덤
하게 한다.
예제. 안경의 표면 손상을 방지하려고 A, B, C, D 네 종류의 코팅처리에 대하여 표면보호에 얼마나 효과가 있는지를 비교하여 보았다. 다음의 표는 네 종류로 코팅처리된 안경에서 표면의 마모도를 측정한 자료이다.
Caution!
이 자료로부터 네 종류 코팅처리의 평균 마모도에
차이가 있다고 할 수 있는가?
이제 \(k\)개의 처리를 비교하기 위한 일반적인 분산분석 모형을 이용하여 보자.
다음의 기본적인 분해로부터 \[ \begin{align*} (y_{ij}-\bar{y})=(\bar{y}_i-\bar{y}) + (y_{ij}-\bar{y}_i) \end{align*} \] 양변을 제곱하면 다음을 얻는다. \[ \begin{align*} (y_{ij}-\bar{y})^2=(\bar{y}_i-\bar{y})^2 + (y_{ij}-\bar{y}_i)^2+2(\bar{y}_i-\bar{y})(y_{ij}-\bar{y}_i) \end{align*} \]
위 식을 \(j=1, \ldots, n_i\)에 대하여 더해 주면 오른쪽 세 번째 항이 \(\sum_{j=1}^{n_i} (y_{ij}-\bar{y}_i)=0\)이라는 조건 때문에 0이 된다.
따라서, 양변을 모두 \(j=1,\ldots, n_i\)와 \(i=1, \ldots, k\)에 대하여 더해 주면 제곱합의 분해가 다음과 같이 완성된다.
oneway.test()
를 이용할 수 있다.oneway.test(formula, data, var.equal = FALSE)
formula
: 분산분석을 수행하려 하는 형태로
반응변수 ~ 처리(집단)변수
형식으로 입력data
: 반응변수와 처리변수가 들어있는 데이터
프레임var.equal
: 처리간 분산이 동일한지를 나타내는
논리값으로 처리간 분산이 동일하면 var.equal = TRUE
,
동일하지 않으면 var.equal = FALSE
를 지정Caution!
R에서 분산분석은 함수 aov()
를
통해서도 수행할 수 있으며, 이 함수는 요인을 구성하는 처리들의 분산이
동일하다는 가정 하에서 분석을 수행한다.
aov(formula, data)
formula
: 분산분석을 수행하려 하는 형태로
반응변수 ~ 처리(집단)변수
형식으로 입력data
: 반응변수와 처리변수가 들어있는 데이터
프레임다음 표에 나타난 자료에 대하여 분산분석을 수행하라.
처리 | 관측치 |
1 | 35, 24, 28, 21 |
2 | 19, 14, 14, 13 |
3 | 21, 16, 21, 14 |
# 데이터x1 <- c(35, 24, 28, 21)
x2 <- c(19, 14, 14, 13)
x3 <- c(21, 16, 21, 14)
df <- data.frame(x1, x2, x3)
df
x1 x2 x3
1 35 19 21
2 24 14 16
3 28 14 21
4 21 13 14
df1 <- stack(df) # df의 열을 하나의 열로 바꿈
df1
values ind
1 35 x1
2 24 x1
3 28 x1
4 21 x1
5 19 x2
6 14 x2
7 14 x2
8 13 x2
9 21 x3
10 16 x3
11 21 x3
12 14 x3
# 정규성 검정정
shapiro.test(df1$values)
Shapiro-Wilk normality test
data: df1$values
W = 0.88725, p-value = 0.1086
shapiro.test(df$x1)
Shapiro-Wilk normality test
data: df$x1
W = 0.96203, p-value = 0.7917
shapiro.test(df$x2)
Shapiro-Wilk normality test
data: df$x2
W = 0.77291, p-value = 0.06185
shapiro.test(df$x3)
Shapiro-Wilk normality test
data: df$x3
W = 0.83785, p-value = 0.1892
Caution!
분산분석은 정규성을 가정하기 때문에 함수
shapiro.test()
를 통해 Shapiro-Wilk 검정을 수행할 수 있다.
Shapiro-Wilk 검정의 귀무가설 \(H_0\)은
“주어진 데이터는 정규분포를 따른다.”이고, 대립가설 \(H_1\)은 “주어진 데이터는 정규분포를 따르지
않는다.”이다.
Result!
유의수준 0.05에서 모든 \(p\)-값이 0.05보다 크기 때문에 귀무가설을
기각하지 못한다. 즉, 주어진 데이터는 정규분포를 따른다.
# 등분산 검정
bartlett.test(df1$values, # 관측값
df1$ind) # 처리(집단)변수수
Bartlett test of homogeneity of variances
data: df1$values and df1$ind
Bartlett's K-squared = 1.7832, df = 2, p-value = 0.41
pacman::p_load("car")
leveneTest(values ~ ind, # 관측값 ~ 처리(집단)변수
data = df1)
Levene's Test for Homogeneity of Variance (center = median)
Df F value Pr(>F)
group 2 1.5283 0.2683
9
Caution!
분산분석은 등분산성을 가정하기 때문에 함수
bartlett.test()
와 leveneTest()
를 통해 등분산
검정을 수행할 수 있다. 두 함수의 귀무가설 \(H_0\)은 “모든 집단의 분산은 동일하다.”이고,
대립가설 \(H_1\)은 “적어도 하나 이상의
집단의 분산은 동일하지 않다.”이다.
Result!
유의수준 0.05에서 모든 \(p\)-값이 0.05보다 크기 때문에 귀무가설을
기각하지 못한다. 즉, 모든 집단의 분산은 동일하다.
# ANOVA 검정 1
fit <- oneway.test(values ~ ind, # 관측값 ~ 처리(집단)변수
data = df1,
var.equal = TRUE)
fit
One-way analysis of means
data: values and ind
F = 8.2588, num df = 2, denom df = 9, p-value = 0.00919
Caution!
위의 예제에서 귀무가설 \(H_0\)은 \(\mu_1=\mu_2=\mu_3\), 즉, 모든 처리의
모평균은 동일하다이며, 대립가설은 적어도 하나 이상의 처리에 평균 차이가
있다는 것이다.
Result!
검정통계량 \(F\)
값이 8.2588이며, \(p\)-값이
0.00919이다. 이에 근거하여, 유의수준 0.05에서 \(p\)-값이 0.05보다 작기 때문에 귀무가설을
기각할 수 있다. 즉, 적어도 하나 이상의 처리에 평균 차이가 있다.
Df Sum Sq Mean Sq F value Pr(>F)
ind 2 312 156.00 8.259 0.00919 **
Residuals 9 170 18.89
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Caution!
함수 aov()
를 이용하면 함수
summary()
를 통해 분산분석표를 출력할 수 있다.
Caution!
함수 plot()
은 잔차에 대한 여러
그림을 제공한다.
Result!
첫 번째 그림은 각 처리의 평균 대비 잔차의 그래프를
보여준다. 각 처리의 평균이 처리 2 \(<\) 처리 3 \(<\) 처리 1이므로 가로축을 기준으로 처리
2, 처리 3, 처리 1의 찬자를 보여준다. 잔차가 0을 기준으로 대칭적으로
분포하고 있으나 처리 1의 잔차가 두 처리의 잔차보다 더 넓게 퍼져있으므로
등분산성 가정을 의심해봐야 한다. 두 번째 그림은 잔차의 정규성을 파악할
수 있는데, 점들이 직선과 가까우면 잔차의 정규성은 만족한다. 세 번째
그림은 처리별로 표준화된 잔차의 절대값에 제곱근을 취한 값의 분포를
보여준다. 평균잔차선을 나타내는 빨간색 선은 등분산을 만족하면 직선의
형태를 가진다. 네 번째 그림도 처리별로 표준화된 잔차를 보여준다. 0을
기준으로 각 처리별로 점의 분포가 동일하면 등분산성을 만족하며, -2와
2사이에 점들이 있으면 정규성을 만족한다.
Caution!
만약 분산분석에서 적어도 하나 이상의 처리에서
평균 차이가 있을 때 사후검정(다중비교)을 수행할 수 있다. 사후검정이란
분산분석을 통해 처리간에 평균 차이가 있다고 결론이 났을 때, 어느
처리간에 차이가 있는 것인지 알아보기 위해 두 처리씩 짝을 지어서 처리간
검정을 수행한다. 즉, 귀무가설 \(H_0\)은
\(\mu_i=\mu_j\)이고 대립가설 \(H_1\)은 \(\mu_i\ne \mu_j\)이다. R에서 사후분석을
수행하기 위해 Package agricolae
를 이용하였다. Package
agricolae
은 사후분석을 위해 다양한 함수를 제공하고 있으며
여기에서
참고할 수 있다. 위의 예제에는 함수 scheffe.test()
를
이용하였다.
pacman::p_load("agricolae")
scheffe <- scheffe.test(fit, # ANOVA 결과를 저장한 객체 "ind", # 처리(집단)변수수
group = TRUE, # 사후분석 결과 그룹 출력 여부
console = TRUE) # 결과 출력
Study: fit ~ "ind"
Scheffe Test for values
Mean Square Error : 18.88889
ind, means
values std r Min Max
x1 27 6.055301 4 21 35
x2 15 2.708013 4 13 19
x3 18 3.559026 4 14 21
Alpha: 0.05 ; DF Error: 9
Critical Value of F: 4.256495
Minimum Significant Difference: 8.96663
Means with the same letter are not significantly different.
values groups
x1 27 a
x3 18 b
x2 15 b
scheffe
$statistics
MSerror Df F Mean CV Scheffe CriticalDifference
18.88889 9 4.256495 20 21.73067 2.917703 8.96663
$parameters
test name.t ntr alpha
Scheffe ind 3 0.05
$means
values std r Min Max Q25 Q50 Q75
x1 27 6.055301 4 21 35 23.25 26.0 29.75
x2 15 2.708013 4 13 19 13.75 14.0 15.25
x3 18 3.559026 4 14 21 15.50 18.5 21.00
$comparison
NULL
$groups
values groups
x1 27 a
x3 18 b
x2 15 b
attr(,"class")
[1] "group"
Result!
출력된 결과에서 마지막 표를 보면, 처리 1은 “a”
그룹, 처리 2와 3은 “b” 그룹으로 분리되었다. 이것은 처리 1은 처리 2, 3과
모평균에 차이가 있기 때문에 다른 그룹으로 분리되었으며, 처리 2와 3은
모평균에 차이가 없기 때문에 같은 그룹으로 묶였다.
plot(scheffe)
어느 공장에서 열처리 온도에 따라서 제품의 강도가 차이가 보이는지 조사하기 위해 열처리 온도를 아래와 같이 설정하고 다음의 자료를 얻었다. 해당 자료를 이용하여 분산분석을 수행하라.
온도 | 제품의 강도 |
125℃ | 23, 27, 24, 25, 29, 30 |
150℃ | 35, 32, 38, 36, 32, 33 |
175℃ | 36, 41, 38, 39, 40, 38 |
200℃ | 32, 30, 37, 34, 35, 34 |
# 데이터x1 <- c(23, 27, 24, 25, 29, 30)
x2 <- c(35, 32, 38, 36, 32, 33)
x3 <- c(36, 41, 38, 39, 40, 38)
x4 <- c(32, 30, 37, 34, 35, 34)
df <- data.frame(x1, x2, x3, x4)
df
x1 x2 x3 x4
1 23 35 36 32
2 27 32 41 30
3 24 38 38 37
4 25 36 39 34
5 29 32 40 35
6 30 33 38 34
df1 <- stack(df) # df의 열을 하나의 열로 바꿈
df1
values ind
1 23 x1
2 27 x1
3 24 x1
4 25 x1
5 29 x1
6 30 x1
7 35 x2
8 32 x2
9 38 x2
10 36 x2
11 32 x2
12 33 x2
13 36 x3
14 41 x3
15 38 x3
16 39 x3
17 40 x3
18 38 x3
19 32 x4
20 30 x4
21 37 x4
22 34 x4
23 35 x4
24 34 x4
# 정규성 검정정
shapiro.test(df1$values)
Shapiro-Wilk normality test
data: df1$values
W = 0.95511, p-value = 0.3482
shapiro.test(df$x1)
Shapiro-Wilk normality test
data: df$x1
W = 0.94009, p-value = 0.6599
shapiro.test(df$x2)
Shapiro-Wilk normality test
data: df$x2
W = 0.9067, p-value = 0.415
shapiro.test(df$x3)
Shapiro-Wilk normality test
data: df$x3
W = 0.974, p-value = 0.9181
shapiro.test(df$x4)
Shapiro-Wilk normality test
data: df$x4
W = 0.97319, p-value = 0.9131
Caution!
분산분석은 정규성을 가정하기 때문에 함수
shapiro.test()
를 통해 Shapiro-Wilk 검정을 수행할 수 있다.
Shapiro-Wilk 검정의 귀무가설 \(H_0\)은
“주어진 데이터는 정규분포를 따른다.”이고, 대립가설 \(H_1\)은 “주어진 데이터는 정규분포를 따르지
않는다.”이다.
Result!
유의수준 0.05에서 모든 \(p\)-값이 0.05보다 크기 때문에 귀무가설을
기각하지 못한다. 즉, 주어진 데이터는 정규분포를 따른다.
# 등분산 검정
bartlett.test(df1$values, # 관측값
df1$ind) # 처리(집단)변수수
Bartlett test of homogeneity of variances
data: df1$values and df1$ind
Bartlett's K-squared = 0.99972, df = 3, p-value = 0.8013
pacman::p_load("car")
leveneTest(values ~ ind, # 관측값 ~ 처리(집단)변수
data = df1)
Levene's Test for Homogeneity of Variance (center = median)
Df F value Pr(>F)
group 3 0.7055 0.5599
20
Caution!
분산분석은 등분산성을 가정하기 때문에 함수
bartlett.test()
와 leveneTest()
를 통해 등분산
검정을 수행할 수 있다. 두 함수의 귀무가설 \(H_0\)은 “모든 집단의 분산은 동일하다.”이고,
대립가설 \(H_1\)은 “적어도 하나 이상의
집단의 분산은 동일하지 않다.”이다.
Result!
유의수준 0.05에서 모든 \(p\)-값이 0.05보다 크기 때문에 귀무가설을
기각하지 못한다. 즉, 모든 집단의 분산은 동일하다.
# ANOVA 검정 1
fit <- oneway.test(values ~ ind, # 관측값 ~ 처리(집단)변수
data = df1,
var.equal = TRUE)
fit
One-way analysis of means
data: values and ind
F = 27.716, num df = 3, denom df = 20, p-value = 2.522e-07
Caution!
위의 예제에서 귀무가설 \(H_0\)은 \(\mu_1=\mu_2=\mu_3=\mu_4\), 즉, 모든 처리의
모평균은 동일하다이며, 대립가설은 적어도 하나 이상의 처리에 평균 차이가
있다는 것이다.
Result!
검정통계량 \(F\)
값이 27.716이며, \(p\)-값이 0에 가깝다.
이에 근거하여, 유의수준 0.05에서 \(p\)-값이 0.05보다 작기 때문에 귀무가설을
기각할 수 있다. 즉, 적어도 하나 이상의 처리에 평균 차이가 있다.
Df Sum Sq Mean Sq F value Pr(>F)
ind 3 471.2 157.06 27.72 2.52e-07 ***
Residuals 20 113.3 5.67
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Caution!
함수 aov()
를 이용하면 함수
summary()
를 통해 분산분석표를 출력할 수 있다.
Caution!
함수 plot()
은 잔차에 대한 여러
그림을 제공한다.
Result!
첫 번째 그림은 각 처리의 평균 대비 잔차의 그래프를
보여준다. 각 처리의 평균이 125℃ \(<\) 200℃\(<\) 150℃\(<\) 175℃이므로 가로축을 기준으로 125℃,
200℃, 150℃, 175℃의 찬자를 보여준다. 두 번째 그림은 잔차의 정규성을
파악할 수 있는데, 점들이 직선과 가까우면 잔차의 정규성은 만족한다. 세
번째 그림은 처리별로 표준화된 잔차의 절대값에 제곱근을 취한 값의 분포를
보여준다. 평균잔차선을 나타내는 빨간색 선은 등분산을 만족하면 직선의
형태를 가진다. 네 번째 그림도 처리별로 표준화된 잔차를 보여준다. 0을
기준으로 각 처리별로 점의 분포가 동일하면 등분산성을 만족하며, -2와
2사이에 점들이 있으면 정규성을 만족한다.
# 사후분석
pacman::p_load("agricolae")
duncan <- duncan.test(fit, # ANOVA 결과를 저장한 객체 "ind", # 처리(집단)변수수
group = TRUE, # 사후분석 결과 그룹 출력 여부
console = TRUE) # 결과 출력
Study: fit ~ "ind"
Duncan's new multiple range test
for values
Mean Square Error: 5.666667
ind, means
values std r Min Max
x1 26.33333 2.804758 6 23 30
x2 34.33333 2.422120 6 32 38
x3 38.66667 1.751190 6 36 41
x4 33.66667 2.422120 6 30 37
Alpha: 0.05 ; DF Error: 20
Critical Range
2 3 4
2.866882 3.009263 3.099750
Means with the same letter are not significantly different.
values groups
x3 38.66667 a
x2 34.33333 b
x4 33.66667 b
x1 26.33333 c
duncan
$statistics
MSerror Df Mean CV
5.666667 20 33.25 7.159327
$parameters
test name.t ntr alpha
Duncan ind 4 0.05
$duncan
Table CriticalRange
2 2.949998 2.866882
3 3.096506 3.009263
4 3.189616 3.099750
$means
values std r Min Max Q25 Q50 Q75
x1 26.33333 2.804758 6 23 30 24.25 26.0 28.50
x2 34.33333 2.422120 6 32 38 32.25 34.0 35.75
x3 38.66667 1.751190 6 36 41 38.00 38.5 39.75
x4 33.66667 2.422120 6 30 37 32.50 34.0 34.75
$comparison
NULL
$groups
values groups
x3 38.66667 a
x2 34.33333 b
x4 33.66667 b
x1 26.33333 c
attr(,"class")
[1] "group"
Result!
출력된 결과에서 마지막 표를 보면, 175℃가
“a”그룹, 200℃와 150℃가 “b” 그룹, 125℃가 “c” 그룹으로 분리되었다. 이는
같은 그룹끼리는 모평균에 차이가 없음을 의미하며, 다른 그룹들 간에는
모평균에 차이가 있음을 의미한다.
plot(duncan)
4가지 교육방법의 효과를 비교분석하기 위하여 4조로 나누어 다음과 같은 점수를 얻었다. 해당 자료를 이용하여 분산분석을 수행하라.
교육방법 | 기말고사 성적 |
1 | 65, 87, 73, 79, 81, 69 |
2 | 75, 69, 83, 81, 72, 79, 90 |
3 | 59, 78, 67, 62, 83, 76 |
4 | 94, 89, 80, 88 |
# 데이터x1 <- c(65, 87, 73, 79, 81, 69)
x2 <- c(75, 69, 83, 81, 72, 79, 90)
x3 <- c(59, 78, 67, 62, 83, 76)
x4 <- c(94, 89, 80, 88)
df1 <- data.frame("values" = c(x1, x2, x3, x4), # 관측값
"ind" = rep(c("x1", "x2", "x3", "x4"), c(6, 7, 6, 4))) # 처리(집단)변수수
df1$ind <- as.factor(df1$ind) # 범주형 변환df1
values ind
1 65 x1
2 87 x1
3 73 x1
4 79 x1
5 81 x1
6 69 x1
7 75 x2
8 69 x2
9 83 x2
10 81 x2
11 72 x2
12 79 x2
13 90 x2
14 59 x3
15 78 x3
16 67 x3
17 62 x3
18 83 x3
19 76 x3
20 94 x4
21 89 x4
22 80 x4
23 88 x4
# 정규성 검정정
shapiro.test(df1$values)
Shapiro-Wilk normality test
data: df1$values
W = 0.98102, p-value = 0.9227
shapiro.test(x1)
Shapiro-Wilk normality test
data: x1
W = 0.9767, p-value = 0.934
shapiro.test(x2)
Shapiro-Wilk normality test
data: x2
W = 0.98148, p-value = 0.9664
shapiro.test(x3)
Shapiro-Wilk normality test
data: x3
W = 0.9354, p-value = 0.6224
shapiro.test(x4)
Shapiro-Wilk normality test
data: x4
W = 0.95092, p-value = 0.7219
Caution!
분산분석은 정규성을 가정하기 때문에 함수
shapiro.test()
를 통해 Shapiro-Wilk 검정을 수행할 수 있다.
Shapiro-Wilk 검정의 귀무가설 \(H_0\)은
“주어진 데이터는 정규분포를 따른다.”이고, 대립가설 \(H_1\)은 “주어진 데이터는 정규분포를 따르지
않는다.”이다.
Result!
유의수준 0.05에서 모든 \(p\)-값이 0.05보다 크기 때문에 귀무가설을
기각하지 못한다. 즉, 주어진 데이터는 정규분포를 따른다.
# 등분산 검정
bartlett.test(df1$values, # 관측값
df1$ind) # 처리(집단)변수수
Bartlett test of homogeneity of variances
data: df1$values and df1$ind
Bartlett's K-squared = 0.94217, df = 3, p-value = 0.8152
pacman::p_load("car")
leveneTest(values ~ ind, # 관측값 ~ 처리(집단)변수
data = df1)
Levene's Test for Homogeneity of Variance (center = median)
Df F value Pr(>F)
group 3 1.2125 0.3323
19
Caution!
분산분석은 등분산성을 가정하기 때문에 함수
bartlett.test()
와 leveneTest()
를 통해 등분산
검정을 수행할 수 있다. 두 함수의 귀무가설 \(H_0\)은 “모든 집단의 분산은 동일하다.”이고,
대립가설 \(H_1\)은 “적어도 하나 이상의
집단의 분산은 동일하지 않다.”이다.
Result!
유의수준 0.05에서 모든 \(p\)-값이 0.05보다 크기 때문에 귀무가설을
기각하지 못한다. 즉, 모든 집단의 분산은 동일하다.
# ANOVA 검정 1
fit <- oneway.test(values ~ ind, # 관측값 ~ 처리(집단)변수
data = df1,
var.equal = TRUE)
fit
One-way analysis of means
data: values and ind
F = 3.7715, num df = 3, denom df = 19, p-value = 0.02804
Caution!
위의 예제에서 귀무가설 \(H_0\)은 \(\mu_1=\mu_2=\mu_3=\mu_4\), 즉, 모든 처리의
모평균은 동일하다이며, 대립가설은 적어도 하나 이상의 처리에 평균 차이가
있다는 것이다.
Result!
검정통계량 \(F\)
값이 3.7715이며, \(p\)-값이
0.02804이다. 이에 근거하여, 유의수준 0.05에서 \(p\)-값이 0.05보다 작기 때문에 귀무가설을
기각할 수 있다. 즉, 적어도 하나 이상의 처리에 평균 차이가 있다.
Df Sum Sq Mean Sq F value Pr(>F)
ind 3 712.6 237.53 3.771 0.028 *
Residuals 19 1196.6 62.98
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Caution!
함수 aov()
를 이용하면 함수
summary()
를 통해 분산분석표를 출력할 수 있다.
Caution!
함수 plot()
은 잔차에 대한 여러
그림을 제공한다.
Result!
첫 번째 그림은 각 처리의 평균 대비 잔차의 그래프를
보여준다. 각 처리의 평균이 교육방법 3 \(<\) 교육방법 1 \(<\) 교육방법 2 \(<\) 교육방법 4이므로 가로축을 기준으로
교육방법 3,교육방법 1, 교육방법 2, 교육방법 4의 찬자를 보여준다. 잔차가
0을 기준으로 대칭적으로 분포하고 있으나 처리 1의 잔차가 두 처리의
잔차보다 더 넓게 퍼져있으므로 등분산성 가정을 의심해봐야 한다. 두 번째
그림은 잔차의 정규성을 파악할 수 있는데, 점들이 직선과 가까우면 잔차의
정규성은 만족한다. 세 번째 그림은 처리별로 표준화된 잔차의 절대값에
제곱근을 취한 값의 분포를 보여준다. 평균잔차선을 나타내는 빨간색 선은
등분산을 만족하면 직선의 형태를 가진다. 네 번째 그림도 처리별로 표준화된
잔차를 보여준다. 0을 기준으로 각 처리별로 점의 분포가 동일하면
등분산성을 만족하며, -2와 2사이에 점들이 있으면 정규성을 만족한다.
# 사후분석
pacman::p_load("agricolae")
scheffe <- scheffe.test(fit, # ANOVA 결과를 저장한 객체 "ind", # 처리(집단)변수수
group = TRUE, # 사후분석 결과 그룹 출력 여부
console = TRUE) # 결과 출력
Study: fit ~ "ind"
Scheffe Test for values
Mean Square Error : 62.98058
ind, means
values std r Min Max
x1 75.66667 8.164966 6 65 87
x2 78.42857 7.114706 7 69 90
x3 70.83333 9.579492 6 59 83
x4 87.75000 5.795113 4 80 94
Alpha: 0.05 ; DF Error: 19
Critical Value of F: 3.12735
Groups according to probability of means differences and alpha level( 0.05 )
Means with the same letter are not significantly different.
values groups
x4 87.75000 a
x2 78.42857 ab
x1 75.66667 ab
x3 70.83333 b
scheffe
$statistics
MSerror Df F Mean CV
62.98058 19 3.12735 77.34783 10.26019
$parameters
test name.t ntr alpha
Scheffe ind 4 0.05
$means
values std r Min Max Q25 Q50 Q75
x1 75.66667 8.164966 6 65 87 70.00 76.0 80.50
x2 78.42857 7.114706 7 69 90 73.50 79.0 82.00
x3 70.83333 9.579492 6 59 83 63.25 71.5 77.50
x4 87.75000 5.795113 4 80 94 86.00 88.5 90.25
$comparison
NULL
$groups
values groups
x4 87.75000 a
x2 78.42857 ab
x1 75.66667 ab
x3 70.83333 b
attr(,"class")
[1] "group"
Result!
출력된 결과에서 마지막 표를 보면, 교육방법 1, 2,
4가 “a” 그룹, 교육방법 2, 1, 3이 “b” 그룹으로 분리되었다. 이는 같은
그룹끼리는 모평균에 차이가 없으며, 다른 그룹끼리는 모평균에 차이가
있음을 나타낸다.
plot(scheffe)
Text and figures are licensed under Creative Commons Attribution CC BY 4.0. The figures that have been reused from other sources don't fall under this license and can be recognized by a note in their caption: "Figure from ...".