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 練習問題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変数で停止しました。
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社から出版されている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 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プロシジャの方が小さくなる。
出力するデータに欠損値や改行文字が含まれている場合、csvをExcelで読み込んだ
場合の挙動が異なるので注意する。
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プロシジャで出力した方は改行を挟んで別の行となってしまう。