授業内容


第21回(第8回) 行列データ 12/08
21 行列データ

21.1  SASデータセットの変換

今までは、シンプルな形のデータセットを作って、作業をしましたが、実際に扱う必要のあるデータはとても手入力で間に合う程度の量であるはずもなく、どこかの誰かが既に作ってくれているものを扱うことがほとんどでしょう。そういった多量のデータを読み込んで処理する方法を見ていきます。
データセットをまず外部ファイルとして読み込んでみましょう。ここで読み込めるデータはテキストデータのように、余計なタグなどのついていない形になっていることが必要です。
Zドライブにbase01FF.prnというファイルをまえもって置いておきます。

【新規プログラム】
data cp00;
infile 'z:\base01FF.prn';
input samno hght wght ft atnd allw pname $ sex $ pc word xl mail;
run;

【プログラム末尾】

1行目は、これから扱うデータを、「cp00という名前にするよ」という命令です。2行目は、Zドライブにあるbase01FF.prnというデータを取ってくるという指令です。そして3行目で、そこには、samno(サンプルナンバー)、hght(身長)、wght(体重)、ft(足のサイズ)、atnd(週の出席日数)、allw(小遣い)、pname(ペンネーム)、sex(性別)、pc(パソコンの経験)、word(ワープロの経験)、xl(表計算ソフトの経験)、mail(メールの経験)という12種類のデータが入っていて、そのうちpname(ペンネーム)とsex(性別)は文字データになっていることを指定しています。$を変数名の後につけてやることで、文字列であることを表現しています。$と$で囲むことが目的ではないので注意しましょう。
次に、このSASデータセットをSAS/IMLで使うためにはその中に取り込んであげる必要があります。
そのためには以下の3つの手順を踏む必要があります。

1)データセットをオープンにする(USEステートメント)
2)入力命令を実行する(READステートメント)
3)データセットを閉じる(CLOSEステートメント)

【追加プログラム】
proc iml;
use cp00;
show datasets;
read all var {hght,wght,ft} into x;
print x;
close cp00;
quit;

【プログラム末尾】

1)データセットのオープン
まず、SAS/IML上でどのデータを使うのか指定してやる必要があります。SAS/IMLでのデータのオープンのやり方にはいくつかの方法がありますが、ここでは入力専用のUSEステートメントを使います。(2行目)
これで、cp00が読み込むべきSASデータセットに指定されます。目には見えていませんが、この状態は、データはまだ行列の形にはなっていなくて、1列の数字または文字の並びに過ぎません。

指定方法
  USE SASデータセット <VAR 変数名> <WHERE(条件式)>;

3行目のSHOW DATASETSステートメントで、データセットの状態を調べます。

2)入力命令の実行
指定したデータを行列に変換するためには、READステートメントを使います。
ここでは、読んできたデータのうち、VAR(変数:variableの略)として、、hght(身長)、wght(体重)、ft(足のサイズ)を抜き出して、行列名 x の中に入れ込んであげています。(4行目)

指定方法
  READ <範囲> <VAR 変数名> <WHERE(条件式)> <INTO 行列の名前>;

指定例

read all var {hght,wght,ft};  単純に、身長、体重、足のサイズを読み込んでそれぞれで使う場合。
read all var _num_;  全ての数値(numerical)データを読み込んで使う場合。
read all var {hght,wght,ft} where (sex="F") into female;  性別がF(Female:女性)のデータについて、身長、体重、足のサイズを取り出して、female と名づけた行列にする。

5行目のPRINT文で打ち出して確認しています。

3)SASデータセットを閉じる
データを一旦読み込んでしまえば、SASデータセットを開いておく必要はありません。CLOSEステートメントで閉じてあげます。(6行目)

指定方法
  CLOSE データセット名;

21.2  相関行列の計算

この行列を使って、身長と体重および足のサイズの間にある相関関係を行列で表すプログラムは次になります。

【新規プログラム】
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;

【プログラム末尾】


今週の課題
なし。


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


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