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

    Navigation

    • FindPage
    • HelpContents
    • FunReading

    Upload page content

    You can upload content for the page named below. If you change the page name, you can also upload content for another page. If the page name is empty, we derive the page name from the file name.

    File to load page content from
    Page name
    설명

    • 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.