PC-SAS入門
SASとはStatistical Analysis Systemのことで、統計解析を行う言語、パッケージ。
簡単なプログラム方法をマスターすれば、難しい数式を覚えることなく簡単に統計分析を行うことができる。
使える手法の例(括弧内は各分析を行うSASのプロシジャ名(太字は講義で紹介するプロシジャ)。
注)簡単に計算してくれますが、その結果を解釈してはくれません。解釈するのは自分自身なのです。
・SASについての参考文献
1)使うデータとそのファイル
「CMについてのアンケート」データファイルは、「f:hamaokadd]の中のensdat1(こう表示されているが実際はensdat1.txt)。
皆さんは残念ながら、ハードディスクを一時的にしか利用できないので、処理速度や容量の問題があるかも知れませんが、フロッピーディスクにデータを保存し、それを利用してもらいます。
2)演習用データを保存するディレクトリの作成
自分のフロッピーを入れる。
「マイコンピューター」を開き、自分のフロッピー(A:)を選ぶ。
「ファイル」「新しいフォルダの作成」
「ensyu」と入力して、ディレクトリを作成する。
3)データファイルのコピー
「f:hamaokadd]の中のensdat1(こう表示されているが実際はensdat1.txt)を、自分のフロッピーのensyuに入れる。
演習で使うSASのプログラムは「f:hamaokadd]の中にあります(演習用データ&プログラムについて参照)。
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の後に「スペース$」を入れておく。
(unix版ではファイル名は区別する?)。
プロシジャによって異なりますが、オプションの指定は次の二カ所で行います(斜体部)。
詳細はプロシジャによって異なるのでマニュアルを参照。
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が印刷される。 |
講義で使うもののみ。
proc corr data=.....;
var x y;
by z;
proc means data=.....;
var x y;
by z;
proc corr data=.....;
var x y;
where z>100;
proc means data=.....;
var x y;
where x<10;
var 変数名;
proc cluster DATA=.... outtree=treeout method=ward;
var x1 x2 x3 x4 x5;
id smpno;
/* 階層型を表す樹系図を出力 */
proc tree data=treeout;
id smpno;
run;
hBAR 変数名 /オプション;
proc chart data=.....;
hbar x;
run;
proc chart data=.....;
hbar x y z ;
run;
var 変数名 with 変数名 ;
proc corr data=..... nomiss noprob ;
var x y z;
run;
var 変数名;
proc factor data=... rotate=varimax preplot plot scree nfact=3 out=cmfac;
var x1 x2 x3 x4 x5;
run;
var 変数名;
proc fastclus DATA=.. out=clout2 maxc=2 cluster=clindx;
var x1 x2 x3 x4 x5;
run;
table 行方向の変数名 * 列方向の変数名 /(検定)オプション;
proc freq data=.....;
table x;
run;
proc freq data=.....;
table x*y;
run;
proc freq data=.....;
table (x1 x2 x3)*(y1 y2 y3);
run;
class 水準を表すノンメトリックな変数名;
model 従属変数=説明変数(classで指定した変数);
means 水準やグループを表す変数 / 平均値の差の検定方法;
行方向の変数名 * 列方向の変数名 /(検定)オプション;
proc glm data=...;
class clindx;
model y=clindx;
means clindx /tukey;
var 変数名;
proc means data=.....;
var x y;
run;
plot 変数名1*変数名2/オプション;
proc plot data=....;
plot y * x;
run;
proc gplot; proc gchartとするとグラフィックでグラフが出力される。
var 変数名;
proc print data=.....;
var x y;
run;
model 被説明変数名=説明変数/オプション;
output out=出力オプション;
proc reg data=.....;
model y1=x1 x2 x3 x4;
run;
proc reg data=...;
model y1=x1 x2 x3 x4;/p r stb cli ;
output out=reg_out1 p=prd r=res;
run;
id idとして使う変数名;
/* 階層型のクラスター分析 */
proc cluster DATA=ens.ensdat1l outtree=treeout method=ward;
var f_l1-f_l4;
id smpno;
/* 階層型を表す樹系図を出力 */
proc tree data=treeout;
id smpno;
run;
var 変数名
proc univariate data=..... normal plot;
var x;
run;
自分で用意するデータの形式としては次のようなものがあるでしょう。
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というデータをエクセルで作成する。
注)残念ながら、大学院棟のパソコン教室のsasでは、文字データ(漢字、英字とも)を下の方法でファイルから読みとることはできないようです(原因については調査を依頼の予定)。
よって、次の二つの方法のどちらかで対応して下さい。
(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)テキスト形式で保存
SASでデータを読み込むためには、テキスト形式に保存しなければならない。
注)次の条件を満たしておくことが必要[大橋ら(1994),p.28]。
各データは1個以上の空白で分離されていること。
必要な小数点はデータ内に含まれていること。
データの欠損値はピリオド「.」としておくこと。
注)自由書式では、文字データは半角8文字(8バイト)=全角4文字までしか読み込めません。
より長い全角文字列を読みたい場合には、固定書式としてください。
→エクセルで新しいワークシートを開き、上のデータのうち、データの部分のみ(変数名の部分は含まない)をコピーしてテキスト形式で保存する。
注)保存のとき「ファイル形式」でテキスト(スペース区切り)を選ぶとテキスト形式で保存される。
→保存するファイル名はkendat.prnとする。
3)sasによる読み込み&永久データセットの作成
次のsasプログラムをsasのprogram editorに入力(この画面からコピーできるはず)。
サブミットしてみる(斜線は自分たちのデータによって変更が必要な部分)。
LIBNAME md "a:\mydata\";
/*a:\mydata\の下にkenssdtという名前の永久データセットを作成する。*/
DATA md.kenssdt;
INFILE 'a:\mydata\kendat.prn' delimiter=' ' ;
/* delimiter=でデリミタ(データの区切のための文字)を指定する。
この場合はスペース*/
input kenno kenname $ popltn suprsal;
/*県名は文字変数なので、変数名の後に$をつける*/
proc means data=md.kenssdt;
/*入力ミスがないか確認のため記述統計を算出。
変数名を指定していないのでデータセットに含まれる
すべての変数(文字変数を除く)について計算される。*/
proc print data=md.kenssdt;
/*入力ミスがないか確認のためデータを印刷。
変数名を指定していないのでデータセットに含まれる
すべての変数が印刷される。*/
run;
注)漢字データの読み込みがうまく行かない場合は、文字データを漢字ではなくローマ字にしてみる(例 東京→tokyoなど)。
ローマ字ならば読み込める場合には、double-byte character sets (DBCS)オプションがインストールされていないと考えられます。→システムの管理者に相談して下さい。
付録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個定義してしまうと、行列がランク落ちしてしまう)。
プログラムの実行結果(「無職」はいないので、全サンプルについて0となっているのでエラーが出ている)