이번 글은
2022.07.05 - [수학의 재미/행렬 이론] - 상관계수와 상관계수 행렬 #1
에서 이어집니다.
$X,Y$의 상관계수는
$$ \mathbf{Corr}(X,Y) =\frac{\mathbf{Cov}(X,Y)}{\sigma_X \sigma_Y} = \frac1{\sigma_X \sigma_Y} \frac1n \sum_{i=1}^n (x_i -\mu_X) (y_i -\mu_Y)$$
로 정의가 됩니다. $X$의 샘플이 $x_1, \cdots, x_n$ 이고 $Y$의 샘플이 $y_1 ,\cdots, y_n$ 그리고
$\mu, \sigma$는 각각의 평균과 표준편차 기호입니다.
상관계수는 어떠한 특징이 있을까요?
상관계수의 특징
1. 상관계수는 -1과 1사이이다.
2. 두 변수가 동조화 하여 움직이면 상관계수는 1에 가깝다.
3. 반대로 두 변수가 반대로 움직이면 상관계수는 -1에 가깝다.
4. 두 변수가 독립적으로 움직이면 상관계수는 0이다.
하나하나 살펴보죠.
1. 상관계수는 -1과 1 사이이다.
Cauchy-Schwarz 부등식으로 보일 수 있습니다.
Cauchy Schearz 부등식 $n$개의 실수 $a_1, a_2, \cdots, a_n$ 과 또 $n$개의 실수 $b_1, b_2,\cdots, b_n$ 에 대해서. $$ \left| \sum_{i=1}^n a_i b_i \right| \leq \sqrt{\sum_{i=1}^n a_i^2 }\sqrt{\sum_{i=1}^n b_i^2} $$ 등호는 $\mathbf{a}=(a_1,\cdots, a_n) , \mathbf{b} = (b_1, \cdots, b_n)$ 이 상수배일 때 즉, $$ \mathbf{a} = k \mathbf{b}$$ 인 실수 $k$가 존재할 때 성립합니다. |
이제, $ x_1-\mu_X , \cdots, x_n-\mu_X$와 $y_1-\mu_Y, \cdots, y_n - \mu_Y$ 에 대해서 부등식을 적용하면
$$ \left| \frac1n \sum_{i=1}^n (x_i -\mu_X)(y_i-\mu_Y) \right| \leq \sqrt{\frac1n \sum_{i=1}^n (x_i-\mu_X)^2} \sqrt{\frac1n \sum_{i=1}^n (y_i-\mu_Y)^2} $$
즉
$$ \left| \mathbf{Cov}(X,Y) \right| \leq \sigma_X \sigma_Y $$
가 성립한다. 따라서
$$ \left| \mathbf{Corr}(X,Y) \right| \leq 1 $$
입니다.
2. $X$와 $X$의 상관계수는 1이다.
$$\mathbf{Cov}(X,X) = \mathbb{E}(X^2) - \mathbb{E}(X)\cdot \mathbb{E}(X) = \mathbb{V}(X) $$
이므로
$$\mathbf{Corr}(X,X) = 1$$
입니다.
$X$와 가장 움직임이 비슷한 건 아예 똑같은 $X$이죠. 움직임이 똑같은 얘와 상관계수를 재봤더니 1이 나왔습니다. 일반적으로 상관관계가 높아질수록, 상관계수는 1로 다가가죠. 학창 시절 들었던 양의 상관관계는 여기서 나온 얘기입니다.
3. $X$와 $-X$의 상관계수는 -1이다.
$$\mathbf{Cov}(X, -X) = \mathbb{E}(-X^2) - \mathbb{E}(X)\cdot \mathbb{E}(-X) = -\mathbb{V}(X) $$
이므로
$$\mathbf{Corr}(X,-X) = -1$$
입니다.
$X$와 가장 움직임이 반대인 건 $-X$인데요, 움직임이 똑같은 얘와 상관계수를 재봤더니 -1이 나왔습니다. 일반적으로 상관관계가 반대일수록, 상관계수는 -1로 다가가죠. 음의 상관관계라는 뜻이 바로 이 말입니다.
4. $X,Y$가 독립이면 상관계수는 0이다.
$X,Y$가 독립이라 하면, $\mathbb{E}(XY) = \mathbb{E}(X)\mathbb{E}(Y)$ 입니다. 즉,
$$ \mathbb{Cov}(X,Y) =0$$
이죠. 따라서 상관계수가 0일 수밖에 없습니다.
어떤가요? 공분산은 숫자가 중구난방이었고, 그 숫자가 무얼 의미하는지도 난해했었습니다. 반면에 상관계수는
-1을 극단적인 디커플링, 1을 극단적인 커플링으로, 또 그 중간인 0은 서로 아무런 관계도 없는 것으로 분석이 가능하죠.
상관계수가 -1과 1 사이에 어디에 위치하는지를 보고 커플링, 디커플링 정도에 대한 의사결정이 가능해지게 됩니다.
python으로 상관계수를 구해볼까요?
정의를 써서 구한 방법과 numpy에서 제공하는 corrcoef를 사용한 방법의 결과를 비교해봅시다.
import numpy as np
def calculate_correlation_matrix():
np.set_printoptions(precision= 3)
data = [[2, 20],
[3, 24],
[6, 36],
[8, 47],
[2.6, 22],
[4.8, 32],
[7, 47],
[4, 42],
[2, 21],
[2.2, 21],
[3.8, 30],
[2.4, 25],
[2.6, 18],
[5.4, 38],
[5.1, 28]
]
nData = len(data)
data = np.array(data)
data = data.T
x1 = data[0, :]
x2 = data[1, :]
z1 = (x1-np.mean(x1))/np.std(x1)
z2 = (x2-np.mean(x2))/np.std(x2)
corr = np.corrcoef(x1,x2)
print('Correlation matrix:\n' ,corr)
res = np.sum(z1*z2)/nData
print('Correlation is {:.3f} '.format(res))
if __name__ == '__main__':
calculate_correlation_matrix()
○ data는 배달 데이터입니다. 총 15개의 sample 이 있고, 1번째 열은 배달 거리, 2번째 열은 배달 시간입니다.
data = np.array(data)
data = data.T
○ data를 분석하기 쉽게 numpy의 array 형태로 바꿔줍니다.
○ data의 transpose를 취해줍니다. 이것은 numpy.corrcoef를 쓰기 위함입니다.
x1 = data[0, :]
x2 = data[1, :]
z1 = (x1-np.mean(x1))/np.std(x1)
z2 = (x2-np.mean(x2))/np.std(x2)
○ data의 첫 번째 행을 x1 (배달 거리) , 두 번째 행을 x2 (배달시간)으로 지정하고
○ z1, z2처럼 각각의 Z- score을 일단 계산해 놓습니다.
corr = np.corrcoef(x1,x2)
print('Correlation matrix:\n' ,corr)
res = np.sum(z1*z2)/nData
print('Correlation is {:.3f} '.format(res))
○ x1, x2를 direct로 np.corrcoef 에 구한 값과
○ z1, z2의 곱의 합을 데이터 개수로 나눠, 즉 상관계수의 정의에 충실하게 구한 값을 비교해 봅니다.
결과는 아래와 같습니다.
Correlation matrix:
[[1. 0.898]
[0.898 1. ]]
Correlation is 0.898
Process finished with exit code 0
Correlation matrix의 (1,2) 원소와 직접 구한 Correltion 값이 같다는 걸 확인할 수 있습니다.
참고로 Correlation matrix의 대각 원소는 자기 자신과의 상관계수이므로 1이 나오는 것이 당연하죠.
numpy.corrceof에 대한 자세한 사항은 여기를 보시면 됩니다.
'수학의 재미 > 행렬 이론' 카테고리의 다른 글
촐레스키 분해 (0) | 2022.09.19 |
---|---|
3중 대각행렬의 풀이 (0) | 2022.07.29 |
상관계수와 상관계수 행렬 #1 (0) | 2022.07.05 |
공분산과 공분산 행렬 (0) | 2022.07.04 |
행렬이 양수다? positive semidefinite (0) | 2022.07.04 |
댓글