上へ

平均値の差のt検定:独立なサンプルの場合

 

独立なサンプルの場合の平均値の差のt検定のためのVisual C++プログラムを作成した。このt検定については<岡本安晴「データ分析のための統計学入門」2009、おうふう;第3章:検定>などを参照されたい。プログラムは、ウェブサイト<テキストファイル入出力>で説明したプログラムに下記のようにコードを書き加えて作成した。

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

        //

        //              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 nx = 0;

                                 while(true){

                                         s = fin->ReadLine();

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

                                         nx++;

                                 }

                                 int ny = 0;

                                 while(true){

                                        s = fin->ReadLine();

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

                                        ny++;

                                 }

                                 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;

                                 x = new double[nx];

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

                                         s = fin->ReadLine();

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

                                 }

                                 s = fin->ReadLine();

                                 double * y;

                                 y = new double[ny];

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

                                         s = fin->ReadLine();

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

                                 }

                                 fin->Close();

 

                                 fout->WriteLine("データ...");

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

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

                                 fout->WriteLine();

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

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

 

                                 double sx = 0.0;

                                 for (int i = 0; i < nx; i++) sx += x[i];

                                 double MeanX = sx / nx;

 

                                 double sy = 0.0;

                                 for (int i = 0; i < ny; i++) sy += y[i];

                                 double MeanY = sy / ny;

 

                                 double sxx = 0.0;

                                 for (int i = 0; i < nx; i++) sxx += sqr(x[i] - MeanX);

                                 double SDX = Math::Sqrt(sxx / nx);

 

                                 double syy = 0.0;

                                 for (int i = 0; i < ny; i++) syy += sqr(y[i] - MeanY);

                                 double SDY = Math::Sqrt(syy / ny);

 

                                 fout->WriteLine();

                                 fout->WriteLine("Xの平均   = " + MeanX.ToString("F5"));

                                 fout->WriteLine("Xの分散   = " + (sxx/nx).ToString("F5"));

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

                                 fout->WriteLine("Xの不偏分散 = " + (sxx/(nx-1)).ToString("F5"));

                                 fout->WriteLine("Xの不偏分散の平方根= " + Math::Sqrt(sxx/(nx-1)).ToString("F5"));

 

                                 fout->WriteLine();

                                 fout->WriteLine("Yの平均   = " + MeanY.ToString("F5"));

                                 fout->WriteLine("Yの分散   = " + (syy/ny).ToString("F5"));

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

                                 fout->WriteLine("Yの不偏分散 = " + (syy/(ny-1)).ToString("F5"));

                                 fout->WriteLine("Yの不偏分散の平方根= " + Math::Sqrt(syy/(ny-1)).ToString("F5"));

 

                                 double SDDxy = Math::Sqrt( (nx * sqr(SDX) + ny * sqr(SDY)) * ((1.0/nx) + (1.0/ny)) / (nx + ny - 2.0) );

                                 double t = (MeanX - MeanY) / SDDxy;

 

                                 fout->WriteLine();

                                 fout->WriteLine("Xの平均- Yの平均 = " + (MeanX - MeanY).ToString("F5"));

                                 fout->WriteLine();

                                 fout->WriteLine("t = " + t.ToString("F5") + "     自由度= " + (nx+ny-2).ToString());

 

                                 fout->Close();

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

                                 Close();

                         }

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

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

図1

 

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

図2

 

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

図3

 

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

図4

 

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

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

図5

 

まず、第1グループのデータを書き、スラッシュ/で始まる行で区切った後、第2グループのデータを書く。データの最後にスラッシュ/で始まる行を置いて、データの終了を示す。

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

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

Data file...F:\yasuharu\www\LaCoocan\introprg\ttestind\t_test_ind\t_test_ind\DataTInd.txt

 

データ...

        x[1] = 80

        x[2] = 71

        x[3] = 71

        x[4] = 66

        x[5] = 78

        x[6] = 84

        x[7] = 72

        x[8] = 82

        x[9] = 74

        x[10] = 72

        x[11] = 66

        x[12] = 73

 

        y[1] = 66

        y[2] = 75

        y[3] = 64

        y[4] = 73

        y[5] = 68

        y[6] = 71

        y[7] = 81

        y[8] = 70

        y[9] = 76

        y[10] = 72

 

Xの平均   = 74.08333

Xの分散   = 30.90972

Xの標準偏差 = 5.55965

Xの不偏分散 = 33.71970

Xの不偏分散の平方根= 5.80687

 

Yの平均   = 71.60000

Yの分散   = 22.64000

Yの標準偏差 = 4.75815

Yの不偏分散 = 25.15556

Yの不偏分散の平方根= 5.01553

 

Xの平均- Yの平均 = 2.48333

 

t = 1.06127     自由度= 20

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

 

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

なお、t値に対応する確率を求めるVisual C++プログラムはウェブサイト<ティ分布>に用意した。

 

上へ