公告

[公告]
2014/01/17
由於已經是faculty的關係,不太有足夠時間寫部落格。因此更新的速度會相當緩慢。再加上近幾年來SAS GLOBAL FORUM沒有出現讓我覺得驚艷的技術文件,所以能分享的文章相對也減少許多。若有人推薦值得分享的SAS技術文件,請利用『問題討論區』告知。

2013/07/19
臉書留言板的功能因為有不明原因故障,因此特此移除。而intensedebate的留言板因管理不易,也一併移除。目前已經開啟內建的 G+ 留言系統,所以請有需要留言的朋友,可直接至『問題討論區』裡面留言。


2007年10月16日 星期二

Steps to Success with PROC MEANS

原文載點:http://www2.sas.com/proceedings/sugi29/240-29.pdf

PROC MEANS 可以簡單的計算出變數的基本統計量,但其實他包含了許多很強大的功能,如果沒有特別介紹,許多人可能一輩子也不知道。Andraw Karp 多年來一直在 SUGI 發表關於 PROC MEANS 的使用方法,而這篇文章是他在 SUGI 29 中所發表的一篇詳盡的 PROC MEANS 技術文件,詳細記載了比教科書上更廣泛的用法,讓使用者可以在短短的 20 頁文件裡面快速地學習熟 練 PROC MEANS 的技巧。

本篇技術文件裡面使用一個有關客戶用電量的資料,由於不是本文重點,所以關於該資料內變數的介紹請自行參閱原文。

Step 1: Basics and Defaults

PROC MEANS 內有預設五個統計量是不必經過特別的函數呼叫就能自動在報表裡產生,分別是 N(個數)、MEAN(平均值)、STD(標準差)、MIN(最小值)、MAX(最大值)。範例如下:

PROC MEANS DATA=SUGI.ELEC_ANNUAL;
   title 'SUGI 29 in Montreal';
   title2 'Steps to Success with PROC MEANS';
   title3 'Step 1: The Basics and Defaults';
run;

這個範例並沒有指定去計算資料內特定變數,所以 SAS 會把所有「數值型」變數通通丟進去計算。結果如下:


Step 2: Taking Control: Selecting Analysis Variables, Analyses to be Performed by PROC MEANS , and Rounding of Results

如果要指定特定的變數,只要使用 Var statement 即可。同時,也可以在 PROC MEANS 之後任意填入指定的 option 來計算不同的基本統計量,甚至可以指定計算結果的小數點位數。範例如下:

PROC MEANS DATA=SUGI.ELEC_ANNUAL MEAN SUM MAXDEC=2;
     VAR TOTREV;
   Title3 'Step 2: Taking Control';
run;

這個範例中,指定計算變數 TOTREV 的平均值(MEAN)和總和(SUM),並且將結果四捨五入到小數點以下第二位(MAXDEC=2)。結果如下:


Step 3: Selecting Other Analyses

下表列出所有可以在 PROC MEANS 中計算出來的基本統計量,只要指定在 PROC MEANS 的 option 區域即可。


簡單地看個範例:

PROC MEANS DATA=SUGI.ELEC_ANNUAL MEDIAN MEAN CLM MAXDEC=0;
   Label TOTREV = 'Total Billed Revenue'
         TOTKWH = 'Total KwH Consumption';
   VAR TOTREV TOTKWH;
   title3 'Step 3: Selecting Statistics';
run;

此範例是計算變數 TOTREV 和 TOTKWH 的中位數(MEDIAN)、平均值(MEAN)、95% 信賴區間(CLM),並全部四捨五入到整數(MAXDEC=0)。結果如下:


Step 4: Analysis with CLASS (variables)

如果想要計算在某個類別變數下各連續變數的基本統計量,可以用 CLASS statement 搞定。範例如下:

PROC MEANS DATA=SUGI.ELEC_ANNUAL SUM MEAN MAXDEC=0;
     CLASS REGION;
   VAR TOTREV TOTKWH;
   title3 'Step 4: Analysis with CLASS (Variables)';
run;

這個範例其實就是從 step 3 的範例延伸而來。SAS 會依照 REGION 內各層去分別計算 TOTREV 和 TOTKWH 的 SUM 和 MEAN。結果如下:


Step 5: Don’t Miss the Missings!

如果資料裡面有 missing data,PROC MEANS 原則上會自動忽略不管。但以 step 4 為例,如果 REGION 有 missing,我們可以要求 SAS 去計算這些 missing REGION 中 TOTREV 和 TOTKWH 的基本統計量。範例如下:

PROC MEANS DATA=SUGI.ELEC_ANNUAL SUM MEAN MAXDEC=0 MISSING;
   CLASS REGION;
   VAR TOTREV TOTKWH;
   title3 "Step 5: Don't Miss the Missings!";
run;

只要在 PROC MEANS 的 option 下呼叫 MISSING 就可以強迫 SAS 不要忽略 missing data。結果如下:


從結果可知,有 38 個 missing REGION data,其所屬的 TOTREV 和 TOTKWH 並沒有 missing,所以仍舊可以計算其基本統計量。

Step 6: Don’t Miss the Missings (Part II)

如果對 missing data 的數量有所好奇,可以用 NMISS 這個 option 來計算。

PROC MEANS DATA=SUGI.ELEC_ANNUAL MAXDEC=0 MISSING N NMISS;
   CLASS REGION;
   VAR TOTREV TOTKWH;
   title3 "Step 6: Don't Miss the Missings! (Part II)";
run;

結果如下:

從上圖可知,在 38 個 missing REGION data 中,有 1 筆資料的 TOTREV 是 missing。

Step 7: Take What You Need and Leave the Rest

在 PROC MEANS 中可以立刻進行一些簡單的資料處理來指定什麼條件下的資料要納入計算,什麼條件之下的資料不要納入計算。範例如下:

PROC MEANS DATA=SUGI.ELEC_ANNUAL(WHERE=(REGION IN('WESTERN','SOUTHERN') and SUBSTR(RATE_SCHEDULE,1,2) = 'E1')) MAXDEC = 0 MEAN SUM NONOBS;
   VAR TOTKWH;
   CLASS REGION RATE_SCHEDULE;
   title3 'Step 7: Take What You Need and Leave the Rest';
run;

其中,WHERE=(REGION IN('WESTERN','SOUTHERN') 是限定 REGION 是 WESTERN 和 SOUTHERN 這兩個區域的資料才能納入計算。SUBSTR(RATE_SCHEDULE,1,2)='E1' 是限定 RATE_SCHEDULE 文字變數中,前兩個字母是 E1 開頭的資料才要納入計算。另外, NONOBS 是強制限定 SAS 不要列出總數(N)的欄位。結果如下:


Step 8: Creating a Simple Data Set with PROC MEANS

想要將計算結果另存新檔的話,用 OUTPUT statement 可以完成。範例如下:

PROC MEANS DATA=SUGI.ELEC_ANNUAL NOPRINT;
   VAR TOTREV;
     OUTPUT OUT=SUGI1 MEAN=MeanRev SUM=TotalRev;
RUN;

執行此程式的結果,可以發現報表會輸出並存成名為 SUGI1 的資料,其中平均值的變數名稱被命名為 MeanRev。總和的變數名稱被命名為 TotalRev。而 NOPRINT 的功用只是抑制報表輸出而已,但不影響新資料的存出。用 PROC PRINT 去列印新資料,結果如下:


Step 9: Creating a More Complex Data Set with PROC MEANS

如果要輸出的變數很多,針對新變數的命名,可以用下面範例中的方法來處理。

PROC MEANS DATA=SUGI.ELEC_ANNUAL NOPRINT;
   VAR TOTREV TOTKWH TOTHRS;
     OUTPUT OUT=SUGI2 sum(TOTREV TOTKWH) = sum_rev sum_kwh mean(TOTREV) = mean_rev median(TOTHRS) = median_hrs;
run;

針對 SUM,新資料只需要 TOTREV 和 TOTKWH 的 SUM,所以用 sum(TOTREV TOTKWH) 來指定,新變數就依序寫在等號後面。而 TOTREV 的平均值和 TOTHRS 的中位數也是用同樣的方法來指定。用 PROC PRINT 去列印新資料,結果如下:


Step 10: Using the AUTONAME Option

如果你很懶,不想去傷腦筋浪費時間想新的變數名稱,可以用 AUTONAME 這個 option 來讓 SAS 自動命名。範例如下:

PROC MEANS DATA=SUGI.ELEC_ANNUAL NOPRINT;
   VAR TOTREV TOTKWH TOTHRS;
   OUTPUT OUT=SUGI2 sum(TOTREV TOTKWH) =
                    mean(TOTREV) =
                    median(TOTHRS) = / AUTONAME;
run;

用 PROC PRINT 去列印新資料,結果如下:


Step 11: Understanding _TYPE_ and _FREQ_

一系列的結果看下來,想必很多人會對兩個變數感到相當納悶,那就是 _TYPE_ 和 _FREQ_。先試著跑下面這個範例:

PROC MEANS DATA=SUGI.ELEC_ANNUAL(WHERE=(REGION IN('WESTERN','SOUTHERN') and SUBSTR(RATE_SCHEDULE,1,2) = 'E1')) ;
   VAR TOTKWH;
   CLASS REGION RATE_SCHEDULE;
   OUTPUT OUT=SUGI3 MEAN= SUM= MEDIAN=/AUTONAME;
RUN;

報表如下:


簡單來說,_FREQ_ 就是去計算該統計量裡面有多少資料是被納入計算的。_TYPE_ 是表示這行數據是從哪一層算出來的。以此結果為例,_TYPE_=0 表示之後的統計量是不分層的全部平均、全部加總等等。_TYPE_=1 表示之後的統計量是 REGION 分類下算出來的數據,_TYPE_=2 表示之後的統計量是 REGION 和 RATE_SCHEDULE 分類組合下算出來的數據。以此類推。最多可以到 32 層。

Step 12: Use the NWAY Option

循上個步驟。如果你想要分層最細的數據,以上面的範例來看,即REGION 和 RATE_SCHEDULE 分類組合下算出來的數據,也就是 _TYPE_=3 下的數據,則直接在 PROC MEANS 後面的 option 中填上 NWAY 即可。

Step 13: Use the CHARTYPE Option to Facilitate Creating Multiple Output Data Sets in a Single PROC MEANS Task

如果想要一次輸出數個新資料,則必須先在 PROC MEANS 後的 option 處呼叫 CHARTYPE 的選項,然後才能用數個 OUTPUT statement 來分別依照不同的條件輸出到不同的資料。範例如下:

PROC MEANS NOPRINT DATA=SUGI.CARDTRANS2 CHARTYPE;
   CLASS TRANS_DATE TRANS_TYPE CARD_TYPE;
   VAR CHARGE_AMOUNT;
   OUTPUT OUT=A(WHERE=(_TYPE_ = '001')) MEAN=/AUTONAME;
   OUTPUT OUT=B(WHERE=(_TYPE_ = '011')) MEAN=/AUTONAME;
   OUTPUT OUT=C(WHERE=(_TYPE_ = '101')) MEAN=/AUTONAME;
   OUTPUT OUT=D(WHERE=(_TYPE_ = '111')) MEAN=/AUTONAME;
RUN;

當 _TYPE_='001' 時則輸出到新資料 A,當 _TYPE_ = '011' 時輸出到新資料 B,以此類推。

上面十三個步驟大概可以解決大部分的 PROC MEANS 的問題。想要知道更細節的使用方法,可自行參考 SAS 手冊。不過根據本人多年來使用 PROC MEANS 的經驗,這樣已經足夠應付大部分的情況了。

Author contact
Andrew H. Karp
President
Sierra Information Services, Inc.
19229 Sonoma Highway PMB 264
Sonoma, California 94115 USA
707 996 7380
SierraInfo@AOL.COM
www.SierraInformation.com
CODE { display: block; /* fixes a strange ie margin bug */ font-family: Courier New; font-size: 8pt; overflow:auto; background: #f0f0f0 url(http://klcintw.images.googlepages.com/Code_BG.gif) left top repeat-y; border: 1px solid #ccc; padding: 10px 10px 10px 21px; max-height:200px; height:200px; // for IE6 line-height: 1.2em; }