SUMMARYプロシジャは,分類変数の水準毎に,分析変数の統計値を出力するプロシジャです.
MEANSプロシジャと機能的に類似しています.
構文例
data sales;
input id sex $ age amount;
cards;
1001 M 20 1000
1002 F 30 2000
1003 M 30 3000
1004 F 30 4000
;
proc summary data=sales;
class sex age;
var amount;
output out=sum sum()=;
run;
/*
OBS sex age _TYPE_ _FREQ_ amount
1 . 0 4 10000
2 20 1 1 1000
3 30 1 3 9000
4 F . 2 2 6000
5 M . 2 2 4000
6 F 30 3 2 6000
7 M 20 3 1 1000
8 M 30 3 1 3000
*/
質問 SUMMARYプロシジャの出力の_TYPE_と_FREQ_ってなんですか?
回答
options nocenter;
/*
顧客の性別,年代毎に売上額合計を集計します
SUMMARYプロシジャのclassステートメントで
分類変数のsexとageを指定し,
varステートメントで集計対象の変数(分析変数)amountを
指定します.
outputステートメントでは,集計結果を出力するデータセット名sumと,
集計方法として「合計」を「sum()=」と書いて指示します.
ちなみに,結果を別名で出力したい時は,sum(amout)=amounttotalなどと指定できます.
*/
data sales;
input id sex $ age amount;
cards;
1001 M 20 1000
1002 F 30 2000
1003 M 30 3000
1004 F 30 4000
;
proc summary data=sales;
class sex age;
var amount;
output out=sum sum()=;
run;
proc print data=sum;run;
/*
これが集計結果のsumデータセットです.
OBS=1 は,sex ,ageが欠損(ブランクか,ピリオド)になっており,amountには総合計が入っています.
この時,変数_FREQ_には,合計したオブザベーション数(レコード行数)が格納されます.
_xx_は,SASが自動的に生成する自動変数の名前の特徴で,何種類もあります.
総合計の対象になったのは,全4件であったことがわかります.
OBS=2と3 は,20代,30代のサブトータル,OBS=4と5 は,性別毎のサブトータルです.
OBS=6,7,8が,性別と年代のクロスのサブトータルで,順に,女30代,男20代,男30代の売上額合計が入っています.
OBS sex age _TYPE_ _FREQ_ amount
1 . 0 4 10000
2 20 1 1 1000
3 30 1 3 9000
4 F . 2 2 6000
5 M . 2 2 4000
6 F 30 3 2 6000
7 M 20 3 1 1000
8 M 30 3 1 3000
ここで,変数_TYPE_を見てみます.
総合計は,_TYPE_=0,年代サブトータルでは,_TYPE_=1,性別サブトータルでは,_TYPE_=2
性別・年代サブトータルでは,_TYPE_=3となっており,おわかりのとおり集計した水準を区別しています.
意味は,ちょっとわかりにくいかもしれませんが,
_TYPE_の2進数表現が,どの水準を有効としているかどうかを示しています
_TYPE_ sex age
0 = 00b No No
1 = 01b No Yes
2 = 10b Yes No
3 = 11b Yes Yes
さて,多くの場合,末端のサブトータルだけが必要ということがあります.
その場合は,最初から,全分類変数の組み合わせの水準だけ出力させることができ,その場合上記のobs=6,7,8に相当する
3行だけが出力されます.それには,nway オプションを使います.
*/
proc summary data=sales nway;
class sex age;
var amount;
output out=sum sum()=;
run;
proc print data=sum;run;
/*
OBS sex age _TYPE_ _FREQ_ amount
1 F 30 3 2 6000
2 M 20 3 1 1000
3 M 30 3 1 3000
*/