기본 콘텐츠로 건너뛰기

벡터와 행렬에 관련된 그림들

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' 와 같...

[sympy] Sympy객체의 표현을 위한 함수들

Sympy객체의 표현을 위한 함수들 General simplify(x): 식 x(sympy 객체)를 간단히 정리 합니다. import numpy as np from sympy import * x=symbols("x") a=sin(x)**2+cos(x)**2 a $\sin^{2}{\left(x \right)} + \cos^{2}{\left(x \right)}$ simplify(a) 1 simplify(b) $\frac{x^{3} + x^{2} - x - 1}{x^{2} + 2 x + 1}$ simplify(b) x - 1 c=gamma(x)/gamma(x-2) c $\frac{\Gamma\left(x\right)}{\Gamma\left(x - 2\right)}$ simplify(c) $\displaystyle \left(x - 2\right) \left(x - 1\right)$ 위의 예들 중 객체 c의 감마함수(gamma(x))는 확률분포 등 여러 부분에서 사용되는 표현식으로 다음과 같이 정의 됩니다. 감마함수는 음이 아닌 정수를 제외한 모든 수에서 정의됩니다. 식 1과 같이 자연수에서 감마함수는 factorial(!), 부동소수(양의 실수)인 경우 적분을 적용하여 계산합니다. $$\tag{식 1}\Gamma(n) =\begin{cases}(n-1)!& n:\text{자연수}\\\int^\infty_0x^{n-1}e^{-x}\,dx& n:\text{부동소수}\end{cases}$$ x=symbols('x') gamma(x).subs(x,4) $\displaystyle 6$ factorial 계산은 math.factorial() 함수를 사용할 수 있습니다. import math math.factorial(3) 6 a=gamma(x).subs(x,4.5) a.evalf(3) 11.6 simpilfy() 함수의 알고리즘은 식에서 공통사항을 찾아 정리하...

sympy.solvers로 방정식해 구하기

sympy.solvers로 방정식해 구하기 대수 방정식을 해를 계산하기 위해 다음 함수를 사용합니다. sympy.solvers.solve(f, *symbols, **flags) f=0, 즉 동차방정식에 대해 지정한 변수의 해를 계산 f : 식 또는 함수 symbols: 식의 해를 계산하기 위한 변수, 변수가 하나인 경우는 생략가능(자동으로 인식) flags: 계산 또는 결과의 방식을 지정하기 위한 인수들 dict=True: {x:3, y:1}같이 사전형식, 기본값 = False set=True :{(x,3),(y,1)}같이 집합형식, 기본값 = False ratioal=True : 실수를 유리수로 반환, 기본값 = False positive=True: 해들 중에 양수만을 반환, 기본값 = False 예 $x^2=1$의 해를 결정합니다. solve() 함수에 적용하기 위해서는 다음과 같이 식의 한쪽이 0이 되는 형태인 동차식으로 구성되어야 합니다. $$x^2-1=0$$ import numpy as np from sympy import * x = symbols('x') solve(x**2-1, x) [-1, 1] 위 식은 계산 과정은 다음과 같습니다. $$\begin{aligned}x^2-1=0 \rightarrow (x+1)(x-1)=0 \\ x=1 \; \text{or}\; -1\end{aligned}$$ 예 $x^4=1$의 해를 결정합니다. solve() 함수의 인수 set=True를 지정하였으므로 결과는 집합(set)형으로 반환됩니다. eq=x**4-1 solve(eq, set=True) ([x], {(-1,), (-I,), (1,), (I,)}) 위의 경우 I는 복소수입니다.즉 위 결과의 과정은 다음과 같습니다. $$x^4-1=(x^2+1)(x+1)(x-1)=0 \rightarrow x=\pm \sqrt{-1}, \; \pm 1=\pm i,\; \pm1$$ 실수...