1. 상관관계 분석(1): 산점도, 공분산 in python [Advanced Analytics Lab]
증권가에서는 흔히 "KOSPI는 삼성전자 주가에 울고 웃는다"는 말이 있다. 다른 말로 하면 삼성전자 주가가 오르면 KOSPI 지수도 상승하고, 삼성전자 주가가 하락하면 KOSPI 주가가 하락한다는 표현이 되겠다. 과연 KOSPI와 삼성전자는 연관되어 움직일까?
삼성전자 주가도 원화로 표기된 "숫자"로 되어 있고, KOSPI 지수도 지수라는 "숫자"로 표시된다. 통계에서는 정해진 범위안에 모든 실수가 될 수 있는 값을 가진 변수들- 온도, 키, 몸무게 등과 같은 간격(interval) 또는 비율(ratio)을 연속된 숫자로 표현하는 변수를 연속형 변수(continuous variable)이라고 부른다.
연속형 변수인 두개의 변수간에 상관성이 존재하는지 파악하는 가장 쉬운 방법은 두 변수간 산점도(Scatter Plot)을 생성해 보는 것이다. 예를 들어 삼성전자의 주가와 KOSPI 주가 간에 상관성이 존재하는지 확인한다고 하자. 가장 쉬운 방법은 x축에 삼성전자의 주가를, y축에 KOSPI 지수를 설정하여 점을 찍어 보는 방법일 것이다. 만약에 두개의 변수가 서로 같이 움직이는 경향을 가진다면 x가 높을 수록 y도 높은 값을 가지고, x가 낮을 수록 y도 낮은 값을 가지게 될 것으로 추측할 수 있다.
먼저 실습 데이터를 Python으로 불러와 보자. 데이터는 2010년부터 2016년까지의 KOSPI 지수와 삼성전자 주가이다.
먼저 필요한 패키지들을 불러온다.
import numpy as npimport pandas as pd
import pandas_datareader.data as web # DataReader
import matplotlib.pyplot as plt #
import datetime
위의 다섯개의 패키지들은 앞으로 있을 실습에서 데이터를 불러오거나 차트를 생성할때 거의 항상 사용하게 될 패키지들이다. numpy 패키지는 다차원 배열의 연산처리를 위한 패키지로 실습과정에서 공분산과 상관계수 등 다양한 계산을 간단한 함수로 지원한다. pandas 패키지는 DataFrame이나 Series 등의 객체를 활용하여 데이터를 쉽게 가공 처리할 수 있는 library이다. pandas_datareader library는 Google 이나 Yahoo 등의 사이트에서 주가정보를 손쉽게 가져올 수 있는 유용한 library이며, matplotlib은 python에서 차트 등을 생성할때 많이 활용되는 대표적인 python library 중 하나이며, 금번 회에서는 산점도를 생성하는데 활용할 것이다. datetime package는 날짜와 시간을 다루기에 매우 편리한 패키지이다.
다음으로 데이터를 가져올 날짜를 지정한다. 편의상 2010년 1월 1일부터 2016년 12월 31일을 지정하도록 하겠다.
start = datetime.datetime(2010, 1, 1)
end = datetime.datetime(2016, 12, 31)
datetime 함수를 활용하여 일자를 지정하였다. 다음에는 pandas_datareader 패키지에서 제공하는 DataReader 함수를 활용해 google에서 KOSPI지수와 종목번호 <005930>의 삼성전자 주가를 불러오도록 하겠다.
df_KOSPI = web.DataReader("KRX:KOSPI", "google", start, end)
df_SE = web.DataReader("KRX:005930", "google", start, end)
명령어를 실행한 후 head 명령어를 통해 잘 들어왔는지 확인해 보자.
print(df_KOSPI.head(5))
print(df_SE.head(5))
출력된 결과를 확인해 보면 Date Column에는 날짜가, Open에는 시가, High는 고가, Low에는 저가, Close에는 종가가 Volume에는 거래랑이 입력되어 있는 것을 확인할 수 있다. 이제 산점도를 생성해 보자.
plt.figure(figsize = (8,6))
plt.scatter(df_SE["Close"], df_KOSPI["Close"])
plt.show()
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwzc8oDS3e1pxaHYtDwffUNF8rzr2LlUXFmM91GPbrdwTBWkYCGhZDI8SWGlFy3UVe4eK_Taqp0eyVRSCha0I_h2kjjmZS2ifrM3sKfmeVRuYx58RgVx_2tQrZ2uPZr6Okx-FlfVB5wXqR/s1600/2.png)
plt.figure에서는 출력될 그래프에 대한 설정을 할 수 있다. figsize 옵션을 통해 가로가 8, 세로가 6인 그래프를 생성하는 것으로 설정하였다. plt.scatter 함수를 활용해 삼성전자 종가와 KOSPI지수 종가의 산점도를 생성하였고, 마지막으로 plt.show() 함수를 통해 산점도를 출력하였다.
산점도를 확인한 결과, x가 높을 때 y도 높은 것처럼 보이고, x가 낮을때 y도 낮은 것처럼 보이는 "경향성"을 확인할 수 있으나, 항상 그런 것처럼 보이지는 않는다. 과연 두 변수간에는 상관관계가 존재할까?
두 변수간의 상관성이 얼마나 존재하는지 명확하게 수치화 하여 나타낼수 있는 방법이 상관분석(Correlation Analysis) 이다. 상관 관계의 가장 기초단계인 공분산(covariance)의 개념에 대해서 알아볼 필요가 있다.
공분산이란, 두개의 변수 즉 x와 y간에 서로 얼마나 같은 방향으로 변화하는지를 나타내는 값이다. x값이 증가할 때 y값도 증가한다면 공분산은 0보다 큰 양(+)의 값이 될 것이고, x값이 증가할때 y 값이 감소한다면 공분산은 음(-) 값을 가지게 될 것이다. 공분산의 수식은 아래와 같다.
삼성전자 주가도 원화로 표기된 "숫자"로 되어 있고, KOSPI 지수도 지수라는 "숫자"로 표시된다. 통계에서는 정해진 범위안에 모든 실수가 될 수 있는 값을 가진 변수들- 온도, 키, 몸무게 등과 같은 간격(interval) 또는 비율(ratio)을 연속된 숫자로 표현하는 변수를 연속형 변수(continuous variable)이라고 부른다.
연속형 변수인 두개의 변수간에 상관성이 존재하는지 파악하는 가장 쉬운 방법은 두 변수간 산점도(Scatter Plot)을 생성해 보는 것이다. 예를 들어 삼성전자의 주가와 KOSPI 주가 간에 상관성이 존재하는지 확인한다고 하자. 가장 쉬운 방법은 x축에 삼성전자의 주가를, y축에 KOSPI 지수를 설정하여 점을 찍어 보는 방법일 것이다. 만약에 두개의 변수가 서로 같이 움직이는 경향을 가진다면 x가 높을 수록 y도 높은 값을 가지고, x가 낮을 수록 y도 낮은 값을 가지게 될 것으로 추측할 수 있다.
먼저 실습 데이터를 Python으로 불러와 보자. 데이터는 2010년부터 2016년까지의 KOSPI 지수와 삼성전자 주가이다.
먼저 필요한 패키지들을 불러온다.
import numpy as npimport pandas as pd
import pandas_datareader.data as web # DataReader
import matplotlib.pyplot as plt #
import datetime
위의 다섯개의 패키지들은 앞으로 있을 실습에서 데이터를 불러오거나 차트를 생성할때 거의 항상 사용하게 될 패키지들이다. numpy 패키지는 다차원 배열의 연산처리를 위한 패키지로 실습과정에서 공분산과 상관계수 등 다양한 계산을 간단한 함수로 지원한다. pandas 패키지는 DataFrame이나 Series 등의 객체를 활용하여 데이터를 쉽게 가공 처리할 수 있는 library이다. pandas_datareader library는 Google 이나 Yahoo 등의 사이트에서 주가정보를 손쉽게 가져올 수 있는 유용한 library이며, matplotlib은 python에서 차트 등을 생성할때 많이 활용되는 대표적인 python library 중 하나이며, 금번 회에서는 산점도를 생성하는데 활용할 것이다. datetime package는 날짜와 시간을 다루기에 매우 편리한 패키지이다.
다음으로 데이터를 가져올 날짜를 지정한다. 편의상 2010년 1월 1일부터 2016년 12월 31일을 지정하도록 하겠다.
start = datetime.datetime(2010, 1, 1)
end = datetime.datetime(2016, 12, 31)
datetime 함수를 활용하여 일자를 지정하였다. 다음에는 pandas_datareader 패키지에서 제공하는 DataReader 함수를 활용해 google에서 KOSPI지수와 종목번호 <005930>의 삼성전자 주가를 불러오도록 하겠다.
df_KOSPI = web.DataReader("KRX:KOSPI", "google", start, end)
df_SE = web.DataReader("KRX:005930", "google", start, end)
명령어를 실행한 후 head 명령어를 통해 잘 들어왔는지 확인해 보자.
print(df_KOSPI.head(5))
print(df_SE.head(5))
Open High Low Close Volume Date 2010-01-04 1681.71 1696.14 1681.71 1696.14 295646000 2010-01-05 1701.62 1702.39 1686.45 1690.62 407629000 2010-01-06 1697.88 1706.89 1696.10 1705.32 425407000 2010-01-07 1702.92 1707.90 1683.45 1683.45 461562000 2010-01-08 1694.06 1695.26 1668.84 1695.26 379138000
Open High Low Close Volume Date 2010-01-04 803000.0 809000.0 800000.0 809000.0 233324 2010-01-05 826000.0 829000.0 815000.0 822000.0 531612 2010-01-06 829000.0 841000.0 826000.0 841000.0 452442 2010-01-07 841000.0 841000.0 813000.0 813000.0 428015 2010-01-08 820000.0 821000.0 806000.0 821000.0 291154
출력된 결과를 확인해 보면 Date Column에는 날짜가, Open에는 시가, High는 고가, Low에는 저가, Close에는 종가가 Volume에는 거래랑이 입력되어 있는 것을 확인할 수 있다. 이제 산점도를 생성해 보자.
plt.figure(figsize = (8,6))
plt.scatter(df_SE["Close"], df_KOSPI["Close"])
plt.show()
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwzc8oDS3e1pxaHYtDwffUNF8rzr2LlUXFmM91GPbrdwTBWkYCGhZDI8SWGlFy3UVe4eK_Taqp0eyVRSCha0I_h2kjjmZS2ifrM3sKfmeVRuYx58RgVx_2tQrZ2uPZr6Okx-FlfVB5wXqR/s1600/2.png)
plt.figure에서는 출력될 그래프에 대한 설정을 할 수 있다. figsize 옵션을 통해 가로가 8, 세로가 6인 그래프를 생성하는 것으로 설정하였다. plt.scatter 함수를 활용해 삼성전자 종가와 KOSPI지수 종가의 산점도를 생성하였고, 마지막으로 plt.show() 함수를 통해 산점도를 출력하였다.
산점도를 확인한 결과, x가 높을 때 y도 높은 것처럼 보이고, x가 낮을때 y도 낮은 것처럼 보이는 "경향성"을 확인할 수 있으나, 항상 그런 것처럼 보이지는 않는다. 과연 두 변수간에는 상관관계가 존재할까?
두 변수간의 상관성이 얼마나 존재하는지 명확하게 수치화 하여 나타낼수 있는 방법이 상관분석(Correlation Analysis) 이다. 상관 관계의 가장 기초단계인 공분산(covariance)의 개념에 대해서 알아볼 필요가 있다.
공분산이란, 두개의 변수 즉 x와 y간에 서로 얼마나 같은 방향으로 변화하는지를 나타내는 값이다. x값이 증가할 때 y값도 증가한다면 공분산은 0보다 큰 양(+)의 값이 될 것이고, x값이 증가할때 y 값이 감소한다면 공분산은 음(-) 값을 가지게 될 것이다. 공분산의 수식은 아래와 같다.
계산의 편의를 위해 2010년 1월 4일부터 6일까지의 최초 3일간 데이터만 활용하여 공분산을 산출해보자. X는 삼성전자 주가이고, Y는 KOSPI 지수이다.
Date | SE | KOSPI |
2010-01-04 | 809000 | 1696.14 |
2010-01-05 | 822000 | 1690.62 |
2010-01-06 | 841000 | 1705.32 |
(1) X와 Y의 평균을 산출한다.
- X의 평균은 824000이고, Y의 평균은 1697.36이다.
(2) X의 편차와 Y의 편차를 산출한다. 편차는 평균과 각 값의 차이이다.
Date | SE | KOSPI | X편차 | Y편차 |
2010-01-04 | 809000 | 1696.14 | -15000 | -1.22 |
2010-01-05 | 822000 | 1690.62 | -2000 | -6.74 |
2010-01-06 | 841000 | 1705.32 | 17000 | 7.96 |
(3) X편차와 Y편차의 곱을 각각 계산한다.
Date | SE | KOSPI | X편차 | Y편차 | 편차곱 |
2010-01-04 | 809000 | 1696.14 | -15000 | -1.22 | 18300 |
2010-01-05 | 822000 | 1690.62 | -2000 | -6.74 | 13480 |
2010-01-06 | 841000 | 1705.32 | 17000 | 7.96 | 135320 |
(4) 편차의 총 합을 산출한 뒤 n-1로 나누면 공분산이 산출된다.
- 편차의 총 합은 18300+13480+135320 = 167100이며, n-1인 2로 나눠주면 83550이 도출되며, 이 값이 공분산이다.
여기서 중요한 점은, 도출된 공분산 값인 "83550"이라는 값이 얼마나 큰 값인지 혹은 작은 값인지 알수 없다는 점이다. 두 변수간에 단위가 서로 다르기 때문에 상대비교가 어려워서, 공분산은 서로 같이 증가하는 경향성을 가졌는지 또는 한쪽이 증가하면 다른 한쪽은 감소하는 경향성을 가졌는지 밖에 나타내지 못한다는 것이다.
위와 같은 복잡한 연산 과정을 python을 통해 간단히 산출할 수 있다.
먼저, 기존에 불러온 데이터프레임에서 가장 상위의 데이터 3개- 2010년 1월 4일~1월 6일까지의 데이터를 추출해 보자.
KOSPI = df_KOSPI.iloc[0:3, 3]
SE = df_SE.iloc[0:3, 3]
print(df_KOSPI_top3)
print(df_SE_top3)
iloc은 pandas에서 제공하는 함수로, DataFrame의 Index Location에서 위치를 기반으로 데이터를 추출한다. df_KOSPI.iloc을 풀어서 살펴보면, df_KOSPI라는 데이터 프레임의 0번째 행부터 3보다 작은 행까지 데이터에서 종가가 담겨있는 3번째 열만 추출하는 명령이다. 마찬가지 방법으로 삼성전자도 3개의 데이터를 추출한다.
np.cov(SE, KOSPI)
공분산을 계산하는 함수는 numpy pacakge에서 제공하는 np.cov()이다. 괄호 안에 비교하고자 하는 두개의 변수를 입력하면 공분산이 도출된다. array 형태로 도출된 공분산 행렬의 1열 1행은 삼성전자 주가의 공분산, 1열 2행은 삼성전자 주가와 KOSPI의 공분산, 2열 1행은 마찬가지로 KOSPI와 삼성전자의 공분산, 2열 2행은 KOSPI의 공분산이다. 8.355의 e+04는 10의 4승을 의미하므로, 10000을 곱해주면 앞서 계산한 것과 마찬가지로 83550이 도출된 것을 확인할 수 있다.
이번에는 전체 데이터를 기준으로 공분산을 산출해 보자. 아까 활용한 cov() 함수를 최초에 생성한 df_KOSPI 종가의 전체 행과 df_SE의 종가의 전체 행을 추출해 적용하면 공분산이 도출된다.
KOSPI = df_KOSPI.iloc[:, 3]
SE = df_SE.iloc[:, 3]
np.cov(SE, KOSPI)
도출된 결과의 array를 보면 1.49738256e+07을 확인할 수 있다. 1.49738256e+07 을 정수로 환산하면 14973825.6 이 되겠다.
삼성전자와 KOSPI의 공분산 값이 0보다 크기 때문에, 동행(X가 증가하면 Y도 증가, X가 감소하면 Y도 감소)하는 경향이 존재하는 것으로 나타났다. 그러나 얼마만큼 같이 동행하는지, 도출된 14973826이라는 값이 큰 것인지 혹은 작은 것인지 알 수가 없다. X와 Y의 단위에 영향을 받기 때문이다.
공분산 값이 높은지, 혹은 낮은지에 대하여 명확하게 알 수 없는 문제를 해결하기 위해 단위를 표준화시킨 값이 필요할 것이다. 다음 회에서는 피어슨 상관계수(Pearson's Correlation Coefficient)를 통해 어떻게 두 변수간의 상관도를 정량적으로 분석하는지 확인할 것이다.
위와 같은 복잡한 연산 과정을 python을 통해 간단히 산출할 수 있다.
먼저, 기존에 불러온 데이터프레임에서 가장 상위의 데이터 3개- 2010년 1월 4일~1월 6일까지의 데이터를 추출해 보자.
KOSPI = df_KOSPI.iloc[0:3, 3]
SE = df_SE.iloc[0:3, 3]
print(df_KOSPI_top3)
print(df_SE_top3)
[ 1696.14 1690.62 1705.32] [ 809000. 822000. 841000.]
iloc은 pandas에서 제공하는 함수로, DataFrame의 Index Location에서 위치를 기반으로 데이터를 추출한다. df_KOSPI.iloc을 풀어서 살펴보면, df_KOSPI라는 데이터 프레임의 0번째 행부터 3보다 작은 행까지 데이터에서 종가가 담겨있는 3번째 열만 추출하는 명령이다. 마찬가지 방법으로 삼성전자도 3개의 데이터를 추출한다.
np.cov(SE, KOSPI)
array([[ 2.59000000e+08, 8.35500000e+04], [ 8.35500000e+04, 5.51388000e+01]])
공분산을 계산하는 함수는 numpy pacakge에서 제공하는 np.cov()이다. 괄호 안에 비교하고자 하는 두개의 변수를 입력하면 공분산이 도출된다. array 형태로 도출된 공분산 행렬의 1열 1행은 삼성전자 주가의 공분산, 1열 2행은 삼성전자 주가와 KOSPI의 공분산, 2열 1행은 마찬가지로 KOSPI와 삼성전자의 공분산, 2열 2행은 KOSPI의 공분산이다. 8.355의 e+04는 10의 4승을 의미하므로, 10000을 곱해주면 앞서 계산한 것과 마찬가지로 83550이 도출된 것을 확인할 수 있다.
이번에는 전체 데이터를 기준으로 공분산을 산출해 보자. 아까 활용한 cov() 함수를 최초에 생성한 df_KOSPI 종가의 전체 행과 df_SE의 종가의 전체 행을 추출해 적용하면 공분산이 도출된다.
KOSPI = df_KOSPI.iloc[:, 3]
SE = df_SE.iloc[:, 3]
np.cov(SE, KOSPI)
array([[ 6.71139396e+10, 1.49738256e+07], [ 1.49738256e+07, 1.35058568e+04]])
도출된 결과의 array를 보면 1.49738256e+07을 확인할 수 있다. 1.49738256e+07 을 정수로 환산하면 14973825.6 이 되겠다.
삼성전자와 KOSPI의 공분산 값이 0보다 크기 때문에, 동행(X가 증가하면 Y도 증가, X가 감소하면 Y도 감소)하는 경향이 존재하는 것으로 나타났다. 그러나 얼마만큼 같이 동행하는지, 도출된 14973826이라는 값이 큰 것인지 혹은 작은 것인지 알 수가 없다. X와 Y의 단위에 영향을 받기 때문이다.
공분산 값이 높은지, 혹은 낮은지에 대하여 명확하게 알 수 없는 문제를 해결하기 위해 단위를 표준화시킨 값이 필요할 것이다. 다음 회에서는 피어슨 상관계수(Pearson's Correlation Coefficient)를 통해 어떻게 두 변수간의 상관도를 정량적으로 분석하는지 확인할 것이다.
Achiotek and his brother, ford escape titanium 2021
ReplyDeleteAnak - and aor microtouch trimmer - part. -, see here, see here, see here, see babyliss titanium flat iron here, see here, titanium legs see here, see here, see here, see here, see here, see best titanium flat iron here, 메이피로출장마사지 see here, see here, see
a258x1syzta512 horse dildo,dog dildo,realistic dildo,Butterfly Vibrator,wholesale sex toys,vibrators,dildo,love dolls,sex chair e479w7nbzfv654
ReplyDelete