PC-SAS入門
SASとはStatistical Analysis Systemのことで、統計解析を行う言語、パッケージ。
簡単なプログラム方法をマスターすれば、難しい数式を覚えることなく簡単に統計分析を行うことができる。
使える手法の例(括弧内は各分析を行うSASのプロシジャ名(太字は講義で紹介するプロシジャ)。
注)簡単に計算してくれますが、その結果を解釈してはくれません。解釈するのは自分自身なのです。
1)使うデータとそのファイル
「CMについてのアンケート」データファイルは、ensdat1.csv)。
皆さんは残念ながら、ハードディスクを一時的にしか利用できないので、処理速度や容量の問題があるかも知れませんが、フロッピーディスクにデータを保存し、それを利用してもらいます。
2)演習用データを保存するディレクトリの作成
自分のフロッピーを入れる。
「マイコンピューター」を開き、自分のフロッピー(A:)を選ぶ。
「ファイル」「新しいフォルダの作成」
「ensyu」と入力して、ディレクトリを作成する。
注)Windowsの場合、入力モードを直接入力にしてください。
3)データファイルのコピー
「上記のensdat1.csvを、自分のフロッピーの\ensyuフォルダーに入れる。
演習で使うSASのプログラムは演習用データ&プログラムについてを参照。
1)SASの構成
SASには次の3つのウインドウがあります(この他にもあるが、よく使うのは3つ)。
図表 SASのウインドウ
Program editorウインドウ |
プログラムを書き込むウインドウ。 |
LOGウインドウ |
計算過程でのSASからのメッセージなどが出力される。 |
outputウインドウ |
計算結果が出力される。 |
注)自分がどのウインドウにいるか見失った場合 「ウィンドウ」を選ぶと、各ウインドウに移動できる。
2)プログラムの実行
基本的には、次の手順で実行させる。
Program editorウインドウにプログラムを書き込み/読み込み
→必要ならば修正
→実行
(1)プログラムの読み込み
Program editorに移動。
「ファイル」「オープン」
「f:hamaokadd」の中から「ensread1」を選ぶ。
(注)自分で直接Program editorにプログラムを書き込むこともできる。
(2)プログラムの実行
Program editorウインドウにいることを確認。
「ローカル」「サブミット」で実行される。
(注)「サブミット」すると、Program editorウインドウはクリアされる。プログラムを修正した場合にはファイルの保存を忘れないように。
(3)実行結果のみかた
・logウインドウ
sasシステムからのメッセージが出力される。
自分のプログラムは黒字、sasからのメッセージのうち単なる報告は青、警告、エラーは赤字で出力される。
・outputウインドウ
うまく行けば(エラーが出なければ)計算結果が出力される。
・Program editorウインドウ
クリアされている。
(注)連続して実行すると、各ウインドウには前の出力に続けて結果が出力される。
まめに「編集」 「テキスト消去」を実行しましょう。
参考)
参考)sas/insight
sasデータセット形式になっていると、sas/insightで対話型の分析を行うことができます。
「グローバル」 「対話式データ解析」で起動。
「SAS/INSIGHTオープンウインドウ」
sasが作ったデータセットが見える。
ensdat1というデータセットを選ぶと、ワークシート形式で表示される。
ただし、この状態ではすべての変数が間隔尺度となっている。
名義尺度は名義尺度に変更しておくと、あとの分析が楽になる。
sasが尺度に応じた適切な手法を選んでくれる。
プロット、回帰分析、主成分分析までならば、 SAS/INSIGHTの中でできます。予備分析には大いに威力を発揮するでしょう。
この講義では、これ以上紹介しません。
1)プログラムの構成(要素)
2)文法
変数名は英数字で8文字以内。変数名の先頭の文字は英字(大文字、小文字は区別されない)。
C言語のように変数を宣言しておく必要はない。
ただし、文字列変数の場合には、読み込みのときに、その変数が文字変数であることを指定しておく必要がある。
例 xという数値変数を読み込む場合。
input x ;
例 xという文字列変数を読み込む場合。
input x $;
→xの後に「スペース$」を入れておく。
- 一行に複数の文を書くこともできる。
- 初心者は、ここでエラーを出ことが多いので要注意。
- 次のプロシジャに移行するまで前のプロシジャは実行されない。
- プログラム例1 :data aaaa, proc xxxxは実行されるが、proc yyyyは実行されない。
- data aaaa;
- proc xxxx;
- proc yyyy;
- プログラム例2 :data aaaa,proc xxxx、proc yyyyとも実行される。
- data aaaa;
- proc xxxx;
- proc yyyy;
- run;プログラムの文末にはrun; を必ず入れる。
プロシジャによって異なりますが、オプションの指定は次の二カ所で行います(斜体部)。
詳細はプロシジャによって異なるのでマニュアルを参照。
proc **** data=入力データセット名 out= 出力データセット名;
varなど/計算やプロットのオプション;
どのデータセットについて処理させるかdata=で指定することができる。指定しなければ、直近に作成されたデータセットを処理する(下の例はproc printの例だが、他のプロシジャでも同様)。
例 データセットを指定した例。 |
例2 データセットを指定しない例。 |
data aaa; ..... data bbb; ..... proc print data=aaa; run; データセットaaa,bbbを作成した。 data=aaaが指定されているので、aaaが印刷される。 |
data aaa; ..... data bbb; ..... proc print ; run; dataで指定されていないので、直前に作成されたbbbが印刷される。 |
講義で使うもののみ。
指定された名前のデータセットを作成する。
例)data kenssdt;
kenssdtという一時データセットを作成。
例)data md.kenssdt;
mdというsasデータ・ライブラリの下に、kenssdtという永久データセットを作成。
sasデータライブラリとWindowsのファイルとの関係を指定する。
データセットが、一時的か永久かは、sasライブラリ名が指定されているかいないかによって判定される。
・永久データセットについては、aaa.bbbbのようにデータセット名を指定する。
「sasライブラリ名.データセット名」という形式になる。
→(sasライブラリ名とデータセット名との間をピリオドで区切る)
sasライブラリ名とWindowsのファイルとを対応づけるのが「LIBNAME」コマンド
例)LIBNAME md "a:\mydata\";
mdで始まる永久データセットはa:\mydata\の下にあること(保存すること)を指定する。
・一時データセットの場合には、ライブラリ名の指定は不要。
例)INFILE 'a:\mydata\kendat.prn' delimiter=' ' ;
a:\mydata\kendat.prnから読み込むことを指定。
デリミタは「」=スペースである。
var x y;
by z;
var x y;
by z;
var x y;
where z>100;
var x y;
where x<10;
var x1 x2 x3 x4 x5;
id smpno;
/* 階層型を表す樹系図を出力 */
proc tree data=treeout;
id smpno;
run;
hbar x;
run;
hbar x y z ;
run;
var x y z;
run;
- 注)corr(x1,x2)はx1とx2の相関係数という意味。
- x1 x2 x3 x4
- x1 corr(x1,x1) corr(x1,x2) corr(x1,x3) corr(x1,x4)
- x2 corr(x2,x1) corr(x2,x2) corr(x2,x3) corr(x2,x4)
- x3 corr(x3,x1) corr(x3,x2) corr(x3,x3) corr(x3,x4)
- x4 corr(x4,x1) corr(x4,x2) corr(x4,x3) corr(x4,x4)
- x1 x2
- x3 corr(x3,x1) corr(x3,x2)
- x4 corr(x4,x1) corr(x4,x2)
var x1 x2 x3 x4 x5;
run;
var x1 x2 x3 x4 x5;
run;
table 行方向の変数名 * 列方向の変数名 /(検定)オプション;
- 頻度分布表、クロス集計表を作成する。
- tableで集計する変数名を指定する。
- ノンメトリックな変数について集計する。
- 例)xの頻度分布表を作成する。
proc freq data=.....;
table x;
run;
- 例)xとyのクロス集計表を作成する。
proc freq data=.....;
table x*y;
run;
- 例)一度に複数のクロス集計表を作成。
proc freq data=.....;
table (x1 x2 x3)*(y1 y2 y3);
run;
- chisq オプションでクロス集計表の列、行の独立性を検定することもできる。
- proc freq data=.....;table x*y /chisq ;カイ2乗検定を行う。
- 注)カイ2乗検定は度数が5以下のセルの割合が多くなると信頼性が低くなる。このような場合はフィッシャーのexact検定を用いた方がよい。
- table x*y /exact;とするとフィッシャーのexact検定を行う。
- →ただし、exact検定では計算量が多くなるので無限ループに入る恐れもある。
model 従属変数=説明変数(classで指定した変数);
means 水準やグループを表す変数 / 平均値の差の検定方法;
行方向の変数名 * 列方向の変数名 /(検定)オプション;
- class で水準やグループを表す変数名(ノンメトリック)を指定する。
- model で推定するモデルを指定。従属変数(メトリック)=説明変数(classで指定したノンメトリックな変数);
- means で指定した変数毎の平均値を算出する。/ で指定すると平均値の差の検定を行う。検定方法としては、LSD検定、Tukey検定などがある。
- 例)clindxというノンメトリックな変数の値によって、yの値が異なるか否かを検定する。
proc glm data=...;
class clindx;
model y=clindx;
means clindx /tukey;
- run;
- meansはオプション。
- varで集計する変数名を指定する。
- 例)x, yの記述統計を算出する。
proc means data=.....;
var x y;
run;
- オプションを指定しなければ、サンプル数、平均値、標準偏差、最小値、最大値が出力される。
plot 変数名1*変数名2/オプション;
- 変数名1*変数名2のグラフを作成する。
- plot で集計する変数名を指定する。
- 例)yを縦軸、xを横軸にした散布図を作成する。
proc plot data=....;
plot y * x;
run;
- 注)proc plot; proc chartはテキストキャラクタでグラフが出力される。
proc gplot; proc gchartとするとグラフィックでグラフが出力される。
var x y;
run;
output out=出力オプション;
model y1=x1 x2 x3 x4;
run;
model y1=x1 x2 x3 x4;/p r stb cli ;
output out=reg_out1 p=prd r=res;
run;
proc cluster DATA=ens.ensdat1l outtree=treeout method=ward;
var f_l1-f_l4;
id smpno;
/* 階層型を表す樹系図を出力 */
proc tree data=treeout;
id smpno;
run;
class 分類変数名(2つの値しかとらない変数);
var 変数名;
var 変数名
- 詳細な記述統計を算出する。
- メトリックな変数について集計する。
- data=でデータセットを指定しなければ、直近に作成されたデータセットが用いられる。
- var で集計する変数名を指定する。
- 例) xの詳細な記述統計を算出する。
proc univariate data=..... normal plot;
var x;
run;
- normal オプション:正規性を検定する。
- plotオプション:正規プロットを出力する。
自分で用意するデータの形式としては次のようなものがあるでしょう。
1)表計算ソフトで入力したデータ。
自分で本などをみてそれをエクセルなどの表計算ソフトで入力したデータ。
表計算ソフト独特の形式で保存されている(ファイル名*.xclなど)ので、直接SASで読み込むことはできない。
→表計算ソフトから(自由書式の)テキストファイル形式に出力。それをSASで読み込む。
2)自由書式のテキストファイル形式で入手する。
データとデータが、「 スペース」や 「,」「タブという眼には見えない特殊文字」などで区切られているデータ(データの区切りに用いられる文字を「デリミタ」と呼ぶ)。
例 ,で区切られている。→ 985,187,abc,899,156,89,3
スペースで区切られている。→ 985 187 abc 899 156 89 3
このデータならば簡単に読み込める。
ファイル名を指定して、input 変数名......;run;とする。
----
上のデータ例について、7つの変数をa〜fという変数で読み込む場合。
input a b c $ d e f g;
のようにinput文を書く。
注意)変数が都道府県、人名のような「文字」の場合には、変数名の後にスペースを空けて「$」をつけておく。
3)固定書式のテキストファイル形式でデータを入手する。
データとデータとの間に区切り記号がない。
→データが記録される桁数が固定されている。
例 上と同じデータ
985187abc899156893
3 3 3 3 3 2 1←各変数の桁数。
各変数の記録されている桁の位置を指定する。
→変数名のあとに、「桁の開始-終了位置」を指定する。
例)input a 1-3 b 4-6 c $ 7-9 d 10-12 e 13-15 f 16-17 g 18-18;
注)フォーマット入力という指定もある。SASマニュアル参照。
→SASで読み込むときは、どの変数が、どの桁に記録されているかを指定することが必要。
エクセル、ロータスなどの表計算ソフトで入力したデータをSASで読み込むことができます。
ただし、表計算ソフト独特の形式のファイル(*.xclなど)を直接読み込むことはできないので、表計算ソフトで入力したファイルをテキスト形式のファイルに出力してから読み込みます。
(演習用に提供しているデータもそうやって入力したものです。)
手順は次のようになります。
表計算ソフトで入力
→入力したものをテキスト形式で保存。
→読み込み用のSASプログラムを用意。
→読み込みプログラムをサブミット。
→出力結果を見て確認。
以下ではエクセルを例にしますが、ロータスでも同様にできるはずです。
a:ドライブの\mydataというフォルダにkendatというデータをエクセルで作成する。
よって、次の二つの方法のどちらかで対応して下さい。
(1)2.1項のcardsコマンドを使うか、
(2)以下の方法で、文字変数を除いて数字データだけとする(データを除くのだから、変数名も除いて下さい)。
-----------
(フォルダを作成しておくこと)
データの例
県番号 県名 人口(1000人) スーパー売上高(100万円/月)
1 茨城 2894 42727
2 栃木 1951 28671
3 群馬 . 26672
4 埼玉 6465 118785
5 千葉 5614 93619
6 東京 11634 174255
7 神奈川 8002 144756
注)人口:住民基本台帳人口、92年3月末
スーパー売上高:商業界「日本スーパーマーケット名鑑91年」
群馬の人口は入手可能だが練習のため、欠損「.」とする。
1)表計算ソフトなどで上のデータを次のように入力する。
変数名は適当に自分の好きなようにつけてよいが、ここでは次のように。
------------
県番号 県名 人口(1000人) スーパー売上高(100万円/月)
kenno kenname popltn suprsal
1 茨城 2894 42727
2 略
------------
データを入力。
欠損はピリオド「.」を入力。
入力したら保存する(自分のフロッピーに)。
2)csv形式で保存
SASでデータを読み込むためには、csv形式に保存しなければならない。
注)次の条件を満たしておくことが必要[大橋ら(1994),p.28]。
各データは「,」で分離されていること。
必要な小数点はデータ内に含まれていること。
データの欠損値はピリオド「.」としておくこと。
注)自由書式では、文字データは半角8文字(8バイト)=全角4文字までしか読み込めません。
より長い全角文字列を読みたい場合には、固定書式としてください。
→エクセルで新しいワークシートを開き、上のデータのうち、データの部分のみ(変数名の部分は含まない)をコピーしてcsv形式で保存する。
注)保存のとき「ファイル形式」でcsv(コンマ区切り)を選ぶとcsv形式で保存される。
→保存するファイル名はkendat.csvとする(コンマ区切りを指定するとcsvは自動的に付加される?)。
3)sasによる読み込み&永久データセットの作成
次のsasプログラムをsasのprogram editorに入力(この画面からコピーできるはず)。
サブミットしてみる(斜線は自分たちのデータによって変更が必要な部分)。
LIBNAME md "a:\mydata\";
/*a:\mydata\の下にkenssdtという名前の永久データセットを作成する。*/
DATA md.kenssdt;
INFILE 'a:\mydata\kendat.csv' lrecl=100 delimiter=',' ;
/*lrecl=100 でデータの横幅を大きめに指定しておく(この場合は100桁)。
- delimiter=でデリミタ(データの区切のための文字)を指定する。この場合はコンマ*/
input kenno kenname $ popltn suprsal;
/*県名は文字変数なので、変数名の後に$をつける*/
proc means data=md.kenssdt;
/*入力ミスがないか確認のため記述統計を算出。
変数名を指定していないのでデータセットに含まれる
すべての変数(文字変数を除く)について計算される。*/
proc print data=md.kenssdt;
/*入力ミスがないか確認のためデータを印刷。
変数名を指定していないのでデータセットに含まれる
すべての変数が印刷される。*/
run;
注)漢字データの読み込みがうまく行かない場合は、文字データを漢字ではなくローマ字にしてみる(例 東京→tokyoなど)。
ローマ字ならば読み込める場合には、double-byte character sets (DBCS)オプションがインストールされていないと考えられます。→システムの管理者に相談して下さい。
横に非常に長いデータの場合にはlrecl=の指定を大きめにしておく。
それでも読めない場合には下のカードで読み込んでください。
付録2.1 ファイルからではなくcardsコマンドでSASプログラム中にデータを書き込む場合。
sasのcardsコマンドを使ってデータをプログラムの中に書き込むこんで、それを読み込むことができます。
下の例を参照(自分のフロッピーに保存するにはどうすればよいかは自分で考えてみて下さい)
LIBNAME md "a:\mydata\";
/*a:\mydata\の下にkenssdtという名前の永久データセットを作成する。*/
DATA md.kenssdt;
input kenno kenname $ popltn suprsal;
/*県名は文字変数なので、変数名の後に$をつける*/
/*データはsas画面に直接入力しても、エクセルからコピーしてきてもよいはず*/
/*cardsコマンドのあとにデータを入力しておく。*/
cards;
1 茨城 2894 42727
2 栃木 1951 28671
3 群馬 . 26672
4 埼玉 6465 118785
5 千葉 5614 93619
6 東京 11634 174255
7 神奈川 8002 144756
;
/*データの終わりのセミコロンを忘れないように*/
proc means data=kenssdt;
proc print data=kenssdt;
run;
一時的にデータセットを作成して分析するプログラムも用意してあります。
「f:hamaokadd]の中の「runable」というディレクトリの下に入っているプログラムを利用して下さい(プログラム名は同じ)。
ただし、CMデータについての永久データセットが作成されていないので、sasを起動したら、まずensread1を実行して、永久データセットを作成してください。
意識しなくても、実行してエラーがなければ、自分の「saswork」の下に、このデータセットが作成されます。
この場合、フォルダSAS611の下の「saswork」というフォルダに、一時的に作成されたデータが格納される。
sasを終了したら、これらのファイルは消去される。
ノンメトリックな変数を回帰分析の説明変数とする場合には、それをダミー変数に変換することが必要です。
マルチプルアンサー(○はいくつでも)の名目尺度の場合には、その選択肢が選ばれたときに1、そうでないときに0となるようにコード化されることが多いので、それをそのままダミー変数として使うことができます。
これに対して、シングルアンサー(○はひとつだけ)の場合には、1.男性、2.女性の1、2という数字を0、1のダミー変数に変換する必要があります。
選択肢がn個ある場合にはn-1個のダミー変数を定義する必要があります(n個定義してしまうと、行列がランク落ちしてしまう)。