上へ

順序統計量

ヒンジ(hinge

 

ヒンジ(下ヒンジlower hinge、上ヒンジupper hinge、ヒンジ散布度H spread, interhinge distance)などを求めるVisual C++プログラムを作成した。これらの統計量については<岡本安晴「データ分析のための統計学入門」2009、おうふう;第2章:統計量>などを参照されたい。プログラムは、ウェブサイト<テキストファイル入出力>で説明したプログラムに下記のようにコードを書き加えて作成した。

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

        //

        //              Quick Sort

        //

        void qSort( double * d, int Lb, int Ub ){

                if (Lb < Ub){

                        int p = (Lb + Ub) / 2;

                        double c = d[p];

                        int i = Lb;

                        int j = Ub;

                        do {

                                while (d[i] < c) i++;

                                while (c < d[j]) j--;

                                if (i <= j){

                                        double v = d[i];

                                        d[i] = d[j];

                                        d[j] = v;

                                        i++;

                                        j--;

                                }

                        } while (i <= j);

                        qSort(d, Lb, j);

                        qSort(d, i, Ub);

                }

                return;

        }

 

        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;

 

                                 button1->Enabled = false;

 

                                 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());

 

                                 qSort( x, 0, n-1 );

                                 fout->WriteLine();

                                 fout->WriteLine("Order statistic...");

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

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

 

                                 double Vmin = x[0];

                                 double Vmax = x[n-1];

                                 double Med;

                                 if ((n % 2) == 0){

                                                Med = (x[(n / 2) - 1] + x[n / 2]) / 2.0;

                                 }else{

                                                Med = x[n / 2];

                                 }

 

                                 double dM = (n + 1.0) / 2.0;

                                 double dLH = (int(dM) + 1.0) / 2.0;

                                 double HL, HU;

                                 if (int(dLH) == dLH){

                                                HL = x[int(dLH)-1];

                                                HU = x[n-int(dLH)];

                                 }else{

                                                HL = (x[int(dLH)-1] + x[int(dLH)]) / 2.0;

                                                HU = (x[n-int(dLH)] + x[n-int(dLH)-1]) / 2.0;

                                 }

                                 double H = HU - HL;

                                 double inrfncL = HL - 1.5 * (HU - HL);

                                 double inrfncH = HU + 1.5 * (HU - HL);

                                 double otrfncL = HL - 3.0 * (HU - HL);

                                 double otrfncH = HU + 3.0 * (HU - HL);

 

                                 fout->WriteLine();

                                 fout->WriteLine("min = " + Vmin.ToString());

                                 fout->WriteLine("max = " + Vmax.ToString());

 

                                 fout->WriteLine();

                                 fout->WriteLine("Outer fence   = " + otrfncL.ToString());

                                 fout->WriteLine("Inner fence   = " + inrfncL.ToString());

                                 fout->WriteLine("下ヒンジ     = " + HL.ToString());

                                 fout->WriteLine("Med           = " + Med.ToString("F3"));

                                 fout->WriteLine("上ヒンジ     = " + HU.ToString());

                                 fout->WriteLine("Inner fence   = " + inrfncH.ToString());

                                 fout->WriteLine("Outer fence   = " + otrfncH.ToString());

                                 fout->WriteLine();

                                 fout->WriteLine("ヒンジ散布度 = " + (HU - HL).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

 

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

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

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

Data file...F:\yasuharu\www\LaCoocan\introprg\calcHinge\calcHinge\calcHinge\Data9.txt

 

Data...

        x[1] = 1

        x[2] = 9

        x[3] = 2

        x[4] = 8

        x[5] = 3

        x[6] = 7

        x[7] = 4

        x[8] = 6

        x[9] = 5

 

Order statistic...

        x(1) = 1

        x(2) = 2

        x(3) = 3

        x(4) = 4

        x(5) = 5

        x(6) = 6

        x(7) = 7

        x(8) = 8

        x(9) = 9

 

min = 1

max = 9

 

Outer fence   = -9

Inner fence   = -3

下ヒンジ     = 3

Med           = 5.000

上ヒンジ     = 7

Inner fence   = 13

Outer fence   = 19

 

ヒンジ散布度 = 4

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

 

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

 

上へ