두개의 모집단에 대한 추정과 검정 (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
반응형
Posted by Rfriend
,

통계적 검정 (statistical testing) 은 모집단의 모수 또는 분포 형태에 대한 추정에 대해 그것이 옳은지 그른지를 임의로 추출한 표본으로부터 통계량을 측정하여 판단하는 통계적 절차를 말합니다.

 

단일 모집단에 대한 통계적 추론 (추정과 검정) 과 관련하여

 

[표본이 크고 정규성 충족 시]

- 단일 모집단의 모평균에 대한 신뢰구간 추정과 검정

   : t.test()

 

- 단일 모집단의 모분산에 대한 신뢰구간 추정과 검정

   : chi-square test

 

- 단일 모집단의 모비율에 대한 신뢰구간 추정과 검정

   : prop.test()

 

 

[정규성 미충족 시]

- 단일 모집단 중심에 대한 비모수 검정

  (Nonparametric test on one sample with median)

  : wilcox.test()

 

 

[정규성 여부 검정]

- 단일 모집단 분포의 정규성 검정

  : shapiro.test(), qqnorm(), qqline()

 

을 차례로 살펴보겠습니다.

 

지난번 포스팅의 정규분포 형태를 띠는 '단일 모집단의 모평균, 모분산, 모비율에 대한 신뢰구간 추정과 검정'에 이어서, 이번 포스팅에서는 정규분포 형태를 띠지 않는 단일 모집단의 비모수 검정에 대해 알아보고, R의 wilcox.test() 함수를 사용해 예를 들어보겠습니다.

 

표본의 개수가 많은 경우에는 중심극한의 정리에 의거해서 정규분포로 근사하게 되어 문제가 안되는데요, 표본의 개수가 작은 경우에는 정규성을 충족시키지 못하는 문제가 발생할 수 있어 t-검정을 사용할 수 없게 되며 이럴 때 사용하는 것이 비모수 검정이 되겠습니다. 혹은 모집단이 정규분포를 띠는지 아닌지를 알지 못하는 경우에도 비모수 검정 (nonparametric 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

 Mann-Whitney test

 paired 2-sample t-test

 Wilcoxon signed rank test

 more than

2 samples

 one-way ANOVA

 Kruskal-Wallis test

 

 

단일 모집단에 중심에 대한 비모수 검정에는 Wilcoxon signed rank 검정을 실시하면 되며, 아래에 R의 wilcox.test() 함수를 사용한 예를 소개하였습니다.

 

 

 

 

 


 

 

문제 ) 2010년도에 서울 지역의 고등학교 1학년 남학생의 몸무게를 전수 조사하였더니 평균이 63.0 kg, 표준편차가 8.0 kg이 나왔다.  2015년에 15명의 남학생을 무작위로 표본을 추출하여 몸무게를 재어보니 {70.2, 54.9, 67.0, 60.5, 63.4, 61.9, 71.8, 66.1, 72.6, 73.0, 68.7, 70.3, 66.2, 55.6, 65.9} 와 같이 나왔을 때 서울 지역 고등학교 1학년 남학생의 몸무게가 5년 전보다 더욱 증가했다고 볼 수 있는가?

 

(대립가설 1, 단측 검정 "greater") 서울 지역 고등학교 1학년 남학생의 몸무게가 5년 전보다 더욱 증가하였다는 대립가설을 검정하시오.

 

H0 : 서울 지역 고등학교 1학년 남학생의 몸무게는 5년 전보다 증가하지 않음

H1 : 서울 지역 고등학교 1학년 남학생의 몸무게가 5년 전보다 더욱 증가

 

 

> ##----------------------------------------------------------
> ## 단일 모집단의 모평균에 대한 비모수 검정: wilcox.test()
> ##----------------------------------------------------------
> 
> # x : random sample of 15 students's weight in high school
> x <- c(70.2, 54.9, 67.0, 60.5, 63.4, 61.9, 71.8, 66.1, 72.6, 73.0, 68.7, 70.3, 66.2, 55.6, 65.9)
> mean(x)
[1] 65.87333
> var(x); sd(x)
[1] 32.54495
[1] 5.704818
> 
> stem(x) # stem-and-leaf plot

  The decimal point is 1 digit(s) to the right of the |

  5 | 
  5 | 56
  6 | 123
  6 | 66679
  7 | 00233

> 
> 
> # wilcox signed rank test, one-sided test : "greater"
> wilcox.test(x, # weight vector for wilcox-test
+             alternative = c("greater"), #  alternative = c("less", "greater", "two-sided")
+             mu = 63.0, # mu of population
+             conf.int = TRUE) # 95% pseudomedian confidence interval

	Wilcoxon signed rank test

data:  x
V = 92, p-value = 0.0365
alternative hypothesis: true location is greater than 63
95 percent confidence interval:
 63.35   Inf
sample estimates:
(pseudo)median 
        66.175

 

 

위의 비모수 검정 결과 P-value가 0.0365 로서 5% 유의수준 하에 귀무가설을 기각하게 되고 대립가설을 채택하게 되어 5년 전보다 고등학교 남학생의 몸무게가 증가했다고 판단할 수 있겠습니다.

 

 

 

t-검정(t-Test)와 비교해보면 아래와 같습니다. 결과는 크게 다르지 않게 나왔습니다.

 

> # t-test, one-sided test : "greater"
> t.test(x, # weight vector for t-test
+        alternative = c("greater"), #  alternative = c("less", "greater", "two-sided")
+        mu = 63.0, # mu of population
+        conf.level = 0.95) # confidence level or confidence coefficient (1-α)

	One Sample t-test

data:  x
t = 1.9507, df = 14, p-value = 0.0357
alternative hypothesis: true mean is greater than 63
95 percent confidence interval:
 63.27896      Inf
sample estimates:
mean of x 
 65.87333

 

 

 

 

Wilcoxon signed rank test 의 lower confidence limit, upper confidence limit 을 indexing 해오는 방법은 아래와 같습니다.

 

> # indexing of 95% confidence level value > wilcox.test_confi_95 <- wilcox.test(x, alternative = c("greater"), mu = 63.0, conf.int = TRUE) > > names(wilcox.test_confi_95) # statistics [1] "statistic" "parameter" "p.value" "null.value" "alternative" "method" "data.name" [8] "conf.int" "estimate" > > wilcox.test_confi_95$conf.int # confidence interval at 95% confidence level [1] 63.35 Inf attr(,"conf.level") [1] 0.95 > > wilcox.test_confi_95$conf.int[1] # lower confidence limit [1] 63.35 > wilcox.test_confi_95$conf.int[2] # upper confidence limit [1] Inf

 

 

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

 

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

 

728x90
반응형
Posted by Rfriend
,