1 데이터 불러오기


getwd()
## [1] "C:/data"
# install.packages('readxl')
library(readxl)
data_anova <- read_excel("data_anova.xlsx", sheet = "표1")


2 데이터 시각화 및 주요 기술통계


데이터의 분포를 박스 플롯으로 시각화하고 주요 기술통계를 본다.


# boxplot

boxplot(값 ~ 특성, 
        data=data_anova,
        main = "Boxplot of evaluation for each question", 
        xlab = "Factor Levels : questions", 
        ylab = "evauation")

# descriptive statistics by group
tapply(data_anova$값, data_anova$특성, summary)
## $A
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   58.79   66.17   69.67   69.67   73.16   83.35 
## 
## $B
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   58.22   70.78   75.06   74.74   78.36   91.31 
## 
## $C
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   54.33   65.00   68.85   68.46   71.95   80.73 
## 
## $D
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   49.84   61.58   65.25   64.92   68.48   77.39 
## 
## $E
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   61.51   70.05   73.35   73.24   76.47   88.90 
## 
## $F
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   60.08   67.94   71.28   71.24   74.58   82.90


3 ANOVA 수행


제안별 수용도에서 하나 이상의 차이가 있는지 확인하기 위해 ANOVA를 수행한다.

# one-wayANOVA
result <- aov(값 ~ 특성, data = data_anova)
summary(result)
##               Df Sum Sq Mean Sq F value Pr(>F)    
## 특성           5  18602    3720   149.4 <2e-16 ***
## Residuals   1794  44664      25                   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# anova(result)
model.tables(result) # 전체 평균 대비 각 그룹 수용도의 차이
## Tables of effects
## 
##  특성 
## 특성
##      A      B      C      D      E      F 
## -0.710  4.362 -1.921 -5.462  2.865  0.866


일원 분산분석 결과 최소한 하나 이상의 오퍼에 대한 수용도 차이가 있다고 보인다. (p<0.05이므로)

오퍼별 평균 대비 상대적 값을 본 결과, B,E 오퍼에 대한 수용도가 높은 반면 C,D에 대한 수용도는 낮은 것으로 보인다.


4 정규성 검정


표본수가 30 이상이므로 정규성 검정은 할 필요가 없으나 학습과정이므로 시행한다.


# 잔차에 대한 정규성 검정
shapiro.test(result$residuals)
## 
##  Shapiro-Wilk normality test
## 
## data:  result$residuals
## W = 0.99843, p-value = 0.09167
# 잔차에 대한 정규성 검정: anderson darling test (표본수가 5000이상일 때)
# install.packages("nortest")
library(nortest)
ad.test(result$residuals)
## 
##  Anderson-Darling normality test
## 
## data:  result$residuals
## A = 0.78864, p-value = 0.04081


shapiro.test결과는 정규성을 위배하지 않는다고 나왔지만 anderson darling test결과로는 위배하는 것으로 파악된다. 하지만 표본수가 충분히 크기 때문에 정규성 가정은 신경쓰지 않는다.


5 등분산성 검정


등분산성을 가설검정할 때 요인의 수준이 2 개인 경우에는 두 모집단의 분산의 차이 검정을 F-분포를 사용하여 수행할 수 있다. 이 경우에는 var.test() 함수를 이용하여 가설검정을 수행하였다. 그러나 요인의 수준이 3 개 이상인 경우에는 bartlet.test()을 사용한다.


# Bartlett test to test the null hypothesis of equal group variances: 등분산 검정
bartlett.test(값 ~ 특성, data = data_anova)
## 
##  Bartlett test of homogeneity of variances
## 
## data:  값 by 특성
## Bartlett's K-squared = 8.6907, df = 5, p-value = 0.1221


p-값>0.05이므로 등분산 가정을 기각하지 못했다.


6 다중 비교


ANOVA 분석을 통해 평균이 같다는 귀무가설이 기각되면, 어느 수준 간의 차이에 의해 귀무가설이 기각되었는지 살펴보아야 한다. 이를 살펴보는 방법 중 하나가 가능한 모든 두 수준 간에 평균의 차이가 있었는지를 가설검정해 보는 것이다. 이는 두 모집단 간의 모평균 비교와 같아진다. 다만 수준이 많은 경우 단순히 두 수준 간의 평균의 차이를 가설검정하는 것은 여러 개의 가설을 동시적으로 검정하는 것이 되어서 기각역 또는 p-값의 조정이 필요하다. R의 기본 기능에 포함되어 있는 TukeyHSD() 함수와 scheffe.test는 이러한 수준별 쌍 비교를 수행해 준다.


##------------------------------------------------------------------
## multiple comparison 
## - Tukey's HSD(honestly significant difference) test : TukeyHSD()
##------------------------------------------------------------------

TukeyHSD(result)
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = 값 ~ 특성, data = data_anova)
## 
## $특성
##          diff         lwr         upr     p adj
## B-A  5.071821   3.9095902  6.23405206 0.0000000
## C-A -1.211064  -2.3732952 -0.04883339 0.0353955
## D-A -4.751949  -5.9141802 -3.58971834 0.0000000
## E-A  3.574484   2.4122533  4.73671518 0.0000000
## F-A  1.575414   0.4131828  2.73764465 0.0015912
## C-B -6.282885  -7.4451164 -5.12065452 0.0000000
## D-B -9.823770 -10.9860013 -8.66153948 0.0000000
## E-B -1.497337  -2.6595678 -0.33510595 0.0033332
## F-B -3.496407  -4.6586383 -2.33417648 0.0000000
## D-C -3.540885  -4.7031159 -2.37865403 0.0000000
## E-C  4.785549   3.6233176  5.94777949 0.0000000
## F-C  2.786478   1.6242471  3.94870897 0.0000000
## E-D  8.326434   7.1642026  9.48866445 0.0000000
## F-D  6.327363   5.1651321  7.48959392 0.0000000
## F-E -1.999071  -3.1613015 -0.83683960 0.0000149
tapply(data_anova$값, data_anova$특성, mean)
##        A        B        C        D        E        F 
## 69.66722 74.73904 68.45616 64.91527 73.24171 71.24264


위의 모든 비교에서 유의미한 차이가 있다고 보이므로 앞서 봤던 평균 순서 그대로 차이가 있다고 판단된다.

\[B>E>F>A>C>D\]

##------------------------------------------------------------------
## multiple comparison 
## - Scheffe test : scheffe.test()
##------------------------------------------------------------------

# install.packages('agricolae')
library(agricolae)

scheffe.test(result,"특성",alpha = 0.05,group=TRUE,console=TRUE)
## 
## Study: result ~ "특성"
## 
## Scheffe Test for 값 
## 
## Mean Square Error  : 24.89632 
## 
## 특성,  means
## 
##         값      std   r        se      Min      Max      Q25      Q50      Q75
## A 69.66722 4.773053 300 0.2880759 58.79182 83.35249 66.16948 69.67084 73.16403
## B 74.73904 5.358928 300 0.2880759 58.21940 91.30598 70.77921 75.06022 78.35956
## C 68.45616 4.941499 300 0.2880759 54.33159 80.72676 65.00495 68.85282 71.95412
## D 64.91527 5.265326 300 0.2880759 49.83550 77.38503 61.58378 65.24671 68.47830
## E 73.24171 4.692675 300 0.2880759 61.51371 88.89632 70.04562 73.35434 76.46883
## F 71.24264 4.869756 300 0.2880759 60.07674 82.90091 67.93614 71.27999 74.57515
## 
## Alpha: 0.05 ; DF Error: 1794 
## Critical Value of F: 2.219085 
## 
## Minimum Significant Difference: 1.357044 
## 
## Means with the same letter are not significantly different.
## 
##         값 groups
## B 74.73904      a
## E 73.24171      b
## F 71.24264      c
## A 69.66722      d
## C 68.45616      d
## D 64.91527      e


또 다른 다중 비교 방법인 scheffe test 결과도 거의 비슷하게 나왔지만 A와 C는 차이가 없는 것으로 판단했다.


\[B>E>F>A=C>D\]