カイ2乗検定
適合度の検定
データに対する理論的分布の適合度の検定を行うVisual C++プログラムを作成した。このカイ2乗検定については<岡本安晴「データ分析のための統計学入門」2009、おうふう;第3章:検定>などを参照されたい。
プログラムを実行すると図1のウィンドウが表示される。
図1
「button1」ボタンのクリックで入力データ名設定用ダイアログウィンドウが図2のように表示される。
図2
入力データファイル名を指定して「開く」ボタンをクリックすると、計算結果出力用のファイル名設定を求めるダイアログウィンドウが表示される(図3)。
図3
出力はテキストファイルとして書き出されるので、ファイル名の拡張子は「.txt」としておく。出力ファイル名の設定後、「保存」ボタンをクリックすると計算がはじまり、計算終了後図4のメッセージウィンドウが表示される。
図4
メッセージウィンドウの「OK」ボタンのクリックでプログラムが終了する。
入力データは、図5に示すようにスラッシュ/で始まる行の次の行に、まずカテゴリ数を書く。
図5
次の行から、各カテゴリにおける理論的確率と観測度数の組み合わせを1行ずつに書く。
図5のファイルを入力データとしたときの出力ファイルは次のようになっている。
============ 出力ファイル例:ここから ====================
Data
file...F:\yasuharu\www\LaCoocan\introprg\chi2_distri\chi2distri\chi2distri\Data.txt
Prob.
Obs.
Est.
0.5
16 10.00
0.5
4 10.00
chi-squared = 7.20000 df = 1
============ 出力ファイル例:ここまで========================
「Prob.」の下の列に帰無仮説の確率、「Obs.」の下の列に観測度数(データ)、「Est.」の下の列に帰無仮説による期待度数が出力されている。帰無仮説の下での入力データに対するの値は最後に「chi=squared = 」の値として自由度dfとともに出力されている。
プログラムは、ウェブサイト<テキストファイル入出力>で説明したプログラムに下記のようにコードを書き加えて作成した。
===============================================
//
// 入出力ファイルの名の設定
//
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;
}
s = fin->ReadLine();
int c = int::Parse(s);
double *
p, * O, * E;
p = new double[c];
O = new double[c];
E = new double[c];
int N =
0;
for (int i = 0; i < c; i++){
s = fin->ReadLine();
p[i] = double::Parse(SeekStr(s,
0));
O[i] = double::Parse(SeekStr(s,
1));
N += O[i];
}
fin->Close();
for (int i = 0; i < c; i++)
E[i] = p[i] * N;
double
chi2 = 0.0;
for (int i = 0; i < c; i++)
chi2 += sqr(O[i] - E[i]) / E[i];
fout->WriteLine();
fout->WriteLine(String("Prob.").PadLeft(10) + String("Obs.").PadLeft(10) + String("Est.").PadLeft(10));
for (int i = 0; i < c; i++){
fout->WriteLine(p[i].ToString()->PadLeft(10)
+ O[i].ToString()->PadLeft(10) + E[i].ToString("F2")->PadLeft(10));
}
fout->WriteLine();
fout->WriteLine("chi-squared = " + chi2.ToString("F5") + " df = " +
(c-1).ToString());
fout->Close();
MessageBox::Show(saveFileDialog1->FileName
+ " was saved.");
Close();
===============================================
プログラム・ファイルは圧縮ファイルchi2distri.zipとしてまとめた。ファイル名chi2distri.zipをクリックしてダウンロードしたものをマウスの右ボタンクリックで表示されるメニュ「解凍」あるいは「展開」などを選ぶと解凍できる。解凍したものはVisual C++などで開いてビルド実行することができる。実行形式ファイルchi2distri.exeも用意したので、ファイル名chi2distri.exeをクリックしてダウンロード実行することができる。実行形式ファイルは.NET Framework3.5対応である。
なお、値に対応する確率を求めるVisual C++プログラムはウェブサイト<カイ2乗分布>に用意した。