기본 콘텐츠로 건너뛰기

[matplotlib] 등고선(Contour)

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

내용

상관성(correlations)과 상관분석

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

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

공분산과 상관계수

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

Cov(Y1,Y2)=E[(Y1μ1)(Y2μ2)] Cov(Y1,Y2)=E[(Y1μ1)(Y2μ2)]=E(Y1Y2Y1μ2μ1Y2+μ1μ2)=E(Y1Y2)E(Y1)μ2μ1E(Y2)+μ1μ2=E(Y1Y2)μ1μ2E(Y1)=μ1,E(Y2)=μ2

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

ρ=Cov(Y1,Y2)σ1σ21ρ1σ1,σ2:Y1,Y2표준편차

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

상관계수
상관계수의미
ρ = 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의 상관계수를 계산한 것입니다. 다음과 같이 계산합니다.

ρ12,3=ρ12ρ13ρ23(1ρ132)(1ρ232)

위 식에서 ρ{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) 이라고 합니다. (1)A=PBP1P1AP=B 식 2는 식 1의 양변에 B의 고유값을 고려한 것입니다. (식 2)BλI=P1APλP1P=P1(APλP)=P1(AλI)P 식 2의 행렬식은 식 3과 같이 정리됩니다. det(BλI)=det(P1(APλP))=det(P1)det((AλI))det(P)=det(P1)det(P)det((AλI))=det(AλI)det(P1)det(P)=det(P1P)=det(I) 유사행렬의 특성 유사행렬인 두 정방행렬 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 sin2(x)+cos2(x) simplify(a) 1 simplify(b) x3+x2x1x2+2x+1 simplify(b) x - 1 c=gamma(x)/gamma(x-2) c Γ(x)Γ(x2) simplify(c) (x2)(x1) 위의 예들 중 객체 c의 감마함수(gamma(x))는 확률분포 등 여러 부분에서 사용되는 표현식으로 다음과 같이 정의 됩니다. 감마함수는 음이 아닌 정수를 제외한 모든 수에서 정의됩니다. 식 1과 같이 자연수에서 감마함수는 factorial(!), 부동소수(양의 실수)인 경우 적분을 적용하여 계산합니다. (식 1)Γ(n)={(n1)!n:자연수0xn1exdxn:부동소수 x=symbols('x') gamma(x).subs(x,4) 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 예 x2=1의 해를 결정합니다. solve() 함수에 적용하기 위해서는 다음과 같이 식의 한쪽이 0이 되는 형태인 동차식으로 구성되어야 합니다. x21=0 import numpy as np from sympy import * x = symbols('x') solve(x**2-1, x) [-1, 1] 위 식은 계산 과정은 다음과 같습니다. x21=0(x+1)(x1)=0x=1or1x4=1의 해를 결정합니다. solve() 함수의 인수 set=True를 지정하였으므로 결과는 집합(set)형으로 반환됩니다. eq=x**4-1 solve(eq, set=True) ([x], {(-1,), (-I,), (1,), (I,)}) 위의 경우 I는 복소수입니다.즉 위 결과의 과정은 다음과 같습니다. x41=(x2+1)(x+1)(x1)=0x=±1,±1=±i,±1 실수...