グループ化されたデータの標準偏差を計算する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関数を呼び出して標準偏差を画面に出力します。
-
C++でAVL木(AVLツリー)を実装する方法:回転操作とサンプルコードを徹底解説
AVL木とは AVL木(AVL Tree)は、自己平衡型二分探索木(Self-balancing Binary Search Tree)の一種です。すべてのノードにおいて、左部分木と右部分木の高さの差が「1以下」に保たれるという性質を持っています。この平衡条件により、木が片側に偏って成長することを防ぎ、検索・挿入・削除といった操作を常に効率的(O(log n))に行うことができます。 木の回転(Tree Rotation)とは 木の回転とは、要素の順序(ソート順)を崩すことなく木の構造を変更する操作のことです。あるノードを一段上へ移動させ、別のノードを一段下へ移動させることで実現されます。 回
-
【C++】STLのset_symmetric_differenceで集合の対称差を実装するプログラム
本記事では、C++の標準テンプレートライブラリ(STL)に含まれる set_symmetric_difference 関数を使って、2つの集合の「対称差」を求めるプログラムを紹介します。 対称差とは、2つの集合のうち「どちらか一方にだけ存在し、両方には存在しない」要素から構成される集合のことです。 主な集合演算の種類 和集合(Union):どちらか一方に含まれるすべての要素 積集合(Intersection):両方に共通して含まれる要素 対称差(Symmetric Difference / 排他的論理和 XOR):片方にのみ含まれる要素 差集合(Difference / 減算):一方から他方