기본 콘텐츠로 건너뛰기

[ML] 결정트리(Decision Tree) 모델

R 비모수적 검정(nonparametic test)

내용

비모수적 검정(nonparametic test)

t-검정 또는 ANOVA의 정규분포를 따르다는 등의 모수적 가정을 충족할 수 없는 경우 비모수적 접근 방식으로 전환할 수 있습니다. 예를 들어, 결과 변수가 본질적으로 심하게 치우치거나 순서가 있는 경우 Wilcoxon-Tesst과 같은 비모수적 검정 방법을 사용할 수 있습니다.

구분 모수검정(parametic Test) 비모수검정(nonparametic test)
가정 정규분포 (0)정규분포(x), 집단의 분포를 모름
통계량평균 (mean) 중앙값 (median)
1 sample 1 sample t-test 1 sample Wilcoxon signed rank test
2 samples 2 sample t-testWilcoxon rank sum test,
Mann-Whitney U-test
paired 2-sample t-test Wilcoxon signed rank test
more than
2 samples
one-way ANOVAKruskal-Wallis test

Wilcoxon test(두 그룹의 비교)

Wilcoxon 검정은 모집단의 데이터들이 정규분포를 따른다고 가정할 수 없거나 분포를 알수 없을 경우 중간값(median)의 유의성을 검정하기 위해 실시합니다. 또한 t-test의 짝비교와 같이 두 그룹의 중간값의 차이가 통계적으로 유의한가를 결정하기 위해 사용합니다. 이 비모수분석 방법이므로 t-test에 비해 전제 조건이 작지만 각 데이터의 독립성은 가정됩니다.

중심극한 정리에 의해 Wilcoxon test의 통계량 w는 정규분포에 부합한다고 가정할 수 있습니다. 이 가정은 통계량의 유의성 검정을 가능하게 합니다. 통계량 w는 평균이 0이고 샘플 크기 n을 기준으로 계산하는 분산은 n(n+1)(2n+1)/6이므로 귀무가설에서 제시한 중간값을 z score로 변환하여 확률을 계산할 수 있습니다. 이 검정의 귀무가설과 대립가설은 다음과 같습니다.

  • 귀무가설: median=a
  • 대립가설: median ≠ a

예를 들어 다음 데이터들의 중간값이 160이라는 귀무가설에 대한 Wilcoxon 검정을 실시합니다.

da<-c(176.9, 158.3, 152.1, 158.8, 172.4, 169.8, 159.7, 162.7, 156.6, 174.5, 184.4, 165.2, 147.8, 177.8, 160.1, 160.5 )
med<-160
  1. 각 값과 중간값과의 차이를 계산합니다.
  2. dif<-da-med; dif
    [1]  16.9  -1.7  -7.9  -1.2  12.4   9.8  -0.3   2.7  -3.4  14.5  24.4   5.2
    [13] -12.2  17.8   0.1   0.5
  3. dif의 절대값에 대한 순위를 결정하고 각값의 부호와 그 순위의 곱의 합을 계산합니다.
  4. difRank<-rank(abs(dif)); difRank
    [1] 14  5  9  4 12 10  2  6  7 13 16  8 11 15  1  3
    difSign<-sign(dif); difSign
    [1]  1 -1 -1 -1  1  1 -1  1 -1  1  1  1 -1  1  1  1
    w<-sum(difRank*difSign); w
    [1] 60
  5. w의 평균 0, 분산은 다음과 같습니다.
  6. n<-length(da)
    sigma<-sqrt(n*(n+1)*(2*n+1)/6); sigma
    [1] 38.67816
  7. z score 계산
  8. z<-(w-0)/sigma; z
    [1] 1.551263
  9. 양쪽검정을 기준으로 표준정규분포에서의 유의수준 0.05에서의 z0.05값은 1.96이며 신뢰구간은 [-1.96, 1.96]이 됩니다. 위에서 계산한 z은 이 구간내에 포함되므로 귀무가설을 기각할 수 없습니다.
  10. qnorm(1-0.025)
    [1] 1.959964
  11. p-value=2p(z>1.55)가 됩니다. 다음의 결과와 같이 p-value는 유의수준 0.05보다 크므로 역시 귀무가설을 기각할 수 없습니다.
  12. p<-2*(1-pnorm(z));p
    [1] 0.1208387

R에서 Wilcoxon test는 다음 함수를 사용합니다. 기본적으로(exact가 지정되지 않은 경우) 표본의 크기가 50개 미만이고 동률이 없는 경우 정확한 p-값이 계산됩니다. 그렇지 않으면 정규 근사가 사용됩니다. 샘플이 작으면 매우 높은 신뢰 구간 범위를 달성하지 못할 수 있습니다.

wilcox.test(x, y = NULL, alternative = c("two.sided", "less", "greater"), mu = 0, paired = FALSE, conf.int = FALSE, conf.level = 0.95, ...)
x, y: 변수이고 두 객체가 전달되면 paried 비교가 실시됩니다.
y~x: y는 수치형벡터, x는 2개의 group을 구분하기 위한 변수
두개의 그룹이 전달되고 paried=FALSE인 경우 Mann-Whitney test라고 합니다.

위 데이터 da에 대해 wilcox.test()함수를 적용하면 다음과 같습니다. 여러가지 원인에 의해 위에서 계산한 결과와 약간의 수치적 차이가 발생할 수 있습니다. 그러나 분석 결과는 같습니다.

wilcox.test(da, mu=160, conf.int=TRUE)
        Wilcoxon signed rank exact test

data:  da
V = 98, p-value = 0.1297
alternative hypothesis: true location is not equal to 160
95 percent confidence interval:
 159.0 170.5
sample estimates:
(pseudo)median
        164.85 

MASS 라이브러리의 데이터 UScrime의 변수 So, Prob에 대한 Mann-Whitney test를 적용합니다.

library(MASS)
with(UScrime, by(Prob, So, median))
So: 0
[1] 0.038201
------------------------------------------------------------
So: 1
[1] 0.055552
wilcox.test(Prob~So, data=UScrime)

        Wilcoxon rank sum exact test

data:  Prob by So
W = 81, p-value = 8.488e-05
alternative hypothesis: true location shift is not equal to 0

위 결과의 p값은 유의확률 0.01보다 작으므로 Prob(수감율)이 So 변수의 두 그룹(남부 주와 비남부 주)에서 동일하다는 가설을 기각할 수 있습니다.

Wilcoxon 부호 있는 순위 검정은 종속 표본 t-검정에 대한 비모수적 대안을 제공합니다. 그룹이 쌍을 이루고 정규성 가정이 타당하지 않은 상황에 적합합니다. 형식은 Mann-Whitney U 테스트와 동일하지만 paired=TRUE 옵션을 추가합니다. 데이터 셋 UScrime의 실업에 대한 두 변수 U1, U2에 대한 두 방법을 적용합니다.

sapply(UScrime[c("U1", "U2")], median)
U1 U2
92 34
Wilcoxon 부호 검정
with(UScrime, wilcox.test(U1, U2, paired=TRUE))
        Wilcoxon signed rank test with continuity correction

data:  U1 and U2
V = 1128, p-value = 2.464e-09
alternative hypothesis: true location shift is not equal to 0

경고메시지(들):
wilcox.test.default(U1, U2, paired = TRUE)에서:
  tie가 있어 정확한 p값을 계산할 수 없습니다
Mann-Whitney 검정
with(UScrime, wilcox.test(U1, U2))
        Wilcoxon rank sum test with continuity correction

data:  U1 and U2
W = 2209, p-value < 2.2e-16
alternative hypothesis: true location shift is not equal to 0

경고메시지(들):
wilcox.test.default(U1, U2)에서: tie가 있어 정확한 p값을 계산할 수 없습니다 
일반적으로 짝비교일 경우 Mann-Whitney 검정이 우선됩니다. 

3 그룹 이상의 비교

비교할 그룹이 2개 이상일 경우에는 모수적 접근 방식으로 분산분석(ANOVA)을 고려할 수 있지만 이 분석의 가정을 충족할 수 없는 경우 비모수적 접근 방식을 사용하여 그룹 차이를 평가할 수 있습니다. 그룹이 독립적인 경우 Kruskal-Wallis 테스트는 유용한 접근 방식을 제공합니다. 그룹간의 연관성이 존재하는 경우(예: 반복 측정 또는 무작위 블록 설계) Friedman 검정이 더 적합합니다.

Kruskal-Wallis 검정
kruskal.test(y~A, data)
y: 수치형 데이터, A: 두개이상의 수준(level)을 가진 변수
Friedman 검정
friedman.test(y~A|B, data)
y: 수치형 데이터, A: 그룹화 변수, B: 대응하는 관찰치들을 식별하는 블럭화 변수
두 경우 모두 data는 변수를 포함하는 행렬 또는 데이터 프레임입니다.
states<-as.data.frame(cbind(state.region, state.x77)) head(states, 1)
state.regionPopulationIncomeIlliteracyLife ExpMurderHS GradFrostArea
Alabama2361536242.169.0515.141.32050708
kruskal.test(Illiteracy~state.region, data=states)
        Kruskal-Wallis rank sum test

data:  Illiteracy by state.region
Kruskal-Wallis chi-squared = 22.672, df = 3, p-value = 4.726e-05

위 결과는 4개의 그룹간의 유의한 차이가 있음을 나타냅니다. 그러나 위 결과는 어느 그룹들간의 차이가 유의한지에 대한 답은 없습니다. 이러한 질문을 위한 평가는 Mann-Whitney의 두 그룹 검정으로 평가할 수 있습니다. 위와 같이 4개의 그룹이 존재하는 경우 Mann-Whitney 검정은 6번을 실시해야 합니다. pairwise.wilcox.test()함수를 각 그룹간의 p 값을 확인할 수 있습니다.

pairwise.wilcox.test(states$Illiteracy, states$state.region)
        Pairwise comparisons using Wilcoxon rank sum test with continuity correction

data:  states$Illiteracy and states$state.region

     1         2           3
2 0.012     -            -
3 0.054   8.1e-05   -
4 0.867   0.018      0.867

P value adjustment method: holm
경고메시지(들): 
1: wilcox.test.default(xi, xj, paired = paired, ...)에서:
  tie가 있어 정확한 p값을 계산할 수 없습니다 ...

그러나 다중비교 내에서 위와 같이 2그룹간의 비교를 사용하는 경우 Type I error(차이가 없는 상황에서 차이가 존재한다고 결정할 수 있는 에러)가 증가하는 위험을 가집니다. 대안으로 2개 이상의 그룹들에 대한 비모수 분석을 제공하는 nparcomp 패키지를 적용합니다. 이 패키지의 nparcomp() 함수는 kruscal.test()와 같은 식(formular)으로 데이터들을 전달합니다. 이 함수는 분석결과와 data에 대한 전반적인 사항들을 모두 반환하므로 summary()함수를 사용하여 그 결과를 요약하거나 다음과 같이 각 비교군의 p-value만을 출력할 수 있습니다.

library(nparcomp)
hoc<-nparcomp(Illiteracy~state.region, data=states)
attributes(hoc)
$names
[1] "Data.Info"   "Contrast"    "Analysis"    "Overall"     "input"
[6] "text.Output" "connames"    "AsyMethod"

$class
[1] "nparcomp"
hoc$Analysis
ComparisonEstimatorLowerUpperStatisticp.Value
1p( 1 , 2 )0.8750.5810.9723.092769810391840.0106956764325296
2p( 1 , 3 )0.190.0380.578-2.11248884256690.156276994260242
3p( 1 , 4 )0.3970.140.727-0.7673426147948120.925735874250196
4p( 2 , 3 )0.010.0010.113-4.695197185924383.32226687898007e-05
5p( 2 , 4 )0.1880.0510.496-2.598530583332930.0464818222669201
6p( 3 , 4 )0.5640.2670.8220.5221675249155480.985318332838074

위 결과는 그룹 2와 3 사이에 유의한 차이를 보이는 것을 알 수 있습니다.

댓글

이 블로그의 인기 게시물

[Linear Algebra] 유사변환(Similarity transformation)

유사변환(Similarity transformation) n×n 차원의 정방 행렬 A, B 그리고 가역 행렬 P 사이에 식 1의 관계가 성립하면 행렬 A와 B는 유사행렬(similarity matrix)이 되며 행렬 A를 가역행렬 P와 B로 분해하는 것을 유사 변환(similarity transformation) 이라고 합니다. $$\tag{1} A = PBP^{-1} \Leftrightarrow P^{-1}AP = B $$ 식 2는 식 1의 양변에 B의 고유값을 고려한 것입니다. \begin{align}\tag{식 2} B - \lambda I &= P^{-1}AP – \lambda P^{-1}P\\ &= P^{-1}(AP – \lambda P)\\ &= P^{-1}(A - \lambda I)P \end{align} 식 2의 행렬식은 식 3과 같이 정리됩니다. \begin{align} &\begin{aligned}\textsf{det}(B - \lambda I ) & = \textsf{det}(P^{-1}(AP – \lambda P))\\ &= \textsf{det}(P^{-1}) \textsf{det}((A – \lambda I)) \textsf{det}(P)\\ &= \textsf{det}(P^{-1}) \textsf{det}(P) \textsf{det}((A – \lambda I))\\ &= \textsf{det}(A – \lambda I)\end{aligned}\\ &\begin{aligned}\because \; \textsf{det}(P^{-1}) \textsf{det}(P) &= \textsf{det}(P^{-1}P)\\ &= \textsf{det}(I)\end{aligned}\end{align} 유사행렬의 특성 유사행렬인 두 정방행렬 A와 B는 'A ~ B' 와 같

[matplotlib] 히스토그램(Histogram)

히스토그램(Histogram) 히스토그램은 확률분포의 그래픽적인 표현이며 막대그래프의 종류입니다. 이 그래프가 확률분포와 관계가 있으므로 통계적 요소를 나타내기 위해 많이 사용됩니다. plt.hist(X, bins=10)함수를 사용합니다. x=np.random.randn(1000) plt.hist(x, 10) plt.show() 위 그래프의 y축은 각 구간에 해당하는 갯수이다. 빈도수 대신 확률밀도를 나타내기 위해서는 위 함수의 매개변수 normed=True로 조정하여 나타낼 수 있다. 또한 매개변수 bins의 인수를 숫자로 전달할 수 있지만 리스트 객체로 지정할 수 있다. 막대그래프의 경우와 마찬가지로 각 막대의 폭은 매개변수 width에 의해 조정된다. y=np.linspace(min(x)-1, max(x)+1, 10) y array([-4.48810153, -3.54351935, -2.59893717, -1.65435499, -0.70977282, 0.23480936, 1.17939154, 2.12397372, 3.0685559 , 4.01313807]) plt.hist(x, y, normed=True) plt.show()

R 미분과 적분

내용 expression 미분 2차 미분 mosaic를 사용한 미분 적분 미분과 적분 R에서의 미분과 적분 함수는 expression()함수에 의해 생성된 표현식을 대상으로 합니다. expression expression(문자, 또는 식) 이 표현식의 평가는 eval() 함수에 의해 실행됩니다. > ex1<-expression(1+0:9) > ex1 expression(1 + 0:9) > eval(ex1) [1] 1 2 3 4 5 6 7 8 9 10 > ex2<-expression(u, 2, u+0:9) > ex2 expression(u, 2, u + 0:9) > ex2[1] expression(u) > ex2[2] expression(2) > ex2[3] expression(u + 0:9) > u<-0.9 > eval(ex2[3]) [1] 0.9 1.9 2.9 3.9 4.9 5.9 6.9 7.9 8.9 9.9 미분 D(표현식, 미분 변수) 함수로 미분을 실행합니다. 이 함수의 표현식은 expression() 함수로 생성된 객체이며 미분 변수는 다음 식의 분모의 변수를 의미합니다. $$\frac{d}{d \text{변수}}\text{표현식}$$ 이 함수는 어떤 함수의 미분의 결과를 표현식으로 반환합니다. > D(expression(2*x^3), "x") 2 * (3 * x^2) > eq<-expression(log(x)) > eq expression(log(x)) > D(eq, "x") 1/x > eq2<-expression(a/(1+b*exp(-d*x))); eq2 expression(a/(1 + b * exp(-d * x))) > D(eq2, "x") a * (b * (exp(-d * x) * d))/(1 + b