본문 바로가기

Python/AI 수학 with Python

[Python] 상관계수 구현

python에서 상관계수는 numpy의 corrcoef() 함수를 이용해 구현할 수 있다.

위의 ex1과 ex2를 각각 코드를 통해 구현해보았다.

 

예제 1

[In]

# 상관계수
%matplotlib inline

import numpy as np
import matplotlib.pyplot as plt

x = np.array([50, 70, 40, 60, 80]) # 수학 점수
y = np.array([60, 80, 50, 50, 70]) # 영어 점수

# 방법 1 : 직접 구하기(공분산, 표준편차 이용)
x_avg = np.average(x)
y_avg = np.average(y)

x_std = np.std(x)
y_std = np.std(y)

cov_xy = np.average((x - x_avg) * (y - y_avg))
corr_coef_xy = cov_xy / (x_std * y_std)

print("- 상관계수 \n", corr_coef_xy)
print()

# 방법 2 : corrcoef() 함수를 이용해 구하기
corr_coef_xy = np.corrcoef(x, y)

print("- 상관계수 \n", corr_coef_xy)

plt.scatter(x, y)

plt.xlabel('x', size = 14)
plt.ylabel('y', size = 14)
plt.grid()

plt.show()

[Out]

- 상관계수 
 0.7276068751089989

- 상관계수 
 [[1.         0.72760688]
 [0.72760688 1.        ]]

corrcoef() 함수의 결과는 2x2 행렬로 나오게 되는데, 이 때 1x2 요소와 2x1 요소에 각각 상관계수가 존재하게 된다.

상관계수가 1에 가까우므로 x와 y는 양의 상관관계를 나타내는 것을 알 수 있다.

 

예제 2

[In]

# 상관계수
%matplotlib inline

import numpy as np
import matplotlib.pyplot as plt

x = np.array([50, 70, 40, 60, 80]) # 수학 점수
z = np.array([60, 40, 60, 40, 30]) # 국어 점수

# 방법 1 : 직접 구하기(공분산, 표준편차 이용)
x_avg = np.average(x)
z_avg = np.average(z)

x_std = np.std(x)
z_std = np.std(z)

cov_xz = np.average((x - x_avg) * (z - z_avg))
corr_coef_xz = cov_xz / (x_std * z_std)

print("- 상관계수 \n", corr_coef_xz)
print()

# 방법 2 : corrcoef() 함수를 이용해 구하기
corr_coef_xz = np.corrcoef(x, z)

print("- 상관계수 \n", corr_coef_xz)

plt.scatter(x, z)

plt.xlabel('x', size = 14)
plt.ylabel('y', size = 14)
plt.grid()

plt.show()

[Out]

- 상관계수 
 -0.9428090415820634

- 상관계수 
 [[ 1.         -0.94280904]
 [-0.94280904  1.        ]]

이번에는 상관계수가 -1에 가까으므로, x와 y는 음의 상관관계를 나타내는 것을 알 수 있다.