授業内容


第22回(第9回) IMLプログラミング1  12/15

シグマとパイ


22 IMLプログラミング

22.1 プログラムを作るときの基本的な考え方
プログラムというものは、何か一つの計算(実行)結果を出したり、シミュレートしたりするときに組むものです。シュミレートじゃないので注意)
ここでは、一般的によく使われる統計量である「相関係数」をプログラムに組み込むために、まず、相関係数がどんなものかを見てみましょう。
まず、あるn人からなる集団に属するある個人が、情報を持っているとします。それを測定値といいます。その情報の全体に対する平均値は平均で表されます。平均は、難しい(面倒な?)言葉でいうと「期待値」と言ったりもします。
測定値

平均

そこで、その個人の持つ情報によって、集合全体をあらわすための一つの手段として「バラつき」と言うものを考えてみます。

22.2 分散と共分散

分散と共分散は、ともに測定値の散らばり具合を表す指標です。
仮に全ての測定値が同じ値をとったとしましょう。これは、どう考えても、散らばり具合はゼロで、まとまっていると答えるのが妥当でしょう。ここで、全ての測定値が同じならば、その平均値もその測定値に等しいはずです。
そこで、各測定値が平均からどれくらいずれているかを測る偏差というものを考えましょう。
偏差:

これは、各測定値のもつズレがどれくらいかをあらわすものですが、集団全体でそれがいくらかを考えてみましょう。しかし、この偏差を集団全体に対して合計するとき、その値はゼロになってしまいます(平均からのズレには、プラスのズレもマイナスのズレもあるはずですから)。
そこで、ズレをプラスの値として扱うために、その偏差を2乗してやるという操作を考えます。その偏差の2乗の平均値を分散と呼んでやります。

分散(variance)

ちなみに、分散の正の平方根(ルート)を標準偏差といいますが、ここではあまり重要ではありません。の2は、2乗の値を扱っているのだ、くらいに考えていてくれればいいです。
また、ある個人が一つの情報しか持っていないというのも、あまり面白くない話で、複数の情報を持っている方がいろんな分析に役立ちます。ここでは、という複数の情報を持っていることにしましょう。するとその時、そのデータ相互でのズレの大きさを考えたものが、次で言う共分散だと考えてもらって構いません。分散の式と見比べてみると、にちょっとだけ置き換えたものになっていることに気づくかもしれません。大雑把な言い方をすれば、クロスでのズレを考えたものになっています。

共分散(covariance)

計算上の扱い

上の分散、共分散は定義の式になっています。そのままでは、計算がしにくいので、計算しやすい形に変えてあげます。
分散:

共分散:

これを見ても、ピンとはこないと思いますが、そんなものです。定義が何をしたかったのかだけを確認できれば十分です。

22.3 相関係数
ここで、相関係数(correlation coefficient)を次の形で定義します。

相関係数

分母はXの分散と、Yの分散を掛け合わせて、平方根を取ってます。分子はXとYとの共分散です。もうちょっと書き下してみましょう。




この式を見て、ピンと来ますか?もしも、XとYが全く同じものなら、この式の値は1になります。つまり、XとYがそれぞれ、どれくらいゆがんでいるか。そしてX,Y同時に考えた時に、それがどれほどゆがんでいるか。さらにその両者の比を取ったときどれほど一致しているか。それを考えるのが、この相関係数という話なのです。もちろん、XとXの相関係数とか、YとYの相関係数なんてものも考えられますが、今話した通りXとX、またはYとYはまったく同じモノなので、相関係数は1になります。
ここで、与えられたデータをそれぞれベクトルで次のように表してみましょう。

すると、式の内容を次のように書くことができます。


これを組み合わせて、分散、共分散を作ります。

【新規プログラム再記】

data cp00;
infile 'z:\base01FF.prn';
input samno hght wght ft atnd allw pname $ sex $ pc word xl mail;
run;
proc iml;
reset noprint;
use cp00;
show datasets;
read all var {hght,wght,ft} into x;
print x;
close cp00;
n = nrow(x);
sum = x[+,];
xpx =t(x) * x - t(sum) * sum/n;
*←ここで使う;
s = diag(1/sqrt(vecdiag(xpx)));
*←ここでも使う;
corr = s * xpx * s;
print corr;
quit;

【プログラム末尾】

要は、計算を行うために必要な途中経過を計算用ソフトに示してあげたうえで、どのように代入していくかを順番に並べてあげればいいわけです。
この相関係数という推計量は、一般にも良く使われるものなので、予めSASのプロシジャとしても存在します(CORRプロシジャ)。ここでは、自分でもそういったプログラミングをするためにどう考えなくてはならないかを考えるために、面倒な方法をわざわざやりました。
diag、sqrt、vecdiagといった関数は、IML関数一覧に載せていますので、時間に余裕のある人は確認してみてください。


一つ前の週へ 先頭に戻る 一つ後の週へ


ホーム シラバス 授業計画 授業へのQ&A コンピューター初心者の皆さんへ