Python 데이터 분석

Python 데이터분석 기초 43 - Python(공분산 / 상관계수)

코딩탕탕 2022. 11. 10. 11:55

 

# 공분산 / 상관계수

import numpy as np
import matplotlib.pyplot as plt

# 공분산 예(공분산 구하기 np.cov() 함수)
print(np.cov(np.arange(1, 6), np.arange(2, 7)))     # 양의 관계 2.5
print(np.cov(np.arange(10, 60, 10), np.arange(20, 70, 10))) # 양의 관계 250
print(np.cov(np.arange(1, 6), (3,3,3,3,3)))         # 0
print(np.cov(np.arange(1, 6), np.arange(6, 1, -1))) # 음의 관계 -2.5
# 공분산의 값이 양의 상관계수, 음의 상관계수인 것은 구했지만, 너무 값들이 다르기 때문에 그것을 1, 0, -1(표준화) 해야된다.

print()
x = [8, 3, 6, 6, 9, 4, 3, 9, 3, 4]
print('x 평균 :', np.mean(x))
print('x 분산 :', np.var(x))

# y = [6, 2, 4, 6, 9, 5, 1, 8, 4, 5]
y = [600, 200, 400, 600, 900, 500, 100, 800, 400, 500]
print('y 평균 :', np.mean(y))
print('y 분산 :', np.var(y))

plt.scatter(x, y)
plt.show()

print('x, y 공분산 :', np.cov(x, y)[0, 1])
print('x, y 상관계수 :', np.corrcoef(x, y)[0, 1]) # x, y 상관계수 : 0.8663686463212853

from scipy import stats
print(stats.pearsonr(x, y))  # 연속형일 경우 pearsonr 사용
print(stats.spearmanr(x, y)) # 순서가 있는 서열척도일 경우 spearmanr 사용

# 주의 : 공분산이나 상관계수는 선형 데이터인 경우에 활용.
m = [-3, -2, -1, 0, 1, 2, 3]
n = [9, 4, 1, 0, 1, 4, 9]

plt.scatter(m, n)
plt.show() # 비선형 데이터라 활용 불가.
print('m, n 공분산 :', np.cov(m, n)[0, 1])
print('m, n 상관계수 :', np.corrcoef(m, n)[0, 1])


<console>
[[2.5 2.5]
 [2.5 2.5]]
[[250. 250.]
 [250. 250.]]
[[2.5 0. ]
 [0.  0. ]]
[[ 2.5 -2.5]
 [-2.5  2.5]]

x 평균 : 5.5
x 분산 : 5.45
y 평균 : 500.0
y 분산 : 54000.0
x, y 공분산 : 522.2222222222222
x, y 상관계수 : 0.8663686463212853
(0.8663686463212854, 0.0011836205396685649)
SpearmanrResult(correlation=0.9000703207408192, pvalue=0.00038610220712161346)
m, n 공분산 : 0.0
m, n 상관계수 : 0.0

공분산의 값이 양의 상관계수, 음의 상관계수인 것은 구했지만, 너무 값들이 다르기 때문에 그것을 1, 0, -1(표준화) 해야된다. 밑의 시각화를 보면 공분산의 값은 다르지만 시각화 그래프는 같은 성향을 보이기 때문에 표준화를 하면 값은 똑같이 나온다.

 

x와 y의 관계 시각화

 

x와 y의 관계 시각화

 

m, n 의 관계 시각화

 

위처럼 비선형 데이터일때는 공분산과 상관계수는 활용 불가능하다.

m, n 공분산 : 0.0
m, n 상관계수 : 0.0