이번 글에서는 C++를 이용해 두 데이터 집합의 공분산(Covariance)을 계산하는 프로그램을 만들어 보겠습니다.
공분산이란?
공분산은 두 확률 변수가 함께 얼마나 변하는지를 나타내는 통계적 척도입니다. 두 값이 같은 방향으로 움직이면 공분산은 양수가 되고, 반대 방향으로 움직이면 음수가 됩니다. 즉, 한 변수가 증가할 때 다른 변수도 증가하는 경향이 있으면 양의 공분산을, 하나는 증가하고 다른 하나는 감소하는 경향이 있으면 음의 공분산을 갖습니다.
표본 공분산은 다음 수식으로 정의됩니다.
cov(X, Y) = Σ (xi − x̄)(yi − ȳ) / (n − 1)
여기서 x̄와 ȳ는 각 배열의 평균이며, n은 데이터의 개수입니다.
C++ 구현 예제
아래 코드는 먼저 배열의 평균을 구하는 mean() 함수를 정의한 뒤, 이를 활용해 공분산을 계산하는 covariance() 함수를 구현한 예제입니다.
#include <bits/stdc++.h>
using namespace std;
// 평균을 구하는 함수
float mean(float arr[], int n){
float sum = 0;
for(int i = 0; i < n; i++)
sum = sum + arr[i];
return sum / n;
}
// 공분산을 계산하는 함수
float covariance(float arr1[], float arr2[], int n){
float sum = 0;
for(int i = 0; i < n; i++)
sum = sum + (arr1[i] - mean(arr1, n)) * (arr2[i] - mean(arr2, n));
return sum / (n - 1);
}
int main(){
float arr1[] = {65.21, 64.75, 65.26, 65.76, 65.96};
int n = sizeof(arr1) / sizeof(arr1[0]);
float arr2[] = {67.25, 66.39, 66.12, 65.70, 66.64};
int m = sizeof(arr2) / sizeof(arr2[0]);
// 두 배열의 크기가 같을 때만 계산 수행
if (m == n)
cout << covariance(arr1, arr2, m);
return 0;
}
코드 설명
- mean() 함수: 배열의 모든 요소를 더한 뒤 요소 개수 n으로 나누어 평균을 반환합니다.
- covariance() 함수: 각 배열의 편차(값 − 평균)를 서로 곱해 모두 더한 후, (n − 1)로 나누어 표본 공분산을 구합니다.
- main() 함수: 두 개의 실수 배열을 준비하고, 두 배열의 크기가 동일한 경우에만 공분산을 계산하여 출력합니다.
실행 결과
-0.0580511
결과가 음수(−0.0580511)로 나온 것을 확인할 수 있습니다. 이는 두 데이터 집합이 대체로 반대 방향으로 움직이는, 즉 음의 상관 관계를 가진다는 것을 의미합니다.