Up

分散の計算法の比較

負の分散が得られる場合

 

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)式に対応する関数が、CalcVarByMeanCalcVarBySSである。上のプログラムを実行すると図1のようになる。

図1

 

Var1Var2の値は、に対する(1)式と(2)式によるものであるが、有効桁数内での計算であるので同じ値となっている。

しかし、に対する値Var3Var4は異なっている。これは、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のコンソール画面が表示される。「ビルド・実行」は、例えば、メニュ「ビルド|ソリューションのリビルド」を選んで実行した後、エラーがないことを確認後、メニュ「デバッグ|デバッグ開始」を選べばよい。

 

Up