#acl +All:read #format wiki #language ko #pragma description 기초의학통계학 및 실험; = T-Test = 두 그룹의 평균이 같은지/다른지 확인하는 방법이다. 자료가 정규분포라는 것을 전제로 한다. 어떤 data가 [[../NormalDistribution|정규분포]]를 따른다면, * [[../NormalDistribution|정규분포]] 곡선은 다 비슷하게 생겼다. 얼마나 벌어졌는지(표준편차)와 중심점(평균)이 어디 있는지만 다를 뿐이다. * data에서 표준편차를 빼고 분산으로 나누면 대충 0을 평균으로 하고 표준편차가 1인 표준정규분포(Z-분포)로 변형이 가능하다. * 그 후 내가 가진 값도 동일한 변형을 거치면 어떤 계산값(Z-score)이 나올 것이고, 이 값이 Z-분포에서 어느 정도 귀퉁이에 있는지 확인할 수 있다. * 얼마나 귀퉁이에 있는지 보는 것으로 얼마나 rare한지를 추측할 수 있고, * 5% 확률 미만이면 (p<0.05) 기각한다거나, 1% 확률 미만이면 (p<0.01) 기각한다거나, 그런 판단을 할 수 있다. 그런데 sample size (data point)가 많지 않다면 Z-분포로 변형할 때 왜곡이 발생한다. (참고: [[https://en.wikipedia.org/wiki/Degrees_of_freedom_(statistics)|자유도]]) * 이게 [[https://en.wikipedia.org/wiki/William_Sealy_Gosset|W. S. Gosset]]이라는 Guinness 맥주 직원에게는 큰 문제였는데, * 맥주 발효 샘플이 많으면 많을수록 테스트가 어려워진다. * 그래서 적은 수의 샘플로도 유효한 방법을 찾다가 Z-분포를 약간 변형한 T-분포를 창안했고, 이 변형된 통계량을 T-score라고 불렀으며, * 본인이 고안한 방법을 학술지에 발표했는데, Guinness에서는 직원이 연구결과를 학술지에 발표하는 것을 반대,,(당연하지!),,했기 때문에, * Student라는 필명을 썼고, 그래서 우리는 이 방법을 Student's T-Test라고 부른다. <> == Two-Sample T-Test == 두 그룹간의 평균을 비교하는 검정이다. * [[http://data.seoul.go.kr/dataList/OA-2218/S/1/datasetView.do|서울시 일별 평균 대기오염도 정보]]에서 * 2019년 11월과 2020년 05월의 서울시 미세먼지를 비교해보자. === Data 준비 === [[http://data.seoul.go.kr/dataList/OA-2218/S/1/datasetView.do|서울시 일별 평균 대기오염도 정보]]페이지에서 [내려받기(CSV)]를 클릭하여 자료를 내려받고 다음을 실행하자. {{{#!highlight r df <- read.csv(file.choose(), fileEncoding = 'euc-kr') df <- df[ grep('구$', df$측정소명), ] dust19 <- data.frame(month = as.factor('2019.11'), pm10 = df[ grep('^201911', df$측정일시) , '미세먼지.....' ]) dust20 <- data.frame(month = as.factor('2020.05'), pm10 = df[ grep('^202005', df$측정일시) , '미세먼지.....' ]) dust = rbind(dust19, dust20) summary(dust) boxplot(pm10 ~ month, data=dust, col=c('brown2','deepskyblue')) }}} === 정규성 검정 === T-test는 [[../NormalDistribution|정규분포]]곡선과 비슷하게 생긴 자료임을 전제로 개발되었다. * 자료가 [[../NormalDistribution|정규분포]]를 따라야 T분포로 변환이 되고, T-score를 계산할 수 있다. * 자료의 정규성 여부는 [[https://en.wikipedia.org/wiki/Shapiro%E2%80%93Wilk_test|Shapiro-Wilk test]]를 통해 구할 수 있다. * R에서는 함수 [[https://www.rdocumentation.org/packages/stats/versions/3.6.2/topics/shapiro.test|shapiro.test()]]를 사용한다. * 계산 결과 얻어지는 p-value는 자료가 [[../NormalDistribution|정규분포]]를 따를 확률이다. {{{#!highlight r shapiro.test(dust[dust$month == '2019.11','pm10']) shapiro.test(dust20$pm10) # 기왕 만들어 둔 dust20 을 사용해도 무방 }}} 혹은 위 두 줄을 [[https://www.rdocumentation.org/packages/base/versions/3.6.2/topics/by|by( )]] 함수를 사용하여 한 줄로 표현할 수 있다. {{{#!highlight r by(dust$pm10, dust$month, shapiro.test) }}} 두 경우 모두 ```p < 2.2e-16``` 로 정규성은 눈꼽만큼도 없으니 [[https://en.wikipedia.org/wiki/Mann-Whitney_U_test|Mann-Whitney test]]를 하기로 한다. === Mann-Whitney Test === [[https://en.wikipedia.org/wiki/Mann-Whitney_U_test|Mann-Whitney test]](동의어: [[https://en.wikipedia.org/wiki/Wilcoxon_rank_sum_test|Wilcoxon rank sum test]])는 자료가 '''정규성이 없을''' 때 '''Two-sample T-test 대신''' 쓰는 비모수 검정법이다 * R에서는 [[https://www.rdocumentation.org/packages/stats/versions/3.6.2/topics/wilcox.test|wilcox.test( )]]함수를 사용하여 계산한다. * [주의] [[https://www.rdocumentation.org/packages/stats/versions/3.6.2/topics/wilcox.test|wilcox.test( )]]에 paired=TRUE 옵션을 주면 ,,(유사품),,[[https://en.wikipedia.org/wiki/Wilcoxon_signed-rank_test|Wilcoxon signed-rank test]]가 된다. * ,,(유사품),,[[https://en.wikipedia.org/wiki/Wilcoxon_signed-rank_test|Wilcoxon signed-rank test]]는 Paired T-test 대신 쓰는 검정법이다 (뒤에 나옴) * ```paired``` 옵션을 안 주면 [[https://en.wikipedia.org/wiki/Wilcoxon_rank_sum_test|Wilcoxon rank sum test]] (Two-sample T-test 대용)으로 간주한다. {{{#!highlight r wilcox.test(dust$pm10 ~ dust$month) # 혹은 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``` 옵션으로 간단히 구분함. * 분산이 같은지 다른지만 알려주세요. 두 그룹의 분산은 [[https://en.wikipedia.org/wiki/F-test|F-test]]로 비교할 수 있고, R에서는 [[https://www.rdocumentation.org/packages/stats/versions/3.6.2/topics/var.test|var.test( )]]가 담당함. {{{#!highlight r var.test(pm10 ~ month, data=dust) }}} p>0.05 로 분산이 같다면(대립가설 버림) ```var.equal=TRUE``` 옵션과 함께 t-test를 한다 {{{#!highlight r t.test(dust$pm10, dust$month, var.equal=T) # 혹은 t.test(pm10 ~ month, data=dust, var.equal=T) }}} p<0.05 로 분산이 다르다는 대립가설이 채택되면 ```var.equal=FALSE``` 옵션과 함께 t-test를 한다 * var.equal를 지정 안 하면 FALSE라고 간주하므로 굳이 안 써도 되는 옵션이다. * Welch's T-test 라고 한다. {{{#!highlight r t.test(pm10 ~ month, data=dust, var.equal=F) t.test(pm10 ~ month, data=dust) }}} == One-Sample T-Test == 모집단의 평균이 알려졌을 때, 내 sample이 그 모집단에서 온 것인지 추측하는 문제. * 내 sample의 평균은 항상 모집단의 평균과 다르다 (같을 확률이 까마득하게 작다) * 다르긴 다른데 이게 통계적으로 유의미한게 다른 것인지...? * 아님 그냥 무시해도 될 정도로 다른 것인지..? 한국 20살 남자 키 평균은 175cm 이다. * 고1 학급의 남학생 13명의 키를 조사했더니 다음과 같았고 평균은 171cm 이었다. * 이 고1 학생들은 성인과 키가 비슷하다고 말 할 수 있는가? * 평균 4cm 의 차이는 통계적으로 유의미한 차이인가? {{{#!highlight r meanKoreanHeight <- 175 myClassHeight <- c(170, 171, 170, 168, 176, 175, 167, 180, 165, 172, 170, 173, 163) mean(myClassHeight) hist(myClassHeight, 10) }}} === 정규성 test === {{{#!highlight r shapiro.test(myClassHeight) }}} ```p-value = 0.9946``` 로 매우 정규분포를 따를 것처럼 보이므로 T-test로 넘어가자. * histogram도 bell-shape의 정규분포처럼 보였었다. === One-Sample T-test === {{{#!highlight r t.test(myClassHeight, mu=175) # mu 에 알려진 평균값을 지정한다. # 지정 안 하면 mu=0 으로 간주한다. }}} 결과: {{{#!highlight rout numbers=disable 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 이다. 1. 그런데 이 평균은 이 학급이 우연히도 키 작은 애들만 모여 있어서 나온 것일 수도 있고, 그 반대일 수도 있다. 1. 이런 sample을 무한정 모으면 (전국 고1 전수조사) 실제 고1 남학생의 평균키는 95% 확률로 167.98~173.55 사이에 존재할 것이다. 1. 고1 남학생의 키 평균이 성인의 키 (175)와 같을 확률은 95% 확률 범위 안에 없다 (5% 미만이다). 1. 고1 키와 성인 키가 같을 것이라는 가설은 기각(거부)한다. Confidence level(유의수준)을 더 넓게 잡을 수도 있다. {{{#!highlight r t.test(myClassHeight, mu=175, conf.level=0.99) }}} 결과: {{{#!highlight rout numbers=disable 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 사이에 존재할 것이다. 1. 고1 남학생의 키 평균이 성인의 키 (175)와 같을 확률은 99% 확률 범위 안에 없다 (1% 미만이다). 1. 고1 키와 성인 키가 같을 것이라는 가설은 기각(거부)한다. '다르다'는 '크다'와 '작다'를 함께 부르는 말이다. * 다를 확률 대신 클 확률만 보고 싶다면 이렇게 지정한다. * 단측검정이라고 한다 (반댓말: 양측검정) {{{#!highlight r t.test(myClassHeight, mu=175, conf.level=0.99, alter="greater") }}} == Paired T-Test == 약물 처리 전 후 차이가 유의미한 차이인지 보는 테스트이다. * 약물 처리 전 후 데이타가 쌍으로 있어야 한다. * 약물 처리 전 후 데이타가 차이가 없다면 (약물이 효과가 없다면), 전-후 데이타의 차이는 0에 가까울 것이다. * 약물 처리 전 후 차이가 없더라도 전-후 데이터 차이가 모조리 기계적으로 0일 수는 없고, 어느 정도 차이가 관찰될 것이다. * 약물 처리 전 후의 데이타 차이가 정규분포 곡선을 따른다면 T-test가 가능하다. * 만약 정규분포를 따르지 않는 데이타라면, raw data 대신 서열(rank)을 가지고 계산하는 [[https://en.wikipedia.org/wiki/Wilcoxon_signed-rank_test|Wilcoxon Signed-Rank Test]]를 한다. * 결국 One-Sample T-test의 변형인 셈이다. 운동 전후 심박수를 재서 기록했다. {{{#!highlight r beforeHR <- c(87,89,85,86,90,83,86,85,87,93) afterHR <- c(89,91,85,89,93,83,89,95,93,93) diff <- afterHR - beforeHR hist(diff, 10) }}} === 정규성 test === {{{#!highlight r shapiro.test(afterHR - beforeHR) hist(afterHR - beforeHR, 10) }}} ```p-value = 0.03814``` 로 정규분포를 따르지 않는 것처럼 보이므로 [[https://en.wikipedia.org/wiki/Wilcoxon_signed-rank_test|Wilcoxon signed-rank test]]를 하겠다. * histogram도 이상하게 보인다. === Wilcoxon Signed Rank test === R 함수 [[https://www.rdocumentation.org/packages/stats/versions/3.6.2/topics/wilcox.test|wilcox.test( )]]를 사용한다. * [[https://www.rdocumentation.org/packages/stats/versions/3.6.2/topics/wilcox.test|wilcox.test( )]] 안에 vector 하나가 있으면 Wilcoxon signed rank test를 계산한다. * [[https://www.rdocumentation.org/packages/stats/versions/3.6.2/topics/wilcox.test|wilcox.test( )]] 안에 vector 두개를 넣고 paired=TRUE라고 하면 Wilcoxon signed rank test를 계산한다. * 그 외의 경우는 Wilcoxon rank sum test(Mann-Whitney test)를 계산한다. {{{#!highlight r wilcox.test(afterHR, beforeHR, paired=TRUE) # 전/후 값을 각각 넣어줬다 (vector 2개) # 혹은 wilcox.test(afterHR - beforeHR) # 전/후 값의 차이를 넣어줬다 (vector 1개) # 혹은 diff <- afterHR - beforeHR wilcox.test(diff) # 미리 계산된 차이를 넣어줬다 (이하동문) }}} 결과: {{{#!highlight rout numbers=disable 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이 아니다) 채택 1. 운동 효과 있음 마지막에 보이는 Warnings은 같은 순위에 rank된 데이타에 의해서 생긴 메세지이다. * 보기 싫으면 exact=FALSE 옵션을 준다. {{{#!highlight r wilcox.test(afterHR, beforeHR, paired=TRUE, exact=FALSE) }}} === Paired T-test === 만약 shapiro.test()에서 p>0.05로 정규성이 확인되면 T-test를 할 수 있다. * [[https://www.rdocumentation.org/packages/stats/versions/3.6.2/topics/t.test|t.test( )]]를 사용하면 되는데, 사용법은 [[https://www.rdocumentation.org/packages/stats/versions/3.6.2/topics/wilcox.test|wilcox.test( )]]와 같다. {{{#!highlight r # 전후 데이타의 차이의 평균이 0과 다른지 확인한다는 테스트 정의를 그대로 옮기면, t.test(beforeHR - afterHR) # 혹은 R에게 모든 것을 맡기면, t.test(beforeHR, afterHR, paired = TRUE) }}} == 정리 == 1. 두 그룹의 평균을 비교할 때는 T-test(혹은 유사품)을 쓴다. 1. 자료가 [[../NormalDistribution|정규분포]]를 보이면 [[https://www.rdocumentation.org/packages/stats/versions/3.6.2/topics/t.test|t.test()]] 를 쓴다. * 표준정규분포로 변환이 가능해야 T-test가 된다. * [[../NormalDistribution|정규분포]]를 보이는 자료를 이용한 계산을 parametric 통계 (모수 통계)라고 한다. * p < 0.05 면 평균이 유의미하게 다르다고 생각 (95% 신뢰수준에서) 1. 자료가 [[../NormalDistribution|정규분포]]를 보이지 않으면 [[https://www.rdocumentation.org/packages/stats/versions/3.6.2/topics/wilcox.test|wilcox.test()]] 를 쓴다. * 비모수 통계 (non-parametric statistics) 라고 한다. * 자료값에 순위(rank)를 매긴 후 이 rank를 비교하는 방법이다. * p < 0.05 면 평균이 유의미하게 다르다고 생각 (95% 신뢰수준에서) 1. 기타 * 자료가 정규성을 띄는지는 [[https://www.rdocumentation.org/packages/stats/versions/3.6.2/topics/shapiro.test|shapiro.test()]] 로 계산한다. * p < 0.05 면 [[../NormalDistribution|정규분포]]와 유의미하게 다른 분포라고 생각 * 분산은 [[https://www.rdocumentation.org/packages/stats/versions/3.6.2/topics/var.test|var.test()]]로 비교한다. * p < 0.05 면 분산이 유의미하게 서로 다르다고 생각 || ||<-2> 정규분포(O): 모수통계 (parametric) || 정규분포(X): 비모수 (non-parametric) || ||<|2> 두 그룹이 독립적<
>(샘플들끼리 만나본 적 없음)||<|2> Two sample T-test || 분산이 같다: [[https://en.wikipedia.org/wiki/Student's_t-test|Student's T-test]]<
>```t.test(y ~ x, var.equal=T)``` ||<|2> [[https://en.wikipedia.org/wiki/Mann%E2%80%93Whitney_U_test|Mann-Whitney Test]]<
>([[https://en.wikipedia.org/wiki/Wilcoxon_rank_sum_test|Wilcoxon Rank Sum test]])<
>```wilcox.test(y ~ x)``` || || 분산이 다르다: [[https://en.wikipedia.org/wiki/Welch's_t-test|Welch's T-test]]<
>```t.test(y ~ x)``` || || 두 그룹이 서로 엮임<
>(샘플들이 그냥 그 자신임<
>before/after 차이) ||<-2> [[https://en.wikipedia.org/wiki/Paired_t-test|Paired T-test]]<
>(사실은 [[https://en.wikipedia.org/wiki/Student%27s_t-test#One-sample_t-test|One-Sample T-test]]가 화장하고 나타남)<
>```t.test(x, y, paired=TRUE)```<
>```t.test(y-x)``` || [[https://en.wikipedia.org/wiki/Wilcoxon_signed-rank_test|Wilcoxon Signed Rank test]]<
><
>```wilcox.test(x, y, paired=TRUE)```<
>```wilcox.test(y-x)``` || ----- <>