1. 상관관계 분석(3): 로그차분을 통한 변화율 상관관계 분석 in python [Advanced Analytics Lab]
앞서 분석에서는 두 변수간의 상관관계를 확인하였다. 분석 결과 삼성전자 주가와 KOSPI 지수, SK Hynix 주가와 KOSPI 지수간에는 유의미한 상관관계가 있음을 확인하였다. 앞서 분석 결과를 바탕으로 생각해 보면, 상관분석 Chapter를 시작하면서 최초의 질문이었던 "삼성전자 주가가 오르면 KOSPI 지수도 상승하고, 삼성전자 주가가 하락하면 KOSPI 주가가 하락한다." 라는 질문에 정확한 대답이 되었을까?
정확한 답은 아니라고 할 것이다. 왜냐하면 삼성전자 주가가 높으면 KOSPI 지수가 높은 것은 맞지만, 삼성전자 주가가 오르면 KOSPI 지수가 오르는 것에 대한 대답은 아니기 때문이다. 즉, X와 Y를 비교하는 것이 아니라 X의 증가량과 Y의 증가량을 비교하는 것이 필요하기 때문이다.
X증가량은 로그차분(Logarithmic Differentiation)을 통해서 산출할 수 있다. 변화량을 수식으로 표현하면 아래와 같다.
Xt시점의 변화량은 Xt시점에 자연로그(ln)를 취한 값에 Xt의 이전시점 (Xt-1) 값에 자연로그를 취하고 빼준 값과 같다. 예를 들어 1월 4일에 1696.14였던 KOSPI 주가지수가 1월 5일에 1690.62로 증가했다면, 자연로그를 취해서 차이를 구해주면 된다.
ln(1690.62) - ln(1696.14) = 7.432851 - 7.43611 = - 0.00326 = -0.326 %
python에서 실습해보자. 데이터는 앞과 동일한 데이터를 사용할 것이다.
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)
데이터를 불러온 다음 로그차분을 통해 두 변수를 수익률로 변환해 보겠다.
먼저 shift함수를 활용해 X의 t-1 시점 데이터를 생성한다.
df_KOSPI["Lag_Close"] = df_KOSPI["Close"].shift(1)
df_KOSPI.head(5)
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSi0UFF1kW-hdyDodzOktEMlTmOXbnZfkK6F51PozajspZAyuyXeN0GIHQdwkQiDA2n2EHdLENchdGDctNfgf7Ct5f7z8VpFhg1jG3QwrSUXmHx2pT3fTHMkxvL__eEYBV2L5Ij3Lqtcj9/s1600/5.PNG)
shift()함수는 데이터를 주어진 데이터 프레임에서 앞/뒤로 이동시킬수 있다. 생성된 데이터를 head(5) 명령어를 통해 데이터 프레임의 최초 5개 행을 확인할 수 있다.
다음은 로그변환을 수행할 차례이다.
df_KOSPI["ln_Lag_Close"] = np.log(df_KOSPI["Lag_Close"])
df_KOSPI.head(5)
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifE9bhsIVlFyIc5cCTvtwdA49LGbJOLIuIk0DFkuCPzQVxishIssfOxEmfyr0zcV1xejtoVXEtQzSUIgFRge1mk77v-vz8dPUTUlNRoztYxSFpoahsuFYoJEqZVh6x6nQjd0KnrMxrJsf0/s1600/6.PNG)
np.log()함수를 활용하여 먼저 생성한 Lag_Close 변수에 자연로그값을 취할 수 있다. 앞서 계산한 것과 마찬가지로 1696.14 가 7.43611로 변환되었다.
이번엔 "Close" 변수도 로그로 변환하여 ln_Close 변수를 생성하고, 앞서 구했던 ln_Lag_Close 변수와 차이를 산출한다.
df_KOSPI["ln_Close"] = np.log(df_KOSPI["Close"])
df_KOSPI["ln_diff"] = (df_KOSPI["ln_Close"] - df_KOSPI["ln_Lag_Close"]) * 100
df_KOSPI.head(5)
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdtAaYaLJ8Bxuz1gWv7D2ZlBwpi_5w6Z6-kEvJKQuEqbJQiKFGrlLz44wBmIyxTfkFAUwQTDN0ygKGKIant9EvAswbQXkaKiJfySS1hLGBzJp0QVKOYhlxpXdjd_OKFrdHqjD53cEF4F3Z/s1600/8.PNG)
편의상 두 값의 차에 *100을 통해 퍼센트(%)로 변환하였다. ln_diff 변수는 KOSPI지수가 전일대비 몇 퍼센트나 변화했는지를 나타내는 변수이다.
같은 방법으로 삼성전자 종가도 로그 차분을 수행한다. 편의상 변수를 여러개 생성하지 않고 한줄로 코드를 만들어 보자.
df_SE["ln_diff"] = (np.log(df_SE["Close"]) - np.log(df_SE["Close"]).shift(1))*100
df_SE.head(5)
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDq6L5JdHkydYzRRp_LuHQ-QsREaSINchR067KqOOXMY9b3ljUzNneKEQ5tu2xJFOyZDXbrUkGaVZZwLRbbwCtN713vJ9MPcrPpPZK5u0rgIjD6u06QoZq7yqnlN2XEJyz-QsrIEPTRB5E/s1600/9.PNG)
이제 생성된 두개의 변수- 삼성전자의 주가변화율과 KOSPI 지수 변화율간의 산점도를 생성하고 상관계수를 도출해보자. 먼저 산점도를 생성한다.
plt.figure(figsize = (8,6))
plt.scatter(df_SE["ln_diff"], df_KOSPI["ln_diff"])
plt.show()
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3hNweRQcSz2S_vh3nyAfC-aMBvhyphenhyphenToPXSw4ilR-NDbL3fqNhH1i9lVjip4nCAB8ostYNqfxU3Qnk0QVrnuMsis9Mz-cEw-JMHIufdDYdNUdaGio80bJTvFvN3teknALYf0wFoNz_vGD4X/s1600/10.png)
산점도 생성 결과 원값으로 비교했을 때 보다 증가율로 비교했을 경우 두 변수간에 선형적 상관관계가 더 뚜렷하게 도출되는 것을 알 수 있다. 상관계수도 구해보자.
KOSPI = df_KOSPI["ln_diff"].dropna()
SE = df_SE["ln_diff"].dropna()
np.corrcoef(SE, KOSPI)
가장 첫번째 열이 결측 (NaN)이기 때문에 dropna() 함수를 사용하여 결측치를 제거하였다. 피어슨 상관계수 기준으로 약 0.663정도가 도출되었으며, 원값 기준으로 비교했을 때 0.497이었던 것에 비해 상당히 높아지는 것을 알 수 있다.
변화율의 상관관계를 통해서 앞서 확인하고 싶었던 명제 "삼성전자 주가가 오르면 KOSPI 지수도 상승하고, 삼성전자 주가가 하락하면 KOSPI 주가가 하락한다." 는 대부분 사실인 것 처럼 보인다.
이번에는 SK Hynix의 주가와 KOSPI 지수간의 상관관계도 확인해 보자. 아까와 같은 방법으로 (1) 로그차분값을 생성하고, (2) 두 변수간에 산점도를 그리고, (3) 피어슨 상관계수를 도출하는 순서로 진행한다.
df_SKH["ln_diff"] = (np.log(df_SKH["Close"]) - np.log(df_SKH["Close"]).shift(1))*100
plt.figure(figsize = (8,6))
plt.scatter(df_SKH["ln_diff"], df_KOSPI["ln_diff"])
plt.show()
SKH = df_SKH["ln_diff"].dropna()
print(np.corrcoef(SKH, KOSPI))
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-GoLCVtaFnhaSFKEsbnjq557lKirCuPaHs41dU0jtDBQDpX7VhToizIm3oFMgcWn-4_mc6VPUzdQMtz2a1k4mPr1CyyGvpj9rkGQnRKrcTUqq-HX76YYDNb6UGVEK3smuwPcA7_3s-Q5w/s1600/11.png)
산점도 생성 결과 삼성전자-KOSPI 의 산점도보다 점들의 분포가 상당히 원형으로 분산되어 있는 것을 볼 수 있다. 당연히 상관계수도 0.513이라는 낮은 값을 가진다.
이번 회에서는 두 변수의 변화율 계산 및 상관계수 산출을 통해 두 변수간의 상관도가 있는지 분석을 수행할 수 있었다. 다음 회에서는 단순선형회귀분석(Simple Linear Regression Analysis)을 통해 X 증가량이 Y 증가량에 미치는 영향에 대해서 분석해 보도록 하겠다.
정확한 답은 아니라고 할 것이다. 왜냐하면 삼성전자 주가가 높으면 KOSPI 지수가 높은 것은 맞지만, 삼성전자 주가가 오르면 KOSPI 지수가 오르는 것에 대한 대답은 아니기 때문이다. 즉, X와 Y를 비교하는 것이 아니라 X의 증가량과 Y의 증가량을 비교하는 것이 필요하기 때문이다.
X증가량은 로그차분(Logarithmic Differentiation)을 통해서 산출할 수 있다. 변화량을 수식으로 표현하면 아래와 같다.
Xt시점의 변화량은 Xt시점에 자연로그(ln)를 취한 값에 Xt의 이전시점 (Xt-1) 값에 자연로그를 취하고 빼준 값과 같다. 예를 들어 1월 4일에 1696.14였던 KOSPI 주가지수가 1월 5일에 1690.62로 증가했다면, 자연로그를 취해서 차이를 구해주면 된다.
ln(1690.62) - ln(1696.14) = 7.432851 - 7.43611 = - 0.00326 = -0.326 %
python에서 실습해보자. 데이터는 앞과 동일한 데이터를 사용할 것이다.
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)
데이터를 불러온 다음 로그차분을 통해 두 변수를 수익률로 변환해 보겠다.
먼저 shift함수를 활용해 X의 t-1 시점 데이터를 생성한다.
df_KOSPI["Lag_Close"] = df_KOSPI["Close"].shift(1)
df_KOSPI.head(5)
shift()함수는 데이터를 주어진 데이터 프레임에서 앞/뒤로 이동시킬수 있다. 생성된 데이터를 head(5) 명령어를 통해 데이터 프레임의 최초 5개 행을 확인할 수 있다.
다음은 로그변환을 수행할 차례이다.
df_KOSPI["ln_Lag_Close"] = np.log(df_KOSPI["Lag_Close"])
df_KOSPI.head(5)
np.log()함수를 활용하여 먼저 생성한 Lag_Close 변수에 자연로그값을 취할 수 있다. 앞서 계산한 것과 마찬가지로 1696.14 가 7.43611로 변환되었다.
이번엔 "Close" 변수도 로그로 변환하여 ln_Close 변수를 생성하고, 앞서 구했던 ln_Lag_Close 변수와 차이를 산출한다.
df_KOSPI["ln_Close"] = np.log(df_KOSPI["Close"])
df_KOSPI["ln_diff"] = (df_KOSPI["ln_Close"] - df_KOSPI["ln_Lag_Close"]) * 100
df_KOSPI.head(5)
편의상 두 값의 차에 *100을 통해 퍼센트(%)로 변환하였다. ln_diff 변수는 KOSPI지수가 전일대비 몇 퍼센트나 변화했는지를 나타내는 변수이다.
같은 방법으로 삼성전자 종가도 로그 차분을 수행한다. 편의상 변수를 여러개 생성하지 않고 한줄로 코드를 만들어 보자.
df_SE["ln_diff"] = (np.log(df_SE["Close"]) - np.log(df_SE["Close"]).shift(1))*100
df_SE.head(5)
이제 생성된 두개의 변수- 삼성전자의 주가변화율과 KOSPI 지수 변화율간의 산점도를 생성하고 상관계수를 도출해보자. 먼저 산점도를 생성한다.
plt.figure(figsize = (8,6))
plt.scatter(df_SE["ln_diff"], df_KOSPI["ln_diff"])
plt.show()
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3hNweRQcSz2S_vh3nyAfC-aMBvhyphenhyphenToPXSw4ilR-NDbL3fqNhH1i9lVjip4nCAB8ostYNqfxU3Qnk0QVrnuMsis9Mz-cEw-JMHIufdDYdNUdaGio80bJTvFvN3teknALYf0wFoNz_vGD4X/s1600/10.png)
산점도 생성 결과 원값으로 비교했을 때 보다 증가율로 비교했을 경우 두 변수간에 선형적 상관관계가 더 뚜렷하게 도출되는 것을 알 수 있다. 상관계수도 구해보자.
KOSPI = df_KOSPI["ln_diff"].dropna()
SE = df_SE["ln_diff"].dropna()
np.corrcoef(SE, KOSPI)
array([[ 1. , 0.6632653], [ 0.6632653, 1. ]])
가장 첫번째 열이 결측 (NaN)이기 때문에 dropna() 함수를 사용하여 결측치를 제거하였다. 피어슨 상관계수 기준으로 약 0.663정도가 도출되었으며, 원값 기준으로 비교했을 때 0.497이었던 것에 비해 상당히 높아지는 것을 알 수 있다.
변화율의 상관관계를 통해서 앞서 확인하고 싶었던 명제 "삼성전자 주가가 오르면 KOSPI 지수도 상승하고, 삼성전자 주가가 하락하면 KOSPI 주가가 하락한다." 는 대부분 사실인 것 처럼 보인다.
이번에는 SK Hynix의 주가와 KOSPI 지수간의 상관관계도 확인해 보자. 아까와 같은 방법으로 (1) 로그차분값을 생성하고, (2) 두 변수간에 산점도를 그리고, (3) 피어슨 상관계수를 도출하는 순서로 진행한다.
df_SKH["ln_diff"] = (np.log(df_SKH["Close"]) - np.log(df_SKH["Close"]).shift(1))*100
plt.figure(figsize = (8,6))
plt.scatter(df_SKH["ln_diff"], df_KOSPI["ln_diff"])
plt.show()
SKH = df_SKH["ln_diff"].dropna()
print(np.corrcoef(SKH, KOSPI))
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-GoLCVtaFnhaSFKEsbnjq557lKirCuPaHs41dU0jtDBQDpX7VhToizIm3oFMgcWn-4_mc6VPUzdQMtz2a1k4mPr1CyyGvpj9rkGQnRKrcTUqq-HX76YYDNb6UGVEK3smuwPcA7_3s-Q5w/s1600/11.png)
[[ 1. 0.51263986] [ 0.51263986 1. ]]
산점도 생성 결과 삼성전자-KOSPI 의 산점도보다 점들의 분포가 상당히 원형으로 분산되어 있는 것을 볼 수 있다. 당연히 상관계수도 0.513이라는 낮은 값을 가진다.
이번 회에서는 두 변수의 변화율 계산 및 상관계수 산출을 통해 두 변수간의 상관도가 있는지 분석을 수행할 수 있었다. 다음 회에서는 단순선형회귀분석(Simple Linear Regression Analysis)을 통해 X 증가량이 Y 증가량에 미치는 영향에 대해서 분석해 보도록 하겠다.
UfauclarYmipo Chad Gonzales Here
ReplyDeleteusizikdo
AfricexXpil_re-1990 Marcus Steen Wondershare PDFelement Pro 9.0.12.1830
ReplyDeleteExpress VPN
Microsoft Word 2016
Stardock Fences 4.0.7.2
sourcommpropvoi