C++
 Computer >> コンピューター >  >> プログラミング >> C++

グループ化されたデータの標準偏差を計算するC++プログラム


はじめに

このチュートリアルでは、グループ化されたデータ(度数分布データ)の標準偏差を求めるC++プログラムについて解説します。

グループ化されたデータでは、個々の数値の代わりに「階級(クラス区間)」と「度数(頻度)」が与えられます。本プログラムの目的は、これらの情報をもとにデータ全体の標準偏差を計算することです。

計算の手順

グループ化されたデータの標準偏差は、以下のステップで求めることができます。

1. 各階級の中央値(級中央値)を計算する:中央値 = (階級下限 + 階級上限) ÷ 2
2. 中央値と度数から平均値を求める:平均 = Σ(中央値 × 度数) ÷ 度数の合計
3. 標準偏差の公式に代入する:SD = √[ ( Σ(度数 × 中央値²) − 度数の合計 × 平均² ) ÷ ( 度数の合計 − 1 ) ]

なお、このプログラムでは分母を「度数の合計 − 1」としているため、不偏標準偏差(標本標準偏差)を計算しています。

プログラム例

#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関数:各階級の中央値(mid)と度数(freq)を受け取り、「Σ(中央値 × 度数) ÷ 度数の合計」を計算して平均値を返します。

calc_deviation関数:まず各階級の下限値と上限値から中央値を求め、次に「Σ(度数 × 中央値²)」を計算します。その後、平均値を用いた標準偏差の公式に代入し、結果を返します。

main関数:階級の下限・上限および度数のサンプルデータを定義し、calc_deviation関数を呼び出して標準偏差を画面に出力します。


  1. C++でAVL木(AVLツリー)を実装する方法:回転操作とサンプルコードを徹底解説

    AVL木とは AVL木(AVL Tree)は、自己平衡型二分探索木(Self-balancing Binary Search Tree)の一種です。すべてのノードにおいて、左部分木と右部分木の高さの差が「1以下」に保たれるという性質を持っています。この平衡条件により、木が片側に偏って成長することを防ぎ、検索・挿入・削除といった操作を常に効率的(O(log n))に行うことができます。 木の回転(Tree Rotation)とは 木の回転とは、要素の順序(ソート順)を崩すことなく木の構造を変更する操作のことです。あるノードを一段上へ移動させ、別のノードを一段下へ移動させることで実現されます。 回

  2. 【C++】STLのset_symmetric_differenceで集合の対称差を実装するプログラム

    本記事では、C++の標準テンプレートライブラリ(STL)に含まれる set_symmetric_difference 関数を使って、2つの集合の「対称差」を求めるプログラムを紹介します。 対称差とは、2つの集合のうち「どちらか一方にだけ存在し、両方には存在しない」要素から構成される集合のことです。 主な集合演算の種類 和集合(Union):どちらか一方に含まれるすべての要素 積集合(Intersection):両方に共通して含まれる要素 対称差(Symmetric Difference / 排他的論理和 XOR):片方にのみ含まれる要素 差集合(Difference / 減算):一方から他方