반응형

[R] 윌콕슨 순위 합 검정, 맨 휘트니 U 검정 (비모수 독립 표본 중앙값 검정: Wilcoxon rank sum test, Mann-Whitney U test) - wilcox.test()

 두 분포의 평균이 다른지 확인하는 방법을 이전에는 독립 표본 T검정 (Two-Sample T test)로 시행했었다. (2022.11.12 - [모평균 검정/R] - [R] 독립 표본 T검정 (Independent samples T-test) - t.test(), var.test(), levene.test()) 하지만 여기에는 중요한 가정이 필요한데, 각각의 분포가 정규성을 따르는 것이다. 하지만 분포가 정규성을 따르지 않는다면 어떻게 해야 할까? 그럴 때 사용하는 것이 Wilcoxon rank sum test (윌콕슨 순위 합 검정)이다.  윌콕슨 순위 합 검정 (Wilcoxon rank sum test)는 이후에 Mann과 Whitney가 개정을 하였고 그때 U 통계량을 사용하므로 맨 휘트니 U 검정(Mann-Whitney U test)이라고도 한다. 또한 세 사람의 이름을 붙여 Wilcoxon-Mann-Whitney Test (WMW test)라고도 한다. 

 

 이번 포스팅에서는 윌콕슨 순위 합 검정 (Wilcoxon rank sum test)에 대해 알아볼 것이다.

 

*실습용 데이터는 아래 링크를 클릭하면 다운로드할 수 있습니다.

2022.08.04 - [공지사항 및 소개] - 분석용 데이터 (update 22.11.30)

 

분석용 데이터 (update 22.11.28)

2022년 11월 28일 버전입니다. 변수는 계속하여 추가될 예정입니다. 다음 카테고리에 있는 글에서 이용된 데이터입니다. - 기술 통계 - 범주형 자료 분석 - 모평균 검정 - 반복 측정 자료 분석 - 통계

medistat.tistory.com

 

코드를 보여드리기에 앞서 워킹 디렉토리부터 지정하겠다.

워킹 디렉토리에 관한 설명은 다음 링크된 포스트에서 볼 수 있다.

2022.08.05 - [통계 프로그램 사용 방법/R] - [R] 작업 디렉토리 (Working Directory) 지정 - getwd(), setwd()

setwd("C:/Users/user/Documents/Tistory_blog")

 

데이터를 불러와 df에 객체로 저장하겠다.

데이터 불러오는 방법은 다음 링크에서 볼 수 있다.

2022.08.05 - [통계 프로그램 사용 방법/R] - [R] 데이터 불러오기 : EXCEL - read_excel(), read.xlsx()

2022.08.10 - [통계 프로그램 사용 방법/R] - [R] 데이터 저장하기 : CSV 파일 - write.csv(), write_csv()

2022.08.10 - [통계 프로그램 사용 방법/R] - [R] 데이터 불러오기 : SAS file (.sas7bdat) - read.sas7bdat(), read_sas()

install.packages("readr")
library("readr")
df<-read_csv("Data.csv")

 

목표:  음주 여부에 따라 Gamma-glutamyl transferase(GGT)의 중앙값이 모집단 수준에서 서로 다르다고 말할 수 있는가?

 

 만약 GGT의 분포가 정규성을 따른다면, 독립 표본 T 검정으로 이를 확인할 수 있을 것이다. 따라서 정규성 여부를 먼저 확인해보자.

 

1) 정규성 - 코드

음주 여부 별로 GGT의 정규성을 확인하기 위해서는 다음 두 가지의 일을 해야 한다.

1) 음주 여부에 따라 데이터를 나누기

2) 각각 정규성을 확인하기.

 

1)데이터 나누기

조건에 따라 데이터를 나누는 방법에 대한 설명은 다음 링크에서 볼 수 있다. 2022.11.10 - [통계 프로그램 사용 방법/R] - [R] 조건에 맞는 자료 추출하기

위 링크에서 확인할 수 있듯이 여러 가지 방법으로 나눌 수 있지만 indexing을 이용하여 나누도록 하겠다.

dfal<-df[df$ALCOHOL==1,]
dfno<-df[df$ALCOHOL==0,]

dfal: 음주자의 데이터

dfno: 비음주자의 데이터

 

2) 정규성 확인

정규성 검정에 관한 내용은 다음 링크에서 확인할 수 있다.

2022.08.11 - [기술 통계/R] - [R] 정규성 검정 (1) : Q-Q plot - qqnorm(), qqline()

2022.08.11 - [기술 통계/R] - [R] 정규성 검정 (2) : 히스토그램 - hist(), dnorm()

2022.08.11 - [기술 통계/R] - [R] 정규성 검정 (3) : 정량적 검정 (Shapiro-Wilk, Kolmogorov-Smirnov) - shapiro.test(), ks.test()

2022.08.12 - [기술 통계/R] - [R] 정규성 검정 (4) : 정량적 검정 (Lilliefors test) - lillie.test()

2022.08.16 - [기술 통계/R] - [R] 고급 Q-Q Plot - Van der Waerden, Rankit, Tukey, Blom

 

#음주자
# 1) Q-Q plot 그리기
qqnorm(dfal$GGT)
qqline(dfal$GGT)
# 2) 히스토그램 그리기
hist(dfal$GGT, prob=TRUE)
GGTrange<-seq(min(dfal$GGT),max(dfal$GGT),length=max(max(dfal$GGT)-min(dfal$GGT),100))
ND<-dnorm(GGTrange,mean=mean(dfal$GGT),sd=sd(dfal$GGT))
lines(GGTrange, ND, lwd=2)
# 3) Shapiro-Wilk test 시행하기
shapiro.test(dfal$GGT)

#비음주자
# 1) Q-Q plot 그리기
qqnorm(dfno$GGT)
qqline(dfno$GGT)
# 2) 히스토그램 그리기
hist(dfno$GGT, prob=TRUE)
GGTrange<-seq(min(dfno$GGT),max(dfno$GGT),length=max(max(dfno$GGT)-min(dfno$GGT),100))
ND<-dnorm(GGTrange,mean=mean(dfno$GGT),sd=sd(dfno$GGT))
lines(GGTrange, ND, lwd=2)
# 3) Shapiro-Wilk test 시행하기
shapiro.test(dfno$GGT)

 

결과

1) 음주자

 

	Shapiro-Wilk normality test

data:  dfal$GGT
W = 0.91166, p-value < 2.2e-16

 

2) 비음주자

	Shapiro-Wilk normality test

data:  dfno$GGT
W = 0.90691, p-value = 3.637e-15

 

 N수가 2,000개 미만이므로 Shapiro-Wilk 통계량의 p-value를 보면 0.05 이하이며, Q-Q Plot은 대부분의 데이터가 선상에 있지 않고, 히스토그램에서도 정규성을 따르지 않는 것처럼 보인다. 따라서 독립 표본 T검정 (Two-sample T-test)를 시행할 수 없고, 맨 휘트니 U 검정 (Mann-Whitney U test)을 시행해야 한다.

 

 

맨 휘트니 U 검정 (Mann-Whitney U test) 코드

wilcox.test(dfal$GGT,dfno$GGT,correct=FALSE)

wilcox.test(dfal$GGT, dfno$GGT, correct=FALSE) : 맨 휘트니 U 검정을 시행하는데, dfal데이터의 GGT와 dfno데이터의 GGT를 비교하라. 연속성 수정은 하지 마라. (연속성 수정에 관한 내용은 다음 링크를 확인하길 바란다.2022.08.30 - [통계 이론] - [이론] 연속성을 수정한 카이 제곱 검정 (Chi-squared test with Yates's correction for continuity))

 

결과

	Wilcoxon rank sum test

data:  dfal$GGT and dfno$GGT
W = 200084, p-value < 2.2e-16
alternative hypothesis: true location shift is not equal to 0

Wilcoxon rank sum test

data:  dfal$GGT and dfno$GGT

W = 200084, p-value < 2.2e-16

alternative hypothesis: true location shift is not equal to 0

 

p-value가 매우 작으므로 유의한 결과임을 알 수 있다. 따라서 귀무가설을 기각하고 대립 가설을 택해야한다. 여기에서 귀무가설과 대립가설은 무엇일까?

 

귀무가설 $H_0=$ 두 분포는 동일하다.

대립가설 $H_1=$ 두 분포는 평균만 다를 뿐, 분포는 똑같이 생겼다.

즉, 대립 가설이 의미하는 것은 두 분포는 평행이동 관계에 있다는 것이다. 그래야 중앙값이 달라진 것인지 확인할 수 있다. 

평행이동 관계

이 말은, 맨 휘트니 U 검정에도 필요한 가정이 있다는 말이다. 두 분포는 동일하게 생겼어야 한다.

조금 어렵게 이야기하면, 두 분포의 first moment는 다르지만, 그보다 고차원의 central moment는 같아야 한다.

만약 생김새가 다르면 맨 휘트니 U 검정을 사용하면 안 되고, Robuts rank order test 등을 시행해야 한다. (물론 현실에서는 이런 내용을 무시한 채 '정규성을 따르지 않으니 맨 휘트니 U 검정을 사용한다'는 연구자가 대다수다.) 이에 관한 내용은 다음 링크를 확인하길 바란다. 2022.12.01 - [모평균 검정/R] - [R] 로버스트 순위 순서 검정 (비모수 독립 표본 중앙값 검정: Robust rank order test, Flinger-Pollicello test) - rrod.test()

 

 그런데 위 히스토그램을 보면 음주자와 비음주자의 GGT분포는 right skewed 된 분포로 어느 정도 비슷하게 생겼다. 모든 central moment를 조사하는 것은 현실적으로 힘들지만, 2nd cental moment인 분산의 차이를 검정해보면 다음과 같음을 알 수 있다. 등분산성 검정 방법은 다음 링크를 확인하길 바란다.

2022.11.12 - [모평균 검정/R] - [R] 독립 표본 T검정 (Independent samples T-test) - t.test(), var.test(), levene.test()

2022.11.20 - [모평균 검정/R] - [R] 등분산성 검정 (Homogeneity of variance) - levene.test(), bartlett.test()

 

코드

var.test(dfal$GGT,dfno$GGT)

 

결과

	F test to compare two variances

data:  dfal$GGT and dfno$GGT
F = 1.0248, num df = 589, denom df = 409, p-value = 0.7922
alternative hypothesis: true ratio of variances is not equal to 1
95 percent confidence interval:
 0.8559314 1.2234543
sample estimates:
ratio of variances 
          1.024817

p-value는 0.7922로 분산에 차이가 없다고 결론 내리는 것이 합당하다.

따라서 두 분포의 모양이 같다고 생각하면 본 맨 휘트니 U 검정으로 음주자와 비음주자의 GGT값에는 차이가 있다고 결론 내릴 수 있다.

 

 

만약, 분포가 다르게 생기면 어떤 결과가 초래되길래 그렇게 강조하는 걸까?

데이터의 NP3_raw와 NP4_raw의 분포를 확인하고, 분산, 중앙값을 확인해보자

코드

hist(df$NP3_raw, breaks=20)
hist(df$NP4_raw, breaks=20)
median(df$NP3_raw)
median(df$NP4_raw)
var(df$NP3_raw)
var(df$NP4_raw)
var.test(df$NP3_raw, df$NP4_raw)
wilcox.test(df$NP3_raw, df$NP4_raw, correct=FALSE)

 

결과

> median(df$NP3_raw)
[1] 0.9968156
> median(df$NP4_raw)
[1] 0.9968156

> var(df$NP3_raw)
[1] 0.2237356
> var(df$NP4_raw)
[1] 0.2237356

> var.test(df$NP3_raw, df$NP4_raw)

	F test to compare two variances

data:  df$NP3_raw and df$NP4_raw
F = 1, num df = 999, denom df = 999, p-value = 1
alternative hypothesis: true ratio of variances is not equal to 1
95 percent confidence interval:
 0.8832987 1.1321198
sample estimates:
ratio of variances 
                 1 
                 
                 
> wilcox.test(df$NP3_raw, df$NP4_raw, correct=FALSE)

	Wilcoxon rank sum test

data:  df$NP3_raw and df$NP4_raw
W = 568902, p-value = 9.515e-08
alternative hypothesis: true location shift is not equal to 0

NP3_raw는 right skewed, NP4_raw는 left skewed로 서루 매우 다르게 생겼지만, 분산, 중앙값이 완벽히 일치하며, 등분산성 검정에서도 분산에 차이가 없다고 나온다. 하지만 맨 휘트니 U 검정 결과 p-value는 매우 작게 나온다. 만약 맨 휘트니 U 검정이 "중앙값이 같은지 확인하는 검정"이라고만 알고 있다면 중앙값이 완전히 같은 이런 경우에도 "중앙값에 차이가 있다."라고 결론 내릴 것이다. 하지만 이 경우 귀무가설을 기각하고 "두 분포는 다르게 생겼다."라고 결론 내려야 옳은 결론에 다다른다. 

 

코드 정리

##워킹 디렉토리 지정
setwd("C:/Users/user/Documents/Tistory_blog")


##데이터 불러오기
install.packages("readr")
library("readr")
df<-read_csv("Data.csv")


##데이터 나누기
dfal<-df[df$ALCOHOL==1,]
dfno<-df[df$ALCOHOL==0,]


##정규성 검정
#음주자
# 1) Q-Q plot 그리기
qqnorm(dfal$GGT)
qqline(dfal$GGT)
# 2) 히스토그램 그리기
hist(dfal$GGT, prob=TRUE)
GGTrange<-seq(min(dfal$GGT),max(dfal$GGT),length=max(max(dfal$GGT)-min(dfal$GGT),100))
ND<-dnorm(GGTrange,mean=mean(dfal$GGT),sd=sd(dfal$GGT))
lines(GGTrange, ND, lwd=2)
# 3) Shapiro-Wilk test 시행하기
shapiro.test(dfal$GGT)

#비음주자
# 1) Q-Q plot 그리기
qqnorm(dfno$GGT)
qqline(dfno$GGT)
# 2) 히스토그램 그리기
hist(dfno$GGT, prob=TRUE)
GGTrange<-seq(min(dfno$GGT),max(dfno$GGT),length=max(max(dfno$GGT)-min(dfno$GGT),100))
ND<-dnorm(GGTrange,mean=mean(dfno$GGT),sd=sd(dfno$GGT))
lines(GGTrange, ND, lwd=2)
# 3) Shapiro-Wilk test 시행하기
shapiro.test(dfno$GGT)


##맨 휘트니 U 검정
wilcox.test(dfal$GGT,dfno$GGT,correct=FALSE)


##등분산성 검정
var.test(dfal$GGT,dfno$GGT)


##모양이 다른 경우
hist(df$NP3_raw, breaks=20)
hist(df$NP4_raw, breaks=20)
median(df$NP3_raw)
median(df$NP4_raw)
var(df$NP3_raw)
var(df$NP4_raw)
var.test(df$NP3_raw, df$NP4_raw)
wilcox.test(df$NP3_raw, df$NP4_raw, correct=FALSE)

 

[R] 윌콕슨 순위 합 검정, 맨 휘트니 U 검정 (비모수 독립 표본 중앙값 검정 정복 완료!

 

작성일: 2022.12.01.

최종 수정일: 2022.12.01.

이용 프로그램: R 4.2.2

RStudio v2022.07.2

RStudio 2022.07.2+576 "Spotted Wakerobin" Release

운영체제: Windows 10, Mac OS 12.6.1

반응형

+ Recent posts