이 글에서는 C++를 이용해 통계 분석에서 널리 쓰이는 t-검정(t-test)을 구현하는 방법을 알아보겠습니다.
t-검정이란 무엇인가?
t-검정(Student's t-test)은 두 집단의 평균값을 비교하여 두 집단이 통계적으로 유사한지, 아니면 유의미하게 다른지를 판단하는 검정 방법입니다.
또한 t-검정은 두 평균 간의 차이가 얼마나 큰지를 수치화해 주기 때문에, 관찰된 변화의 원인을 분석하고 해석하는 데에도 큰 도움이 됩니다.
독립 표본 t-검정의 t값은 다음 공식으로 계산됩니다.
t = (평균1 − 평균2) / √(분산1/n + 분산2/m)
C++ 구현 예제
아래 프로그램은 세 단계로 구성되어 있습니다. 먼저 각 집단의 평균을 계산하고, 다음으로 표준편차를 구한 뒤, 마지막으로 위 공식에 대입해 t값을 산출합니다.
#include <bits/stdc++.h>
using namespace std;
// 평균 계산
float calc_mean(float arr[], int n){
float sum = 0;
for (int i = 0; i < n; i++)
sum = sum + arr[i];
return sum / n;
}
// 표준편차 계산
float calc_deviation(float arr[], int n){
float sum = 0;
for (int i = 0; i < n; i++)
sum = sum + (arr[i] - calc_mean(arr, n)) * (arr[i] - calc_mean(arr, n));
return sqrt(sum / (n - 1));
}
// 두 데이터 집합의 t-검정 값 계산
float calc_ttest(float arr1[], int n, float arr2[], int m){
float mean1 = calc_mean(arr1, n);
float mean2 = calc_mean(arr2, m);
float sd1 = calc_deviation(arr1, n);
float sd2 = calc_deviation(arr2, m);
float t_test = (mean1 - mean2) / sqrt((sd1 * sd1) / n + (sd2 * sd2) / m);
return t_test;
}
int main(){
float arr1[] = { 10, 20, 30, 40, 50 };
int n = sizeof(arr1) / sizeof(arr1[0]);
float arr2[] = { 1, 29, 46, 78, 99 };
int m = sizeof(arr2) / sizeof(arr2[0]);
cout << calc_ttest(arr1, n, arr2, m) << endl;
return 0;
}
코드 동작 원리
- calc_mean(): 배열 요소의 합을 구한 뒤 개수로 나누어 산술 평균을 반환합니다.
- calc_deviation(): 각 데이터와 평균의 편차 제곱합을 구하고, 자유도(n−1)로 나눈 값의 제곱근, 즉 표본 표준편차를 반환합니다.
- calc_ttest(): 두 집단의 평균 차이를 합동 표준오차로 나누어 t값을 계산합니다.
실행 결과
-1.09789
출력 결과가 음수라는 것은 첫 번째 집단({10, 20, 30, 40, 50})의 평균이 두 번째 집단({1, 29, 46, 78, 99})의 평균보다 작다는 의미입니다. 실제로 첫 번째 집단의 평균은 30, 두 번째 집단의 평균은 50.6으로 차이가 있으며, 이 차이가 표준편차 대비 어느 정도 크기인지를 t값 −1.09789로 확인할 수 있습니다.
일반적으로 |t|값이 클수록 두 집단의 차이가 우연이 아닐 가능성이 높으며, 자유도에 따른 임계값과 비교하거나 p-값을 계산하면 통계적 유의성을 판단할 수 있습니다.