SUMMARYプロシジャ

Last-modified: 2008-06-07 (土) 14:21:46

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
*/