上へ

1変量統計量

4つの統計量;平均、分散、歪度、尖度

 

4つの1変量統計量;平均値、分散、歪度、尖度、および標準偏差を求めるプログラムを作成した。これらの統計量については<岡本安晴「データ分析のための統計学入門」2009、おうふう;第2章:統計量>などを参照されたい。プログラムは、ウェブサイト<テキストファイル入出力>で説明したプログラムに下記のようにコードを書き加えて作成した。

===============================================

                double sqr( double v ){

                                return v * v;

                }

 

        private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {

                                 //

                                 //             入出力ファイルの名の設定

                                 //

                                 openFileDialog1->Title = "入力データファイル名";

                                 if (openFileDialog1->ShowDialog() == System::Windows::Forms::DialogResult::Cancel) return;

                                 saveFileDialog1->Title = "出力ファイル名";

                                 if (saveFileDialog1->ShowDialog() == System::Windows::Forms::DialogResult::Cancel) return;

 

                                 using namespace System::IO;

                                 //

                                 //             入力ストリームと出力ストリームの設定

                                 //

                                 StreamReader ^ fin = gcnew StreamReader( openFileDialog1->FileName, System::Text::Encoding::GetEncoding("shift-jis") );

                                 StreamWriter ^ fout = gcnew StreamWriter( saveFileDialog1->FileName, false, System::Text::Encoding::GetEncoding("shift-jis") );

 

                                 fout->WriteLine("Data file..." + openFileDialog1->FileName);

 

                                 String ^s;

                                 while(true){

                                         s = fin->ReadLine();

                                         if (s->Length > 0)

                                                 if (s[0] == '/') break;

                                 }

                                 int n = 0;

                                 while(true){

                                         s = fin->ReadLine();

                                         if (s[0] == '/') break;

                                         n++;

                                 }

                                 fin->Close();

 

                                 double * x;

                                 x = new double[n];

                                 fin = gcnew StreamReader( openFileDialog1->FileName, System::Text::Encoding::GetEncoding("shift-jis") );

                                 while(true){

                                         s = fin->ReadLine();

                                         if (s->Length > 0)

                                                 if (s[0] == '/') break;

                                 }

                                 for (int i = 0; i < n; i++){

                                         s = fin->ReadLine();

                                         x[i] = double::Parse(s);

                                 }

                                 fin->Close();

                                //

                                //            データの書き出し   

                                //

                                 fout->WriteLine();

                                 fout->WriteLine("Data...");

                                 for (int i = 0; i < n; i++)

                                         fout->WriteLine(String("x[").PadLeft(10) + (i+1).ToString() + "] = " + x[i].ToString());

                                //

                                //            平均値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 = Math::Sqrt(v);

                                 double u_v = sum / (n - 1);

                                 double u_sd = Math::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->WriteLine();

                                 fout->WriteLine("平均値      = " + mean.ToString("F5"));

                                 fout->WriteLine();

                                 fout->WriteLine("標準偏差     = " + sd.ToString("F5"));

                                 fout->WriteLine();

                                 fout->WriteLine("分散       = " + v.ToString("F5"));

                                 fout->WriteLine();

                                 fout->WriteLine("不偏分散の平方根 = " + u_sd.ToString("F5"));

                                 fout->WriteLine();

                                 fout->WriteLine("不偏分散     = " + u_v.ToString("F5"));

                                 fout->WriteLine();

                                 fout->WriteLine("歪度       = " + g1.ToString("F5"));

                                 fout->WriteLine();

                                 fout->WriteLine("尖度       = " + g2.ToString("F5"));

 

                                 fout->Close();

                                 MessageBox::Show(saveFileDialog1->FileName + " was saved.");

                                 Close();

                         }

===============================================

このプログラムを実行すると図1のウィンドウが表示される。

図1

 

button1」ボタンのクリックで入力データ名設定用ダイアログウィンドウが図2のように表示される。

図2

 

入力データファイル名を指定して「開く」ボタンをクリックすると、計算結果出力用のファイル名設定を求めるダイアログウィンドウが表示される(図3)。

図3

 

出力はテキストファイルとして書き出されるので、ファイル名の拡張子は「.txt」としておく。出力ファイル名の設定後、「保存」ボタンをクリックすると計算がはじまり、計算終了後図4のメッセージウィンドウが表示される。

図4

 

メッセージウィンドウの「OK」ボタンのクリックでプログラムが終了する。

入力データは、図5に示すようにスラッシュ/で始まる行の次の行からデータを1行に1つずつ書く。

無題.jpg

図5

 

データの終了もスラッシュ/で始まる行で終わる。すなわち、データはスラッシュで始まる行で挟まれた形で用意する。

図5のファイルを入力データとしたときの出力ファイルは次のようになっている。

============ 出力ファイル例:ここから ====================

Data file...F:\yasuharu\www\LaCoocan\introprg\statOneVar\stat1var\stat1var\Data.txt

 

Data...

        x[1] = 1

        x[2] = 10

        x[3] = 2

        x[4] = 9

        x[5] = 3

        x[6] = 8

        x[7] = 4

        x[8] = 7

        x[9] = 5

        x[10] = 6

 

平均値      = 5.50000

 

標準偏差     = 2.87228

 

分散       = 8.25000

 

不偏分散の平方根 = 3.02765

 

不偏分散     = 9.16667

 

歪度       = 0.00000

 

尖度       = 1.77576

============ 出力ファイル例:ここまで========================

 

プログラム・ファイルは圧縮ファイルstat1var.zipとしてまとめた。ファイル名stat1var.zipをクリックしてダウンロードしたものをマウスの右ボタンクリックで表示されるメニュ「解凍」あるいは「展開」などを選ぶと解凍できる。解凍したものはVisual Studio 2013などで開いてビルド実行することができる。実行形式ファイルstat1var.exeも用意したので、ファイル名stat1var.exeをクリックしてダウンロード実行することができる。実行形式ファイルは、Visual Studio 2013のインストールされているPCであれば実行できる。

上へ