分散の計算法の比較
負の分散が得られる場合
Visual Studio 2013で標準C++準拠のコンソールアプリケーションプログラムを作成する方法については、このウェブサイトの後半で説明している。
記述統計量としての分散は
で与えられる。(1)式を変形して
を得る。
プログラムで計算するときは、有効桁数の関係で(1)式と(2)式の値が異なることがあり、場合によっては分散の値が負の値になることがある。例えば、
のとき、(1)式と(2)式の値はdouble型で計算したとき一致する。しかし、
のときは、例えば、
となるので、double型での計算の有効桁数は約15桁であることから、上式のにおける
は、より小さすぎるので消されて、は
により与えられる。このため、データの分散を求めるとき、(1)式と(2)式の値は等しくならない。このことは次のプログラムで確認することができる。
#include <iostream>
#include <iomanip>
using namespace std;
inline double sqr(double v){
return v * v;
}
double CalcVarByMean(double * data, int n){
double sum = 0.0;
for (int i = 0; i < n; i++)
sum += data[i];
double mean = sum / n;
sum = 0.0;
for (int i = 0; i < n; i++)
sum += sqr(data[i] - mean);
return sum / n;
}
double CalcVarBySS(double * data, int n){
double sum = 0.0, ssum = 0.0;
for (int i = 0; i < n; i++){
sum += data[i];
ssum += sqr(data[i]);
}
return (ssum - sqr(sum) / n) / n;
}
const int n = 10;
int main()
{
double X[n] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
cout << "Var1 = " << CalcVarByMean(X, n) << endl;
cout << "Var2 = " << CalcVarBySS(X, n) << endl;
double B[n];
for (int i = 0; i < n; i++)
B[i] = 1.0e10 + i + 1.0;
cout << endl;
for (int i = 0; i < n; i++)
cout << "B = " << setprecision(16) << B[i] << endl;
cout << endl;
cout << "Var3 = " << CalcVarByMean(B, n) << endl;
cout << "Var4 = " << CalcVarBySS(B, n) << endl;
cout << endl << "Press any character key, then press Enter key." << endl;
char ck;
cin >> ck;
return 0;
}
(1)式と(2)式に対応する関数が、CalcVarByMeanとCalcVarBySSである。上のプログラムを実行すると図1のようになる。
図1
Var1とVar2の値は、に対する(1)式と(2)式によるものであるが、有効桁数内での計算であるので同じ値となっている。
しかし、に対する値Var3とVar4は異なっている。これは、Var4は(2)式によって算出されており、有効桁数からはみ出る値が消されていることによる。
上のプログラムを用意する手順を以下に示す。
標準C++準拠のコンソールアプリケーションプログラムの作成例
Visual Studio Express 2013 for Windows Desktopにおいて標準C++準拠の上のプログラムを作成する場合は以下のようにする。
メニュ「ファイル|新しいプロジェクト」を選ぶ(図2)。
図2
提示される「新しいプロジェクト」ダイアログウィンドウにおいて、テンプレートとして「Win32」を選ぶ(図3)。
図3
「Win32プロジェクト」を選び、「場所」および「名前」を設定した後、「OK」ボタンをクリックする。「Win32アプリケーションウィザード」ダイアログウィンドウが表示される(図4)。
図4
「次へ」ボタンをクリックすると図5のダイアログウィンドウになる。
図5
「コンソールアプリケーション」と「空のプロジェクト」にチェックを入れて「完了」ボタンをクリックする。図3で設定した名前のプロジェクトが図6のように空のプロジェクトとして表示される。
図6
メニュ「プロジェクト|新しい項目の追加」を選ぶ(図7)。
図7
表示された「新しい項目の追加」ダイアログウィンドウにおいて、「コード」を選び、「C++ファイル」を選ぶ(図8)。
図8
「名前」を適宜設定後、「追加」ボタンをクリックすると、設定した名前のファイルが表示される(図9)。
図9
上のプログラムを打ち込む(図10)。これは、本ページの上のコードをコピー・貼り付けによって行うこともできる。
図10
図10のようにプログラムを入力後、ビルド・実行すると図1のコンソール画面が表示される。「ビルド・実行」は、例えば、メニュ「ビルド|ソリューションのリビルド」を選んで実行した後、エラーがないことを確認後、メニュ「デバッグ|デバッグ開始」を選べばよい。