R 분석과 프로그래밍/R 통계분석

R (4) 두 모집단의 중심 차이에 대한 비모수 검정 : wilcox.test()

Rfriend 2015. 10. 18. 23:02

두개의 모집단에 대한 추정과 검정 (two sample tests)에 대해서 정규분포 가정을 만족하는 경우와 그렇지 않은 경우로 나누어서 알아보겠습니다.

 

 

정규성 가정을 충족하는 경우

 

(1) 독립된 두 표본의 평균 차이에 대한 추정과 검정 : t.test()

     (indepentent two sample t-test)

 

(2) 짝을 이룬 표본에 대한 평균 차이에 대한 추정과 검정 : t.test(paired=TRUE)

     (paired sample t-test)

 

(3) 두 모집단의 모비율 차이에 대한 추정과 검정 : prop.test()

     (independent two population proportions test)

 

 

정규성 가정을 충족하지 못하는 경우, 혹은 분포형태를 모르는 경우

 

(4) 두 모집단의 중심 차이에 대한 비모수 검정 : wilcox.test()

    (non-parametric wilcoxon tests on two indepedent sample)

 

 

그동안의 포스팅에서는 "정규성 가정을 충족하는" 두 모집단의 모평균 혹은 모비율 차이에 대한 추정과 검정을 다루었는데요, 이번 포스팅에서는 정규성 가정을 만족하지 않거나 혹은 분포형태를 모르는 경우의 (4) 두 모집단의 중심 차이에 대한 비모수 검정(non-parametric wilcoxon tests on two indepedent sample), R의 wilcox.test() 함수에 대해 소개하겠습니다.

(cf. 정규성을 만족하면 t-test를 실시)

 

모수 검정과 비모수 검정법은 아래 비교표처럼 서로 짝을 지어서 보면 좀더 쉽게 이해할 수 있을 것입니다. 

 

 

 

[ 모수 검정과 비모수 검정 비교표 ]

 

 구분

 모수 검정

(Parametric Test)

비모수 검정

(Nonparametric Test) 

 When to use

 정규분포 가정 만족 시

 (normal distribution)

 정규분포 가정 불충족 시,

 혹은 모집단이 어떤 분포를 따르는지 모를 때

 (non-normal distribution, or un-know distribution,

  or very small sample size, or rankded data)

Statisctic

 평균 (mean)

 중앙값 (median) 

 1 sample

 1 sample t-test 

 1 sample Wilcoxon signed rank test

 2 samples

 2 sample t-test

 Wilcoxon rank sum test,  

 Mann-Whitney U-test

 paired 2-sample t-test

 Wilcoxon signed rank test

 more than

2 samples

 one-way ANOVA

 Kruskal-Wallis test

 

이론적인 부분에 대해서는 wikipedia (☞ https://en.wikipedia.org/wiki/Mann%E2%80%93Whitney_U_test) 를 참조하시기 바랍니다.

 

두 집단이 독립적이면 (1) Wilcoxon rank sum test (혹은 Mann-Whitney U-test), 짝을 이룬 집단이면 (2) Wilcoxon signed rank test 를 사용하게 되는되요, R에서는 wilcox.test() 함수를 동일하게 사용하고, 옵션에서 "paired = TRUE" 여부에 따라서 짝을 이룬 표본 여부를 구분하게 됩니다.  순서대로 예를 들어 설명해보겠습니다.

 

 

 

(1) independent 2 samples : Wilcoxon rank sum test (혹은 Mann-Whitney U-test)

     => wilcox.test()

 

정규분포를 따르지 않는 두 모집단에 중심에 대한 비모수 검정에 사용하는 R Wilcoxon rank sum test를 실시하면 되며, 아래에 R의 wilcox.test() 함수를 사용한 예를 소개하였습니다. 

 

 

[ R wilcox.test() 함수 사용방법 2가지 ] 

 

 

 

예제로 사용할 데이터는 MASS 패키지에 내장된 Cars93 데이터프레임의 가격(Price)과 생산국가(Origin) 입니다. 생산국이 USA vs. non-USA 2개의 group 에 대해서 차 가격(Price)의 평균이 차이가 있는지를 검정해보겠습니다.

 

> # Dataset
> library(MASS)
> str(Cars93)
'data.frame':	93 obs. of  27 variables:
 $ Manufacturer      : Factor w/ 32 levels "Acura","Audi",..: 1 1 2 2 3 4 4 4 4 5 ...
 $ Model             : Factor w/ 93 levels "100","190E","240",..: 49 56 9 1 6 24 54 74 73 35 ...
 $ Type              : Factor w/ 6 levels "Compact","Large",..: 4 3 1 3 3 3 2 2 3 2 ...
 $ Min.Price         : num  12.9 29.2 25.9 30.8 23.7 14.2 19.9 22.6 26.3 33 ...
 $ Price             : num  15.9 33.9 29.1 37.7 30 15.7 20.8 23.7 26.3 34.7 ...
 $ Max.Price         : num  18.8 38.7 32.3 44.6 36.2 17.3 21.7 24.9 26.3 36.3 ...
 $ MPG.city          : int  25 18 20 19 22 22 19 16 19 16 ...
 $ MPG.highway       : int  31 25 26 26 30 31 28 25 27 25 ...
 $ AirBags           : Factor w/ 3 levels "Driver & Passenger",..: 3 1 2 1 2 2 2 2 2 2 ...
 $ DriveTrain        : Factor w/ 3 levels "4WD","Front",..: 2 2 2 2 3 2 2 3 2 2 ...
 $ Cylinders         : Factor w/ 6 levels "3","4","5","6",..: 2 4 4 4 2 2 4 4 4 5 ...
 $ EngineSize        : num  1.8 3.2 2.8 2.8 3.5 2.2 3.8 5.7 3.8 4.9 ...
 $ Horsepower        : int  140 200 172 172 208 110 170 180 170 200 ...
 $ RPM               : int  6300 5500 5500 5500 5700 5200 4800 4000 4800 4100 ...
 $ Rev.per.mile      : int  2890 2335 2280 2535 2545 2565 1570 1320 1690 1510 ...
 $ Man.trans.avail   : Factor w/ 2 levels "No","Yes": 2 2 2 2 2 1 1 1 1 1 ...
 $ Fuel.tank.capacity: num  13.2 18 16.9 21.1 21.1 16.4 18 23 18.8 18 ...
 $ Passengers        : int  5 5 5 6 4 6 6 6 5 6 ...
 $ Length            : int  177 195 180 193 186 189 200 216 198 206 ...
 $ Wheelbase         : int  102 115 102 106 109 105 111 116 108 114 ...
 $ Width             : int  68 71 67 70 69 69 74 78 73 73 ...
 $ Turn.circle       : int  37 38 37 37 39 41 42 45 41 43 ...
 $ Rear.seat.room    : num  26.5 30 28 31 27 28 30.5 30.5 26.5 35 ...
 $ Luggage.room      : int  11 15 14 17 13 16 17 21 14 18 ...
 $ Weight            : int  2705 3560 3375 3405 3640 2880 3470 4105 3495 3620 ...
 $ Origin            : Factor w/ 2 levels "USA","non-USA": 2 2 2 2 2 1 1 1 1 1 ...
 $ Make              : Factor w/ 93 levels "Acura Integra",..: 1 2 4 3 5 6 7 9 8 10 ... 

 

 

먼저, y(vector) ~ Factor, data=data.frame 형식을 먼저 소개합니다.

 

> 
> ##----------------------------------------------------------
> ## independent two population proportions test : prop.test()
> ##----------------------------------------------------------
> 
> ##--- way 1 : y ~ Factor
> wilcox.test(Price ~ Origin, 
+             data=Cars93, 
+             alternative = c("two.sided"), 
+             mu = 0, 
+             conf.int = FALSE, 
+             conf.level = 0.95)

	Wilcoxon rank sum test with continuity correction

data:  Price by Origin
W = 1024.5, p-value = 0.6724
alternative hypothesis: true location shift is not equal to 0

Warning message:
In wilcox.test.default(x = c(15.7, 20.8, 23.7, 26.3, 34.7, 40.1,  :
  tie가 있어 정확한 p값을 계산할 수 없습니다

 

 

P-value가 0.6724로서 유의수준 10%에서 귀무가설(H0 : Origin(USA와 non-USA) 별 두 집단 간에 자동차 가격 차이는 없다)을 채택하게 되었습니다.

 

 

두번째로, x, y numeric vector를 이용하는 방법은 아래와 같습니다.

 

> ##--- way 2. x, y numeric vectors
> 
> # x, y numeric vector indexing
> Price_USA <- Cars93[which(Cars93$Origin == c("USA")), c("Price")]
> Price_nonUSA <- Cars93[which(Cars93$Origin == c("non-USA")), c("Price")]
> wilcox.test(Price_USA, Price_nonUSA, 
+             alternative = c("two.sided"), 
+             mu = 0, 
+             conf.int = FALSE, 
+             conf.level = 0.95)

	Wilcoxon rank sum test with continuity correction

data:  Price_USA and Price_nonUSA
W = 1024.5, p-value = 0.6724
alternative hypothesis: true location shift is not equal to 0

Warning message:
In wilcox.test.default(Price_USA, Price_nonUSA, alternative = c("two.sided"),  :
  tie가 있어 정확한 p값을 계산할 수 없습니다

 

 

W통계량 및 P-value가 위의 첫번째 방법과 동일함을 알 수 있습니다.

 

 

 

 

다음으로 짝을 이룬 표본에 대한 비모수 검정 소개합니다. paired sample t-test 포스팅에서 사용했던 예제를 동일하게 사용하겠습니다.

 

(2) paired 2-sample : Wilcoxon signed rank test => wilcox.test(, paired = TRUE, ...)

 

Example 1 ) 새로운 당뇨병 치료제를 개발한 제약사의 예를 계속 들자면, 치료에 지대한 영향을 주는 외부요인을 통제하기 위해 10명의 당뇨병 환자를 선별하여 1달 동안 '위약(placebo)'을 투여한 기간의 혈압 (Xi)과 '신약(new medicine)'을 투여한 1달 기간 동안의 혈당 수치(Yi)를 측정하여 짝을 이루어 혈당 차이를 유의수준 5%에서 비교하는 방법이 짝을 이룬 표본에 대한 검정이 되겠습니다. 단, 모집단이 정규분포를 따르지 않는다고 합니다.

 

 

[ 환자 10명에 대한 당뇨병 치료제 투약 전/후 혈당 비교(before/after paired sample comparison) ]

  

(예를 들어 설명하기 위해 임의로 가공해서 만든 가짜 수치임.  혈당에 대해서는 아무것도 모름 ^^;)

 

 

귀무가설 H0 : 당뇨병 치료제는 효과가 없다 (mu1 = mu2, ie. difference = 0)

대립가설 H1 : 당뇨병 치료제는 효과가 있다 (혈당을 낮춘다, mu1 > mu2) => 우측검정(right-sided test)

 

위 문제를 R의 wilcox.test(paired=TRUE) 함수를 사용해서 풀어보면 아래와 같습니다.

 

당뇨병 치료제가 효과가 있어서 혈당을 낮추었는지를 검정하는 것이므로 'alternative = c("greater") 옵션(mu1 > mu2)을 입력하였습니다. P-value 가 0.006172 이므로 유의수준 (significance level) 5% 에서 귀무가설을 기각하고 대립가설(치료제가 효과가 있음. 혈당을 낮추었음)을 채택하게 됩니다.

(cf. paired sample t-test 에서도 대립가설 채택)

 

> ##----------------------------------------------------------
> ## paired sample : wilcox signed rank test
> ##----------------------------------------------------------
> 
> # paired 10 sample of patient's blood sugar
> x1 <- c(51.4, 52.0, 45.5, 54.5, 52.3, 50.9, 52.7, 50.3, 53.8, 53.1)
> x2 <- c(50.1, 51.5, 45.9, 53.1, 51.8, 50.3, 52.0, 49.9, 52.5, 53.0)
> # wilcox signed rank test
> wilcox.test(x1, x2, 
+        alternative = c("greater"), 
+        paired = TRUE, 
+        conf.level = 0.95)

	Wilcoxon signed rank test with continuity correction

data:  x1 and x2
V = 52.5, p-value = 0.006172
alternative hypothesis: true location shift is greater than 0

Warning message:
In wilcox.test.default(x1, x2, alternative = c("greater"), paired = TRUE,  :
  tie가 있어 정확한 p값을 계산할 수 없습니다

 

 

많은 도움이 되었기를 바랍니다. 

 

이번 포스팅이 도움이 되었다면 아래의 '공감 ~♡'를 꾸욱 눌러주세요. ^^

 

 

728x90
반응형