2変量統計量
共分散と相関係数
2変量統計量、共分散と相関係数、を求めるプログラムを作成した。これらの統計量については<岡本安晴「データ分析のための統計学入門」2009、おうふう;第2章:統計量>などを参照されたい。プログラムは、ウェブサイト<テキストファイル入出力>で説明したプログラムに下記のようにコードを書き加えて作成した。
===============================================
//
// pos
番目の文字列の取り出し
//
String
^ SeekStr( String ^ str, int pos ){
String
^ vstr = "";
array<wchar_t>
^ separator = { ' ', '\t', ',',' ','/' };
array<String ^> ^ ary_str;
ary_str
= str->Split( separator );
int L = ary_str->Length;
int ckp = -1;
int tmpPos = 0;
do {
if (ary_str[tmpPos]->Length > 0) ckp++;
tmpPos++;
}
while ((ckp != pos) && (tmpPos < L)
);
if (ckp == pos) vstr = ary_str[tmpPos-1];
return vstr;
}
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);
fout->WriteLine();
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();
fin = gcnew
StreamReader( openFileDialog1->FileName,
System::Text::Encoding::GetEncoding("shift-jis")
);
while(true){
s = fin->ReadLine();
if
(s->Length > 0)
if (s[0]
== '/') break;
}
double *
x, * y;
x = new double[n];
y = new double[n];
for (int i = 0; i < n; i++){
s = fin->ReadLine();
x[i] = double::Parse(SeekStr(s,
0));
y[i] = double::Parse(SeekStr(s,
1));
}
fin->Close();
fout->WriteLine("Data...");
for (int i = 0; i < n; i++)
fout->WriteLine(String("x[").PadLeft(10) + (i+1).ToString() + "] = " + x[i].ToString()->PadLeft(7)
+
String("y[").PadLeft(10)
+ (i+1).ToString() + "] = " +
y[i].ToString()->PadLeft(7));
double sx
= 0.0, sy = 0.0;
for (int i = 0; i < n; i++){
sx
+= x[i];
sy
+= y[i];
}
double
MeanX = sx / n;
double MeanY
= sy / n;
double
ssx = 0.0, ssy = 0.0, sxy = 0.0;
for (int i = 0; i < n; i++){
ssx
+= sqr(x[i] - MeanX);
ssy
+= sqr(y[i] - MeanY);
sxy
+= (x[i] - MeanX) * (y[i] - MeanY);
}
double
SDX = Math::Sqrt(ssx / n);
double
SDY = Math::Sqrt(ssy / n);
fout->WriteLine();
fout->WriteLine("Xの平均 = " + MeanX.ToString("F5"));
fout->WriteLine("Xの分散 = " + (ssx/n).ToString("F5"));
fout->WriteLine("Xの標準偏差 = " + SDX.ToString("F5"));
fout->WriteLine("Xの不偏分散 = " +
(ssx/(n-1)).ToString("F5"));
fout->WriteLine("Xの不偏分散の平方根= " +
Math::Sqrt(ssx/(n-1)).ToString("F5"));
fout->WriteLine();
fout->WriteLine("Yの平均 = " + MeanY.ToString("F5"));
fout->WriteLine("Yの分散 = " + (ssy/n).ToString("F5"));
fout->WriteLine("Yの標準偏差 = " + SDY.ToString("F5"));
fout->WriteLine("Yの不偏分散 = " +
(ssy/(n-1)).ToString("F5"));
fout->WriteLine("Yの不偏分散の平方根= " +
Math::Sqrt(ssy/(n-1)).ToString("F5"));
//
//
共分散
//
double cov
= sxy / n;
fout->WriteLine();
fout->WriteLine("共分散 = " + cov.ToString("F5"));
//
//
相関係数
//
double r
= sxy / Math::Sqrt(ssx * ssy);
fout->WriteLine("相関係数= " + r.ToString("F5"));
fout->Close();
MessageBox::Show(saveFileDialog1->FileName
+ " was saved.");
Close();
}
===============================================
このプログラムを実行すると図1のウィンドウが表示される。
図1
「button1」ボタンのクリックで入力データ名設定用ダイアログウィンドウが図2のように表示される。
図2
入力データファイル名を指定して「開く」ボタンをクリックすると、計算結果出力用のファイル名設定を求めるダイアログウィンドウが表示される(図3)。
図3
出力はテキストファイルとして書き出されるので、ファイル名の拡張子は「.txt」としておく。出力ファイル名の設定後、「保存」ボタンをクリックすると計算がはじまり、計算終了後図4のメッセージウィンドウが表示される。
図4
メッセージウィンドウの「OK」ボタンのクリックでプログラムが終了する。
入力データは、図5に示すようにスラッシュ/で始まる行の次の行からデータを1行に一対ずつ書く。
図5
データの終了もスラッシュ/で始まる行で終わる。すなわち、データはスラッシュで始まる行で挟まれた形で用意する。
図5のファイルを入力データとしたときの出力ファイルは次のようになっている。
============ 出力ファイル例:ここから ====================
Data
file...F:\yasuharu\www\LaCoocan\introprg\statTwoVars\stat2vars\stat2vars\Data2vars.txt
Data...
x[1]
=
1 y[1]
= 1
x[2]
=
1 y[2]
= 2
x[3]
=
2 y[3]
= 2
x[4]
=
2 y[4]
= 3
x[5]
=
3 y[5]
= 3
x[6]
=
3 y[6]
= 4
x[7]
=
4 y[7]
= 5
x[8]
=
5 y[8]
= 5
x[9]
=
5 y[9]
= 6
Xの平均 = 2.88889
Xの分散 = 2.09877
Xの標準偏差 = 1.44871
Xの不偏分散
= 2.36111
Xの不偏分散の平方根= 1.53659
Yの平均 = 3.44444
Yの分散 = 2.46914
Yの標準偏差 = 1.57135
Yの不偏分散 = 2.77778
Yの不偏分散の平方根= 1.66667
共分散 = 2.16049
相関係数=
0.94907
============ 出力ファイル例:ここまで========================
プログラム・ファイルは圧縮ファイルstat2vars.zipとしてまとめた。ファイル名stat2vars.zipをクリックしてダウンロードしたものをマウスの右ボタンクリックで表示されるメニュ「解凍」あるいは「展開」などを選ぶと解凍できる。解凍したものはVisual C++などで開いてビルド実行することができる。実行形式ファイルstat2vars.exeも用意したので、ファイル名stat2vars.exeをクリックしてダウンロード実行することができる。実行形式ファイルは.NET Framework3.5対応である。