T-Test

두 그룹의 평균이 같은지/다른지 확인하는 방법이다. 자료가 정규분포라는 것을 전제로 한다.

어떤 data가 정규분포를 따른다면,

그런데 sample size (data point)가 많지 않다면 Z-분포로 변형할 때 왜곡이 발생한다. (참고: 자유도)

Two-Sample T-Test

두 그룹간의 평균을 비교하는 검정이다.

Data 준비

서울시 일별 평균 대기오염도 정보페이지에서 [내려받기(CSV)]를 클릭하여 자료를 내려받고 다음을 실행하자.

   1 df <- read.csv(file.choose(), fileEncoding = 'euc-kr')
   2 df <- df[ grep('구$', df$측정소명), ]
   3 
   4 dust19 <- data.frame(month = as.factor('2019.11'),
   5                      pm10 = df[ grep('^201911', df$측정일시) , '미세먼지.....'  ])
   6 dust20 <- data.frame(month = as.factor('2020.05'),
   7                      pm10 = df[ grep('^202005', df$측정일시) , '미세먼지.....'  ])
   8 
   9 dust = rbind(dust19, dust20)
  10 summary(dust)
  11 boxplot(pm10 ~ month, data=dust, col=c('brown2','deepskyblue'))

정규성 검정

T-test는 정규분포곡선과 비슷하게 생긴 자료임을 전제로 개발되었다.

   1 shapiro.test(dust[dust$month == '2019.11','pm10'])
   2 shapiro.test(dust20$pm10) # 기왕 만들어 둔 dust20 을 사용해도 무방

혹은 위 두 줄을 by( ) 함수를 사용하여 한 줄로 표현할 수 있다.

   1 by(dust$pm10, dust$month, shapiro.test)

두 경우 모두 p < 2.2e-16 로 정규성은 눈꼽만큼도 없으니 Mann-Whitney test를 하기로 한다.

Mann-Whitney Test

Mann-Whitney test(동의어: Wilcoxon rank sum test)는 자료가 정규성이 없을Two-sample T-test 대신 쓰는 비모수 검정법이다

   1 wilcox.test(dust$pm10 ~ dust$month)
   2 
   3 # 혹은
   4 wilcox.test(pm10 ~ month, data=dust)

Two-Sample T-Test

이 미세먼지 데이타는 정규성 테스트를 통과하지 못 했지만, 혹시 예를 들어 정규성을 통과했다면 다음과 같이 T-test를 사용할 수 있다.

주의! 두 그룹의 분산이 같은지 다른지에 따라 결과가 아주 약간 달라진다.

두 그룹의 분산은 F-test로 비교할 수 있고, R에서는 var.test( )가 담당함.

   1 var.test(pm10 ~ month, data=dust)

p>0.05 로 분산이 같다면(대립가설 버림) var.equal=TRUE 옵션과 함께 t-test를 한다

   1 t.test(dust$pm10, dust$month, var.equal=T)
   2 
   3 # 혹은
   4 t.test(pm10 ~ month, data=dust, var.equal=T)

p<0.05 로 분산이 다르다는 대립가설이 채택되면 var.equal=FALSE 옵션과 함께 t-test를 한다

   1 t.test(pm10 ~ month, data=dust, var.equal=F)
   2 t.test(pm10 ~ month, data=dust)

One-Sample T-Test

모집단의 평균이 알려졌을 때, 내 sample이 그 모집단에서 온 것인지 추측하는 문제.

한국 20살 남자 키 평균은 175cm 이다.

   1 meanKoreanHeight <- 175
   2 
   3 myClassHeight <- c(170, 171, 170, 168, 176, 175, 167, 180, 165, 172, 170, 173, 163)
   4 mean(myClassHeight)
   5 
   6 hist(myClassHeight, 10)

정규성 test

   1 shapiro.test(myClassHeight)

p-value = 0.9946 로 매우 정규분포를 따를 것처럼 보이므로 T-test로 넘어가자.

One-Sample T-test

   1 t.test(myClassHeight, mu=175)
   2 # mu 에 알려진 평균값을 지정한다.
   3 # 지정 안 하면 mu=0 으로 간주한다.

결과:

        One Sample t-test

data:  myClassHeight
t = -3.3136, df = 12, p-value = 0.006183
alternative hypothesis: true mean is not equal to 175
95 percent confidence interval:
 167.9874 173.5511
sample estimates:
mean of x
 170.7692

  1. 이 sample의 평균은 170.7692 이다.
  2. 그런데 이 평균은 이 학급이 우연히도 키 작은 애들만 모여 있어서 나온 것일 수도 있고, 그 반대일 수도 있다.
  3. 이런 sample을 무한정 모으면 (전국 고1 전수조사) 실제 고1 남학생의 평균키는 95% 확률로 167.98~173.55 사이에 존재할 것이다.
  4. 고1 남학생의 키 평균이 성인의 키 (175)와 같을 확률은 95% 확률 범위 안에 없다 (5% 미만이다).
  5. 고1 키와 성인 키가 같을 것이라는 가설은 기각(거부)한다.

Confidence level(유의수준)을 더 넓게 잡을 수도 있다.

   1 t.test(myClassHeight, mu=175, conf.level=0.99)

결과:

        One Sample t-test

data:  myClassHeight
t = -3.3136, df = 12, p-value = 0.006183
alternative hypothesis: true mean is not equal to 175
99 percent confidence interval:
 166.8692 174.6692
sample estimates:
mean of x
 170.7692

  1. 이런 sample을 무한정 모으면 (전국 고1 전수조사) 실제 고1 남학생의 평균키는 99% 확률로 166.87~174.66 사이에 존재할 것이다.
  2. 고1 남학생의 키 평균이 성인의 키 (175)와 같을 확률은 99% 확률 범위 안에 없다 (1% 미만이다).
  3. 고1 키와 성인 키가 같을 것이라는 가설은 기각(거부)한다.

'다르다'는 '크다'와 '작다'를 함께 부르는 말이다.

   1 t.test(myClassHeight, mu=175, conf.level=0.99, alter="greater")

Paired T-Test

약물 처리 전 후 차이가 유의미한 차이인지 보는 테스트이다.

운동 전후 심박수를 재서 기록했다.

   1 beforeHR <- c(87,89,85,86,90,83,86,85,87,93)
   2 afterHR <- c(89,91,85,89,93,83,89,95,93,93)
   3 
   4 diff <- afterHR - beforeHR
   5 hist(diff, 10)

정규성 test

   1 shapiro.test(afterHR - beforeHR)
   2 hist(afterHR - beforeHR, 10)

p-value = 0.03814 로 정규분포를 따르지 않는 것처럼 보이므로 Wilcoxon signed-rank test를 하겠다.

Wilcoxon Signed Rank test

R 함수 wilcox.test( )를 사용한다.

   1 wilcox.test(afterHR, beforeHR, paired=TRUE) # 전/후 값을 각각 넣어줬다 (vector 2개)
   2 
   3 # 혹은
   4 wilcox.test(afterHR - beforeHR)             # 전/후 값의 차이를 넣어줬다 (vector 1개)
   5 
   6 # 혹은
   7 diff <- afterHR - beforeHR
   8 wilcox.test(diff)                           # 미리 계산된 차이를 넣어줬다 (이하동문)

결과:

        Wilcoxon signed rank test with continuity correction

data:  diff
V = 28, p-value = 0.0213
alternative hypothesis: true location is not equal to 0

Warning messages:
1: In wilcox.test.default(diff) : cannot compute exact p-value with ties
2: In wilcox.test.default(diff) : cannot compute exact p-value with zeroes

  1. p < 0.05 이므로 대립가설 (전 후 차이가 0이 아니다) 채택

  2. 운동 효과 있음

마지막에 보이는 Warnings은 같은 순위에 rank된 데이타에 의해서 생긴 메세지이다.

   1 wilcox.test(afterHR, beforeHR, paired=TRUE, exact=FALSE)

Paired T-test

만약 shapiro.test()에서 p>0.05로 정규성이 확인되면 T-test를 할 수 있다.

   1 # 전후 데이타의 차이의 평균이 0과 다른지 확인한다는 테스트 정의를 그대로 옮기면,
   2 t.test(beforeHR - afterHR)
   3 
   4 # 혹은 R에게 모든 것을 맡기면,
   5 t.test(beforeHR, afterHR, paired = TRUE)

정리

  1. 두 그룹의 평균을 비교할 때는 T-test(혹은 유사품)을 쓴다.
  2. 자료가 정규분포를 보이면 t.test() 를 쓴다.

    • 표준정규분포로 변환이 가능해야 T-test가 된다.
    • 정규분포를 보이는 자료를 이용한 계산을 parametric 통계 (모수 통계)라고 한다.

    • p < 0.05 면 평균이 유의미하게 다르다고 생각 (95% 신뢰수준에서)

  3. 자료가 정규분포를 보이지 않으면 wilcox.test() 를 쓴다.

    • 비모수 통계 (non-parametric statistics) 라고 한다.
    • 자료값에 순위(rank)를 매긴 후 이 rank를 비교하는 방법이다.
    • p < 0.05 면 평균이 유의미하게 다르다고 생각 (95% 신뢰수준에서)

  4. 기타
    • 자료가 정규성을 띄는지는 shapiro.test() 로 계산한다.

      • p < 0.05 면 정규분포와 유의미하게 다른 분포라고 생각

    • 분산은 var.test()로 비교한다.

      • p < 0.05 면 분산이 유의미하게 서로 다르다고 생각

정규분포(O): 모수통계 (parametric)

정규분포(X): 비모수 (non-parametric)

두 그룹이 독립적
(샘플들끼리 만나본 적 없음)

Two sample T-test

분산이 같다: Student's T-test
t.test(y ~ x, var.equal=T)

Mann-Whitney Test
(Wilcoxon Rank Sum test)
wilcox.test(y ~ x)

분산이 다르다: Welch's T-test
t.test(y ~ x)

두 그룹이 서로 엮임
(샘플들이 그냥 그 자신임
before/after 차이)

Paired T-test
(사실은 One-Sample T-test가 화장하고 나타남)
t.test(x, y, paired=TRUE)
t.test(y-x)

Wilcoxon Signed Rank test

wilcox.test(x, y, paired=TRUE)
wilcox.test(y-x)


Class/Statistics/T-Test (2020-09-23 22:27:09에 gehoon가(이) 마지막으로 수정)