이번 튜토리얼에서는 그룹화된 데이터(grouped data)의 표준편차를 계산하는 C++ 프로그램을 다뤄보겠습니다.
통계에서 그룹화된 데이터란 계급구간(class interval)과 해당 구간에 속한 자료의 개수인 도수(frequency)로 정리된 형태를 말합니다. 개별 자료값을 직접 알 수 없기 때문에, 각 계급의 중앙값(midpoint)을 대푯값으로 사용하여 표준편차를 추정하게 됩니다.
계산 과정
그룹화된 데이터의 표준편차는 다음 순서로 구할 수 있습니다.
1. 각 계급의 중앙값을 계산합니다.
midi = (하한값 + 상한값) / 2
2. 전체 평균(mean)을 구합니다.
mean = Σ(midi × freqi) / Σfreqi
3. 아래 공식으로 표준편차를 계산합니다.
sd = √[ (Σ(freqi × midi²) − n × mean²) / (n − 1) ]
※ 여기서 n은 전체 도수의 합입니다.
C++ 구현 예제
#include <bits/stdc++.h>
using namespace std;
// 그룹화된 데이터의 평균 계산
float calc_mean(float mid[], int freq[], int n){
float sum = 0, freqSum = 0;
for (int i = 0; i < n; i++) {
sum = sum + mid[i] * freq[i];
freqSum = freqSum + freq[i];
}
return sum / freqSum;
}
// 그룹화된 데이터의 표준편차 계산
float calc_deviation(float lower_limit[], float upper_limit[], int freq[], int n){
float mid[n], sum = 0, freqSum = 0, sd;
for (int i = 0; i < n; i++) {
mid[i] = (lower_limit[i] + upper_limit[i]) / 2;
sum = sum + freq[i] * mid[i] * mid[i];
freqSum = freqSum + freq[i];
}
sd = sqrt((sum - freqSum * calc_mean(mid, freq, n) * calc_mean(mid, freq, n)) / (freqSum - 1));
return sd;
}
int main(){
float lower_limit[] = { 50, 61, 71, 86, 96 };
float upper_limit[] = { 60, 70, 85, 95, 100 };
int freq[] = { 9, 7, 9, 12, 8 };
int n = sizeof(lower_limit) / sizeof(lower_limit[0]);
cout << calc_deviation(lower_limit, upper_limit, freq, n) << endl;
return 0;
}실행 결과
15.757
코드 설명
calc_mean() 함수는 각 계급의 중앙값과 도수를 곱한 값들을 모두 더한 뒤, 전체 도수의 합으로 나누어 가중평균을 구합니다.
calc_deviation() 함수는 먼저 하한값과 상한값의 평균으로 각 계급의 중앙값을 만들고, Σ(freq × mid²) 값을 누적합니다. 이후 앞서 소개한 공식에 대입하여 분산을 구하고, 제곱근을 취해 최종적인 표준편차를 반환합니다.
위 예제에서는 50~60, 61~70, 71~85, 86~95, 96~100의 다섯 개 계급구간과 각각의 도수가 주어졌으며, 실행 결과 약 15.757이라는 표준편차 값을 얻을 수 있습니다. 이 값은 데이터가 평균으로부터 얼마나 흩어져 있는지를 나타냅니다.