Python에서 공분산 행렬을 만드는 방법


공분산은 한 변수의 변화가 두 번째 변수의 변화와 어떻게 연관되어 있는지를 측정한 것입니다. 보다 구체적으로 말하면 두 변수가 선형적으로 연관되는 정도를 측정하는 것입니다.

공분산 행렬은 다양한 변수 간의 공분산을 나타내는 정사각 행렬입니다. 이는 데이터 세트에서 다양한 변수가 어떻게 관련되어 있는지 이해하는 데 유용한 방법이 될 수 있습니다.

다음 예에서는 Python에서 공분산 행렬을 만드는 방법을 보여줍니다.

Python에서 공분산 행렬을 만드는 방법

Python에서 공분산 행렬을 만들려면 다음 단계를 따르세요.

1단계: 데이터세트를 만듭니다.

먼저 수학, 과학, 역사 등 세 가지 과목에서 10명의 학생의 시험 점수가 포함된 데이터세트를 만듭니다.

 import numpy as np

math = [84, 82, 81, 89, 73, 94, 92, 70, 88, 95]
science = [85, 82, 72, 77, 75, 89, 95, 84, 77, 94]
history = [97, 94, 93, 95, 88, 82, 78, 84, 69, 78]

data = np.array([math, science, history])

2단계: 공분산 행렬을 만듭니다.

다음으로, numpy cov() 함수를 사용하여 이 데이터 세트에 대한 공분산 행렬을 생성하고 모집단 공분산 행렬을 계산할 수 있도록 편향 = True를 지정합니다.

 np.cov(data, bias= True )

array([[ 64.96, 33.2, -24.44],
       [33.2, 56.4, -24.1],
       [-24.44, -24.1, 75.56]])

3단계: 공분산 행렬을 해석합니다.

행렬의 대각선에 있는 값은 단순히 각 개체의 분산입니다. 예를 들어:

  • 수학 점수의 분산은 64.96입니다.
  • 과학 점수의 분산은 56.4입니다.
  • 과거 점수 차이는 75.56입니다.

행렬의 다른 값은 서로 다른 대상 간의 공분산을 나타냅니다. 예를 들어:

  • 수학과 과학 점수의 공분산은 33.2입니다.
  • 수학과 역사 점수 사이의 공분산은 -24.44입니다.
  • 과학 점수와 역사 점수 사이의 공분산은 -24.1입니다.

공분산의 양수는 두 변수가 동시에 증가하거나 감소하는 경향이 있음을 나타냅니다. 예를 들어, 수학과 과학은 양의 공분산(33.2)을 가지며, 이는 수학에서 높은 점수를 받은 학생이 과학에서도 높은 점수를 받는 경향이 있음을 나타냅니다. 반대로 수학 성적이 좋지 않은 학생은 과학 성적도 좋지 않은 경향이 있습니다.

공분산의 음수는 한 변수가 증가하면 두 번째 변수가 감소하는 경향이 있음을 나타냅니다. 예를 들어, 수학과 역사는 음의 공분산(-24.44)을 가지며, 이는 수학에서 높은 점수를 받은 학생이 역사에서 낮은 점수를 받는 경향이 있음을 나타냅니다. 반대로, 수학에서 낮은 점수를 받은 학생들은 역사에서 높은 점수를 받는 경향이 있습니다.

4단계: 공분산 행렬을 시각화합니다(선택 사항).

seaborn 패키지의 heatmap() 함수를 사용하여 공분산 행렬을 시각화할 수 있습니다.

 import seaborn as sns
import matplotlib.pyplot as plt

cov = np.cov(data, bias=True)
labs = ['math', 'science', 'history']

sns.heatmap(cov, annot=True, fmt='g', xticklabels=labs, yticklabels=labs)
plt.show()

Python의 공분산 행렬

cmap 인수를 지정하여 색상 팔레트를 변경할 수도 있습니다.

 sns.heatmap(cov, annot=True, fmt='g', xticklabels=labs, yticklabels=labs, cmap=' YlGnBu ')
plt.show() 

Python의 공분산 행렬

이 히트맵의 스타일을 지정하는 방법에 대한 자세한 내용은 seaborn 설명서를 참조하세요.

의견을 추가하다

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다