Up

1変量記述統計量:4つの統計量

平均、分散、歪度、尖度

 

1変量記述統計量として平均、分散、不偏分散、標準偏差、歪度、尖度を求める。Win32コンソールアプリケーションの新規作成については<Win32コンソールアプリケーションの新規作成>で、C++の標準入出力(コンソール入出力)については<標準入出力cincout>で、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++プログラミング入門」勁草書房>を上梓した。

 

Up