기본 콘텐츠로 건너뛰기

[data analysis]로그-노말 분포(Log-normal distribution)

[data analysis] 공분산과 상관계수

공분산과 상관계수

연속변수일 경우 $\chi^2$ 검정의 대상이 되는 교차표를 작성할 수 없습니다. 대신에 상관분석을 적용할 수 있습니다. 상관분석은 두 개 혹은 그 이상의 연속변수들 사이의 관계를 측정하는 분석 방법입니다.

두 변수의 상관성을 시각적으로 나타내기 위해 산포도를 사용합니다. 그림 1의 (a)는 x와 y의 정비례 관계가 명확합니다. 반면에 (b)의 경우는 반비례관계를 보이며 (c)의 경우는 x와 y 사이에 어떠한 비례 관계를 특정할 수 없습니다. 이러한 관계는 상관계수라는 통계량을 사용하여 정량적으로 나타낼 수 있으며 이는 두 변수의 공분산과 각각의 표준편차와 관계됩니다.

그림 1. 두 변수의 (a) 정상관계 (b)역상관계 (c)상관성없음.
plt.figure(figsize=(9, 4))
col=["blue","red","green"]
lab=["a) direct","b) inverse", "c) no"]
yT=[y, y1, y2]
for i in range(3):
    plt.subplot(1,3,i+1)
    plt.scatter(x, yT[i], s=15, color=col[i])
    plt.title(f"{lab[i]} proportion", fontsize=15)
    plt.xticks([])
    plt.yticks([])
    plt.xlabel("x")
    if i==0:
        plt.ylabel("y")
plt.show()

그림 1(a)에서 각 변수의 평균들 μx, μy와 임의의 점 x, y 사이에 각각의 편차를 x - μx, y - μy를 측정합니다(식 1). 이 경우 x의 증가와 함께 y의 증가가 관찰되므로 두 편차의 곱 (x - μx)(y -μy)는 각각의 편차보다 증가하며 양수가 될 것입니다. 같은 과정을 그림 (b)에 적용한다면 두 편차의 곱은 음수가 될 것입니다. 그림 (c)의 경우에서는 두 편차의 곱의 부호를 특정할 수 없습니다. 결과적으로 (x - μx)(y - μy)는 두 변수 X, Y의 선형 의존성을 나타내는 지표가 되며 이 편차 곱의 기대값 E[(x - μx)(y - μy)]공분산(covariance)이라고 합니다. 다시말하면 공분산은 변수들 각각의 분포의 변화가 결합분포에 미치는 영향을 나타내는 것입니다.

Cov(X, y) = E[(X − μx)(Y − μy)] (식 1)

식 1의 전개로 보다 간편한 식으로 공분산을 계산할 수 있습니다(식 2).

Cov(X, y) = E(XY − Xμy − Yμx + μxμy) (식 2)
= E(XY) − E(X)μy − E(Y)μx + μxμy
= E(XY) − μxμy
∵ E(X) = μx, E(Y) = μy

공분산 절대값의 증가에 따라 선형 의존성은 증가하며 양의 공분산은 정상관계, 음의 값은 역상관계를 의미합니다. 공분산 0는 두 변수 사이의 선형의존성은 없음을 의미합니다. 그러나 2개 이상의 변수들 사이에 계산되는 공분산은 각 변수의 스케일의 차이(단위에 의한 차이)로 인해 절대적인 의존도 척도로 사용하기 어렵습니다. 그러므로 여러 공분산들의 비교가 어렵습니다. 이러한 문제는 값을 표준화하고 공분산과 관련된 양인 피어슨 상관 계수(Pearson correlation coefficient, ρ)를 사용하는 것으로 해결 할 수 있습니다(식 3).

$$ρ = \frac{\text{Cov(X, Y)}}{\rho_x \rho_y}$$ (식 3)

식 3에서 σx와 σy는 각각 X, Y의 표준편차이며 ρ는 [-1, 1]의 범위에 존재합니다. 결과인 상관계수의 부호는 공분산의 부호와 같으며 표 1과 같이 정리됩니다.

표 1 상관계수
상관계수 의미
ρ = 1 완벽한 정관계
0 < ρ < 1 정관계
ρ = 0 상관성 없음
-1 < ρ < 0 역관계
ρ = -1 완벽한 역관계

표 1에 나타낸 것과 같이 두 변수의 상관성이 없다는 것은 "공분산 = 0"임을 의미합니다. 이것은 두 변수가 서로 독립임을 의미합니다. 즉, 두 변수가 독립인 경우 식 4가 성립합니다.

Cov(X,Y) = 0 ⇒ E(XY) = E(X)E(Y)(식 4)

예 1)

두 자료에 대한 공분산과 상관계수를 계산합니다.

ex kos
0 0.729 1.681
1 0.707 0.384
2 -0.625 1.118
3 0.244 2.630
4 -1.672 0.048

자료는 다음의 코드를 사용하여 호출한 것으로 연속변수입니다.(FinanceDataReader 참조)

st=pd.Timestamp(2023,1,1)
et=pd.Timestamp(2025, 5, 30)
kos=fdr.DataReader('KS11', st, et)["Close"]
ex=fdr.DataReader('USD/KRW',st, et)["Close"]
kos=kos.pct_change()[1:]*100
ex=ex.pct_change()[1:]*100
data=pd.concat([ex, kos.shift(periods=-1)], join="inner", axis=1)
data.index=range(len(data))
data.columns=['ex', 'kos']
data=data.dropna()
data.head()
ex kos
0 0.152338 -1.132034
1 0.229837 1.176494
2 0.544509 -0.953332
3 -0.738113 0.022548
4 0.101093 1.540630

두 자료에 대한 관계를 나타내는 산점도(scatter)는 그림 2와 같습니다. 그림 2에 의한 두 데이터 사이에 상관관계를 결정은 모호합니다. 이러한 모호성을 개선하기 위해 공분산과 상관계수를 계산해 봅시다.

그림 2. ex vs. kos의 일일 변화율에 대한 산점도.

위 객체 data의 공분산은 식 2를 적용하여 산출할 수 있습니다. 즉, E(kos·ex)과 μkos·μex를 계산합니다. 한 객체내의 여러 열 또는 행들의 곱은 객체.product(axis) 함수를 적용하여 계산할 수 있습니다.

mu=data.mean(axis=0); mu
ex     0.032484
kos    0.073461
dtype: float64
cov=data.product(axis=1).mean()-mu.product()
cov.round(3)
-0.027

식 1의 공분산 계산은 식 5와 같이 행렬 형태의 자료에 대한 행렬곱으로 연산할 수 있습니다. 이 연산은 행렬(자료)에 대해 행과 열을 교환한 전치행렬과의 행렬곱(XTX)을 적용합니다. 이 연산의 결과는 대각외 요소들은 각 변수의 제곱합이며 대각 원소는 동일한 인덱스의 값들의 곱의 합이 됩니다.

\begin{align}& X^T=\begin{bmatrix}x_1-\mu_x& \cdots & x_n-\mu_x\\y_1-\mu_y& \cdots & y_n-\mu_y \end{bmatrix}, \quad X=\begin{bmatrix}x_1-\mu_x& y_1-\mu_y\\ \vdots & \vdots \\ x_n-\mu_x& y_n-\mu_y \end{bmatrix} \\& X^TX=\begin{bmatrix} \sum^n_{i=1}(x_i-\mu_x)^2& \sum^n_{i=1}(x_i-\mu_x)(y_i-\mu_y)\\ \sum^n_{i=1}(x_i-\mu_x)(y_i-\mu_y) & \sum^n_{i=1}(y_i-\mu_y)^2 \end{bmatrix}\end{align} (식 5)

식 6은 식 5의 결과인 XTX를 객체의 크기로 나눈 결과입니다. 이 결과는 대각요소들을 기준으로 대칭인 대칭행렬이며 공분산행렬(covariance matrix)이라고 합니다. 이 행렬의 대각요소는 각 자료의 분산을 나타내며 대각외 요소는 두 자료의 공분산을 나타냅니다.

\begin{align}\text{Cov Matrix} & = \frac{X^TX}{n}\\ & = \begin{bmatrix} \frac{\sum^n_{i=1}(x_i-\mu_x)^2}{n} & \frac{\sum^n_{i=1}(x_i-\mu_x)(y_i-\mu_y)}{n}\\ \frac{\sum^n_{i=1}(x_i-\mu_x)(y_i-\mu_y)}{n} & \frac{\sum^n_{i=1}(y_i-\mu_y)^2}{n} \end{bmatrix}\\& = \begin{bmatrix}\text{Var}_x & \text{Cov}_{xy}\\\text{Cov}_{xy} & \text{Var}_y \end{bmatrix} \end{align} (식 6)

표본에서는 식 6과 같이 전체 샘플수를 사용하는 대신 자유도를 적용합니다. 그러므로 data에 대한 공분산행렬은 다음과 같습니다.

daMu=data.values-mu.values.reshape(-1, 2)
print(np.around(np.dot(daMu.T, daMu)/(len(daMu)-1), 3))
[[ 0.324 -0.027]
 [-0.027  0.961]]

위의 공분산행렬은 pd객체.cov() 함수에 의해 계산됩니다.

cov=data.cov()
np.round(cov, 3)
ex kos
ex 0.324 -0.027
kos -0.027 0.961

상관계수는 공분산을 각 자료의 표준편차의 곱으로 나누어 준 결과입니다. 그러므로 식 6의 공분산 행렬에 대해 표준편차를 고려하면 상관행렬(correlation matrix)이 생성됩니다(식 7).

$$\text{Cor Matrix} =\begin{bmatrix}\frac{\text{Var}_x}{\sigma_x} & \frac{\text{Cov}_{xy}}{\sigma_x \sigma_y}\\\frac{\text{Cov}_{xy}}{\sigma_x \sigma_y} & \frac{\text{Var}_y}{\sigma_y} \end{bmatrix}$$ (식 7)
s=data.std(axis=0).values.reshape(1,2)
print(s.round(3))
[[0.569 0.98 ]]
smat=np.dot(s.T, s)
print(smat.round(3))
[[0.324 0.558]
 [0.558 0.961]]
corCoef=cov/smat
np.around(corCoef, 3)
ex kos
ex 1.000 -0.049
kos -0.049 1.000

상관계수는 pandas객체.corr() 메서드로 계산됩니다.

corCoef2=data.corr()
np.around(corCoef2, 3)
ex kos
ex 1.000 -0.049
kos -0.049 1.000

위 정량적인 결과는 ex와 kos 자료간에 상관관계가 매우 약함을 나타내며 그림 2의 모호성을 개선시킵니다. 그러나 이 결과 역시 두 변수의 상관관계에 명확한 근거를 제시하는데 모호합니다. 그러므로 상관계수 0.05는 상관관계가 없음의 유무를 위한 명확한 판단을 내리기 위해 가설 검정을 실시합니다.

댓글

이 블로그의 인기 게시물

유사변환과 대각화

내용 유사변환 유사행렬의 특성 대각화(Diagonalization) 유사변환(Similarity transformation) 유사변환 n×n 차원의 정방 행렬 A, B 그리고 가역 행렬 P 사이에 식 1의 관계가 성립하면 행렬 A와 B는 유사하다고 하며 이 변환을 유사 변환 (similarity transformation)이라고 합니다. $$\begin{equation}\tag{1} A = PBP^{-1} \Leftrightarrow P^{-1}AP = B \end{equation}$$ 식 1의 유사 변환은 다음과 같이 고유값을 적용하여 특성 방정식 형태로 정리할 수 있습니다. $$\begin{align} B - \lambda I &= P^{-1}AP – \lambda P^{-1}P\\ &= P^{-1}(AP – \lambda P)\\ &= P^{-1}(A - \lambda I)P \end{align}$$ 위 식의 행렬식은 다음과 같이 정리됩니다. $$\begin{align} &\begin{aligned}\textsf{det}(B - \lambda I ) & = \textsf{det}(P^{-1}(AP – \lambda P))\\ &= \textsf{det}(P^{-1}) \textsf{det}((A – \lambda I)) \textsf{det}(P)\\ &= \textsf{det}(P^{-1}) \textsf{det}(P) \textsf{det}((A – \lambda I))\\ &= \textsf{det}(A – \lambda I)\end{aligned}\\ &\begin{aligned}\because \; \textsf{det}(P^{-1}) \textsf{det}(P) &= \textsf{det}(P^{-1}P)\\ &= \t

[matplotlib] 히스토그램(Histogram)

히스토그램(Histogram) 히스토그램은 확률분포의 그래픽적인 표현이며 막대그래프의 종류입니다. 이 그래프가 확률분포와 관계가 있으므로 통계적 요소를 나타내기 위해 많이 사용됩니다. plt.hist(X, bins=10)함수를 사용합니다. x=np.random.randn(1000) plt.hist(x, 10) plt.show() 위 그래프의 y축은 각 구간에 해당하는 갯수이다. 빈도수 대신 확률밀도를 나타내기 위해서는 위 함수의 매개변수 normed=True로 조정하여 나타낼 수 있다. 또한 매개변수 bins의 인수를 숫자로 전달할 수 있지만 리스트 객체로 지정할 수 있다. 막대그래프의 경우와 마찬가지로 각 막대의 폭은 매개변수 width에 의해 조정된다. y=np.linspace(min(x)-1, max(x)+1, 10) y array([-4.48810153, -3.54351935, -2.59893717, -1.65435499, -0.70977282, 0.23480936, 1.17939154, 2.12397372, 3.0685559 , 4.01313807]) plt.hist(x, y, normed=True) plt.show()

R 미분과 적분

내용 expression 미분 2차 미분 mosaic를 사용한 미분 적분 미분과 적분 R에서의 미분과 적분 함수는 expression()함수에 의해 생성된 표현식을 대상으로 합니다. expression expression(문자, 또는 식) 이 표현식의 평가는 eval() 함수에 의해 실행됩니다. > ex1<-expression(1+0:9) > ex1 expression(1 + 0:9) > eval(ex1) [1] 1 2 3 4 5 6 7 8 9 10 > ex2<-expression(u, 2, u+0:9) > ex2 expression(u, 2, u + 0:9) > ex2[1] expression(u) > ex2[2] expression(2) > ex2[3] expression(u + 0:9) > u<-0.9 > eval(ex2[3]) [1] 0.9 1.9 2.9 3.9 4.9 5.9 6.9 7.9 8.9 9.9 미분 D(표현식, 미분 변수) 함수로 미분을 실행합니다. 이 함수의 표현식은 expression() 함수로 생성된 객체이며 미분 변수는 다음 식의 분모의 변수를 의미합니다. $$\frac{d}{d \text{변수}}\text{표현식}$$ 이 함수는 어떤 함수의 미분의 결과를 표현식으로 반환합니다. > D(expression(2*x^3), "x") 2 * (3 * x^2) > eq<-expression(log(x)) > eq expression(log(x)) > D(eq, "x") 1/x > eq2<-expression(a/(1+b*exp(-d*x))); eq2 expression(a/(1 + b * exp(-d * x))) > D(eq2, "x") a * (b * (exp(-d * x) * d))/(1 + b