기본 콘텐츠로 건너뛰기

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

R 상관성(correlation)과 상관분석

내용

상관성(correlations)과 상관분석

상관 계수는 양적 변수(quantative variables) 간의 관계를 설명하는 데 사용됩니다. ± 기호는 관계의 방향을 나타내고 크기는 관계의 강도를 나타냅니다(관계가 없는 경우 0에서 완벽하게 예측 가능한 관계인 경우 1).

예를 들어 두 변수 x1과 x2에서 x1의 변화에 따라 x2가 변화한다면 두 변수는 서로 상관성이 존재합니다. 이 상관성의 정도를 나타내는 것이 상관계수이며 이는 두 변수의 공분산(covariance)으로부터 계산됩니다.

공분산과 상관계수

공분산은 각 변수의 편차들의 곱에 대한 기대값입니다.

$$\begin{equation} \text{Cov}(Y_1, Y_2)=E[(Y_1-\mu_1)(Y_2-\mu_2)] \end{equation}$$ $$\begin{align}&\begin{aligned}\text{Cov}(Y_1, Y_2)&=E[(Y_1-\mu_1)(Y_2-\mu_2)]\\&=E(Y_1Y_2-Y_1\mu_2-\mu_1 Y_2+\mu_1 \mu_2)\\&= E(Y_1Y_2)-E(Y_1)\mu_2-\mu_1E(Y_2)+\mu_1 \mu_2\\&=E(Y_1Y_2)-\mu_1 \mu_2\end{aligned} \\& \because\; E(Y_1)=\mu_1, \quad E(Y_2)=\mu_2\end{align}$$

두 변수간의 공분산의 절대값의 증가에 따라 선형 의존성은 증가하며 양의 공분산은 정상관계, 음의 값은 역상관계를 의미합니다. 공분산이 0이라면 두 변수 사이의 선형의존성은 없습니다. 그러나 각 변수의 측정척도가 다른 경우 선형성에 대한 즉, 두 변수의 의존성에 대해 공분산을 절대적인 척도로 사용하는 것은 어렵습니다. 결과적으로 공분산만으로 선형성의 정도를 확인하는 것에는 한계가 있습니다. 이러한 문제는 값을 표준화하고 공분산과 관련된 양인 피어슨 상관 계수(Pearson correlation coefficient) $\mathbf{\rho}$를 사용하는 것으로 해결 할 수 있습니다.

$$\begin{align}&\rho = \frac{\text{Cov}(Y_1, Y_2)}{\sigma_1 \sigma_2}\\ & -1 \le \rho \le 1\\ &\sigma_1, \sigma_2: Y_1, Y_2의 \text{표준편차} \end{align}$$

상관계수의 부호는 공분산의 부호와 같으며 다음과 같이 정리됩니다.

상관계수
상관계수의미
ρ = 1완벽한 정관계
0 < ρ <1 정관계
ρ= 0 상관성 없음
-1 < ρ < 0 역관계
ρ = -1 완벽한 역관계

state.x77 데이터 세트를 사용합니다.1:6열 사용

R은 Pearson, Spearman, Kendall, partial, polychoric 및 polyserial을 포함한 다양한 상관 계수를 생성할 수 있습니다.

PEARSON, SPEARMAN 및 KENDALL 상관 관계

Pearson 상관 관계는 두 양적 변수 간의 선형 관계 정도를 평가합니다. Spearman의 순위 상관 계수는 두 순위 변수 간의 관계 정도를 평가합니다. Kendall의 Tau는 순위 상관 관계의 비모수 측정 입니다.

cor() 함수는 세 가지 상관 계수를 모두 생성고 cov() 함수는 공분산을 제공합니다.

cor(x, use, method)
x: matrix 또는 data.frame
use: missing data 처리
all.obs: maissing이 없다고 가정, 존재시 에러
Everything: missing 관련된 모든 경우 missing으로 설정(default)
complete.obs: missing이 존재하는 list는 삭제, 열 삭제
pairwise.omplete: missing 존재하는 관찰치의 쌍들 삭제, 행삭제
method: 상관성의 타입설정(pearson, spearman, kendall), pearson이 default
state<-state.x77[,1:6]

다음 결과는 데이터에 대한 공분산 행렬입니다. cov(x)를 사용합니다.

round(cov(state), 3)
PopulationIncomeIlliteracyLife ExpMurderHS Grad
Population10.1250.313-0.1040.346-0.383
Income0.1251-0.3150.324-0.2170.51
Illiteracy0.313-0.3151-0.5550.672-0.655
Life Exp-0.1040.324-0.5551-0.780.524
Murder0.346-0.2170.672-0.781-0.437
HS Grad-0.3830.51-0.6550.524-0.4371

round(cor(state),3)
PopulationIncomeIlliteracyLife ExpMurderHS Grad
Population10.2080.108-0.0680.344-0.098
Income0.2081-0.4370.34-0.230.62
Illiteracy0.108-0.4371-0.5880.703-0.657
Life Exp-0.0680.34-0.5881-0.7810.582
Murder0.344-0.230.703-0.7811-0.488
HS Grad-0.0980.62-0.6570.582-0.4881
round(cor(state, method="spearman"), 3)
PopulationIncomeIlliteracyLife ExpMurderHS Grad
Population10.1250.313-0.1040.346-0.383
Income0.1251-0.3150.324-0.2170.51
Illiteracy0.313-0.3151-0.5550.672-0.655
Life Exp-0.1040.324-0.5551-0.780.524
Murder0.346-0.2170.672-0.781-0.437
HS Grad-0.3830.51-0.6550.524-0.4371

위 결과는 각 변수들 사이에 상관성을 나타냅니다. 예를 들면 Income과 HS Grad와 강한 양의 상관관계가 있음을 나타냅니다. 상관성을 집약적으로 나타낼 수 있습니다.

x<-state[, c("Population", "Income" ,"Illiteracy" ,"Life Exp")]
y<-state[, c("Murder", "HS Grad")]
cor2<-round(cor(x, y), 3); cor2
MurderHS Grad
Population0.344-0.098
Income-0.230.62
Illiteracy0.703-0.657
Life Exp-0.7810.582

그러나 위 결과는 통계적 유의성, 즉 통계적으로 변수들 사이의 상관성에 대한 통계적 결론을 내리기에는 부족합니다. 이를 위해서는 유의성검정이 필요합니다.

부분상관(Partial correlations)

부분 상관은 하나 이상의 다른 양적 변수를 제어하는 ​​두 양적 변수 간의 상관 관계입니다. 예를 들어 세개 변수의 x1, x2, x3에서 x1과 x2의 부분 상관계수는 세 변수의 공통부분과 x1과 x3, x2와 x3의 공통부분을 배제한 상태에서 x1과 x2의 상관계수를 계산한 것입니다. 다음과 같이 계산합니다.

$$\rho_{12,3}=\frac{\rho_{12}-\rho_{13}\cdot\rho_{23}}{\sqrt{(1-\rho_{13}^2)\cdot(1-\rho_{23}*2)}}$$

위 식에서 ρ{12}는 변수 1과 변수 2의 상관계수입니다. 또한 ρ{12,3}는 변수3을 배제한 조건에서의 상관계수로서 변수1과 2의 부분상관계수를 의미합니다.

ppcor 패키지pcor() 함수를 사용하여 편상관 계수를 계산할 수 있습니다.

pcor(x, method)
x: matrix or dataframe
method: 'pearson', 'kendall','spearman'중의 하나로 기본값은 'pearon'
estimate(편상관계수), p-value, statistic, n(샘플수), gn(제어된 변수의 수), method를 결과로 반환

다음 데이터셋으로부터 위 식을 사용하여 grade-hours의 부분상관계수를 계산해 보면 다음과 같습니다.

data <- data.frame(Grade = c(80, 50, 80, 90, 92, 85, 76, 81, 90, 95),
                 hours = c(5, 4, 6, 6, 3, 5, 9, 9, 5, 6),
                 Score = c(90, 80, 70, 80, 95, 91, 99, 88, 92, 91))
corr<-cor(data); round(corr, 3)
GradehoursScore
Grade10.0170.312
hours0.01710.122
Score0.3120.1221

grade-hours의 부분상관계수

pcorr<-(corr[1,2]-corr[1,3]*corr[2,3])/sqrt((1-corr[1,3]^2)*(1-corr[2,3]^2))
pcorr
[1] -0.02240543

pcor()함수를 사용하여 부분상관계수를 계산합니다.

pcorr2<-pcor(data); round(pcorr2$estimate, 3)
GradehoursScore
Grade1-0.0220.312
hours-0.02210.123
Score0.3120.1231

위 두 결과는 같습니다.

다음으로 데이터 셋 state에 대한 각 변수 쌍에 대한 부분상관계수를 계산합니다.

library(ppcor)
pc<-pcor(state)
pc$estimate
PopulationIncomeIlliteracyLife ExpMurderHS Grad
Population10.307-0.2050.3610.484-0.291
Income0.3071-0.073-0.043-0.0030.502
Illiteracy-0.205-0.07310.1940.55-0.42
Life Exp0.361-0.0430.1941-0.7130.373
Murder0.484-0.0030.55-0.71310.232
HS Grad-0.2910.502-0.420.3730.2321

상관 분석

상관 계수를 통해 변수들의 상관 여부를 정성적으로 판단할 수 있지만 그 결과의 통계적 유의성을 판단의 근거로 제시할 필요가 존재합니다. 즉 가설-검정 방법에 의해 통계적 유의 정도를 정량적으로 나타내게 되는데 일반적인 귀무 가설은 관계 없음 즉, 모집단의 상관 관계가 0 입니다.

cor.test(x, y, Alternative = , method = )
x와 y는 분석할 변수
method= Pearson, Spearman 및 Kendall 중의 하나이며 default로 Pearson
Alternative는 양측 또는 단측 검정("two.side", "less" 또는 "크게")

연구 가설이 모집단 상관 관계가 0보다 작다면 Alternative="less"를 사용합니다. 연구 가설이 모집단 상관 관계가 0보다 크다면 Alternative="greater"를 사용합니다. 기본적으로 Alternative="two.side" (인구 상관 관계가 0과 같지 않음)이 가정됩니다.

 state<-state.x77[,1:6]
colnames(state)
[1] "Population" "Income"     "Illiteracy" "Life Exp"   "Murder"    
[6] "HS Grad"
cor.test(state[,3], state[,5])
        Pearson's product-moment correlation

data:  state[, 3] and state[, 5]
t = 6.8479, df = 48, p-value = 1.258e-08
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 0.5279280 0.8207295
sample estimates:
      cor
0.7029752

위 분석의 귀무가설은 "Illiteracy와 Murder과의 상관성은 0"이고 이에 대한 유의 확률은 0.01보다 작습니다. 즉, 귀무가설을 기각할 수 있습니다. 이에 대응하는 상관계수 0.703 역시 매우 높은 양의 상관성을 보입니다. 이 분석은 단지 두 변수간의 상관 정도를 분석한 것으로 다른 변수들과의 상관은 없다고 가정합니다.

위의 cor.test()는 단지 하나의 상관성만을 분석할 수 있습니다. sych 패키지corr.test(x, use, method)함수는 method는 Pearson, Spearman 또는 Kendall 상관 관계의 행렬에 대한 상관 관계 및 유의 수준을 생성합니다. use는 missing value의 삭제 방식으로 "pairwise"는 기본값이며 케이스의 쌍별 삭제를 수행합니다. use="complete"는 완전한 케이스만 선택합니다. 이 함수의 결과인 신뢰구간을 확인하기 위해서는 print(테스트, short=FALSE) 함수에 의해 그 결과를 출력합니다.

library(psych)
corr.test(state, use="complete")
Call:corr.test(x = state, use = "complete")
Correlation matrix
           Population Income Illiteracy Life Exp Murder HS Grad
Population       1.00   0.21       0.11    -0.07   0.34   -0.10
Income           0.21   1.00      -0.44     0.34  -0.23    0.62
Illiteracy       0.11  -0.44       1.00    -0.59   0.70   -0.66
Life Exp        -0.07   0.34      -0.59     1.00  -0.78    0.58
Murder           0.34  -0.23       0.70    -0.78   1.00   -0.49
HS Grad         -0.10   0.62      -0.66     0.58  -0.49    1.00
Sample Size
[1] 50
Probability values (Entries above the diagonal are adjusted for multiple tests.)
           Population Income Illiteracy Life Exp Murder HS Grad
Population       0.00   0.59       1.00      1.0   0.10       1
Income           0.15   0.00       0.01      0.1   0.54       0
Illiteracy       0.46   0.00       0.00      0.0   0.00       0
Life Exp         0.64   0.02       0.00      0.0   0.00       0
Murder           0.01   0.11       0.00      0.0   0.00       0
HS Grad          0.50   0.00       0.00      0.0   0.00       0

 To see confidence intervals of the correlations, print with the short=FALSE option

부분상관 분석은 ppcor 패키지의 pcor() 또는 pcor.test() 함수를 적용합니다. 두 함수는 반환하는 결과의 종류는 같지만 pcor.test()는 단지 한 쌍의 부분상관에 대한 결과만을 반환합니다.

pcor.test(state[,2], state[, 3], state[,c(1, 4, 5,6)])
    estimate   p.value statistic  n gp  Method
1 -0.0732356 0.6286068 -0.487098 50  4 pearson

위 결과는 다른 변수들을 제어한 상태에서 Income과 Illiteracy 변수의 상관분석을 수행한 것으로 이 둘만의 상관성은 없다는 귀무가설을 기각할 수 없습니다.

댓글

이 블로그의 인기 게시물

[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