Leo Yeh's Blog

SAS 基礎程式 (5)

教學目標

初步了解 SAS 基礎程式如何有效進行資料匯整的商業分析應用。

重點概念

(請注意以下內容皆為課程心得筆記,若有不清楚的部份,建議上官方主辦的 SAS Programming 2 課程,謝謝。)

我們主要會使用 OUTPUT 敘述搭配 WHERE 敘述、IF 敘述和 SELECT-WHEN 敘述有效進行資料匯整的商業分析應用,首先請試想情境當企業需要預測未來部門人數,此時該如何撰寫 SAS 程式呢?

預測企業未來部門人數

建立 COMPANY.growth 資料集,主要內容為部門、總人數和成長率。

1
2
3
4
5
6
7
8
9
LIBNAME COMPANY 'C:\DATA' ;
DATA growth;
INPUT Department $ Total_Employees Increase
DATALINES;
業務 5 0.25
行銷 3 0.10
資訊 10 0.35
;
RUN;

透過 COMPANY.growth 資料集建立 COMPANY.forecast 資料集,主要內容為預測企業未來部門人數。

1
2
3
4
5
6
DATA COMPANY.forecast;
SET COMPANY.growth;
Total_Employees = Total_Employees * (1+Increase);
RUN;
PROC PRINT;
RUN;

輸出結果

Obs Department Total_Employees Increase
1 業務 6.25 0.25
2 行銷 3.30 0.10
3 資訊 13.5 0.35

一般來說,在 DATA 步驟結束時,在 RUN; 敘述前皆會有隱含輸出和隱含回傳。

透過 COMPANY.growth 資料集建立 COMPANY.forecast 資料集,主要內容為預測企業未來第一年和第二年的部門人數。

1
2
3
4
5
6
7
8
9
10
11
12
DATA forecast;
SET COMPANY.growth (DROP=Increase);
Year=1;
Total_Employees Total_Employees * (1+Increase);
OUTPUT;
Year=2;
Total_Employees Total_Employees * (1+Increase);
OUTPUT;
DROP Increase;
RUN;
PROC PRINT;
RUN;

輸出結果

Obs Department Total_Employees Year
1 業務 6.2500 1
2 業務 7.8125 2
3 行銷 3.3000 1
4 行銷 3.3000 2
5 資訊 13.5000 1
6 資訊 18.2250 2

首先 OUTPUT 會直接將 PDV 的數值進行輸出,像是上述 SAS 程式會產生第一年和第二年的資訊,同時若有 OUTPUT 則 RUN 之前隱含輸出就會消失,像是上述 SAS 程式若第二個 OUTPUT 不存在時則第二年的資訊就不會出現,再來新增的變數就會被重新初始化 PDV,像是上述 SAS 程式中的 Year 變數會重新初始化 PDV,最後DROP 在編譯期間就會決定是否刪除變數不輸出,或者 DROP 當成 DATA 敘述的選項時,則是針對不同資料集進行處理,所以像是上述 SAS 程式中的雖然 DROP Increase; 寫在 OUTPUT 下方,但是 OUTPUT 時還是會刪除 Increase 變數,請注意 DROP 敘述和 KEEP 敘述不能寫在 PROC 敘述中,而 DATA COMPANY.growth (DROP=Increase); 則是針對 COMPANY.growth 資料集移除欄位,反之我們也可以使用 KEEP 選項 DATA COMPANY.growth (KEEP=Department Total_Employees Year); 也是一樣輸出結果。

產生年度銷售活動檔期折扣

建立 COMPANY.discount 資料集,主要內容為產品編號、開始日期、結束日期、單位銷售金額和折扣數。

1
2
3
4
5
6
7
8
9
LIBNAME COMPANY 'C:\DATA' ;
DATA COMPANY.discount;
INPUT Product_ID$ Start_Date YYMMDD10. End_Date YYMMDD10. Unit_Sales_Price Discount;
DATALINES;
產品1 2016-12-01 2016-12-31 20.31 0.5
產品2 2016-12-01 2016-12-31 19.22 0.5
產品3 2016-12-01 2016-12-31 16.55 0.5
;
RUN;

透過 COMPANY.discount 資料集建立 COMPANY.compaign 資料集,主要內容為不同活動檔期的折扣資訊。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
DATA COMPANY.compaign;
SET COMPANY.discount;
WHERE Start_date='01DEC2016'd;
Promtion='節日促銷';
Season='冬季';
Year=2016
OUTPUT;
Start_date='01Jul2017'd;
End_date='31Jul2017'd;
Season='夏季';
Year=2017
OUTPUT;
DROP Unit_Sales_Price Start_date End_Price;
RUN;
PROC PRINT;
RUN;

輸出結果

Obs Product_ID Discount Promotion Season Year
1 產品1 0.5 節日促銷 冬季 2016
2 產品1 0.5 節日促銷 夏季 2017
3 產品2 0.5 節日促銷 冬季 2016
4 產品2 0.5 節日促銷 夏季 2017
5 產品3 0.5 節日促銷 冬季 2016
6 產品3 0.5 節日促銷 夏季 2017

接著 OUTPUT 敘述通常會搭配 WHERE 敘述、IF 敘述和 SELECT-WHEN 敘述進行資料集匯整的應用,像是產生年度銷售檔期折扣,其中 WHERE 敘述主要從硬碟中的檔案資料載入至 PDV 時進行篩選,而 IF 敘述和 WHEN 敘述則是在 PDV 中進行篩選,所以若當硬碟中的檔案資料很大量時將會先透過 WHERE 敘述進行篩選之後,再透過 IF 敘述和 WHEN 敘述進行篩選,像是上述 SAS 程式中 Year 變數是資料集中新建變數,所以就不能透過 WHERE 變數進行篩選,只能透過 IF 敘述和 WHEN 敘述進行篩選,請注意 DROP 和 KEEP 選項也能使用在 SET 敘述中,但是會直接影響 PDV 變數欄位,此時若 IF 敘述和 WHEN 敘述有使用該變數欄位執行 SAS 程式時就會導致結果發生問題,不會執行錯誤而是產生訊息。

分類購物商品交付類型

再來 OUTPUT 敘述之後分別加入不同 SAS 資料集就能夠產生多個資料集,像是分類購物商品交付類型,請注意若 OUTPUT 敘述沒有指定資料集,但使用多個資料集時,就會輸出至所有 SAS 資料集中,此時會導致結果有問題,需要特別小心謹慎使用 OUTPUT 敘述。

建立 COMPANY.orders 資料集,主要內容為產品編號、訂購類型、客戶編號、交付期間,其中訂購類型 1 為零售店面、 2 為網路購物和 3 為行動購物。

1
2
3
4
5
6
7
8
9
10
DATA COMPANY.orders;
INPUT Order_ID $ Order_TYPE Employee_ID $ Customer_ID $ Ship_Days;
DATALINES;
訂單1 1 員工1 客戶1 1
訂單2 3 員工2 客戶2 3
訂單3 2 員工1 客戶3 9
訂單4 3 員工1 客戶4 7
訂單5 2 員工2 客戶5 5
;
RUN;

透過 COMPANY.orders 資料匯出三個資料集,分別為 order_fast 、 order_normal 和 order_slow 資料集,其內容分別為網路購物和行動購物中最快交付、一般交付和最慢交付的訂單類型,最後僅顯示最慢交付的訂單類型。

1
2
3
4
5
6
7
8
9
10
DATA COMPANY.order_fast COMPANY.order_normal COMPANY.order_slow;
SET COMPANY.orders;
WHERE Order_Type IN (2,3);
IF Ship_Days<3 THEN OUTPUT COMPANY.order_fast;
IF 3<=Ship_Days<=7 THEN OUTPUT COMPANY.order_normal;
IF Ship_Days>7 THEN OUTPUT COMPANY.order_slow;
KEEP Order_ID Employee_ID Customer_ID Ship_Days;
RUN;
PROC PRINT DATA=COMPAN.order_low;
RUN;

輸出結果

Obs Order_ID Employee_ID Customer_ID Ship_Days
1 訂單3 員工1 客戶3 9

最後我們還可以透過 FIRSTOBS 和 OBS 選項篩選部份資料,其中 FIRSTOBS 代表第一個讀取的觀察值列數,OBS 代表最後讀取的觀察值列數,請注意 FIRSTOBS 與 OBS 選項只能使用在 SET 和 PROC ,而不能使用在 DATA,然而當我們將 FIRSTOBS 與 OBS 和 WHERE 一起使用時,則 WHERE 會優先執行。

總結我們可以使用 OUTPUT 敘述搭配 WHERE 敘述、IF 敘述和 SELECT-WHEN 敘述有效進行資料匯整的應用,像是預測企業未來部門人數、產生年度銷售活動檔期折扣和分類購物商品交付類型等商業應用。

相關資源

⬅️ Go back