본문 바로가기

R/R을 이용한 데이터 처리&분석 실무

상관 분석

반응형

상관 분석(Correlation Analysis)은 두 확률 변수 사이의 관련성을 파악하는 방법이다. 상관 계수(Correlation Coefficient)는 두 변수 간 관련성의 정도를 의미하며, 이를 계산하는 방법에는 피어슨 상관 계수, 스피어만 상관 계수, 켄달의 순위 상관 계수 등이 있다. 그러나 흔히 상관 계수라고하면 피어슨 상관 계수를 뜻한다.

 

상관 계수 값이 크면 데이터 간의 관계가 존재한다는 의미며, 보통 한쪽 값이 커질 때 다른 쪽 값이 커지는 정도가 크다. 그러나 상관 계수가 크다고 해서 변수 간에 인과관계가 있음을 뜻하지는 않는다. A가 커짐에 따라 B가 커지는 것을 보고 A가 B를 야기한다고 판단했으나 실제로는 또 다른 변수 C가 A와 B를 동시에 증가시키고 있거나(이를 교락 변수(Confounding Variable)라고 부름), A가 B의 원인이라고 예상했지만 실제로는 B가 A의 원인일 수도 있기 때문이다.

두 확률 변수 간에 다음 식이 성립하면 독립(Independence)이라고 한다.

 

식 7-4

변수가 서로 독립이라면 변수 간에 관련성이 없어 상관 계수가 0이다. 그러나 상관 계수가 0이라고 해서 두 변수가 독립임을 의미하지는 않는다. 변수 간 독립성 확인은 식 7-4가 성립함을 살펴보거나 "독립성 검정" 절에서 독립성 검정을 사용해 알 수 있다.

 

피어슨 상관 계수

피어슨 상관 계수(Pearson Correlation Coefficient)는 두 변수 간의 선형적 상관관계를 측정하며, [-1, 1] 사이의 값을 가진다. 0보다 큰 상관 계수 값은 한 변수가 커지면 다른 변수도 선형적으로 증가함을 뜻하고, 0보다 작은 상관 계수는 한 변수가 커지면 다른 변수가 선형적으로 감소함을 뜻한다. X, Y의 피어슨 상관 계수가 1이면 (X, Y)를 좌표 평면에 그렸을 때 직선으로 나타난다. 0은 두 변수 간 상관관계가 없음을 뜻한다.

 

피어슨 상관 계수는 선형 관계를 판단하므로 Y = aX + b와 같은 형태의 관계를 잘 찾는다. 반면 Y = aX^2 + b와 같은 비선형 관계에서 Y는 X가 증가함에 따라 값이 커지는 것이 확실하지만 값의 증가 형태가 선형이 아니므로 피어슨 상관 계수가 작게 나타날 수 있다.

 

피어슨 상관 계수는 다음과 같이 정의된다.

 

식에서 cov(X, Y)는 X, Y의 공분산, σ_X, σ_Y는 X, Y의 표준 편차다.

 

피어슨 상관 계수는 cor() 함수를 사용해 계산한다. 이 절에서 사용하는 함수들에 대해 살펴보자.

 

-cor : 상관 계수를 구한다.

cor(

   x,           # 숫자 벡터, 행렬, 데이터 프레임

   y=NULL,   # NULL, 벡터, 행렬 또는 데이터 프레임

   # 계산할 상관 계수의 종류를 지정한다. 피어슨(pearson), 켄달(kendall), 스피어만(spearman)

   # 지정할 수 있으며 기본값은 피어슨이다.

   method=c("pearson", "kendall", "spearman")

)

 

-symnum : 숫자를 심볼로 표현한다.

symnum(

   x          # 숫자 또는 논릿값의 벡터, 배열

)

 

-orrgram::corrgram : 상관 계수 행렬을 그림으로 보여준다.

corrgram::corrgram(

   x,                   # 한 행에 한 관측값들이 저장된 데이터 프레임 또는 상관 계수 행렬

   type=NULL,      # x가 데이터일 때 data, 상관 계수일 때 cor을 지정한다.

                        # 그러나 대부분의 경우 지정하지 않아도 잘 동작한다.

   # panel에는 각 셀을 표현할 패널, lower.panel, upper.panel은 우측 상단과 좌측 상단에 그릴 패널,

   # diag.panel, text.panel에는 대각선에 그릴 패널과 문자열 패널을 지정한다.

   # 대각선 외의 패널에는 panel.pts, panel.pie, panel.shade, panel.bar, panel.ellipse,

   # panel.conf를 지정할 수 있으며, 대각선 방향의 패널에는 panel.txt, panel.minmax,

   # panel.density를 지정할 수 있다. 이들 각각은 패널에 어떤 값들을 보여줄지를 의미한다.

   # 예를 들어, panel.conf는 값의 신뢰 구간을 보여준다.

   panel=panel.shade,

   lower.panel=panel,

   upper.panel=panel,

   diag.panel=NULL,

   text.panel=textPanel

)

 

다음은 아이리스 데이터에서 Sepal.Width, Sepal.Length의 피어슨 상관 계수를 구하는 예다. 상관 계수 값이 작아 두 값 사이에 큰 상관관계는 없지만, Sepal.Width가 커짐에 따라 Sepal.Length가 작아지는 경향이 있음을 알 수 있다.

>cor(iris$Sepal.Width, iris$Sepal.Length)
[1] -0.1175698

 

아이리스에서 Species를 제외한 모든 컬럼의 피어슨 상관 계수를 구해보자.

> cor(iris[,1:4])
                Sepal.Length Sepal.Width Petal.Length Petal.Width
Sepal.Length   1.0000000  -0.1175698    0.8717538   0.8179411
Sepal.Width   -0.1175698   1.0000000   -0.4284401  -0.3661259
Petal.Length   0.8717538  -0.4284401    1.0000000   0.9628654
Petal.Width    0.8179411  -0.3661259    0.9628654   1.0000000

 

만약 살펴봐야 할 컬럼의 수가 많다면 한눈에 숫자가 잘 안 들어올 수 있다. symnum()을 사용하면 숫자들을 간략한 기호로 볼 수 있다. 결과에 표시된 기호들을 보면 P.L(Petal.Length)과 Petal.Width 간의 상관 계수가 가장 크고(B로 표시됨), 그 다음으로 Sepal.Length와 Petal.Length, Sepal.Length와 Petal.Width가 상관관계가 큼(+로 표시됨)을 쉽게 알 수 있다.

>symnum(cor(iris[,1:4]))
             S.L S.W P.L P.W
Sepal.Length 1
Sepal.Width      1
Petal.Length +   .   1
Petal.Width  +   .   B   1
attr(,"legend")
[1] 0 ' ' 0.3 '.' 0.6 ',' 0.8 '+' 0.9 '*' 0.95 'B' 1

 

corrgram 패키지는 상관 계수를 시각화하는 데 유용하다. 다음 코드는 아이리스의 상관 계수를 그림의 우측 상단에 배치하고(upper.panel=panel.conf), 대각선에는 컬럼의 이름을 적고, 좌측 하단에는 상관 계수를 그림으로 표현하는 예다. 그림에서 오른쪽 위에서 왼쪽 아래로 빗금이 쳐진 부분은 양의 상관 계수를 뜻하고, 왼쪽 위에서 오른쪽 아래로 빗금이 쳐진 영역은 음의 상관 계수를 뜻한다. 색의 짙기는 상관 계수의 크기를 뜻해 절댓값이 큰 상관 계수일수록 더 짙은 색을 띤다. 그림 7-11에 실행 결과를 보였다.

그림 7-11

피어슨 상관 계수는 데이터의 선형 관계 정도를 판단한다. 따라서 Y=X, Y=2X는 모두 선형 관계가 성립하므로 피어슨 상관 계수가 1이다. 피어슨 상관 계수에서는 선형 관계가 성립하면 1, 성립하지 않으면 1이 아닌 값을 갖게 된다. 다음 코드는 이러한 사실을 확인시켜준다.

>cor(1:10, 1:10)
[1] 1
>cor(1:10, 1:10*2)
[1] 1

 

반면 비선형 상관관계 Y=X^3은 선형 상관관계가 아니므로 1보다 작은 값을 가진다.

>x = 1:10
>y = x^3
>cor(x, y)
[1] 0.9283912

 

 

스피어만 상관 계수

스피어만 상관 계수(Spearman’s Rank Correlation Coefficient)는 상관 계수를 계산할 두 데이터의 실제 값 대신 두 값의 순위rank를 사용해 상관 계수를 계산하는 방식이다. 피어슨 상관 계수와 마찬가지로 값의 범위는 [-1. 1]이며 1은 한쪽의 순위가 증가함에 따라 다른 쪽의 순위도 증가함을 뜻하고, -1은 한쪽의 순위가 증가할 때 다른 쪽의 순위는 감소함을 뜻한다. 0은 한쪽의 순위 증가가 다른 쪽의 순위와 연관이 없음을 뜻한다.

 

스피어만 상관 계수의 계산식은 피어슨 상관 계수와 유사해 이해하기 쉽고, 피어슨 상관 계수와 달리 비선형 관계의 연관성을 파악할 수 있다는 장점이 있다. 또한, 데이터에 순위만 매길 수 있다면 적용이 가능하므로 연속형(Continuous) 데이터에 적합한 피어슨 상관 계수와 달리 이산형(Discrete) 데이터, 순서형(Ordinal) 데이터에 적용이 가능하다. 예를 들어, 국어 점수와 영어 점수 간의 상관 계수는 피어슨 상관 계수로 계산할 수 있고, 국어 성적 석차와 영어 성적 석차의 상관 계수는 스피어만 상관 계수로 계산할 수 있다.

 

스피어만 상관 계수는 다음과 같이 정의한다.

식 7-5

위 식에서 x_i는 변수 X에서 i번째 데이터의 순위, y_i는 Y에서 i번째 데이터의 순위, , 는 각각 x_i, y_i의 평균을 뜻한다. 이 식을 피어슨 상관 계수와 비교해보면 모양이 상당히 유사함을 알 수 있다.

 

식 7-5는 d_i = x_i - y_i라 놓으면 다음과 같이 간단히 할 수 있다.

식 7-6

데이터가 주어졌을 때 순위 계산은 다음과 같이 한다. 예를 들어, 3, 4, 5, 3, 2, 1, 7, 5를 가정해보자. 이 데이터를 정렬하면 1, 2, 3, 3, 4, 5, 5, 7이 된다. 또, 각 값의 순위는 1, 2, 3.5, 3.5, 5, 6.5, 6.5, 8이 된다. 데이터에서 3, 3은 순위 3, 4에 해당하므로 이들의 평균인 3.5가 순위로 주어지고 5, 5는 순위가 6, 7위이므로 평균인 6.5가 순위로 주어진다. R 코드를 사용해 순위를 확인해보자.

>x<- c(3, 4, 5, 3, 2, 1, 7, 5)
># rank() 함수를 사용하기 위해 sort()를 할 필요는 없다. 보기 편하게 하려고 정렬한 것일 뿐이다.
>rank(sort(x))
[1] 1.0 2.0 3.5 3.5 5.0 6.5 6.5 8.0

 

이처럼 비교할 데이터로부터 순위를 구한 다음 식 7-6을 적용하면 된다. R 코드에서는 스피어만 상관 계수 계산 시와 마찬가지로 cor() 함수를 사용한다. 다음은 가상의 순위가 저장된 행렬로부터 스피어만 상관 계수를 계산한 예다. 숫자가 양쪽에서 모두 증가하므로 스피어만 상관 계수는 1로 계산된다.

>(m<-matrix(c(1:10, (1:10)^2), ncol=2))
       [,1]  [,2]
 [1,]    1    1
 [2,]    2    4
 [3,]    3    9
 [4,]    4   16
 [5,]    5   25
 [6,]    6   36
 [7,]    7   49
 [8,]    8   64
 [9,]    9   81
[10,]   10  100

>cor(m, method="spearman")
      [,1]  [,2]
[1,]    1    1
[2,]    1    1

 

반면 같은 값을 피어슨 상관 계수에 넣으면 선형 관계를 따지게 되어 컬럼 1, 2 간의 상관 계수가 0.9745586으로 1보다 작게 나타난다.

>cor(m, method="pearson")
          [,1]         [,2]
[1,] 1.0000000 0.9745586
[2,] 0.9745586 1.0000000

 

 

켄달의 순위 상관 계수

켄달의 순위 상관 계수(Kendal’s Rank Correlation Coefficient)는 (X, Y) 형태의 순서쌍으로 데이터가 있을 때 x_i < x_j, y_i < y_j 또는 x_i > x_j, y_i > y_j가 성립하면 부합, x_i < x_j, y_i > y_j 또는 x_i > x_j, y_i < y_j면 비부합이라고 정의한다. 즉, x가 커질 때 y도 커지면 부합(concordant), x가 커질 때 y가 작아지면 비부합(discordant)이라고 본다.

 

켄달의 순위 상관 계수 τ는 다음과 같이 구한다.

식 7-7

 

식 7-7의 분모는 모든 (x_i, y_i), (x_j, y_j) 쌍의 수다. 따라서 위 식은 부합쌍이 비부합쌍에 비해 얼마나 많은지 그 비율을 본다. 켄달의 순위 상관 계수는 다른 상관 계수들과 마찬가지로 [-1, 1] 범위를 가지며, 1은 부합 데이터쌍의 비율이 100%임을, -1은 비부합 데이터쌍의 비율이 100%임을 뜻한다. 0은 x와 y 간에 값의 연관성이 없음을 뜻한다.

 

다음은 c(1, 2, 3, 4, 5)와 c(1, 0, 3, 4, 5) 간에 켄달의 순위 상관 계수를 계산한 예다.

>cor(c(1, 2, 3, 4, 5), c(1, 0, 3, 4, 5), method="kendall")
[1] 0.8

 

 

 

상관 계수 검정

cor.test()를 사용해 상관 계수 검정(Correlation Test)을 수행하여 상관 계수의 통계적 유의성을 판단할 수 있다. 이때 귀무가설은 ‘H0: 상관 계수가 0이다’이며, 대립가설은 ‘H1: 상관 계수가 0이 아니다’이다.

 

-cor.test : 상관 계수에 대한 가설 검정을 수행한다.

cor.test(

   x,       # 숫자 벡터

   y,       # 숫자 벡터

   alternative=c("two.sided", "less", "greater"),     # 대립가설. 기본값은 양측 검정(two.sided)

   method=c("pearson", "kendall", "spearman")   # 상관 계수의 종류. 기본값은 피어슨

)

 

 

c(1, 2, 3, 4, 5)와 c(1, 0, 3, 4, 5) 간의 피어슨 상관 계수, 스피어만 상관 계수, 켄달의 상관 계수에 대해 상관 계수 검정을 수행해보자.

>cor.test(c(1, 2, 3, 4, 5), c(1, 0, 3, 4, 5), method="pearson")

   Pearson's product-moment correlation

data: c(1, 2, 3, 4, 5) and c(1, 0, 3, 4, 5)
t = 3.9279, df = 3, p-value = 0.02937
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 0.1697938 0.9944622
sample estimates:
      cor
0.9149914

>cor.test(c(1, 2, 3, 4, 5), c(1, 0, 3, 4, 5), method="spearman")

   Spearman's rank correlation rho

data: c(1, 2, 3, 4, 5) and c(1, 0, 3, 4, 5)
S = 2, p-value = 0.08333
alternative hypothesis: true rho is not equal to 0
sample estimates:
rho
0.9

>cor.test(c(1, 2, 3, 4, 5), c(1, 0, 3, 4, 5), method="kendall")

   Kendall's rank correlation tau

data: c(1, 2, 3, 4, 5) and c(1, 0, 3, 4, 5)
T = 9, p-value = 0.08333
alternative hypothesis: true tau is not equal to 0
sample estimates:
tau
0.8

 

코드 수행 결과 피어슨 상관 계수에서만 p-value가 0.05보다 작아 상관관계가 유의한 것으로 나타났다. 이처럼 세 가지 상관 계수의 값은 서로 다른 값이 될 수 있다. 이런 경우 더 작은 숫자를 사용하는 것이 바람직하다. 위의 경우라면 켄달의 상관 계수 0.8이 가장 작은 값이므로 이 값을 사용한다. 또는 세 가지 값이 계산하는 것이 무엇인지 알고 데이터의 성격에 비추어 올바른 상관 계수를 찾아 사용해야 한다.

 

R을 이용한 데이터 처리&분석 실무 中

반응형

'R > R을 이용한 데이터 처리&분석 실무' 카테고리의 다른 글

선형 회기-2  (0) 2020.02.07
선형 회귀-1  (0) 2020.02.06
분할표  (0) 2020.02.05
표본 추출  (0) 2020.02.05
기초 통계량  (0) 2020.02.04