Home ChungLab Wiki
    • 설명
    • 못 고치는 문서
    • Menu
      • Navigation
      • RecentChanges
      • FindPage
      • 사이트맵
      • Help
      • HelpContents
      • HelpOnMoinWikiSyntax
      • 보기
      • 첨부
      • 정보
      • 원문 보기
      • 인쇄용 화면
      • 수정
      • 로드
      • 저장
    • 로그인

    Navigation

    • FindPage
    • HelpContents
    • FunReading
    이 위키는 메일 처리를 할 수 없도록 되어 있습니다. 위키 관리자에게 연락하여 메일을 쓸 수 있도록 요청하세요.
    • Class
    • Statistics
    • T-Test

    T-Test

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

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

    • 정규분포 곡선은 다 비슷하게 생겼다. 얼마나 벌어졌는지(표준편차)와 중심점(평균)이 어디 있는지만 다를 뿐이다.

    • data에서 표준편차를 빼고 분산으로 나누면 대충 0을 평균으로 하고 표준편차가 1인 표준정규분포(Z-분포)로 변형이 가능하다.
    • 그 후 내가 가진 값도 동일한 변형을 거치면 어떤 계산값(Z-score)이 나올 것이고, 이 값이 Z-분포에서 어느 정도 귀퉁이에 있는지 확인할 수 있다.
    • 얼마나 귀퉁이에 있는지 보는 것으로 얼마나 rare한지를 추측할 수 있고,
    • 5% 확률 미만이면 (p<0.05) 기각한다거나, 1% 확률 미만이면 (p<0.01) 기각한다거나, 그런 판단을 할 수 있다.

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

    • 이게 W. S. Gosset이라는 Guinness 맥주 직원에게는 큰 문제였는데,

    • 맥주 발효 샘플이 많으면 많을수록 테스트가 어려워진다.
    • 그래서 적은 수의 샘플로도 유효한 방법을 찾다가 Z-분포를 약간 변형한 T-분포를 창안했고, 이 변형된 통계량을 T-score라고 불렀으며,
    • 본인이 고안한 방법을 학술지에 발표했는데, Guinness에서는 직원이 연구결과를 학술지에 발표하는 것을 반대(당연하지!)했기 때문에,

    • Student라는 필명을 썼고, 그래서 우리는 이 방법을 Student's T-Test라고 부른다.

    차례

    1. Two-Sample T-Test
      1. Data 준비
      2. 정규성 검정
      3. Mann-Whitney Test
      4. Two-Sample T-Test
    2. One-Sample T-Test
      1. 정규성 test
      2. One-Sample T-test
    3. Paired T-Test
      1. 정규성 test
      2. Wilcoxon Signed Rank test
      3. Paired T-test
    4. 정리

    Two-Sample T-Test

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

    • 서울시 일별 평균 대기오염도 정보에서

    • 2019년 11월과 2020년 05월의 서울시 미세먼지를 비교해보자.

    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는 정규분포곡선과 비슷하게 생긴 자료임을 전제로 개발되었다.

    • 자료가 정규분포를 따라야 T분포로 변환이 되고, T-score를 계산할 수 있다.

    • 자료의 정규성 여부는 Shapiro-Wilk test를 통해 구할 수 있다.

    • R에서는 함수 shapiro.test()를 사용한다.

    • 계산 결과 얻어지는 p-value는 자료가 정규분포를 따를 확률이다.

       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 대신 쓰는 비모수 검정법이다

    • R에서는 wilcox.test( )함수를 사용하여 계산한다.

    • [주의] wilcox.test( )에 paired=TRUE 옵션을 주면 (유사품)Wilcoxon signed-rank test가 된다.

      • (유사품)Wilcoxon signed-rank test는 Paired T-test 대신 쓰는 검정법이다 (뒤에 나옴)

      • paired 옵션을 안 주면 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를 사용할 수 있다.

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

    • 분산이 같다면 전통적인 Student's T-test 를 쓰면 됨.

    • 분산이 다르다면 Welch's T-test를 씀.

    • R 에서는 var.equal=TRUE/FALSE 옵션으로 간단히 구분함.

    • 분산이 같은지 다른지만 알려주세요.

    두 그룹의 분산은 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를 한다

    • var.equal를 지정 안 하면 FALSE라고 간주하므로 굳이 안 써도 되는 옵션이다.
    • Welch's T-test 라고 한다.

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

    One-Sample T-Test

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

    • 내 sample의 평균은 항상 모집단의 평균과 다르다 (같을 확률이 까마득하게 작다)
    • 다르긴 다른데 이게 통계적으로 유의미한게 다른 것인지...?
    • 아님 그냥 무시해도 될 정도로 다른 것인지..?

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

    • 고1 학급의 남학생 13명의 키를 조사했더니 다음과 같았고 평균은 171cm 이었다.
    • 이 고1 학생들은 성인과 키가 비슷하다고 말 할 수 있는가?
    • 평균 4cm 의 차이는 통계적으로 유의미한 차이인가?

       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로 넘어가자.

    • histogram도 bell-shape의 정규분포처럼 보였었다.

    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

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

    • 약물 처리 전 후 데이타가 쌍으로 있어야 한다.
    • 약물 처리 전 후 데이타가 차이가 없다면 (약물이 효과가 없다면), 전-후 데이타의 차이는 0에 가까울 것이다.
    • 약물 처리 전 후 차이가 없더라도 전-후 데이터 차이가 모조리 기계적으로 0일 수는 없고, 어느 정도 차이가 관찰될 것이다.
    • 약물 처리 전 후의 데이타 차이가 정규분포 곡선을 따른다면 T-test가 가능하다.
    • 만약 정규분포를 따르지 않는 데이타라면, raw data 대신 서열(rank)을 가지고 계산하는 Wilcoxon Signed-Rank Test를 한다.

    • 결국 One-Sample 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를 하겠다.

    • histogram도 이상하게 보인다.

    Wilcoxon Signed Rank test

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

    • wilcox.test( ) 안에 vector 하나가 있으면 Wilcoxon signed rank test를 계산한다.

    • wilcox.test( ) 안에 vector 두개를 넣고 paired=TRUE라고 하면 Wilcoxon signed rank test를 계산한다.

    • 그 외의 경우는 Wilcoxon rank sum test(Mann-Whitney 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된 데이타에 의해서 생긴 메세지이다.

    • 보기 싫으면 exact=FALSE 옵션을 준다.

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

    Paired T-test

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

    • t.test( )를 사용하면 되는데, 사용법은 wilcox.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)


    /CentralLimitTheorem   /ChiSquared   /Clustering   /InstallR   /InstallRStudio   /Lies   /NormalDistribution   /RBasic   /RBasic1   /RBasic2   /RBasic3   /RCloud   /RIntro   /RKorean   /T-Test  
    Copyright © ChungLab. Built on MoinMoin and Bootstrap. All Rights Reserved.