데이터 분석/머신러닝

[ML] 12. PCA 공분산 이해하기

eunnys 2023. 11. 24. 17:19

▶ 육상선수 종목별 기록 데이터

 

import numpy as np

A = np.array([
              [3.73, 1.86, 15.8, 4.05, 7.27, 45.66, 34.92 ],
              [3.57, 1.80, 16.23, 2.96, 6.71, 42.56, 37.31],
              [3.22, 1.83, 14.20, 3.51, 6.68, 44.54, 39.23],
              [2.81, 1.80, 15.23, 2.69, 6.25, 42.78, 31.19],
              [2.91, 1.74, 14.76, 2.68, 6.32, 47.46, 35.53],
              [2.67, 1.83, 13.50, 1.96, 6.33, 42.82, 37.64]
])

 

 

## 허들 종목 통계지표 ##

 

hurdles = A[:,0] # 모든 행의 0번째 열
print(hurdles)
print(f'평균: {np.mean(hurdles):.3f}')
print(f'분산: {np.var(hurdles, ddof=1):.3f}') # ddof 자유도 값 1 : 불편추정량 (n-1로 구함)
[3.73 3.57 3.22 2.81 2.91 2.67]
평균: 3.152
분산: 0.184

 

 

## 공분산 행렬 ##

 

np.set_printoptions(precision=3, suppress=True)
print('[Covariance Matrix]')
# rowvar : True(기본값)인 경우에는 행이 변수를 나타내며 열은 각 변수의 관측치를 나타낸다, False인 경우에는 각 행이 관측치(선수 한명당 육상 종목별 관측 데이터)를 나타내며 열이 변수(종목)을 나타낸다
B = np.cov(A, rowvar=False) 
B
[Covariance Matrix]
array([[ 0.184,  0.007,  0.325,  0.262,  0.151,  0.109,  0.222],
       [ 0.007,  0.002, -0.001,  0.014,  0.01 , -0.029,  0.022],
       [ 0.325, -0.001,  1.028,  0.388,  0.199, -0.026, -1.06 ],
       [ 0.262,  0.014,  0.388,  0.528,  0.244,  0.524,  0.078],
       [ 0.151,  0.01 ,  0.199,  0.244,  0.148,  0.157,  0.21 ],
       [ 0.109, -0.029, -0.026,  0.524,  0.157,  3.884,  0.085],
       [ 0.222,  0.022, -1.06 ,  0.078,  0.21 ,  0.085,  7.871]])

 

col_mean = np.mean(A, axis=0) # 종목별(컬럼별) 평균
A = A - col_mean # 표준화해줌
cov = (A.T@A) / (len(A)-1)
cov # 위의 값과 동일
array([[ 0.184,  0.007,  0.325,  0.262,  0.151,  0.109,  0.222],
       [ 0.007,  0.002, -0.001,  0.014,  0.01 , -0.029,  0.022],
       [ 0.325, -0.001,  1.028,  0.388,  0.199, -0.026, -1.06 ],
       [ 0.262,  0.014,  0.388,  0.528,  0.244,  0.524,  0.078],
       [ 0.151,  0.01 ,  0.199,  0.244,  0.148,  0.157,  0.21 ],
       [ 0.109, -0.029, -0.026,  0.524,  0.157,  3.884,  0.085],
       [ 0.222,  0.022, -1.06 ,  0.078,  0.21 ,  0.085,  7.871]])