심리학 연구에서 가장 많이 쓰이는 통계적 tool은 단연 ANOVA이다. 어찌나 아노바가 많이 사용되고 있는지 아노바에 연구자들이 너무 의존한다고 일부 방법론 연구자들이 불만을 터트릴 지경이다. 사실 ANOVA와 회귀분석은 따로 분리하여 이해할 필요는 없지만, 심리학 연구장면에서는 실험연구가 많이 수행되므로 집단을 나누어 평균을 보게 되는 경우가 많다(실험군 1, 실험군 2, 대조군...). 따라서 일반적인 통계 교과서에서는 아노바와 회귀분석을 분리하여 가르치는 경우가 많다. 하지만 학부 수준에서 배우게 되는 t검증, ANOVA, 상관, 회귀 등은 모두 일반선형모형(GLM)의 일종이며 하나의 맥락에서 이해될 수 있다는 것만 이야기해 두도록 하자.
익히 알고 있겠지만 ANOVA는 독립변수가 범주형인 경우에 주로 사용하며, 적어도 세 집단 이상의 평균을 비교할때 사용하는 방법이다. 또한 종속변수에 영향을 미치는 요인이 둘 이상일 때도 사용한다. 하지만 두 집단의 평균을 비교할 때도 사용하지 못하는 것은 아니다. 두 집단을 비교하는 경우에는 아노바와 t검증의 결과는 일치한다(p값이 동일하게 산출된다는 말이다). 아무튼 아노바를 하는 이유는 familywise error 때문이라는 것은 알고 있다고 가정하고 넘어가려 하니,잘 모르는 독자들은 검색을 하거나 책을 참조하기 바란다. 이번 포스팅에서 다룰 것은 one-way ANOVA(일원분산분석)이다. 일원분산분석에서는 요인은 하나뿐이며, 종속변수도 하나뿐이다. 이 방법은 ANOVA 중에서도 가장 간단한 경우에 속하니, 제대로 이해하는 것이 중요하다. 이후에 2-way ANOVA와 repeated measure ANOVA까지 다루겠다. (참가자 내 요인과 참가자 간 요인을 함께 포함하는 mixed design은 고급과정에 속하니 나중에 따로 다루겠다.)
R에서 아노바를 하기 전에, 요인과 수준에 대해 잠시 언급하고 넘어가기로 하자. 요인이란 종속변수에 영향을 주는 변수 그 자체를 의미하며, 이를테면 학습에 영향을 미치는 요인들은 학습시간, 자가진단 test 여부, feedback 여부 등이 있을 수 있는데, 이런 것들 하나하나가 바로 요인이다. 수준은 서로 다른 요인의 값을 의미하는데 여기서 '값'이라고 하는 것이 꼭 숫자일 필요는 없다. 이를테면 feedback 여부의 경우 수준은 '있음' 과 '없음' 의 두 가지로만 구성될 수 있다(물론 feedback의 종류나 상세함을 기준으로 더 나눌 수도 있겠지만). 보통 통계분석의 단계에서는 이들 수준을 숫자로 코딩하게 되는 경우가 많다. 예를 들어 다음과 같은 데이터가 얻어졌다고 가정해 보자.
앞의 다섯 개의 데이터는 학습법 1, 뒤의 다섯 개의 데이터는 학습법 2를, 마지막 다섯개는 학습법 3을 이용한 학생들의 시험 점수를 나타낸다고 가정해 보자. 이 데이터에서는 독립변수(요인)은 학습법 하나밖에 없고, 종속변수는 시험 점수가 되겠다. 학습법이라는 요인은 세 가지의 수준을 갖고 있는데, 학습법1,2,3이 그것들이다. R에서는 ANOVA를 하기 전에 요인 데이터를 요인으로 간주하도록 바꿔 주어야 한다. 아래 화면을 보도록 하자.
method라는 변수에 자신을 요인으로 바꾸어서 다시 넣었다. 명령어는 위에서 보다시피 as.factor()이다. 요인으로 간주된 데이터를 다시 불러보니 밑에 Levels 라는 항목이 추가된 것이 눈에 띈다. 수준은 1,2,3의 세 가지가 있다는 것을 R이 감지하였다.
이제 아노바를 시행할 준비가 되었다. 일단 탐색적으로 기술통계량부터 좀 보자. boxplot을 그리니 다음과 같았다.
한눈에 보아도 집단 간 점수차가 드러난다. 1,2,3으로 갈수록 성적이 떨어진다. 이 차이가 유의미한지를 알아보기 위해 아노바를 본격적으로 함에 앞서서 등분산 가정을 테스트해주어야 한다. 이것은 ANOVA에 있어서 아주 중요한 가정 중 하나이다. t검증에서 사용했던 var.test()는 두 집단만 비교할 수 있으므로 새로운 명령어가 필요한데, 그것은 levene.test()이다. 이 명령어는 R 내장 명령어가 아니므로 라이브러리를 불러서 해야 한다. 라이브러리 중 lawstat()라이브러리를 다운로드받아 인스톨하고, library()명령어를 이용하여 불러오기까지 마쳐야 한다. 제대로 되었다면 다음과 같은 화면을 볼 수 있다.
이제 levene.test()명령어를 사용할 수 있게 되었다. 형식은 levene.test(종속변수, 요인)의 형식을 사용하면 된다.
레벤 테스트의 영가설은 모든 집단의 분산이 동일하다는 것인데, p>.05이므로 영가설은 기각하지 않아도 된다. 즉 등분산을 가정할 수 있다는 말이다. 등분산이 가정되지 않는 경우에 어떻게 하는지에 대해서는 후반부에 다시 다루겠다.
이제 등분산 가정이 충족되었으니 본격적으로 아노바를 해 보자. 다음 화면을 보자.
score라는 종속변수와 method라는 독립변수를 이용하여 ANOVA를 시행하였다. 명령어는 보시다시피 aov()이다. 결과 화면은 일단 모형을 보여주고(formula 부분), SS들을 보여준다. method에 의해 설명되는 SS는 총 1643.2 이고, method에 의해 설명되지 않는 SS는 총 152.4이다. (SS는 개인차와 관련되어 있다는 사실은 알고 있을 것이다. 또한 위의 두 SS를 합치면 전체 SS가 된다.) 한 눈에 보아도 요인에 의해 설명되는 변산성이 그렇지 않은 변산성보다 더 크다. ANOVA에서 따지는 것은 결국 요인이 얼마나 변산성을 잘 설명하는가 하는 것이므로 이 모델은 유의미할 것으로 추측된다. 물론 더 자세한 분석이 이루어져야 할 것이다. 사실 실제로 ANOVA를 할 때는 이런 식으로는 하지 않는다. 분석 결과를 변수에 저장한 뒤에, summary()문을 이용하여 정보를 추출한다. 다음과 같이.
아까의 화면보다 더 자세한 것을 볼 수 있다. 자유도, SS, MS, F값, p-value 등이 모두 나와있다. 요인에 의해 설명되는 평균적인 변산성인 821.6은 그렇지 않은 평균적인 변산성인 12.7보다 무려 65배 가량 크다. F-table에서 이 값의 유의확률을 계산하면 3.783/10^7이며 이 값은 .001수준에서 통계적으로 유의미하다. 따라서 이 화면을 보고 나서는 method가 score를 유의미하게 예측하는 예측변인이라는 결론을 내릴 수 있다. 또는, 세 가지 학습법을 사용한 집단들의 평균이 모두 같지는 않다는 결론을 내린다. (아노바에서 영가설은 모든 집단의 평균이 같다는 것이므로, 이를 기각한 것이다.)
아노바의 목적은 평균이 동질적이지 않은 집단이 단 하나라도 있는 것을 탐지하는 데 있다.(이는 어떤 종류의 ANOVA에 대해서도 공통적으로 적용되는 이야기다.) 따라서 영가설을 기각했다 하더라도 구체적으로 어떤 집단 간에 차이가 존재하는지를 알 수 없다. 이에 대해 알아보려면 follow-up test를 해 주어야 한다. 일원분산분석에서는 사용할 수 있는 follow-up test가 크게 두 가지 있다. 첫째는 post hoc analysis(unplanned comparison)이고, 둘째는 contrast(planned comparison)이다. 자세한 것은 다루지 않겠으나, 양자의 차이에 대해서만 이야기하자면 전자는 어떤 집단끼리 차이가 날지에 대해 구체적인 예상이 없을 때 사용하고, 후자는 있을 때 사용한다. 이 내용에 대해서는 다음 포스팅에서 다루겠다.
t검증 포스팅에서 전통적 가설검증 절차의 맹점에 대해 다루었었다. 요지는 표본 크기가 너무 크면, 별로 의미가 없는 평균차도 유의미하게 뜬다는 것이었다. ANOVA에서도 이를 해결하기 위해 효과 크기를 같이 보고하도록 권장하고 있는데, 이를 위해 사용하는 값은 η제곱(에타 스퀘어)이다. 계산 방법은 집단간 차이로 설명되는 변산성(SS model)을 전체 변산성(SS total)로 나누어주는 것이다. 이 분석 같은 경우에는 1643.2/(152.4+1643.2)로 계산하면 된다. 전체 변산성은 SS model과 SS error(모델에 의해 설명되지 않는 변산성)을 더하면 바로 구할 수 있다. 계산하면 값이 0.915 정도 나온다. 이것은 집단간 차이가 전체 변산성의 91.5%를 설명할 수 있다는 얘긴데, 거의 절대적인 factor라 할 수 있다. 사실 에타제곱은 r제곱의 ANOVA 버전 이름이며, 둘의 개념은 동일한 것이라 할 수 있다. 크기는 small/medium/large로 나뉘는데, 해석의 가이드라인은 책이나 검색으로 해결할것.
마지막으로 등분산가정이 깨질 때 사용할 수 있는 ANOVA에 대해 다루겠다. t-test에서 아무 옵션을 주지 않으면 등분산가정을 하지 않는다고 말했었다. 이 때 출력창에는 Welch라는 이름이 떴는데, 아노바도 똑같다. 등분산가정을 하지 않는 one-way ANOVA의 이름은 Welch ANOVA이다. Welch ANOVA는 stats 라이브러리를 요구하는데, 따로 깔 필요는 없이 그냥 불러오면 된다. 다음의 화면을 보자.

명령어는 oneway.test()이다. 형식은 aov()와 비슷하게 하면 된다. 등분산가정을 하지 않는다고 나와 있는것을 볼 수 있다. Welch방식을 사용하면 자유도를 고쳐서 분석하는데, 분모의 자유도를 보면 소수가 된 것이 보인다. p값은 여전이 유의하기는 한데, 값이 좀 커진 것을 볼 수 있다.
익히 알고 있겠지만 ANOVA는 독립변수가 범주형인 경우에 주로 사용하며, 적어도 세 집단 이상의 평균을 비교할때 사용하는 방법이다. 또한 종속변수에 영향을 미치는 요인이 둘 이상일 때도 사용한다. 하지만 두 집단의 평균을 비교할 때도 사용하지 못하는 것은 아니다. 두 집단을 비교하는 경우에는 아노바와 t검증의 결과는 일치한다(p값이 동일하게 산출된다는 말이다). 아무튼 아노바를 하는 이유는 familywise error 때문이라는 것은 알고 있다고 가정하고 넘어가려 하니,잘 모르는 독자들은 검색을 하거나 책을 참조하기 바란다. 이번 포스팅에서 다룰 것은 one-way ANOVA(일원분산분석)이다. 일원분산분석에서는 요인은 하나뿐이며, 종속변수도 하나뿐이다. 이 방법은 ANOVA 중에서도 가장 간단한 경우에 속하니, 제대로 이해하는 것이 중요하다. 이후에 2-way ANOVA와 repeated measure ANOVA까지 다루겠다. (참가자 내 요인과 참가자 간 요인을 함께 포함하는 mixed design은 고급과정에 속하니 나중에 따로 다루겠다.)
R에서 아노바를 하기 전에, 요인과 수준에 대해 잠시 언급하고 넘어가기로 하자. 요인이란 종속변수에 영향을 주는 변수 그 자체를 의미하며, 이를테면 학습에 영향을 미치는 요인들은 학습시간, 자가진단 test 여부, feedback 여부 등이 있을 수 있는데, 이런 것들 하나하나가 바로 요인이다. 수준은 서로 다른 요인의 값을 의미하는데 여기서 '값'이라고 하는 것이 꼭 숫자일 필요는 없다. 이를테면 feedback 여부의 경우 수준은 '있음' 과 '없음' 의 두 가지로만 구성될 수 있다(물론 feedback의 종류나 상세함을 기준으로 더 나눌 수도 있겠지만). 보통 통계분석의 단계에서는 이들 수준을 숫자로 코딩하게 되는 경우가 많다. 예를 들어 다음과 같은 데이터가 얻어졌다고 가정해 보자.


이제 아노바를 시행할 준비가 되었다. 일단 탐색적으로 기술통계량부터 좀 보자. boxplot을 그리니 다음과 같았다.



이제 등분산 가정이 충족되었으니 본격적으로 아노바를 해 보자. 다음 화면을 보자.


아노바의 목적은 평균이 동질적이지 않은 집단이 단 하나라도 있는 것을 탐지하는 데 있다.(이는 어떤 종류의 ANOVA에 대해서도 공통적으로 적용되는 이야기다.) 따라서 영가설을 기각했다 하더라도 구체적으로 어떤 집단 간에 차이가 존재하는지를 알 수 없다. 이에 대해 알아보려면 follow-up test를 해 주어야 한다. 일원분산분석에서는 사용할 수 있는 follow-up test가 크게 두 가지 있다. 첫째는 post hoc analysis(unplanned comparison)이고, 둘째는 contrast(planned comparison)이다. 자세한 것은 다루지 않겠으나, 양자의 차이에 대해서만 이야기하자면 전자는 어떤 집단끼리 차이가 날지에 대해 구체적인 예상이 없을 때 사용하고, 후자는 있을 때 사용한다. 이 내용에 대해서는 다음 포스팅에서 다루겠다.
t검증 포스팅에서 전통적 가설검증 절차의 맹점에 대해 다루었었다. 요지는 표본 크기가 너무 크면, 별로 의미가 없는 평균차도 유의미하게 뜬다는 것이었다. ANOVA에서도 이를 해결하기 위해 효과 크기를 같이 보고하도록 권장하고 있는데, 이를 위해 사용하는 값은 η제곱(에타 스퀘어)이다. 계산 방법은 집단간 차이로 설명되는 변산성(SS model)을 전체 변산성(SS total)로 나누어주는 것이다. 이 분석 같은 경우에는 1643.2/(152.4+1643.2)로 계산하면 된다. 전체 변산성은 SS model과 SS error(모델에 의해 설명되지 않는 변산성)을 더하면 바로 구할 수 있다. 계산하면 값이 0.915 정도 나온다. 이것은 집단간 차이가 전체 변산성의 91.5%를 설명할 수 있다는 얘긴데, 거의 절대적인 factor라 할 수 있다. 사실 에타제곱은 r제곱의 ANOVA 버전 이름이며, 둘의 개념은 동일한 것이라 할 수 있다. 크기는 small/medium/large로 나뉘는데, 해석의 가이드라인은 책이나 검색으로 해결할것.
마지막으로 등분산가정이 깨질 때 사용할 수 있는 ANOVA에 대해 다루겠다. t-test에서 아무 옵션을 주지 않으면 등분산가정을 하지 않는다고 말했었다. 이 때 출력창에는 Welch라는 이름이 떴는데, 아노바도 똑같다. 등분산가정을 하지 않는 one-way ANOVA의 이름은 Welch ANOVA이다. Welch ANOVA는 stats 라이브러리를 요구하는데, 따로 깔 필요는 없이 그냥 불러오면 된다. 다음의 화면을 보자.

명령어는 oneway.test()이다. 형식은 aov()와 비슷하게 하면 된다. 등분산가정을 하지 않는다고 나와 있는것을 볼 수 있다. Welch방식을 사용하면 자유도를 고쳐서 분석하는데, 분모의 자유도를 보면 소수가 된 것이 보인다. p값은 여전이 유의하기는 한데, 값이 좀 커진 것을 볼 수 있다.




덧글
ㅅ. 2011/11/16 14:08 # 삭제 답글
안녕하세요 :D 검색에 검색을 타고 들러서 많이 배우고 갑니다.등분산가정을 하지않는 welch ANOVA의 경우에 자유도를 고쳐서 해석한다고 하셨는데,
(생물학쪽에서 같은 경우는 트랜스포메이션을 엄청나게 해보고 안되면 좌절하고 그러건든요 ㅠ)
이 방법이 실제 실험영역에서 쓰일수 있을만한 것인지.
이부분에 관련되어서는 전혀 알지 못해서 간단한 설명이나 참고할만한 레퍼런스 추천을 부탁드려봅니다.
푸른숲 2011/12/27 00:40 # 삭제 답글
지금까지 본 통계 포스팅 중에서 가장 완벽한 것 같습니다. 감사합니다.