HOWTO · Python

NumPy 상관관계 함수

이 튜토리얼에서는 NumPy의 `np.corrcoef()` 함수를 사용해 피어슨 상관계수를 계산하는 방법을 설명합니다.

이 페이지의 내용

NumPy의 np.corrcoef() 함수는 짝을 이루는 숫자 데이터의 피어슨 상관계수를 계산합니다. 반환값의 비대각 원소에서 두 배열 사이의 상관계수를 확인할 수 있으며, 산점도를 함께 보면 데이터의 패턴을 살펴보는 데 도움이 됩니다.

NumPy의 상관관계

상관계수는 두 변수 사이 연관성의 방향과 강도를 요약합니다. 양의 상관계수는 두 변수의 값이 함께 커지는 경향을 나타내고, 음의 상관계수는 한 변수의 값이 커질 때 다른 변수의 값은 작아지는 경향을 나타냅니다. 계수가 0에 가까우면 선형 연관성이 약하다는 뜻이지만, 비선형 관계까지 없다는 의미는 아닙니다. 상관관계는 연관성을 나타낼 뿐, 한 변수가 다른 변수의 변화를 일으킨다는 증거는 아닙니다.

피어슨, 켄달, 스피어만은 서로 다른 연관성 측정 방법입니다. np.corrcoef()는 변수의 표준편차로 공분산을 정규화해 선형 연관성을 나타내는 피어슨 상관계수를 계산합니다. 켄달이나 스피어만 상관계수는 계산하지 않으므로, 이 측정값에는 SciPy의 적절한 함수를 사용하세요. NumPy에서 피어슨 상관계수를 구할 때는 함수 이름 np.corrcoef()를 정확히 사용해야 합니다.

np.corrcoef() 함수로 Python에서 상관관계 계산하기

짝을 이루는 관측값이 담긴 두 배열을 np.corrcoef()에 전달하세요. 각 위치의 값이 하나의 관측값 쌍을 나타내도록 두 배열의 길이가 같아야 합니다. 함수는 2×2 행렬을 반환합니다. 두 비대각 원소는 배열 사이의 피어슨 상관계수이며, 서로 같은 값입니다. 두 변수의 상관관계가 모두 정의될 때 대각 원소는 각 변수가 자기 자신과 완벽한 상관관계를 가지므로 1입니다.

아래 배열에는 값이 열 쌍 들어 있습니다. 예제를 실행해 상관계수를 계산하세요.

import numpy as np

a = np.arange(20, 30)
b = np.array([8, 12, 29, 33, 60, 48, 21, 44, 78, 96])
x = np.corrcoef(a, b)
print(x)

출력:

[[1.         0.82449488]
 [0.82449488 1.        ]]

두 비대각 원소는 약 0.82로, 이 관측값에 양의 선형 연관성이 있음을 나타냅니다. 배열 사이의 상관계수는 두 원소 중 어느 쪽에서든 확인할 수 있습니다. 값이 반복되는 것은 상관 행렬이 대칭이기 때문입니다. 분산이 0이 아니고 상관관계가 정의되는 변수의 대각 원소는 1입니다. 입력값이 모두 같으면 표준편차가 0이므로 피어슨 상관계수는 정의되지 않습니다. 따라서 결과에 유효한 계수 대신 NaN이 포함될 수 있습니다. 이런 값을 후속 계산에 사용하기 전에 데이터를 확인하고 적절히 처리하세요.

Matplotlib 라이브러리로 상관관계 그래프 만들기

산점도는 각 관측값 쌍을 해당하는 (x, y) 좌표에 표시합니다. 계수 계산에 사용된 데이터를 눈으로 살펴볼 수 있어, 하나의 선형 요약만으로는 잘 드러나지 않는 군집이나 곡선형 패턴을 찾는 데 도움이 됩니다. 산점도는 계산한 계수와 함께 해석하세요. 점들이 전반적으로 상승하는 모습은 양의 상관관계와 일치하지만, 그래프만으로 수치를 계산하거나 확정할 수는 없습니다.

다음은 선택적으로 사용할 수 있는 예제로, 상관계수 행렬을 출력하고 관측값 쌍을 그래프로 표시합니다. Matplotlib의 pyplot 인터페이스를 사용하므로 실행 전에 Python 환경에 NumPy와 Matplotlib을 설치하세요. 그래프 창의 표시 방식은 그림을 출력하는 환경에 따라 달라집니다.

import matplotlib.pyplot as plt
import matplotlib
import numpy as np

x = np.arange(20, 30)
y = np.array([8, 12, 29, 33, 60, 48, 21, 44, 78, 96])
print(np.corrcoef(x, y))

# %matplotlib inline
matplotlib.style.use("ggplot")
plt.scatter(x, y)
plt.show()

짝을 이룬 관측값이 전반적으로 상승하는 산점도

이 예시에서는 x 값이 커질수록 점들이 대체로 상승하며, 이는 np.corrcoef()에서 얻은 양의 계수와 일치합니다. 실제 데이터에는 더 다양한 패턴이 나타날 수 있으므로 연관성을 해석할 때 계수뿐 아니라 짝을 이루는 값들도 살펴보세요.