1. 상관관계 분석(2): 피어슨 상관계수 in python [Advanced Analytics Lab]

앞서 삼성전자 주가와 KOSPI 지수간의 공분산 분석을 통해, 두 변수간의 공분산이 14973826이라는 것을 확인했다. 그러나 공분산 값 만으로는 두 값이 서로 같이 증가하는 경향성이 있다는 것을 알 수 있었지만, 얼마나 "끈끈하게" 두 값이 묶여 있는지는 알 수 없었다. 이에 이번 회에서는 상관계수를 산출하여 두 변수간 얼마나 관련성이 있는지 알아 볼 것이다. 실습으로는 삼성전자와 SK Hynix 주가 중 KOSPI지수와 더 상관관계가 높은 종목을 찾아볼 것이다.

먼저 데이터를 불러오고 산점도를 생성한다. python에서 산점도를 생성하고 공분산을 산출하는 방법은 이전 회 <1. 상관관계 분석(1)> 을 참조한다.

import numpy as np
import pandas as pd
import pandas_datareader.data as web
import matplotlib.pyplot as plt
import datetime

start = datetime.datetime(2010, 1, 1)
end = datetime.datetime(2016, 12, 31)

df_KOSPI = web.DataReader("KRX:KOSPI", "google", start, end)
df_SE = web.DataReader("KRX:005930", "google", start, end)
df_SKH = web.DataReader("KRX:000660", "google", start, end)

plt.figure(figsize  = (8,6))
plt.scatter(df_SE["Close"], df_KOSPI["Close"])
plt.show()

plt.figure(figsize  = (8,6))
plt.scatter(df_SKH["Close"], df_KOSPI["Close"])
plt.show()



산점도: 삼성전자종가 - KOSPI지수 종가


산점도: SK Hynix 종가- KOSPI지수 종가


삼성전자 주가와 KOSPI, SK Hynix 주가와 KOSPI간의 산점도를 확인한 결과 두 변수 모두 양의 상관관계를 가진 것 처럼 보인다. 그러나 두 종목중 어느 종목이 확실하게 상관관계가 높다고 단언하기는 어려워 보인다. 각각의 공분산을 산출해 보자.

KOSPI = df_KOSPI.iloc[:, 3]
SE = df_SE.iloc[:, 3]
SKH = df_SKH.iloc[:, 3]
print(np.cov(SE, KOSPI))
print(np.cov(SKH, KOSPI))

[[  6.71139396e+10   1.49738256e+07]
 [  1.49738256e+07   1.35058568e+04]]
[[  7.15687087e+07   4.79893229e+05]
 [  4.79893229e+05   1.35058568e+04]]

상관관계 계산 결과 삼성전자-KOSPI는 <14973825.6>이 산출되었고, SK Hynix-KOSPI는 479893.229가 산출되었다. 서로의 값을 비교해보면 삼성전자-KOSPI의 공분산이 높지만, 같은 기간 동안 삼성전자 주가의 단위가 약 120만원, SK Hynix의 주가가 3만원에 불과하여 서로의 단위가 일률적인 상대비교가 어려운 것을 알 수 있다.


위에서 본 바와 같이 공분산의 단점인 상대적 비교의 어려움을 해결하기 위해, 표준화된 값으로 결과를 변환 시킬 필요가 있다. 이에 표준화된 공분산 값을 상관계수(Correlation Coefficient)라고 부르며 수식은 아래와 같다.


수식에서 보는 바와 같이 앞서 산출된 공분산 값을 두 변수의 표준편차의 곱으로 나눠서 표준화 시키면 상관계수가 도출된다. 위와 같은 방법으로 산출되는 상관계수를 피어슨 상관계수(Pearson's Correlation Coefficient, PCC) 또는 수학기호 rho를 따서 Pearson's r 이라고 부른다. 피어슨 상관계수의 경우 선형적 상관관계를 나타내는 값으로, ±1에 가까울 수록 선형적 상관관계가 강하며, 양의 값을 가지면 X가 증가할 수록 Y가 증가하고 음의 값을 가지면 X가 증가하면 Y가 감소하는 경향을 가지게 되고, 0이면 선형적 상관이 없음을 나타낸다.


피어슨 상관계수의 특징은 도출된 값이 -1에서 +1 사이의 값을 가지기 때문에 단위에 의존하지 않는 성질 (scale invariant)을 갖고 있어, 비교 대상의 단위에 관계 없이 상관 정도에 대한 비교가 가능하다.

3일분의 데이터를 추출하여 활용하여 삼성전자 주가와 -KOSPI지수 간의 상관계수를 도출해 보자.

DateSEKOSPIX편차Y편차
2010-01-048090001696.14-15000-1.22
2010-01-058220001690.62-2000-6.74
2010-01-068410001705.32170007.96

(1) 분산을 산출한다. 분산은 편차를 제곱해서 산출할 수 있다.

DateSEKOSPIX편차X편차제곱Y편차Y편차제곱
2010-01-048090001696.14-15000225000000-1.221.4884
2010-01-058220001690.62-20004000000-6.7445.4276
2010-01-068410001705.32170002890000007.9663.3616

(2) 편차 제곱의 총 합을 구한 후 n-1로 나눠준다.
  - X의 경우 (225000000 + 4000000 + 289000000) / (3-1) = 259000000
  - Y의 경우 (1.4884 + 45.4276 + 63.3616) / (3-1) = 55.1388

(3) 도출된 값에 제곱근을 취하여 표준편차를 도출한다.
  - X의 경우 259000000^(1/2) = 16093.48
  - Y의 경우 55.1388^(1/2) = 7.42555

(4) X와 Y의 표준편차를 곱한 값을 모수로 사용하여, XY 변수의 공분산을 나눠 주면 상관계수가 산출된다.
  - 83550 / (16093.48 * 7.42555) = 83550 / 119502.9 = 0.699146

계산결과 삼성전자-KOSPI의 2010년 1월 4일부터 6일까지의 상관계수는 약 0.7이 도출되었다.

도출된 상관계수는 높은 것일까 낮은 것일까? 앞서 밝힌 것 처럼 피어슨 상관계수가 낮더라도 서로간에 상관관계가 없는 것은 아니지만, 문헌마다 다소 차이가 있긴 하지만 아래와 같은 기준이 활용되기도 한다. 

r이 -1.0과 -0.7 사이이면, 강한 음적 선형관계,
r이 -0.7과 -0.3 사이이면, 뚜렷한 음적 선형관계,
r이 -0.3과 -0.1 사이이면, 약한 음적 선형관계,
r이 -0.1과 +0.1 사이이면, 거의 무시될 수 있는 선형관계,
r이 +0.1과 +0.3 사이이면, 약한 양적 선형관계,
r이 +0.3과 +0.7 사이이면, 뚜렷한 양적 선형관계,
r이 +0.7과 +1.0 사이이면, 강한 양적 선형관계
(출처: 위키피디아) 

위의 기준을 활용한다면, 2010년 1월 4일부터 1월 6일 까지 3일동안에는 삼성전자주가와 KOSPI지수 간에는 강한 양적 선형 관계를 가지고 있다고 말할 수 있다.


이제 python을 활용해 간단하게 피어슨 상관계수를 도출해 보도록 하자.
먼저 앞서 사용했던 삼성전자와 KOSPI 데이터 프레임에서 3개 행을 추출하여 새로운 행을 생성한다.

KOSPI = df_KOSPI.iloc[0:3, 3]
SE = df_SE.iloc[0:3, 3]
np.corrcoef(SE, KOSPI)

array([[ 1.        ,  0.69914606],
       [ 0.69914606,  1.        ]])

피어슨 상관계수는 numpy 라이브러리에서 제공하는 corrcoef() 함수를 활용하여 계산할 수 있다. np.corrcoef(SE, KOSPI) 는 삼성전자 주가가 담겨있는 SE Series와 KOSPI지수가 담겨있는 KOSPI Series에 numpy의 corrcoef 함수를 적용하여 피어슨 상관계수를 도출하는 명령이다. 앞서 계산한 것과 마찬가지로 0.69914606이 산출되었다.


이번에는 2010년부터 2016년까지의 전체 데이터를 활용하여 상관관계를 도출해보자. 앞서 사용한 방법을 똑같이 적용하여 전체 데이터를 추출한 다음 corrcoef() 함수를 적용하면 상관계수를 산출할 수 있다.

KOSPI = df_KOSPI.iloc[:, 3]
SE = df_SE.iloc[:, 3]
np.corrcoef(SE, KOSPI)

array([[ 1.        ,  0.49735368],
       [ 0.49735368,  1.        ]]

피어슨 상관계수를 계산한 결과는 약 0.50으로 2010년부터 2016년 기간동안 삼성전자 주가와 KOSPI간에는 뚜렷한 양적 선형관계가 있다고 확인되었다.

이번엔 같은 기간동안 SK Hynix의 주가와 KOSPI지수간의 상관계수를 산출해 보겠다.


SKH = df_SKH.iloc[:, 3]
np.corrcoef(SKH, KOSPI)


array([[ 1.        ,  0.48811478],
       [ 0.48811478,  1.        ]])


같은 방법을 활용하여 상관계수를 도출하였고, SK Hynix의 주가와 KOSPI 주가 간의 상관계수는 0.488로 삼성전자와 KOSPI 상관계수 0.497보다 조금 낮은 것을 확인할 수 있다. 따라서 2010년부터 2016년 기간동안 KOSPI 지수는 SK Hynix의 주가보다 삼성전자 주가와 더 상관성이 높은 것을 알 수 있다.

상관계수를 활용할 때 주의해야 할 점은 상관관계가 0이어도 "선형적 관계"만 존재하지 않을 뿐 두 변수간의 "상호 관련성"은 존재할수 있다는 점이다. 




(출처: Wikipedia, Pearson Correlation Coefficient)




위의 그림에서 보는바와 같이 상관계수를 통해 둘 간의 선형적 관계를 파악할수 있다. 그러나 상관계수의 한계는 상관계수 자체가 선형성의 강도가 얼마나 강한지를 보여주는 수치이기 때문에, 그림의 세번째 행에 나오는 것처럼 산점도가 W모양이나 O모양, U 모양 등의 비선형 형태로 나타나면 상관계수가 0에 가깝게 나오는 특성이 있다. 

또한 상관분석은 X와 Y의 선형적 연관도를 설명할 뿐이지, 인과관계를 설명하지 않는다. 즉 X가 증가할때 Y가 얼마나 증가하는지는 알 수 없다. X의 Y에 대한 "영향도" 분석을 하기 위해서는 선형 회귀분석을 활용하는 것이 필요하다.

금번 실습에서 다룬 내용은 X값과 Y값의 상관관계를 산출하는 방법을 다뤘다. 실습으로 삼성전자주가와 KOSPI지수간에는 유의미한 상관관계가 있었으며, SK Hynix 주가보다 삼성전자 주가가 KOSPI지수와 상관성이 더 높은 것을 확인할 수 있었다. 다음 회에서는 "삼성전자의 주가가 변동폭과 KOSPI 지수의 변동폭에 대한 상관관계를 알아보기 위하여 X값의 변화량과 Y값의 변화량을 산출하고 상관계수를 산출할 것이다.

Comments

Popular posts from this blog

1. 상관관계 분석(3): 로그차분을 통한 변화율 상관관계 분석 in python [Advanced Analytics Lab]

2. 선형회귀분석 (1): 단순선형회귀분석 in python [Advanced Analytics Lab]