SAS Learning · Exam Prep

SAS 9.4 Base Programming Performance-Based Exam 対策

試験範囲を「読む」だけで終わらせず、DATA ステップ、PROC、ログ確認、レポート出力を実際に書ける状態へ持っていくための学習ページ。

SAS 学習 · Base Programming Specialist · A00-231

Overview

この試験は、暗記より「書けるか」を見る

SAS 9.4 Base Programming は、データを読み、加工し、エラーを直し、基本レポートを出す力を測る試験です。

SAS 公式の資格ページでは、この認定で示すスキルとして「データファイルの読み書き」「Base SAS プロシジャによる詳細・要約レポート」「データの操作と変換」「構文エラーとロジックエラーの特定・修正」が挙げられています。試験 ID は A00-231、試験時間は 135 分、問題数は 40-45 問、合格スコアは 725 / 1000、対象は SAS 9.4 M5 です。

学習方針

比重が最も大きいのはデータ管理です。まず DATA ステップでの変数作成、条件分岐、関数、BY グループ処理、DO ループを固め、その後に入出力とレポートへ広げるのが効率的です。

参照: ローカル PDF articles/sas/docs/specialist-base-programming.pdf / SAS 公式 Exam Content Guide

Domain Map

試験範囲を、手を動かす単位に分解する

1. データ構造へのアクセスと作成

  • DATA ステップで既存データセットから一時・永久 SAS データセットを作る。
  • LIBNAMEPROC CONTENTS でライブラリとデータセット構造を調べる。
  • SETPROC IMPORT、XLSX エンジンで SAS / CSV / Excel データを読み込む。
  • 縦結合、1 対 1 マージ、1 対多マージを使い分ける。
  • SAS 日付値、informat、format、DATA ステップの WHEREDROP / KEEP を扱う。

2. データ管理

  • PROC SORTNODUPKEYOUT= で観測値の並べ替えと重複削除を行う。
  • IF-THEN/ELSEDO/END、代入文、日付定数、LENGTHLABELFORMAT を使う。
  • BYfirst.last.RETAIN、SUM ステートメントで小計・合計を累積する。
  • 文字・数値・日付関数、INPUT / PUT、変数リスト、DO ループ、PROC TRANSPOSE、マクロ変数を使う。

3. エラーハンドリング

  • PUTLOG で変数値、フォーマット済み値、全変数値をログに出す。
  • 条件付き PUTLOG で特定ケースだけを追跡する。
  • 構文エラー、スペルミス、引用符の不一致、セミコロン欠落、無効なオプションをログから読む。
  • ロジックエラーは「実行できたが結果が違う」ものとして、入力、条件、型変換、BY 処理を疑う。

4. レポートとアウトプット生成

  • PROC PRINTVARSUMWHEREIDBYLABELSPLIT= を使う。
  • PROC FREQPROC MEANSPROC UNIVARIATE で度数、要約統計、欠損・外れ値を確認する。
  • PROC FORMATLABELSPLIT=、タイトル、フットノートで出力を読みやすくする。
  • ODS HTML/PDF/RTF、Excel で表示できる ODS 出力、PROC EXPORT、XLSX エンジンで結果を書き出す。

Core Syntax

まず暗唱できるまで書きたい構文

試験対策では、説明を読んで分かった気になるより、短いコードを何度も書くほうが強いです。以下は最小単位の型です。

ライブラリと構造確認

libname cert "/path";
proc contents data=cert.sales; run;

CSV / Excel 読み込み

proc import datafile="file.csv" out=work.raw dbms=csv replace;
guessingrows=max; run;

抽出と列制御

data work.q1;
set cert.sales(keep=id date amount);
where amount > 0;
run;

並べ替えと重複削除

proc sort data=work.q1 out=work.q1_sorted nodupkey;
by id date; run;

BY グループ累計

if first.id then total=0;
total + amount;
if last.id then output;

型変換

num = input(char_amount, comma12.);
char_date = put(sale_date, yymmdd10.);

要約

proc means data=work.q1 n mean sum maxdec=1;
class region; var amount; run;

ODS 出力

ods pdf file="report.pdf" style=journal;
proc print data=work.q1 label; run;
ods pdf close;

Practice

演習: 1 問を 15 分で解く型を作る

Performance-Based では、コードを組み立て、ログを読み、出力を確認する流れが重要です。

問題文から「入力」「処理」「出力」を線引きする

入力ファイル形式、ライブラリ、必要列、抽出条件、グループ単位、出力データセット名を先にメモします。ここで WHEREIFKEEP=KEEP の使い分けも決めます。

小さく実行して PROC CONTENTS / PROC PRINT(obs=) で見る

いきなり完成形を書かず、読み込み直後の列名、型、長さ、日付表示を確認します。特に Excel / CSV は推測された型で崩れやすいので、GUESSINGROWSinformat を意識します。

ログの NOTE / WARNING / ERROR を読む

赤い ERROR だけでなく、型の自動変換、未初期化変数、欠損値の生成といった WARNING / NOTE も点を落とす原因になります。BY 変数の未ソートはログで明確に確認します。

最後に件数・合計・欠損を検算する

PROC FREQPROC MEANSPROC PRINT を検算用に使います。試験では見た目のレポートより、指定どおりのデータセットや値になっているかが大事です。

構文解説: 読み込みから検算までの流れ

  • libname で入力データの保存場所に参照名を付ける。
  • PROC CONTENTSPROC PRINT(obs=) で、加工前に型・長さ・先頭行を確認する。
  • PROC SORTBY は、グループ累計やマージの前提を作る。
  • first. / last. と SUM ステートメントで、顧客ごとの合計を 1 行にまとめる。
  • PROC MEANS は、最終データセットの件数・平均・合計が妥当かを検算する。
/* 練習用テンプレート: 読む → 加工 → 検算 */
libname cert "/home/u/cert";

proc contents data=cert.orders; run;
proc print data=cert.orders(obs=10); run;

proc sort data=cert.orders out=work.orders_sorted;
  by customer_id order_date;
run;

data work.customer_total;
  set work.orders_sorted;
  by customer_id;
  if first.customer_id then total_amount=0;
  total_amount + amount;
  if last.customer_id then output;
  keep customer_id total_amount;
run;

proc means data=work.customer_total n mean sum maxdec=2;
  var total_amount;
run;

Decision Points

本番で迷いやすい判断を先に決めておく

Performance-Based の問題は、知識を単独で聞くより「どの構文を選ぶか」を問います。次の判断を反射的にできると、コードを書く時間が短くなります。

WHEREIF

入力データに元からある変数で行を絞るなら WHERE。DATA ステップ内で作った変数や複雑な処理結果で絞るなら IF

KEEP=KEEP

読み込み前に列を減らすなら入力データセットオプションの KEEP=。最終出力の列を指定するなら KEEP ステートメント。

SETMERGE

同じ構造のデータを縦に積むなら SET 複数指定。キーで横に列を足すなら MERGE ... BY と事前ソート。

FORMATINPUT / PUT

表示だけ変えるなら FORMAT。文字と数値の型を変換するなら、文字から数値は INPUT、数値から文字は PUT

CLASSBY

PROC の中で分類して要約したいなら CLASS。グループごとに処理を分けたい、または DATA ステップで first./last. を使うなら BY とソート。

ログで止まるか、検算へ進むか

ERROR は先頭から直す。WARNING と重要な NOTE は結果が怪しいサインとして、件数・欠損・合計で検算する。

Item-Based Learning

項目ごとの学習ロードマップ

時間割ではなく、試験ガイドの項目をそのまま学習単位にします。各項目で「覚える構文」「できる状態」「確認問題」をセットにしてください。

20-25% · Access and Create Data Structures

データ構造へのアクセスと作成

一時・永久データセット

DATA ステップで、既存データセットを読み込み、新しい SAS データセットを作れる状態にします。work は一時、ライブラリ参照名つきは永久です。

  • 練習: data work.sample; set cert.source; run; を書く。
  • 確認: セッション終了後に残るデータセットと消えるデータセットを説明できる。

ライブラリ調査

LIBNAME で保存場所に名前を付け、PROC CONTENTS で変数名、型、長さ、format、informat、ラベルを確認します。

  • 練習: ライブラリ内の全テーブルと、指定テーブルの構造を確認する。
  • 確認: 文字型 / 数値型の違いを、処理前に判断できる。

外部データの読み込み

PROC IMPORTOUT=DBMS=REPLACEGUESSINGROWS を使い、区切り文字付きファイルと Excel ファイルを読みます。

  • 練習: CSV と XLSX をそれぞれ読み、読み込み後に PROC CONTENTS で型を検査する。
  • 確認: 推測された型が間違うケースと、その対処を言える。

データセット結合

縦に足す連結、横に並べる 1 対 1 マージ、キーを使う 1 対多マージを区別します。マージ前の PROC SORT を忘れないことが重要です。

  • 練習: 同じ列構造の月別データを連結し、顧客マスタを売上データへマージする。
  • 確認: SET 複数指定と MERGE ... BY の違いを説明できる。

日付値と行・列制御

SAS 日付値は基準日からの日数として保存されます。表示は format、読み込みは informat で制御します。行は WHERE / IF、列は DROP / KEEP で制御します。

  • 練習: 文字列の日付を INPUT で SAS 日付値にし、FORMAT で表示を整える。
  • 確認: WHEREIFKEEP=KEEP の実行タイミングを説明できる。

35-40% · Manage Data

データ管理

並べ替えと重複削除

PROC SORTBYOUT=、重複削除オプションを使います。後続の BY 処理とマージの土台です。

  • 練習: 元データを残したままソート済みデータを作る。
  • 確認: 重複行を消す場合と、キー重複を消す場合の違いを整理する。

条件分岐と複数ステートメント

IF-THEN/ELSEDO/END で条件付き処理を作ります。条件が複数あるときは、上から順に評価されることを意識します。

  • 練習: 金額やカテゴリに応じてランク変数を作る。
  • 確認: else を入れないと、後続条件が再評価されるケースを説明できる。

代入文と属性変更

新規変数、既存変数、式、日付定数を代入します。文字変数は LENGTH の位置が重要です。LABELFORMAT は表示と説明を整えます。

  • 練習: 文字長を指定してカテゴリ名を作り、ラベルと format を付ける。
  • 確認: 変数名変更は RENAME=、表示名は LABEL であると区別できる。

小計・合計の累積

BYfirst.last.RETAIN、SUM ステートメントを使い、グループごとの累計を作ります。

  • 練習: 顧客別の合計金額、初回日、最終日を 1 行にまとめる。
  • 確認: SUM ステートメントが欠損を 0 として扱い、暗黙に retain されることを説明できる。

関数と型変換

文字関数、数値関数、日付関数を使います。型変換は自動変換に頼らず、文字から数値は INPUT、数値から文字は PUT で明示します。

  • 練習: SCANSUBSTRUPCASESUMROUNDINTCKINTNX を短問で使う。
  • 確認: ログに出る型変換 NOTE を読んで、明示変換へ直せる。

DO ループと転置

反復 DO、条件付き DO、ネスト DO を使い、繰り返し処理を短く書きます。PROC TRANSPOSE は縦持ち・横持ちの変換に使います。

  • 練習: 1 月から 12 月までの対象日を DO ループで作る。
  • 確認: VARIDBYOUT=PREFIX=NAME= の役割を言える。

マクロ変数

%LET で値を一箇所に置き、プログラム保守を簡単にします。マクロ変数名の直後に文字を続けるときはドット区切りを使います。

  • 練習: 入力ライブラリ名、対象年、出力ファイル名をマクロ変数化する。
  • 確認: &year. のドットが必要な場面を説明できる。

15-20% · Error Handling

エラーハンドリング

ロジックエラーの特定

コードは動いているのに結果が違う場合は、行数、欠損、型、条件、ソート、グループ境界を疑います。PUTLOG で途中の値を見ます。

  • 練習: 条件付き PUTLOG で、特定 ID だけ計算途中の値を出す。
  • 確認: _N__ERROR_ の意味を説明できる。

構文エラーの修正

SAS ステートメントはキーワードから始まり、セミコロンで終わります。引用符不一致、スペルミス、無効オプション、セミコロン欠落をログから逆引きします。

  • 練習: わざと壊したコードを作り、ログの最初の ERROR から直す。
  • 確認: 1 つのセミコロン欠落が、後続の複数エラーに見えることを理解する。

15-20% · Generate Reports and Output

レポートとアウトプット生成

一覧レポート

PROC PRINT の既定動作を、VARSUMWHEREIDBYLABELSPLIT= で制御します。

  • 練習: 表示列を絞り、ID 列を指定し、合計行を付けた一覧表を作る。
  • 確認: BY レポートには事前ソートが必要だと判断できる。

要約・度数・検証

PROC FREQPROC MEANSPROC UNIVARIATE はレポートだけでなく、データ検証にも使います。

  • 練習: カテゴリの件数、クロス集計、クラス別平均、極値、欠損を出す。
  • 確認: CLASSBY の違い、基本統計量やマルチレベル要約の読み方を説明できる。

表示形式と ODS / EXPORT

PROC FORMATLABEL、タイトル、フットノートで読みやすくし、ODSPROC EXPORT で外部ファイルへ出力します。

  • 練習: HTML、PDF、RTF、XLSX、CSV の出力を 1 回ずつ作る。
  • 確認: ODS の開閉忘れ、STYLE=DBMS=csv/tab/dlm を確認できる。

Practice Sets

項目別の演習セット

各項目の最後に、次のような小さな成果物を作ってください。大きな模試に入る前に、この粒度で手が止まらない状態を作ります。

データアクセス演習

CSV、Excel、既存 SAS データセットを読み込み、構造確認、型確認、先頭 10 行確認まで行う。

  • 成果物: 読み込み済みデータセット 3 つ、PROC CONTENTS 結果、読み込み時のログ確認。
  • 採点観点: 列名、型、長さ、日付の扱いが想定どおりか。

加工演習

抽出、列制御、文字加工、数値加工、日付計算、グループ累計を 1 本の DATA ステップにまとめる。

  • 成果物: 顧客別またはカテゴリ別の集計データセット。
  • 採点観点: 件数、合計、欠損、ソート順、変数属性が指定どおりか。

デバッグ演習

壊れたコードを 5 種類用意し、ログを読んで修正する。構文エラー 3 種、ロジックエラー 2 種を含める。

  • 成果物: 修正前コード、ログの原因メモ、修正後コード。
  • 採点観点: 最初に直すべき ERROR を見つけられるか、ロジックエラーを検算で見抜けるか。

レポート演習

同じデータから一覧、度数表、要約統計、HTML / PDF / RTF / Excel / CSV 出力を作る。

  • 成果物: PROC PRINTPROC FREQPROC MEANS、ODS 出力、PROC EXPORT
  • 採点観点: 表示列、ラベル、format、出力先、ファイル形式が指定どおりか。

Final Checklist

本番で落としやすいポイント

要注意

WHEREIF

WHERE は読み込み前に絞る。IF は DATA ステップで読み込んだ後に絞る。入力データセットオプションや集計前の件数に影響します。

要注意

KEEP=KEEP

KEEP= は読み込み / 書き出し対象をデータセット単位で制御。KEEP ステートメントは DATA ステップ出力変数を制御します。

要注意

文字長の決定タイミング

文字変数の長さは最初に現れた定義で決まります。LENGTH は代入文より前に置くのが基本です。

要注意

BY 処理前のソート

BYfirst.last.、マージは BY 変数でソート済みであることが前提です。ログの BY 関連エラーを見逃さないようにします。

Readiness Check

受験前に「説明できる」だけでなく「書ける」状態にする

次の項目を、何も見ずに短いコードとして書けるか確認してください。詰まった項目は、対応する詳細ページに戻って練習します。

入力LIBNAMEPROC CONTENTSPROC IMPORT、XLSX エンジンで、入力元を読み込み、型と長さを確認できる。
整形LENGTHLABELFORMATRENAME=、日付定数、条件分岐で、指定された変数を作れる。
集計PROC SORTBYfirst.last.、SUM ステートメントで、グループごとの 1 行サマリーを作れる。
変換文字・数値・日付関数、INPUT / PUT、DO ループ、PROC TRANSPOSE、マクロ変数を小問で使える。
検証PROC PRINT(obs=)PROC FREQPROC MEANS、ログの NOTE / WARNING / ERROR で、結果の妥当性を確認できる。
出力PROC PRINTPROC FORMAT、ODS HTML/PDF/RTF、PROC EXPORT、XLSX エンジンで、人が読む出力と外部ファイルを作れる。

Sources

参照した公式情報

このページは、ローカルに保存した試験コンテンツガイドと、SAS 公式の資格・学習リソースをもとに構成しています。試験仕様は変わる可能性があるため、受験前に必ず公式ページを確認してください。