Leo Yeh's Blog

SAS 快速入門 (1)

教學目標

撰寫 SAS 程式快速入門教學,適合對象為沒有學過 SAS 程式,但想學 SAS 程式的使用者。

重點概念

SAS 基本介紹

SAS 發展歷史

SAS 最早是由北卡羅來納大學的兩位生物統計學研究生所開發的統計分析系統 (Statistics Analysis System,SAS),首先在 1972 年開發出第一版,接著在 1976 年成立了 SAS 軟體研究所,同時推出了 SAS 軟體,主要是應用於資料分析,其中統計分析功能是最重要組成的核心功能,目前版本為 9.4。

SAS 應用模組

SAS 有許多功能模組,最常見的為 SAS BASE 基礎模組、SAS/STAT 統計分析模組、SAS/GRAPH 繪圖模組、SAS/ACCESS 存取外部資料模組、SAS/CONNECT 分散式資料處理模組、SAS/EM 企業級資料探勘模組、…等。

SAS 基本操作

撰寫程式

我們首先開啟「SAS Base 9.4 (中文(繁體))」軟體,接著在「檔案總管」中點選「資料館」,其中主要有三個重要的資料館必須了解,分別為:

  1. Sasuser:主要為 SAS 使用者個設定相關資訊檔案,永久儲存。
  2. Sashelp:主要為 SAS 範本資料集和協助系統檔案,永久儲存。
  3. Work:主要為資料集的臨時檔案,當退出 SAS 系統時就會被自動刪除

再來在「編輯器」中透過 SAS 範本資料集撰寫下述 SAS 程式。

1
2
3
4
5
DATA retail;
SET sashelp.retail;
RUN;
PROC PRINT;
RUN;

執行程式

接著按下功能表中「黑色小人」進行「提交」作業,此時就會在「日誌」中顯示以下資訊。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
1   DATA retail;
2 SET sashelp.retail;
3 RUN;

NOTE: 已從資料集 SASHELP.RETAIL. 讀取 58 個觀測值
NOTE: 資料集 WORK.RETAIL 有 58 個觀測值和 5 個變數。
NOTE: 已使用 DATA 陳述式 (總處理時間):
實際時間 0.64 秒
CPU 時間 0.09 秒

4 PROC PRINT;
NOTE: 正在寫入 HTML Body (本文) 檔案: sashtml.htm
5 RUN;

NOTE: 已從資料集 WORK.NEWDATA. 讀取 58 個觀測值
NOTE: 已使用 PROCEDURE PRINT (總處理時間)
實際時間 2.51 秒
CPU 時間 0.81 秒

此外還能在「結果檢視器」中看到下表結果。(註:總共 58 筆資料,但下表僅先示意 1980 年的資料。)

Obs SALES DATE YEAR MONTH DAY
1 $200 80Q1 1980 1 1
2 $257 80Q2 1980 4 1
3 $258 80Q3 1980 7 1
4 $295 80Q4 1980 10 1

在上述範例中我們主要是建立新的資料集為 WORK.retail,資料來自於資料館中 SASHELP.retail 資料集,其中 WORK 為資料館,而 RETAIL 為資料集,所以我們可以透過「資料館」在 WORK 中找到 RETAIL 資料集。

SAS 資料集

基本介紹

在 SAS 系統中資料主要是以資料集的方式儲存和處理。其實 SAS 資料集可以看成由多行列所組成的表格,其中每一行稱為觀測值,每一列稱為變數,此外我們主要會透過 SAS 邏輯名稱使用 SAS 資料集,不需知道它儲存在哪個資料夾中,若想知道就搜尋 「.sas7bdat」副檔名的檔案就是 SAS 資料集。

命名規則

  1. SAS 名稱最多使用 32 個字元,大小寫字母不區分。
  2. SAS 名稱必須由英文字母、數字、底線所組成,並且第一個字元必須為字母或底線。
  3. SAS 名稱中不能有空格和一些特殊字元,像是%$!*&#@。

SAS 基本結構

SAS 的基本結構主要可以分成二大部份,分別為 DATA SETP 和 PROC STEP。

DATA STEP

當我們要針對資料進行分析時,首先需要建立資料,此時就會透過 DATA STEP 轉換成所需要的資料集,其敘述式主要是以 DATA 敘述開始,下述 SAS 程式就是建立 newdata 的資料集的操作。

1
2
3
DATA retail;
SET sashelp.retail;
RUN;

PROC STEP

當我們準備好資料集,接著需要針對資料進行分析時,就會根據 DATA STEP 所建立完成的資料集進行統計分析或列印報表,其敘述式主要是以 PROC 敘述開始,下述 SAS 程式就是列印報表的操作。

1
2
PROC PRINT;
RUN;

輸入資料

CARDS 換行輸入

上述的範例主要是從資料館中讀取範例資料,但是我們能不能夠自行輸入所需的資料呢?此時我們就會使用到 INPUT 和 CARDS; 關鍵字,請參考下述 SAS 程式。

1
2
3
4
5
6
7
8
9
DATA retail;
INPUT sales date $ year month day;
CARDS;
550 106Q1 2017 1 1
570 106Q2 2017 4 1
560 106Q3 2017 7 1
530 106Q3 2017 10 1
;
RUN;

第一行 DATA retail 主要是宣告一個資料集稱為 retail,預設儲存在 WORK 資料館中,第二行 INPUT 敘述主要是代表資料欄位,我們主要會宣告四個欄位,當欄位為文字時記得在欄位後方加上 $ 號,第三行 CARDS; 敘述主要是代表下一行準備要輸入資料,也就是說從下一行開始每一行就是一筆資料,輸入完成之後請以 ; 號做結束。

CARDS 不換行輸入

除此之外,我也可以以在 INPUT 敘述最後方加上 @@ 代表連續輸入資料,此時每筆資料就可以不必透過換行區分,請參考下述 SAS 程式。

1
2
3
4
5
6
DATA retail;
INPUT sales date $ year month day @@;
CARDS;
550 106Q1 2017 1 1 570 106Q2 2017 4 1 560 106Q3 2017 7 1 530 106Q4 2017 10 1
;
RUN;

處理資料

算術運算

若我們所擁有的零售銷售業績,主要是以美元為主的「sales」欄位資料,但長官卻想要知道台幣金額時,就會需要針對資料進行美元轉換台幣的處理。此時我們就可以透過算術運算針對欄位進行處理,請參考下述 SAS 程式。

1
2
3
4
DATA drv_retail;
SET retail;
sales_twd = sales * 30.3195682;
RUN;
算術運算 功能
+ 數值相加
- 數值相減
* 數值相乘
/ 數值相除
** 數值次方

文字函數

若我們擁有「106Q1」的「date」欄位資料,此時為了比較每一年同季的零售銷售業績,此時建議先轉換出「quarter」欄位資料,以利進行比較分析,請參考下述 SAS 程式。

1
2
3
4
5
DATA drv_retail;
SET retail;
sales_twd = sales * 30.3195682;
quarter = substr(date,5,1);
RUN;
文字函數 功能
INDEX(文字一,文字二) 回傳文字二出現在文字一中的位置,若文字二不在文字一中則回傳 0。
SCAN(文字,N,分隔符號) 回傳文字中以分隔符號分割第 N 部份的文字,若分隔符號不指定則預設為空隔. < ( + & ! $ * ) ; ^ - / , % 等分隔符號。
SUBSTR(文字,開始,長度) 回傳變數文字中開始長度的文字,若長度省略則回傳開始之後的所有文字。
TRIM(文字) 回傳刪除文字空白。
UPCASE(文字) 回傳所有文字大寫。
LOWCASE(文字) 回傳所有文字小寫。
LENGTH(文字) 回傳文字長度,不考慮最後空白。
CAT(文字一,文字二,…) 回傳文字的連接,主要會留下頭尾空白。
CATS(文字一,文字二,…) 回傳文字的連接,主要會刪除頭尾空白。
CATX(符號字元,文字一,文字二,…) 回傳文字的連接,主要會留下頭尾空白,並且用指定的符號字元連接。
TRANWRD(文字,文字一,文字二) 回傳文字中的文字二取代文字一。

輸出資料

最近處理資料集

當我們透過 DATA STEP 完成資料處理之後,就能夠透過 PROC STEP 輸出資料,其實 PROC 代表 Procedure,也就是程序或函數,因此我們會透過 PRINT 程序列印最後一次處理的資料集,請參考下述 SAS 程式。

1
2
PROC PRINT;
RUN;

指定處理資料集

此外我們也可以加入 DATA 參數指定處理資料集,請參考下述 SAS 程式。

1
2
PROC PRINT DATA=work.drv_retail;
RUN;

分析資料

呈現統計資訊

當我們輸出資料確認資料無誤之後,下一步就是進行分析資料,一般來說,只須要透過 UNIVARIATE 程序就能夠針對變數匯整出動差、基本統計量值、位置檢定、分位數和極端觀測值等統計資訊,以利分析資料,其中基本統計量值就是我們常常提到平均值、中位數、眾數、標準差、變異數、全距和內四分位距等資訊,請參考下述 SAS 程式。

1
2
PROC UNIVARIATE DATA=work.drv_retail;
RUN;

匯出統計資訊

除此之外,我們也可以透過 UNIVARIATE 程序指定要匯出的特定統計資訊至特定資料集中,例如我們僅想針對零售銷售業績的平均值和標準差匯出為報告資料集,請參考下述 SAS 程式。

1
2
3
4
5
PROC UNIVARIATE DATA=work.drv_retail;
OUTPUT OUT=work.retail_report MEANS=sales_twd_means STD=sales_twd_std;
RUN;
PROC PRINT DATA=work.retail_report;
RUN;

總結我們首先從開啟「 SAS Base 9.4 (中文(繁體)) 」軟體使用預設 RETAIL 範例資料集撰寫 DATA STEP 和 PROC STEP 程式的基本操作開始,接著透過撰寫 DATA STEP 程式進行輸入資料和處理資料,最後透過撰寫 PROC STEP 程式進行輸出資料和分析資料。因此 SAS 程式的兩大重點在於 DATA STEP 和 PROC STEP 的操作,至於更深入的操作則差別在於參數的不同而已,至於 SAS 語法基本上皆大同小異。

相關資源

⬅️ Go back