2017年2月23日木曜日

頻度集計で存在しない水準値を0件として出したい【PROC SUMMARY編】



まずは失敗例から。

失敗例
*** サンプルデータ作成 ;
data DT1;
input NO$ YN SEX;
cards;
001 1 2
002 1 2
;

YN…何かの有無(0=無、1=有)
SEX…性別(1=男、2=女)




*** FORMAT作成 ;
proc format;
   value _YN
   0 = "無"
   1 = "有"
   ;
   value _SEX
   1 = "男"
   2 = "女"
   ;
run;

*** 変数YN, SEXの頻度集計 ;
proc freq data=DT1;
   tables YN SEX;
   format YN _YN. SEX _SEX.;
run;




変数YNとSEXの頻度集計をしています。

その際、YNに以下フォーマットを当てています
「0=無」「1=有」

SEXには以下フォーマットを当てています
「1=男」「2=女」

結果を見てみると、「YN=0 (無)」と「SEX=1(男)」の度数が出てませんね。
これは集計対象のデータセットDT1に該当の値が存在しないからです。



PROC FREQでは現状0件の水準を出せないので、PROC SUMMARYで出してみましょう。
※今回の例は「1変数毎の頻度集計」のみに対応しています
※また、集計対象が0オブザベーションの場合、今回紹介するオプションは機能しません。

proc summary data=DT1 print completetypes;
   class YN SEX / preloadfmt missing;
   format YN _YN. SEX _SEX.;
   ways 1;
run;


POINT1

PROC MEANSでも似たようなことが出来るけど、PROC SUMMARYを使った理由。
それは、以下の記事を見ると理解しやすいと思います。


ちょっと解説すると、2つのプロシジャの違いのひとつが「VARステートメント」を省略した場合。
  • PROC MEANS: CLASSステートメント等、その他のステートメントに指定していない「すべての数値変数の要約統計量」が求められる
  • PROC SUMMARY:「オブザベーション数」のみ求められる

今回は頻度集計を求めたいだけなので、PROC SUMMARYが最適というわけです。
(ちなみにPROC SUMMARYでは「PRINT」オプションを指定しないと出力結果が表示されません)


POINT2

サンプルプログラムで指定している「COMPLETETYPES」「PRELOADFMT」「WAYS」については以下の記事を見て頂くと理解しやすいと思います。


ちなみにCLASSステートメントに「MISSING」をつけているのは以下データステップ100万回で解説されている落とし穴予防の為です(今回の例では問題ないけど)

0 件のコメント:

コメントを投稿