기본 콘텐츠로 건너뛰기

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

R 독립성 검정과 변수 간의 연관성

내용

독립성 검정과 변수 간의 연관성

독립성 검정(Test of Independence)

다양한 통계 방법에서의 전제조건이 데이터들의 독립성에 대한 것입니다. R은 범주형 변수의 독립성을 테스트하는 여러 방법을 제공합니다.

세 가지 검정은 카이제곱 독립성 검정, Fisher 정확 검정 및 Cochran-Mantel-Haenszel 검정에 대해 알아봅니다.

chi-square 검정

chisq.test()
두 변수(2-way table)에 대해 독립성 검정을 실시
귀무가설: 두 변수는 독립입니다.
library(vcd)
twoTable<-xtabs(~Treatment+Improved, data=Arthritis)
q<-chisq.test(twoTable); q
        Pearson's Chi-squared test

data:  twoTable
X-squared = 13.055, df = 2, p-value = 0.001463

위 chisq.test() 객체는 다음과 같은 속성을 포함합니다.

attributes(q)
$names
[1] "statistic" "parameter" "p.value"   "method"    "data.name" "observed"
[7] "expected"  "residuals" "stdres"   

$class
[1] "htest"

속성 중 관찰값을 나타내는 observed와 기대값을 나타내는 expected를 사용하여 통계량을 계산합니다. chisq분석은 각 변수 간의 연관성이 없다고 전제합니다. 그러므로 two-way table의 각 셀의 값은 행합과 열합의 곱을 전체 합으로 나눈 값을 기대할 수 있습니다. 즉, 기대값은 다음과 같이 계산됩니다.

a b a+b
c d c+d
a+c b+d a+b+c+d
$$\begin{aligned}\text{a의 기대값} &=\frac{\text{a+c}\text{a+b}}{a+b+c+d}\\&=\frac{R \cdot C}{T}\end{aligned}$$

위 식에서 R, C,T는 각각 행합, 열합, 전체합을 나타냅니다. R · C는 외적(outer product)와 같습니다.

$$\begin{aligned}\text{outer} &=(r_1, r_2) \otimes (c_1, c_2, c_3)\\&=\begin{bmatrix} r_1\cdot c_1&r_1\cdot c_2&r_1\cdot c_3\\r_2\cdot c_1&r_2\cdot c_2&r_2\cdot c_3\end{bmatrix}\end{aligned}$$

위와 같이 magin을 포함한 표를 작성하기 위해 addmargins() 함수를 사용합니다.

qM<-addmargins(twoTable);qM
         Improved
Treatment None Some Marked Sum
  Placebo   29    7      7  43
  Treated   13    7     21  41
  Sum       42   14     28  84

위 결과를 기반으로 각 셀의 기대값을 계산해 봅니다.

r<-qM[1:2,4]
c<-qM[3, 1:3]
re<-matrix(, 2,3)
for (i in 1:length(r)){
  for (j in 1:length(c)){
    re[i, j]<-r[i]*c[j]/84
  }
}
re
     [,1]     [,2]     [,3]
[1,] 21.5 7.166667 14.33333
[2,] 20.5 6.833333 13.66667
outer(rowSums(twoTable), colSums(twoTable))/sum(twoTable)
        None     Some   Marked
Placebo 21.5 7.166667 14.33333
Treated 20.5 6.833333 13.66667

위 결과는 q$expected와 같습니다.

q$expected 
        Improved
Treatment None     Some   Marked
  Placebo 21.5 7.166667 14.33333
  Treated 20.5 6.833333 13.66667

카이제곱 통계량은 관찰값과 기대값의 차이에 기반한 것으로 다음과 같이 계산할 수 있습니다.

$$\chi^2=\sum^n_{i=1}\left(\frac{O_i-E_i}{E_i}\right)$$ 위 식의 O, E는 각각 관찰값과 기대값을 나타냅니다. q가 포함하고 있는 observed와 expected를 사용하여 카이제곱 통게량을 계산해 보면 다음과 같습니다.
chVal<-sum((q$observed-q$expected)^2/q$expected); chVal
[1] 13.05502
이 카이제곱 통계량에 대응하는 p value는 확률분포함수의 전체 면적에서 그 통계량까지의 면적을 제거한 부분의 면적입니다.
pVal<-1-pchisq(chVal, 2);pVal
[1] 0.001462643

위 결과 유의학률, p <0.01이므로 Treatment와 Improved 두 변수에는 연관성이 있음을 나타냅니다. 반면에 아래 결과 Improved와 Sex 사이에는 p>0.05이므로 이 변수들에는 연관성이 없을 확률이 크다는 것을 의미합니다.

p 값은 비교하는 두 변수가 독립일 경우 즉, 서로 연관성이 없다는 전제하에 데이터들을 생성할 확률을 의미합니다. chi-square 분포는 정규분포를 따르는 확률변수들의 제곱에 의해 나타나는 것으로 p 값이 작다는 것은 정규분포의 꼬리 부분에 해당하는 것으로 작을수록 일반적인 상황에서 일어나는 것이 어렵다는 것을 나타냅니다. 그러므로 이 결과들에 의해 Improved와 Sex 사이에 독립이라는 귀무가설을 기각할 수 없습니다.

twoTable2<-xtabs(~Improved+Sex, data=Arthritis)
w<-chisq.test(twoTable2);w
경고메시지(들): 
chisq.test(twoTable2)에서:
  카이제곱 approximation은 정확하지 않을수도 있습니다

        Pearson's Chi-squared test

data:  twoTable2
X-squared = 4.8407, df = 2, p-value = 0.08889

chisq.test()에 의해 생성된 객체의 속성들 중에 'expected'는 이 분석에 의한 기대값을 나타냅니다.

chisq 검정은 tow-way table의 각 성분에 대한 관찰값이나 기대값이 어느 수준이상이어야 하는 조건이 있습니다. 다음과 같이 이 두 변수에서 some-Male에서의 관찰치나 기대값이 5 이하임을 알 수 있습니다. 이것은 카이제곱 검증의 전제를 충족할 수 없기 때문에 이 분석에 대한 경고가 발생합니다.

w$observed
        Sex
Improved Female Male
  None       25   17
  Some       12    2
  Marked     22    6
w$expected
        Sex
Improved    Female      Male
  None   29.500000 12.500000
  Some    9.833333  4.166667
  Marked 19.666667  8.333333

Fisher's exact test

fisher.test()
두 변수(two-way table)에 대한 독립성 검정
귀무가설: 두 변수는 독립입니다.
fisher.test(twoTable)
        Fisher's Exact Test for Count Data

data:  twoTable
p-value = 0.001393
alternative hypothesis: two.sided

카이제곱 검정의 결과와 같이 두 변수는 독립이라고 할 수 없습니다. fisher.test()는 검정 방식을 이 함수의 인자 alternative에 "two.sided"(양쪽검정), "greater, less"(한쪽 검정)의 전달로 지정할 수 있습니다. 위 결과는 기본값이 양쪽검정을 사용한 것입니다.

Cochran-Mantel-Haenszel 검정

mantelhaen.test() 함수는 두 개의 명목 변수가 세 번째 변수의 각 계층(levle)에서 조건부 독립이라는 귀무 가설의 Cochran-Mantel-Haenszel 카이제곱 검정을 제공합니다.

다음 코드는 Treatment 및 mproved 변수가 Sex의 각 수준 내에서 독립적이라는 가설을 테스트합니다. 테스트에서는 3방향(Treatment x mproved x Sex) 상호 작용이 없다고 가정합니다.

threeTable<-xtabs(~Treatment+Improved+Sex, data=Arthritis)
mantelhaen.test(threeTable)
        Cochran-Mantel-Haenszel test

data:  threeTable
Cochran-Mantel-Haenszel M^2 = 14.632, df = 2, p-value = 0.0006647

위 결과는 Sex의 수준에서 Treatment와 Improved는 독립이라고 할 수 없습니다.

연관성의 측정

독립성 검정에서 독립이라는 귀무가설을 기각할 수 있다면 변수간의 연관성 정도를 평가 이어질 수 있습니다. 이러한 측정은 vcd 패키지의 assocstats() 함수는 two-way 테이블에 대한 파이 계수, 분할 계수 및 Cramer의 V를 계산하는 데 사용할 수 있습니다.

assocstats(twoTable)
                        X^2 df  P(> X^2)
Likelihood Ratio 13.530  2 0.0011536
Pearson              13.055  2 0.0014626

Phi-Coefficient   : NA
Contingency Coeff.: 0.367
Cramer's V        : 0.394

파이계수

파이계수는 2 변수간의 상관계수를 검정하는 방법으로 2 × 2 데이블 구조에서만 사용할 수 있습니다. 그러므로 위 twoTable에서는 계산되지 않습니다.

예로서 성별(s, 남자:1, 여자:2)과 시험 통과(p, 실패:0, 통과:1)에 대한 다음 표에서 파이계수를 계산해 봅니다.

p
01
s12(a)3(b)5
2 1(c) 4(d) 5
Sum 3 7 10
$$\phi \text{coef}=\frac{bc-ad}{\sqrt{(a+b)(c+d)(a+c)(b+d)}}$$
  • -1.0< φ < -0.7 : 강한 부적 상관
  • -0.7< φ < -0.3 : 약한 부적 상관
  • -0.3< φ < 0.3 : 상관 관계 거의 없음
  • 0.3< φ < 0.7 : 약한 정적 상관
  • 0.7< φ < 1.0 : 강한 정적 상관

분할계수(Contigency Coefficiency)

분할 계수 C는 범주형 데이터에 대한 χ2 기반 연관 측정입니다. 그것은 독립성에 대한 χ2 테스트에 의존합니다. 즉, 분할표(이원표, 교차표)의 변수 간에 통계적 관계가 있는지 여부를 평가할 수 있습니다.

다음과 같이 분할계수는 chisq 통계량과 샘플 크기에 의해 계산합니다.

$$C=\sqrt{\frac{\chi^2}{n+\chi^2}}$$

n은 샘플 크기입니다. 두 변수 사이에 관계가 없는 경우 C=0입니다. 우발 계수 C는 값 >1을 초과할 수 없지만 두 변수가 서로 완벽하게 관련되어 있더라도 우발 계수는 1보다 작을 수 있습니다. 이것은 바람직하지 않으므로 C는 행과 열의 수에 관계없이 테이블에 완전한 연관이 있을 때 최대값 1에 도달하도록 조정됩니다. 따라서 우리는 Cmax를 계산합니다.

$$C_{max}=\sqrt{\frac{k-1}{k}}$$

여기서 k는 행 수 또는 열 수 중 작은 값, k=min(rows,columns)입니다. 그런 다음 조정된 우발 계수는 다음과 같이 계산됩니다.

$$C_{adj}=\frac{C^*}{C_{max}}=\sqrt{\frac{k\cdot \chi^2}{(k-1)(n+\chi^2)}}$$

twoTable에 대해 분할계수를 계산해보면 다음과 같습니다.

x2<-q$statistic
k<-min(nrow(twoTable), ncol(twoTable))
n<-sum(twoTable)
contigencyCoef<-function(x2, n){
  return(sqrt(x2/(n+x2)))
}
contigencyCoef(x2, n)
X-squared
0.3667581

Cramer's V

범주형변수에 대한 연관성을 평가하는 것으로 chisq 통계량을 근거로 다음과 같이 계산합니다.

$$v=\sqrt{\frac{\chi^2}{n\cdot \text{min(C-1, R-1)}}}$$

n, C, R은 각각 전체합, 열의수, 행의수를 나타냅니다. 이 값은 [0, 1]사이이며 두 변수의 연관성이 없는 경우 0, 완전한 연관성은 1을 나타냅니다.

twoTable에 대해 Cramer's V를 계산해보면 다음과 같습니다.

cramerV<-function(x2, n, r, c){
  return(sqrt(x2/(n*min(r-1, c-1))))
}
cramerV(x2, n, ncol(twoTable), nrow(twoTable))
X-squared 
0.3942295

댓글

이 블로그의 인기 게시물

[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