1変量記述統計量:4つの統計量
平均、分散、歪度、尖度
1変量記述統計量として平均、分散、不偏分散、標準偏差、歪度、尖度を求める。Win32コンソールアプリケーションの新規作成については<Win32コンソールアプリケーションの新規作成>で、C++の標準入出力(コンソール入出力)については<標準入出力cinとcout>で、C++におけるテキストファイル入出力については<テキストファイル入出力>で説明している。
プログラムの実行例を図1に示す。
図1
入力ファイルはプログラム・ソースコード・ファイル*.cppと同じフォルダに用意する。入力ファイルは図2の形式で用意する。
図2
第1行目に基準値を置く。2行目からデータを1行に1つずつ書く。最後のデータの次の行に基準値より小さい値を置いてデータの終わりであることを示す。エディタでデータを新しく用意したときは、保存してからプログラムで読み込む。エディタの画面に打ち込んだだけでは、その内容はファイルに反映されない。
計算結果の書き出しが終了すると「何か文字を入力すると終了します」と表示されるので、適当な文字キーを押してEnterキーを押すとプログラムの終了となる。この部分は以下のコードによって処理されている。
fout.close();
cout << "計算終了." << endl;
cout << "何か文字を入力すると終了します。";
string ckstr;
cin >> ckstr;
return 0;
出力ファイルもファイル名を図1のように設定すると、プログラムソースコードファイル*.cppと同じフォルダ内に作成される。図2のデータでプログラムを実行したときの出力ファイルをVisualC++のエディタで開くと図3のようになっている。
図3
データを,・・・,で表したとき、平均は
で、標準偏差は
で与えられる。プログラムコードは次のようになっている。
double sum = 0.0;
for (int i = 0; i < n; i++) sum += x[i];
double mean = sum / n;
sum = 0.0;
for (int i = 0; i < n; i++) sum += sqr(x[i] - mean);
double v = sum / n;
double sd = ::sqrt(v);
歪度と尖度は次式で与えられるものである(岡本安晴「データ分析のための統計学入門」おうふう)。
プログラムコードは以下のようである。
double s3 = 0.0, s4 = 0.0;
for (int i = 0; i < n; i++){
double z = (x[i] - mean) / sd;
s3 += z * sqr(z);
s4 += sqr(sqr(z));
}
double g1 = s3 / n;
double g2 = s4 / n;
プログラムソースコード全体は以下の通りである。
===========================================
#include "stdafx.h" // Visual C++が勝手に用意するもの。削除するとエラーになる。
#include <iostream> // cin, coutの使用に必要
#include <fstream> // ifstream,ofstreamの使用に必要
#include <string> // string型の使用に必要
using namespace std; // cin,coutなどが属する名前空間
double sqr( double v ){
return v * v;
}
int _tmain(int argc, _TCHAR* argv[])
{
//
// 入力データファイルの設定
//
string ifnm;
cout << "入力ファイル名 = ";
cin >> ifnm;
ifstream fin( ifnm );
//
// 基準値の読み込み
//
double c;
fin >> c;
//
// データ数のカウント
//
int n = 0;
double tv;
do{
fin >> tv;
n++;
}while(tv > c);
fin.close(); // 一旦、閉じる
n--;
double * x;
x = new double[n];
//
// データの読み込み
//
fin.open( ifnm ); // 入力ファイルを開きなおす
fin >> tv;
for (int i = 0; i < n; i++)
fin >> x[i];
fin.close();
//
// 出力ファイルの設定
//
string ofnm;
cout << "出力ファイル名 = ";
cin >> ofnm;
ofstream fout( ofnm );
//
// データの書き出し
//
fout << "入力ファイル = " << ifnm << endl << endl;
fout << "データ..." << endl;
for (int i = 0; i < n; i++)
fout << (i+1) << ": " << x[i] << endl;
//
// 平均値meanの計算
//
double sum = 0.0;
for (int i = 0; i < n; i++) sum += x[i];
double mean = sum / n;
//
// 分散・標準偏差の計算
//
sum = 0.0;
for (int i = 0; i < n; i++) sum += sqr(x[i] - mean);
double v = sum / n;
double sd = ::sqrt(v);
double u_v = sum / (n - 1);
double u_sd = ::sqrt(u_v);
//
// 歪度と尖度の計算
//
double s3 = 0.0, s4 = 0.0;
for (int i = 0; i < n; i++){
double z = (x[i] - mean) / sd;
s3 += z * sqr(z);
s4 += sqr(sqr(z));
}
double g1 = s3 / n;
double g2 = s4 / n;
fout << endl;
fout << "平均値 = " << mean << endl;
fout << "標準偏差 = " << sd << endl;
fout << "分散 = " << v << endl;
fout << "不偏分散の平方根 = " << u_sd << endl;
fout << "不偏分散 = " << u_v << endl;
fout << "歪度 = " << g1 << endl;
fout << "尖度 = " << g2 << endl;
fout.close();
cout << "計算終了." << endl;
cout << "何か文字を入力すると終了します。";
string ckstr;
cin >> ckstr;
return 0;
}
===========================================
プログラムソースコードファイルなどをまとめたものは圧縮ファイルstat1var.zipとして用意した。圧縮ファイル名stat1var.zipをクリックしてダウンロードすることが出来る。ダウンロードした圧縮ファイルstat1var.zipはマウスの右ボタンクリックで表示されるメニュから「展開」あるいは「解凍」を選ぶと解凍できる。解凍したファイルはVisual C++2010で開くことができる。
Visual C++プログラミングの入門書として<岡本安晴「大学生のための心理学VC++プログラミング入門」勁草書房>を上梓した。