散布図と単回帰直線
図1のような散布図を描くプログラムを作成した。プログラムはプログラム名ScatterDiagram.exeをクリックしてダウンロード・実行することができる。プログラムは.NET Framework 3.5対応である。
図1
プログラムを実行すると図2のフォームが表示される。
図2
「Go」ボタンのクリックで、まず入力データファイル名の設定を求めるダイアログボックスが表示される(図3)。
図3
入力データファイルはテキストファイルとして用意する。スラッシュ/で始まる行の次の行に変数のラベル並べる(図4)。変数のラベルを並べた次の行から、1行に1組のデータを書いていく。
図4
スラッシュで始まる行までの読み込みと、続く変数ラベルの行の読み込み、および変数の数のカウントは以下のコードで行っている。
String ^s;
while (true) {
s
= fin->ReadLine();
if (s->Length > 0)
if (s[0].ToString() == "/")
break;
}
s = fin->ReadLine(); // 変数ラベル行の読み込み
n_var = 0;
String ^ck_s;
do {
ck_s
= SeekStr( s, n_var );
n_var++;
} while
(ck_s->Length > 0);
n_var--; // 変数の数
関数SeekStrは、1行の文字列から空白文字などのセパレータ区切られた文字列を取り出すものであり、以下のようなコードである。
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;
}
最後のデータを書いた行の次の行はスラッシュで始めて、データの終わりであることを示す(図5)。
図5
最後のデータを示すスラッシュで始まる行までの読み込みとデータ数のカウントは以下のコードで行っている。
n = 0;
do{
s = fin->ReadLine();
if(s[0].ToString()
== "/") break;
n++;
}while(true);
入力ファイル名を設定後、図3のダイアログフォームの「開く」ボタンをクリックすると、図6の出力ファイル名の設定を求めるダイアログフォームが表示される。
図6
出力ファイルもテキストファイルである。出力ファイル名を設定して、「保存」ボタンをクリックすると、データの読み込みが始まる。読み込み後、ヒストグラム描画用のフォームが用意されるが、これは次のコードによって行っている。
cf = gcnew
DrawScatterDiagram();
cf->Show();
cf->setFormH( this,
fout );
label1->Text = "";
for (int i = 0; i < n_var; i++){
cf->AddToCombo1(v_label[i]); // コンボボックスに変数ラベルを設定
cf->AddToCombo2(v_label[i]);
}
描画用フォームは図7のように表示される。
図7
図7の「Draw」ボタンをクリックすると図8のようにフォームの最大化後、散布図と単回帰直線が描画される。図において、変量の値はz得点に標準化されている。素点による散布図の描画プログラムはこのウェブサイトの後半で紹介する。
図8
散布図の下には相関係数が表示されている。相関係数はz得点間の共分散であるが、<岡本安晴「データ分析のための統計学入門」おうふう、p. 30>などを参照されたい。
散布図を作成する変量はコンボボックスの右端の下向き黒三角をクリックして表示される変数ラベルのリストから選ぶことができる(図9)。
図9
変数ラベルをクリックして変数を選択した後、「Draw」ボタンのクリックでコンボボックスに選択されている変数の組み合わせで散布図と回帰直線の描画および相関係数の表示が行われる。
描画されている散布図の画面は、「Save」ボタンのクリックで保存することができる。保存した画像は、ペイントなどで開いたりワードに読み込んだりして利用することができる。
プログラムのソースコードファイルなどは圧縮ファイルとしてまとめた。圧縮ファイル名ScatterDiagram.zipをマウスの右ボタンでクリックしてダウンロードすることができる。ダウンロードしたファイルは、圧縮ファイル名をマウスの右ボタンでクリックして表示されるメニュから「解凍」あるいは「展開」を選んで解凍すればVisual C++2008で開くことができる。
図8の散布図では変量の値は標準化された値z得点であるが、素の値のままで散布図と単回帰直線を描くプログラムも用意した。このプログラムの名前SimpleRegression.exeをクリックしてダウンロード実行すると図10のような散布図と単回帰直線を描くことができる。
図10
横軸(X-軸)と縦軸(Y-軸)の両端の値は、フォーム左上のテキストボックス(図11)に値を設定して指定することができる。フォームが最初に表示されるときは、変量の最小値と最大値が設定されている。「Draw」ボタンをクリックすると、そのときに設定されている値で散布図と回帰直線の描画が行われる。
図11
画面の上部には、回帰直線の係数が表示されている(図12)。
図12
係数は、次式
の形におけるものである。
r は相関係数、r^2 は決定係数を表す。
表示されている描画画面は「Save」ボタンのクリックでファイルに保存することができる。保存した画像ファイルは、ペイントなど画像処理ソフトで読み込んで編集することができる。
なお、プログラムでは、2変量のデータを入力テキストファイルとしている。具体的には、図13,14に示す形式である。
図13
図14
スラッシュ/で始まる行の次行に2変量のラベルを書く。ラベルを書いた行の次行から、1行に1対のデータを書いていく。最後のデータ対を書いた次の行は/で始まる行を置いてデータの終わりを示す。
なお、「X Y」ボタン(図15)をクリックするとX軸の変数とY軸の変数が入れ替わる。
図15
実行開始時に、入力データファイル名の設定に続いて出力ファイル名の設定用ダイアログも提示されるが、この出力用ファイルには、X軸とY軸の入れ替えごとに対応する回帰直線の係数が以下のように出力される。
=======================================
Input File =
D:\yasuharu\www\LaCoocan\VCpp\scattergram\SimpleRegression\SimpleRegression\Data2Vars.txt
Y->英語 X->国語
n = 50
Y->英語 X->国語
Y = 1.26364 + 0.97562 * X
r = 0.855
r^2 = 0.732
Y->国語 X->英語
Y = 15.81218 + 0.75013 * X
r = 0.855
r^2 = 0.732
Y->英語 X->国語
Y = 1.26364 + 0.97562 * X
r = 0.855
r^2 = 0.732
=======================================
プログラムのソースコードファイルなどは圧縮ファイルSimpleRegression.zipとして用意した。圧縮ファイル名SimpleRegression.zipをマウスの右ボタンでクリックしてダウンロードすることができる。ダウンロードした圧縮ファイルは、ファイル名をマウスの右ボタンでクリックして表示されるメニュから「解凍」あるいは「展開」を選んで解凍することができる。解凍したプログラムファイルはVisual Studio Express 2013 for Windows Desktopで開くことができる。
Visual C++プログラミングについては、入門解説書<岡本安晴「大学生のための心理学VC++プログラミング入門」勁草書房>を用意している。