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つずつ書く。
図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であれば実行できる。