SAS入門5/1

Last-modified: 2008-11-18 (火) 19:17:50
サマリ連続変数のレンジ
投稿者anonymous?
状態
投稿日2008-11-17 (月) 14:45:35

質問

class sex expense; と入力すると,全員の金額が違うために頻度1のデータが4つになってしまうように思いました(4人の場合).
その後formatをexpfとする事で,出力だけではなく,ここで改めてレンジも決定されるのでしょうか.わかり難くて恐縮ですが,ご回答宜しくお願いいたします.

回答

  • 質問の内容を確認しますが,
proc summary data=sample nway missing;
  class sex expense;      /*性別,定期代レンジ別に集計*/
  output out=sum;
  format sex $sexf. expense expf.;
run;
proc print data=sum;run;
/*
性別,定期代レンジ別の度数_freq_をもつデータセットが生成
OBS    sex     expense      _TYPE_    _FREQ_
 1     女     1万円以上       3         1
 2     男     1万円未満       3         1
 3     男     1万円以上       3         2
*/

において,sampleは,4obsであり,sexとexpenceの値は,みな違うのだから,なぜ3obsにまとまってしまうのか,説明してほしいということで,よろしいですか?

それについて,お答えします.
結果から先にいうと,

OBS     ID      name      sex    station         expense
 3     004    tanaka     M     yokohama        15,830
 4     003    takahashi  M     funabashi       17,800

の2人は,共にsex=男,sepense=1万円以上ですので,同じ分類にまとめられます.
確かに,expenseの値は,別ですが,

format ... expense expf.;

と,expenseには,ユーザ定義フォーマットexpf.を適用するように指定しており,フォーマットexpf.は,その前に

value expf     /*定期代を1万円未満と以上に分類するフォーマットを作成*/
   .="不明"
  0-<10000="1万円未満"
  10000-high="1万円以上"
  ;

と10000-highの範囲の値を「1万円以上」というカテゴリに分類するよう定義していましたから,お察しのとおり,このような結果となります.おわかりいただけましたでしょうか?

なお,SUMMARYプロシジャのことでひとつ書かなかった,ちょっと重要なことがあったので,ついでにここで触れておきます.
この例のように,フォーマットを使って,異なる値を指定したレンジにまとめることができました.ただ,注意すべきことは,まとめられた結果のデータセットの値です.たった今,確認した,まとめられたデータセットsumの中身を,表示フォーマットを少し変えてもう一度みてみましょう.

proc print data=sum;format sex $. expense best20.;run;
/*
OBS    sex                 expense    _TYPE_    _FREQ_
 1      F                    13650       3         1
 2      M                     6160       3         1
 3      M                    13650       3         2
*/

変数sexの内部値は,「男」「女」ではなく,「M」「F」です.先の例では,SUMMARYプロシジャがsumデータセットを作り出すときに指定されたフォーマットを,その変数のデフォルトフォーマットとして設定したので,「男」「女」と表示されていたのですが,それは,内部値ではなく,フォーマットの表示結果だったということです.で,注目すべきなのは,変数expenseのほうです.こちらも,内部値は,表示されていた,「1万円未満」,「1万円以上」ではなく,もとのデータにあった,数値データです.しかし,よくみると,少しへんですね.OBS=3のデータは,元のデータでのtanaka,takahashiの2つのデータのはずですが,2人とも,そのexpenseの値は, 13650ではありません.この値は,どこから来たかというと,「1万円以上」のカテゴリに該当した最小のデータ,suzukiのexpenseの値なのです.
このように,SUMMARYプロシジャがまとてくれた分類変数の値は,指定したフォーマットに従って,異なる値を定義されたレンジにまとめてくれるのですが,その時に吐き出されるデータセットの分類変数の「内部値」は,このような仕組みで設定されることは覚えて置きましょう.というのは,フォーマットでまとめられて表示されているのを見ていると,内部値があるきりのいい値に揃えられているように思ってしまうかもしれませんが,実際には,内部値は,もとのある値を代表で使っています.このことを知らずに,別のデータとマージなどを行うと,思い通りに値が一致してくれないということを経験することになるでしょう.(実際の例がないとわかりにくいかも..その時はまた聞いてください)-- 2008-11-17 (月) 16:30:52

  • お答え頂き有難うございました,

しかし,今作成して下さった一番下のデータセットでは,formatをexpense best20 にしても,valueで設定したexpfの分類が適用されているのですが,これは何故なのでしょうか.表記は数値でも,内部的にexpfと同様の分類が行われているのでしょうか?
format ... expense expf.;により,初めて分類が適用されると思っておりました.度々申し訳ありませんが,ご回答頂けると幸いです. -- 質問者? 2008-11-17 (月) 18:28:30

  • お答えします.

SUMMARYプロシジャの処理を大きく分けると次のようになります.
①CLASSステートメントで指定されている分類変数の値に従って,データセットのオブザベーションを分類します.このとき,分類変数にフォーマットが指定されていれば,フォーマット表示された値が同じものを同じ分類グループとします.ただし,分類の値として出力データセットに記録されるのは,その分類の最小の値です(たぶんですが).フォーマットは,この例のように,SUMMARYプロシジャで指定してもいいし,あらかじめ,入力データセットでデフォルトフォーマットに設定されているのであれば,SUMMARYプロシジャに指定がなくても,それが使われることになります.
②分類グループ毎のオブザベーション件数を数えます.さらに,VARステートメントにより,分析変数も指定されていれば,分類グループ毎の分析変数の統計量(デフォルトは合計値)を計算します.
③分類グループ毎の件数や統計量のデータを分類変数とともに集約データとしてに出力します.
本当の処理の流れは私にはわかりませんが,このような流れだと思います.また,すべての①が終わってから②や③にうつるのではなく,ある程度入力データセットを読み込みながら①,②,③を平行して進行させているかもしれません.
で,この処理において,①と③で,指定フォーマットが使われます.
①における同一分類グループの判定のところで,内部値が異なっていても,フォーマットを通して,同じ表示値になるものは,同じ分類グループとみなされます.
③においては,分類グループにまとめられた集約データのデフォルトフォーマットに,指定したフォーマットが設定されます.
ご質問の「expense best20 にしても,valueで設定したexpfの分類が適用されている」というのは,集約データは,①のとおり,分類グループに仕分ける段階で,フォーマットが使われてるので,後から,集約データをbest20.で表示させても,分類はすでに終わったことで,分類結果が変ることはありません.
質問の文をみると,もしかしたら,format expense expf.;が,DATAステップでのformatステートメントとまったく同じ機能,すなわち,「表示するときのデフォルトフォーマットとして設定する」だけの機能と考えておられるかもしれませんね.
SUMMARYプロシジャにおいては,①のように,処理する変数の値をフォーマットを通して動的に変えてあげることができ,これはPROCステップの他のプロシジャにおいても,共通する考え方です.どうでしょう.疑問のお答えになりましたでしょうか? -- 2008-11-17 (月) 21:51:47

  • ご丁寧にお答え頂き恐縮です,

ステップによりステートメントの役割が違うのですね.よく分かりました (^^)それから,①の”分類の値として最小値が…”という事が,上で回答頂いた項目にありました”suzukiのexpenseの値になっている”という現象の元なのなのだろうと解釈しました(違っていたらすみません) .分かり易くご説明頂き,ありがとうございました! -- 質問者? 2008-11-18 (火) 09:23:05

  • 私の考えを述べます.

「ステップによりステートメントの役割が違うのですね.」というのが,そうなのかどうか私にも内部的なことはよくわかりません.次のように考えればすっきりしませんか?
1)SUMMARYプロシジャ(他のプロシジャや,DATAステップについても)においてのFORMATステートメントは,入力データセットの変数に対して,処理中に一時的に有効となるフォーマットを指定している.
2)SUMMARYプロシジャ(他の処理についても)では,一時的か否かによらず,処理時点で有効だったフォーマットが使われる.
3)出力データセットは,入力データセットの処理時点で有効だったフォーマットを継承する.-- 2008-11-18 (火) 10:40:15

  • 確かにすっきりです,ありがとうございました (^^) -- 質問者? 2008-11-18 (火) 19:17:49