Leo Yeh's Blog

SAS 基礎程式 (6)

教學目標

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

重點概念

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

我們主要會使用 RETAIN 敘述搭配 SUM 敘述進行分類加總,在實務應用中我們通會需要進行分類加總,但是通常會面臨遺漏值的問題,首先請試想情境當企業需要加總客戶消費金額,此時該如何撰寫 SAS 程式呢?建立客戶購物消費資料集,主要內容為客戶編號和價格。

1
2
3
4
5
6
7
8
9
10
11
LIBNAME COMPANY 'C:\DATA' ;
DATA COMPANY.shopping;
INPUT Customer_ID $ Price;
DATALINES;
客戶1 1000
客戶2 .
客戶3 5000
客戶4 2000
客戶5 500
;
RUN;

加總消費金額。

1
2
3
4
5
6
DATA COMPANY.shopping_total;
SET COMPANY.shopping;
Total_Price= Total_Price + Price;
RUN;
PROC PRINT;
RUN;

輸出結果

Obs Customer_ID Price Total_Price
1 客戶1 1000 .
2 客戶2 . .
3 客戶3 5000 .
4 客戶4 2000 .
5 客戶5 500 .

上述 SAS 程式會發現 Total_Price 的金額累加好像有點奇怪,主要是因為 Price 變數中有遺漏值,所以會導致加總遺漏值之後的結果皆為遺漏值。

透過 SUM 敘述加總消費金額。

1
2
3
4
5
6
DATA COMPANY.shopping_total;
SET COMPANY.shopping;
SUM(Total_Price,Price);
RUN;
PROC PRINT;
RUN;

輸出結果

Obs Customer_ID Price Total_Price
1 客戶1 1000 1000
2 客戶2 . .
3 客戶3 5000 5000
4 客戶4 2000 2000
5 客戶5 500 500

上述 SAS 程式會發現 Total_Price 的金額累加還是有點奇怪,主要是因為 Total_Price 是新變數,所以每次 PDV 皆會重新設定為 0,導致每次皆從 0 開始加總,此時我們就會透過透過 RETAIN 敘述保留變數欄位,當在重新初始 PDV 時就不會重新設定 RETAIN 敘述所保留變數欄位。

透過 RETAIN 敘述搭配 SUM 敘述加總消費金額。

1
2
3
4
5
6
DATA COMPANY.shopping_total;
SET COMPANY.shopping;
SUM(Total_Price,Price);
RUN;
PROC PRINT;
RUN;

輸出結果

Obs Customer_ID Price Total_Price
1 客戶1 1000 1000
2 客戶2 . 1000
3 客戶3 5000 6000
4 客戶4 2000 8000
5 客戶5 500 8500

除此之外 SAS 更提供加法敘述,就能夠一開始就會給予初始值為 0,也就 RETAIN 敘述,加總每個觀察值且忽略遺漏值,也就是 SUM 敘述,以及自動傳回值,重點是程式撰寫更簡潔。

透過加法敘述加總消費金額。

1
2
3
4
5
6
DATA COMPANY.shopping_total;
SET COMPANY.shopping;
Total_Price + Price;
RUN;
PROC PRINT;
RUN;

輸出結果

Obs Customer_ID Price Total_Price
1 客戶1 1000 1000
2 客戶2 . 1000
3 客戶3 5000 6000
4 客戶4 2000 8000
5 客戶5 500 8500

接著我們要如何針對不同客群進行加總,主要三個步驟,第一步我們會先設定初始值、第二步我們會針對不同客群的數值累加,第三步我們會輸出加總之後的資料。簡單來說,一開始我們會透過 PROC SORT 敘述進行排序,因為針對不同客群需要使用 BY 敘述所以建議先排序才不會有錯誤,接著針對不同客群我們主要會使用 BY 敘述,最後我們可以透過 First. 和 Last. 判斷是否為該類別中的第一筆和最後一筆資料,其中 LAST. 會先以主要索引值為主,而次索引值的 LAST. 若當主索引值為 1 時,一律為 1。

建立客戶購物消費資料集,主要內容為客戶編號、類型和價格。

1
2
3
4
5
6
7
8
9
10
11
LIBNAME COMPANY 'C:\DATA' ;
DATA COMPANY.shopping;
INPUT Customer_ID $ Type $ Price;
DATALINES;
客戶1 型男 1000
客戶2 型男 .
客戶3 正妹 5000
客戶4 型男 2000
客戶5 正妹 500
;
RUN;

透過 PROC SORT 排序資料集,同時產生已排序的資料集。

1
2
3
4
5
PROC SORT DATA=COMPANY.shopping OUT=COMPANY.shopping_sort;
BY TYPE;
RUN;
PROC PRINT;
RUN;

透過 FIRST. 和 LAST. 計算不同客群加總。

1
2
3
4
5
6
7
8
9
10
DATA COMPANY.shopping_total;
SET COMPANY.shopping_sort;
BY Type;
IF First.Type THEN Total_Price = 0;
Total_Price + Price;
IF Last.Type THEN OUTPUT;
KEEP TYPE Total_Price;
RUN;
PROC PRINT;
RUN;

輸出結果

Obs Type Total_Price
1 型男 3000
2 正妹 5500

最後我們透過加法敘述搭配 FIRST. 判斷該類別中的第一筆和 LAST. 判斷該類別中的最後一筆資料,就能夠計算不同客群的加總金額,此時我們可以得知企業主要目標群眾為正妹客群,因為正妹客群總消費金額較高。

總結在實務應用中我們常常會需要進行分類加總,但是通常會面臨遺漏值的問題,此時我們可以透過 RETAIN 敘述設定變數初始值和保留變數、SUM 敘述忽略遺漏值和加總變數值、FIRST. 判斷類別第一筆資料和 LAST. 判斷類別最後一筆資料就能夠解決遺漏值的問題進行分類加總,以利分析企業中哪個客群為主要的目標群眾。

相關資源

⬅️ Go back