R|Rstudio

집단별 평균 차이검정(t검정, t-test)

루아흐뉴마 2018. 7. 24. 00:56
반응형
  • 독립표본 t-test를 수행하기 전에 각 표본 집단이 충족해야 하는 가정이 있다.
  • 1) 각 표본이 정규성을 띠고 있어야 하고, 정규성 검정 링크(새창)
  • 2) 분산이 같아야 한다. 등분산 검정 링크(새창)
  • 물론, 위 가정을 충족하지 못하더라도 우회하여 검정하는 방법이 있다.
  • 1) 의 경우 각 표본이 정규분포를 따르는지를 검정한다.
  • 일반적으로 표본의 크기가 30 이상인 경우 정규분포를 따르는 것으로 알려져 있다. (중심극한정리)
  • 2) 의 경우 각 표본의 분산이 같은지를 검정한다.
  • R 관련 함수 전체 보기


t.test: 집단의 평균에 대한 차이 검정


  • R에서 기본적으로 제공하는 t.test()함수는 Student's t-Test를 의미한다.
  • 스튜던트의 t-test는 기본적으로 각 집단 표본의 분산에 차이가 없을 때 사용한다.
  • 그러나 var.equal=FALSE 옵션을 걸어서 분산에 차이가 있을 때도 사용할 수 있다.
  • 그런데, 순서상 1) 정규성, 2) 동질성 검정을 먼저 해야하는 것 아닌가? t.test를 왜 먼저 하나?
  • 지극히 자연스런 의문이다. (물론 이런 의문에 대해 답을 구한 적은 없다. 사견-私見-이다.)
  • t.test를 수도 없이 돌려보다보면 자연스레 알게 되겠지만,
  • 사사건건 정규성, 동질성을 따지는 것이 여간 번거로운 것이 아니다.
  • 학위논문 통계의 경우 모든 사실을 있는 그대로 보고하는 것이기 때문에 순서를 지켜서 하는 것이 타당하다.
  • 그게 아니라면 결론적으로, t.test 결과가 통계적으로 유의미하지 않을 경우
  • 구태여 정규성, 동질성을 따질 필요가 없게 된다.
  • 따라서, 1차적으로 t.test를 먼저 시행하되, var.equal=TRUE 옵션과 var.equal=FALSE 옵션을 건t.test를 각각 수행한다.
  • 그다음 하나 이상의 결과가 유의미한 경우 정규성, 동질성 검정을 수행하고,
  • 둘 다 유의미하지 않은 경우 정규성, 동질성 검정을 할 필요도 없이 넘어가면 된다.
  • 사족이 길었다. sleep 데이터를 가지고 t.test를 돌려보자.



  • sleep 데이터는 두 종류의 수면제의 수면 시간 증가 효과를 비교하기 위해,
  • -정확히는 어떤 수면제의 효과를 알아보기 위해-
  • 10명의 실험군과 10명의 대조군의 수면 증/감 시간을 기록한 데이터이다.
  • 아래와 같이 extra는 수면 증/감 시간이고, group은 복용한 수면제에 따른 집단 구분,
  • ID는 피험자의 Index이다.


data(sleep)
str(sleep)
## 'data.frame': 20 obs. of 3 variables: ## $ extra: num 0.7 -1.6 -0.2 -1.2 -0.1 3.4 3.7 0.8 0 2 ... ## $ group: Factor w/ 2 levels "1","2": 1 1 1 1 1 1 1 1 1 1 ... ## $ ID : Factor w/ 10 levels "1","2","3","4",..: 1 2 3 4 5 6 7 8 9 10 ...

  • 여기서는 실험군과 대조군의 수면 시간 증감의 평균 차이가 있는지,
  • 즉, 시험하고자 하는 수면제의 수면 시간 증감 효과가 기존 수면제와 유의미한 차이가 있는지 살펴보자.
  • 아래는 t.test를 가장 간략한 형식으로 작성한 코드이다.
  • t.test는 Student's t-test인데, Welch의 t-test가 실행되었다.
  • 등분산 조건을 걸어주지 않으면 t.test 함수는 디폴트 값으로 이분산 조건의 Welch's t-test를 실행한다.
  • 자유도(df) 값이 17.776으로 수정된 것을 확인할 수 있다.
  • 유의도(p-value)가 .079(>.05)인 것으로 보아, 95% 신뢰수준에서 통계적으로 유의미한 차이가 있다고 할 수는 없겠다.


t.test(extra~group, sleep)
## Welch Two Sample t-test ## ## data: extra by group ## t = -1.8608, df = 17.776, p-value = 0.07939 ## alternative hypothesis: true difference in means is not equal to 0 ## 95 percent confidence interval: ## -3.3654832 0.2054832 ## sample estimates: ## mean in group 1 mean in group 2 ## 0.75 2.33


  • 여기서 등분산 조건(var.equal=T)을 걸어주면 Welch's t-test가 아닌 Student's t-test를 실행한다.
  • 아래 결과처럼 등분산 조건을 걸어준 결과 Welch's t-test가 표기되지 않고
  • Two Sample t-test가 표기된다.
  • 자유도(df) 또한 18로, 정상적으로 표기되어 있다.


t.test(extra~group, sleep, var.equal=T)
## Two Sample t-test ## ## data: extra by group ## t = -1.8608, df = 18, p-value = 0.07919 ## alternative hypothesis: true difference in means is not equal to 0 ## 95 percent confidence interval: ## -3.363874 0.203874 ## sample estimates: ## mean in group 1 mean in group 2 ## 0.75 2.33

  • t.test 함수는 다음과 같이 사용할 수도 있다. t.test(집단1의 값, 집단2의 값)
  • 앞서 실행한 결과와 정확히 동일한 값을 산출한다.
  • 개인적으로는 앞선 형식 즉, 수식 표기 방식(Formula)을 선호한다.
  • 더욱이 다른 통계 함수(lm 이나 aov 등)를 사용하는 데 혼란스럽지 않으려면
  • 수식 표기 방식을 익혀두고, 스스로 일관성을 지키는 편이 좋을 것이다.
  • 다만 여기서는 '이런 방식도 있다.'는 정도로 제시한다.
  • 이 방식이 유효한 때는 '대상 집단이 3개 이상인데, 이 중 2개만 취사선택하여 t검정을 할 때' 정도다.
  • with 함수를 사용하면 sleep 데이터를 attach 하여 반복되는 sleep 표기를 생략할 수 있다.
  • 아래 두 코드는 정확히 같다.

t.test(sleep$extra[sleep$group==1], sleep$extra[sleep$group==2])
with(sleep, t.test(extra[group==1], extra[group==2]))
## Two Sample t-test ## ## data: extra by group ## t = -1.8608, df = 18, p-value = 0.07919 ## alternative hypothesis: true difference in means is not equal to 0 ## 95 percent confidence interval: ## -3.363874 0.203874 ## sample estimates: ## mean in group 1 mean in group 2 ## 0.75 2.33

 Copyright (2018) Ruahneuma. All Rights Reserved.


반응형