Study SAS

統計解析ソフトウェアSASについて学習したことのまとめやSAS認定試験対策など

SAS Base Programmer 練習問題19

以下のような内容のデータセットQTR1_REVENUEがある。

destination revenue
YYZ 53634
FRA 62129
FRA 75962
RDU 76254
YYZ 82174

次のSASプログラムをコミットする。

proc sort data = qtr1_revenue;
    by destination descending revenue;
run;

出力データセットの最初のオブザーベーションはどれか

A.

destination revenue
YYZ 82174

B.

destination revenue
YYZ 53634

C.

destination revenue
FRA 62129

D.

destination revenue
FRA 75962

出典はこちら


答え: D (要反転)

変数destinationについて辞書の順番で並び替え、かつ同じdestinationのオブザーベーションについてrevenueの大きい順で並び替える。

data qtr1_revenue;
    destination = 'YYZ'; revenue = 53634; output;
    destination = 'FRA'; revenue = 62129; output;
    destination = 'FRA'; revenue = 75962; output;
    destination = 'RDU'; revenue = 76254; output;
    destination = 'YYZ'; revenue = 82174; output;
run;

proc sort data = qtr1_revenue;
    by destination descending revenue;
run;

このコードを実行すると以下の並び替えの結果が得られる。

destination revenue
FRA 75962
FRA 62129
RDU 76254
YYZ 82174
YYZ 53634

SAS Base Programmer 練習問題18

以下のSASプログラムをサブミットする

data work.month;
    date = put('13mar2000'd, ddmmyy10.);
run;

データセットに出力される変数DATEの型とデータ長は次のどれか

A. 数値変数, 8バイト
B. 数値変数, 10バイト
C. 文字変数, 8バイト
D. 文字変数, 10バイト

出典はこちら


答え: D (要反転)

putは数値データを指定したフォーマットで文字データに変換する。
WORK.MONTHには以下の文字列(10文字分)が出力される。

Obs date
1 13/03/2000

SAS Base Programmer 練習問題17

次のSASプログラムをサブミットする

data work.total;
    set work.salary(keep = department wagerate);
    by department;
    if first.department then payroll = 0;
    payroll + wagerate;
    if last.department;
run;

SASデータセットWORK.SALARYには5つのdepartmentのデータが100オブザーベーションずつ含まれ、変数DEPARTMENTでソートされている。
WORK.TOTALデータセットにはいくつのオブザーベーションが格納されているか

A. 5
B. 20
C. 100
D. 500

出典はこちら


答え: A (要反転)

byステートメントを使用してグループ(department)ごとに合計を算出している。5つのdepartmentがあるため、オブザーベーション数は5つとなる。
byステートメントの使い方はこちらを参照。

5つのdepartmentのソート済みデータは例えば以下のようなデータセット

data salary;
    department = 'A'; wagerate = 1000; output;
    department = 'A'; wagerate = 2000; output;
    department = 'A'; wagerate = 3000; output;
    department = 'B'; wagerate = 4000; output;
    department = 'B'; wagerate = 5000; output;
    department = 'C'; wagerate = 6000; output;
    department = 'C'; wagerate = 7000; output;
    department = 'C'; wagerate = 8000; output;
    department = 'D'; wagerate = 9000; output;
    department = 'D'; wagerate = 10000; output;
    department = 'D'; wagerate = 11000; output;
    department = 'D'; wagerate = 12000; output;
    department = 'E'; wagerate = 13000; output;
    department = 'E'; wagerate = 14000; output;
    department = 'E'; wagerate = 15000; output;
run;
Obs department wagerate
1 A 1000
2 A 2000
3 A 3000
4 B 4000
5 B 5000
6 C 6000
7 C 7000
8 C 8000
9 D 9000
10 D 10000
11 D 11000
12 D 12000
13 E 13000
14 E 14000
15 E 15000

このデータセットを入力として下記のコードを実行する。

data total;
    set salary(keep = department wagerate);
    by department;
    if first.department then payroll = 0;
    payroll + wagerate;
    if last.department;
run;

各departmentの最初のオブザーベーションで合計値を格納する変数payrollに0を代入、最後のオブザーベーションのときにデータセットに出力するようになっている。

Obs department payroll
1 A 6000
2 B 9000
3 C 21000
4 D 42000
5 E 42000

データセットTOTALにはdepartmentごとのwagerateの合計値が格納されている。

SAS Base Programmer 練習問題16

DATAステップでデータエラーとなった場合の挙動で正しいものは次のどれか

A. エラーとなったところでDataステップが中断し、SASデータセットは作成されない
B. エラー内容のnoteがSASログに出力され、Dataステップの実行は継続される
C. 不正なデータレコードが別のSASファイルに保存されたという内容のnoteが出力される
D. エラーとなったところでDataステップが中断し、そこまでに処理したオブザベーションを含むデータセットが作成される

出典はこちら


答え: B (要反転)

エラーのタイプによって継続して実行を行う場合と、中断される場合とに分かれる。データエラーは前者のタイプ。
例えば以下のようなDataステップはデータエラーとなる。

data temp;
    input num;
    datalines;
1
2
3
4
a
5
6
7
8
;
run;

数値であるべきデータにaが入っている。
これを実行すると

NOTE: numに対して、無効なデータが行32カラム1-1にあります。

のようなnoteがSASログに出力されるが

Obs num
1 1
2 2
3 3
4 4
5 .
6 5
7 6
8 7
9 8

以降のオブザベーションは継続して実行され、データセットが作成される。

一方、以下のようなシンタックスエラーではDataステップの実行が中断される

data temp;
    input num;
    format num = 2.;
    datalines;
1
2
3
4
a
5
6
7
8
;
run;

formatステートメントに不要な'='が入っている。
これを実行すると

NOTE: エラーが発生したため、このステップの処理を中止しました。
WARNING: データセットWORK.TEMPは未完成です。このステップは、
         0オブザベーション、1変数で停止しました。

処理を中止したため、データセットが作成されない旨のnoteがSASログに出力されている。

SAS Base Programmer 練習問題15

次のSASプログラムをサブミットする

proc means data = sasuser.houses std mean max;
    var sqfeet;
run;

結果の値を小数点以下2位まで表示するのに必要となる修正は以下のどれか

A. MEANSプロシジャに MAXDEC=2 のオプションを追加する
B. MEANSプロシジャのステップに MAXDEC=7.2; のステートメントを追加する
C. MEANSプロシジャのステップに FORMAT STD 7.2; のステートメントを追加する
D. MEANSプロシジャに FORMAT=7.2 のオプションを追加する

出典はこちら


答え: A (要反転)

data temp;
    do num = 0 to 9;
        output;
    end;
run;
Obs num
1 0
2 1
3 2
4 3
5 4
6 5
7 6
8 7
9 8
10 9

このデータセットにMEANSプロシジャを適用する。

proc means data=temp std mean max;
    var num;
run;
標準偏差 平均 最大値
3.0276504 4.5000000 9.0000000

何も指定しない場合はSASが適切な表示フォーマットを選択する(BESTw.フォーマット)。

proc means data=temp std mean max maxdec=2;
    var num;
run;
標準偏差 平均 最大値
3.03 4.50 9.00

MAXDECオプションで表示する小数点以下の桁数を設定できる。
桁数なので設定できる値は整数値のみとなる。

SASグローバル認定プログラム受験対策向けの教材

SAS Base Programmerを受験される方向けに学習コンテンツのご紹介

  • SAS Certification Prep Guide:
      Base Programming for SAS 9

SAS社から出版されているSAS Certificationの対策教本です。公式のテキストということもありSAS Base Programmer for SAS 9の出題範囲が全てカバーされています。各章末に4択形式の確認問題があるので、一通り解いて出題形式に慣れておくとよいと思います。Amazonで書籍版とKindle版が購入可能です。また、上記タイトルは英語の書籍なのですが、日本語版も「SAS認定プロフェッショナルのためのBase Programming for SAS 9 完全ガイド」という名称で出版されています。こちらはSAS社のWebページから購入できます。

英語版(書籍) 14,843円
英語版(Kindle 5,989円
日本語版(書籍) 19,440円

内容は同じですが英語版(とくにKindle版)が安いので、英語で大丈夫そうな方は英語版を購入するのがお得かもしれません。かなり厚くて重い本なので、私はKindle版を購入してiPadで読んでいました。

  • Step-by-Step Programming with Base SAS 9.4

SASのドキュメントとしてこちらからダウンロードできます。SASの基本的な内容がまとめられていて(SASのドキュメント類の中では)読みやすいのですが、残念ながら現時点では英語版しかありません。英語圏の学習者向けのおすすめ教材の1つとしてよく挙げられているので、日本語版を出してくれないかなーと常々思っています。

  • 試験対策 e-learning

SAS Base Programmer向けとして以下のe-learningコースが販売されています。

SAS認定プロフェッショナル模擬問題 7,560円

本番と同じ質問形式の問題が114問収録されている問題集です。私は購入していないので詳しい内容は分かりません。価格としてはそれほど高いものではないので、万全を期すために取り組むのもありだと思います。

  • 試験対策トレーニングコース

SAS社のセミナールームで開催されるトレーニングセミナーです。SAS Base Programmer向けの講座は以下の3つです。

SASプログラミング1:必須要素(3日間) 178,200円
SASプログラミング2:データ加工テクニック(3日間) 178,200円
SAS Base Programmer for SAS9 ポイント解説講座(1日間) 78,840円

高いです。会社に費用を出してもらえるのであれば、学習期間を短縮できると思われます。そうでなければ特に受講の必要はありません。


ここまでは、いずれもSAS社が出しているコンテンツですが、その他のWebで入手可能なテキストとしては以下のものがおすすめです。

  • データマインテックのSAS講習会用テキスト(Base SAS 編)

こちらにテキストが公開されています。もちろん日本語です。

基礎的な内容がコンパクトにまとまっているので、SAS Certification Prep Guideが難しいと感じる方はこちらに目を通しておくとよいです。実際に手を動かしながら学習できるようになっています。テキストの最後の方の[SQLプロシジャ]と[SASマクロ機能]はSAS Advanced Programmerの方の試験範囲なので読み飛ばして問題ありません。PDV(Program Data Vector)のようなSASの内部の仕組みなどについては他の教材で補う必要があります。

  • まとめ

SAS Certification Prep Guideを中心に学習し、それ以外はお好みでということになります。日常の業務でSASを使っているという方でも、実際に試験問題を解く練習をすることを強くおすすめします。
また、本サイトでも受験される方の助けになるような内容を提供していければと思います。

データセットをcsv形式のファイルに出力する

sasデータセットcsv形式のファイルに出力する方法として、ds2csvマクロとexportプロシジャがある。

dataステップを利用して自前で出力することもできるが、csvのルールに沿ってデータを変換してくれるため、上記2つの方法の方が便利。

  • ds2csvマクロ
data temp;
    A = 1; B = 2; C = 3;
    output;
    A = 4; B = 5; C = 6;
    output;
    A = 7; B = 8; C = 9;
    output;
run;

%ds2csv(data=temp, runmode=b, csvfile=C:\work\SAS\output.csv);

出力ファイルの内容

"A","B","C"
"1","2","3"
"4","5","6"
"7","8","9"
  • exportプロシジャ
data temp;
    A = 1; B = 2; C = 3;
    output;
    A = 4; B = 5; C = 6;
    output;
    A = 7; B = 8; C = 9;
    output;
run;

proc export data=temp outfile='C:\work\SAS\output2.csv' dbms=csv replace;
run;

出力ファイルの内容

A,B,C
1,2,3
4,5,6
7,8,9

ds2csvマクロは全てのデータをダブルクォテーションで括って出力する。
一方、exportプロシジャを使用する場合は空白が入った文字列など、
必要なものだけダブルクォテーションで括る。そのため出力ファイルのサイズは
exportプロシジャの方が小さくなる。

出力するデータに欠損値や改行文字が含まれている場合、csvExcelで読み込んだ
場合の挙動が異なるので注意する。

data temp;
    length Case 8 Text $ 32;
    Case = 1; Text = 'Kitty on Your Lap';
    output;
    Case = 2; Text = 'Kitty on "Your" Lap';
    output;
    Case = 3; Text = 'Kitty,on,Your,Lap';
    output;
    Case = 4; Text = 'Kitty on' || '0d0a'x || 'Your Lap';
    output;
    Case = .; Text = '';
    output;
run;
  • ds2csvマクロで出力したcsvファイル
"Case","Text"
"1","Kitty on Your Lap"
"2","Kitty on ""Your"" Lap"
"3","Kitty,on,Your,Lap"
"4","Kitty on
Your Lap"
".",""
  • exportプロシジャで出力したcsvファイル
Case,Text
1,Kitty on Your Lap
2,"Kitty on ""Your"" Lap"
3,"Kitty,on,Your,Lap"
4,Kitty on
Your Lap
,

- ','を含む文字列 -> ダブルクォテーション括りになる。
- ' " 'を含む文字列 -> "が""に変換され、ダブルクォテーション括りになる。
- 改行文字を含む文字列 -> そのまま改行として出力される。
- 数値の欠損値 -> ds2csvマクロではピリオド、exportプロシジャは何も出力しない

出力したcsvファイルをExcelで読み込んだ場合、4番目のデータについて、ds2csvマクロで出力した方はセル内改行となるので元のデータセット通りに表示されるが、exportプロシジャで出力した方は改行を挟んで別の行となってしまう。