Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++로 그룹화된 데이터(도수분포표)의 표준편차 구하는 방법

이번 튜토리얼에서는 그룹화된 데이터(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이라는 표준편차 값을 얻을 수 있습니다. 이 값은 데이터가 평균으로부터 얼마나 흩어져 있는지를 나타냅니다.