2008年10月31日 星期五

資料格式轉換-用T檢定比較兩班級的成績差異

剛使用SAS或SPSS等統計軟體時,除了操作介面外,還要適應統計軟體處理資料的方式,以及資料整理的格式。
在唸統計課本的時候,資料常常長的像這個樣子
A B
60 75
70 66
80 83
90 82
95 90

但是假使這樣的資料直接輸入至SAS,那SAS絕對無法處理成績。

SAS的資料格式,是以"變項"和"case"組成的。變項代表case一種特性,是一種分類。而變項中有不同的"值",分別代表個體在該變項中的實際性質。例如身高是一種變項,163cm、178cm是實際上的值。一般統計分析,是在處理變項之間的關係,而無法處理case之間的關係。因此在輸入資料的時候,要先確認我要以什麼東西為case,然後把同樣的特性歸為同一變項。

以這個例子來說,不論a班和b班,成績都是同一種特性,是依附在學生身上的特性,也就是說我們要將每個學生視為一個case,將其成績要放在同一變項,班級也是一個變項。
因此我們要將上述的資料形式,轉換為:

ods 班級 成績
1 A
2 A
3 A
4 A
5 A
6 B
7 B
8 B
9 B
10 B
成績我就不打了,要轉換成這樣才能執行檢定。

SAS中的獨立樣本T檢定,是將同一變數,依照另外一個變數分成兩組,互相比較,所以我們要把原本ab兩個變數,轉換成同一變數,分為AB兩組互相比較。因此我們就先把資料分成兩個,再分組合就好了

假設原始檔案叫做O_file

/*把變項A抓出來*/
data a ;
set O_file;
keep a;
class_=A_;/*設定組別名稱為A_*/
c=a; /*要把AB轉換成同一變項才能合併*/
run;

/*把變項B抓出來*/
data b;
set O_file;
keep b;
class_=B_; /*設定組別名稱為B_*/
c=b /*要把AB轉換為同一變項才能合併*/
run;

/*垂直合併*/
data c;
set a b;
keep c class_;
run;

/*執行檢定*/
proc ttest;
var c; /*對C變項做檢定 以AB分組*/
class class_;
run;

這樣就可以囉~

2008年10月28日 星期二

自己學SAS Learning SAS by self (三) 開啟檔案 Open the File

上一篇提到DATA,但是要成為SAS能讀取的資料,還要經過一番轉換。
一般來說,SAS能讀取的檔案有三種形式:
(1) 副檔名為sas7bdat的SAS資料檔
(2) ASCll碼,也就是純文字的檔案,算是外部檔案
(3) 其他外部檔案

SAS可以利用libname設定SAS資料夾,再用SET讀取檔案,詳細的libname用法可以參考這篇
http://kenshinsasstory.blogspot.com/2008/10/libname.html

ASCll純文字檔案要用infile或是filename讀取,其他外部檔案可以使用export功能匯入。

SAS在讀取檔案時也不能像spss或是其他軟體一樣使用滑鼠點選,而是要在program視窗的地方輸入指令。

(1) 讀取SAS資料檔
data test ; /*建立SAS DATA檔*/
set Libname_.SAS_Filename; /*匯入SAS資料檔*/
run;

(2) 讀取ASCll純文字碼
data test;
infile Filename; /*或是直接輸入檔案路徑和名稱)*/
input VarName 1-2 ; /*因為純文字檔沒有包含變項名稱,所以要用input來建立變項,格式有很多種,其中一種是先建立變項名稱,再標示變項在文字檔中的位置*/
run;

純文字檔可以說是通用的data儲存格式,只要以input輸入變項,不用特定轉換檔案格式,使用上也SAS資料檔來得要用彈性。例如在分析次級資料的時候,原始data有一百多個變項,而我只需要觀察性別、年齡兩個變項,我可以用inpu讀取特定變項,減少系統處理時間和記憶體空間。

其中,input的方式會依需求改變,而且指令也相當的多,留待專題文章再做說明。

2008年10月20日 星期一

合併多個檔案 Merge many files

要如何合併多個檔案我想是很多人在資料處理時很容易遇到的問題。
以人力資源調查資料庫為例,這是一個長達二十幾年,每個月都調查的資料,也就是說一年有十二個檔案,總共有二十幾年,為了怕弄混,每一個月份的檔案都存在不同資料,然後每十二個月的檔案又放在一個資料夾中。若要一個一個打開,複製貼上一定會浪份不少時間。
先不考慮每年的coding是否相同,我先以合併同一年份的檔案為例。

%macro LB95;
%let m = 01 02 03 04 05 06 07 08 09 10 11 12;
%do i = 1 %to 12;
%let moon=%scan(&m,&i);
data temp ;
infile "C:\data\manpower\mp95\mp95&moon\LB95&moon..dat";
input#1 Towncode 4-10 a2 21 a3 22-24 a4 25 ;
run;

這是程式的前半段。
想法很簡單,因為我每個月的資料都放在不同資料夾,比如說一月的資料我就放在LB9501,二月我就放在LB9502,那我是不是只要設計一個程式,能夠按照01、02的順序替換掉資料夾的名稱,就能順利讀取檔案?

其中的關鍵是%let和%scan的用法。
%let是一前導指令,可以指定多個字串作為前導變項。%scan則是用來讀取%let中的字串,可以依序讀取,第一次讀取01、第二次讀取02。設定好巨集指令後,我再以&moon來呼叫前導指令中設定的變數。sas中前導變項的功能非常強大,幾乎可以出現在程式中的任何地方。

看起來神奇,說起來簡單,前導指令和前導變項的關係其實就是複製貼上。當程式讀到&開頭的前導變項時,會代換以%為開頭的前導指令。假使前導變項後面還要加上其他文字,就得加個"."將他們隔開,不然sas程式會以為&後面到空白處都是同一個前導變項。

我在infile的地方用&moon前導變項替換檔案路徑,和檔案名稱,讓程式可以讀取不同資料夾中的檔案,只要你在歸檔的時候有順序的排列,在使用巨集的時候也會變得比較輕鬆。

%if &i=1 %then
%do;
data LB95;
set temp;
run;
%end;
%else
%do ;
data lb95;
set lb95 temp;
run;
%end;
%end;
%mend LB95;
%LB95;

最後面這邊就只是很單純在合併不同年的檔案。sas中有很多指令都是一組一組的。像是do對應end,data對應run,寫的時候要注意有沒有對好,沒有對好可就執行不暸。

2008年10月19日 星期日

自己學SAS Learning SAS by self (二) Data!Data!Data!


沒有DATA來談SAS是沒有意義的。 SAS作為處理資料的軟體,目的就是要分析資料,從中找出有意義的關係。

資料是原料、材料,透過SAS和使用者的想法,才能煮成一盤好菜。沒有原料要來學SAS其實沒有什麼太大用途。SAS的用途很多,但是不同的材料有不同的應用方法。就像大同電鍋可以煎煮炒炸,但是也要看你今天有什麼材料,想吃什麼菜才能決定用法。我們在學習使用電鍋的時候,也要先準備好材料,才有辦法使用電鍋來料理。才能看出自己的手法好不好?能不能煮成一盤好菜?

那DATA怎麼來呢?

小則個人支出帳簿、或是班上同學的成績;大到人口普查、社會變遷調查;甚至跨國、國際性的經濟數據資料,都可以當作DATA。端看您的用途來去找相應的資料。有時候找得到,有時後找不到,有的如探囊取物,有得難如登天。

因為資料的形式很多,有點難做一個統合的描述。但是因為要用SAS來處理資料,所以原始資料一定都要用數字表示。大致上來說,一份完整的資料要包括三個東西:

1. 問卷--是讓人填答問題,或者可以延伸為資料的實質意涵。
2. CodeBook--連結問卷和DATA。
3. Data--以數字為主要形式。

1. 問卷,廣義的來說就是問題。任何數字都不是憑空出現,一定會對應於一種特定的問題。
例如:帳簿上的40,他背後的問題可能是我今天吃飯花多少錢?
成績單上的65,背後的問題就是這個學生其中考考多少分

2. CodeBook,有時後數字可能代表比較複雜的東西,很難從數字來解釋,這時候就需要codebook來記錄每個數字代表的意思。
例如:你家住哪裡? 因為sas只能分析數字,我們必須設定台灣各縣市的代號,然後才能輸入sas或成為一筆data。

3. data,用以紀錄問卷結果,以及成為sas資料分析的來源。

在解讀資料的時候,就是來回查詢問題、codebook、以及data,連結三者之間的關係,才能了解data的涵義、以及這個問題在整體中的分配狀況。

本Blog使用說明(會不定期新增內容)

sas使用說明和指令內容一般仿間的書或是網站或是sas說明手冊都說得很詳細了。我再怎樣說都不會有這些專業說明書籍或手冊來得詳盡,使用上也沒那麼方便。(總不能把blog整個抓下來印出來吧)

我想提供的是「解決問題的方法」和「解決問題的想法。」

舉例來說,學sas就像學英文一樣吧,要練好英文,雖然不能沒有字典,但也需要完整的對話情境和脈絡,才懂得如何使用英文,而且學習英文最終的目的也是要放在情境脈絡中使用。

SAS Story就是提拱學習以及使用sas的脈絡,而不只是本sas使用手冊。語法很多,查手冊很快,但是要找出能夠解決問題的語法,並且將他們組織起來,就不是那麼容易。

不管是「實戰分析」還是「指令」篇,我一定會先帶一段使用情境,或是我遇到的問題,然後才會開始談到指令和語法。希望能讓讀者了解到,這些指令和語法是在什麼時候使用的,或是我遇到什麼問題,要用什麼方法分析解構,再來找適當的語法來處理。

在排版上,脈絡或是解釋的部份字型比較大,語法部份字型比較小,語法通常可以讓各位複製在sas中執行,語法中的說明我己經用/* */標示,並不會影響到程式執行。希望各位能走了解故事背景,也能順利走到故事中:)

2008年10月17日 星期五

自己學SAS (一) 去哪問問題?

SAS不一定要問人,但是一定要懂得去哪找資料。
首先推薦幾本書:
1. SAS 1-2-3 作者彭昭英 儒林出版社
很有調理的說明如何讀取檔案、排序、到分析等等,東西不會太多,也不會太難,還滿好上手的入門書籍

2. SAS與資料處理 作者翁淑源 儒林出版社
對於SAS DATA SET的指令介紹的非常詳細,著重在處理和整理資料,沒有介紹統計分析,可以當成字典工具書使用。

3. SAS內建的HELP指令
東西應有盡有,非常詳盡,只是一些編排的方式和專有名詞需要花時間熟析一下,在SAS中按F1就能叫出來。

另外,網路資源也相當多,基本上使用GOOGLE就能找到很多資料。只要將關鍵字SAS,和自己遇到的問題打進去,通常就能找到不錯的回覆。但是比較複雜的問題可能還是需要自己想一下。

台灣家庭收支暨所得分配訪問(二) 分析策略

分析資料也是講求策略的。考量的原因無他,就看這筆資料的結構以及問題為何。資料結構在上一篇文章提過,這裡就不加贅述。那我要處理的問題為:挑出特定變數。這些變數包括了:
1.挑出家戶長配偶
2.挑出該家戶的收入支出變項
3.計算各家庭人口數,以及老人數目

在思考這個問題的時候,要注意

1. 資料結構為家戶資料,假使照著主計處提供的SAS檔案,我們得到的是一筆一筆的家戶資料。家裡不同人口特質的變項,問卷提供近五十組的位置可以填寫,所以也不確定家戶長和其配偶在哪個變項。

2. 同時由於這筆資料在收入支出的部份是分為400組變項,每組變項都包括(收入支出代號)和(收入支出金額)這兩部份,所以我們也不確定每筆資料的收入支出會在同一個位置。

3. 沒有變項說家裡有幾個人。

當然,案主給我問題的時候,並不會特別幫我將問題依照期性質分類。是因為這三個問題在其資料結構上有其實質上的差異,所以我才會分為這三個問題。

1. 第一個問題主要是要整理家戶長及其配偶的人口資料,本質上是以人為單位的資料。

2. 收入和支出都是以家庭為單位。

3. 家裡人口數基本上可以用家庭為單位計算,或是轉換成個人資料來計算。

所以我的策略就是:

1. 加以家戶為單位的資料轉換為以個人為資料。

2. 以個人資料來處理家戶長和配偶的人口資料,同時來計算家裡人口。

3. 用家戶資料來找家庭的收入和支出。

由於案主要的是家戶資料,所以最後在將個人資料轉換成家戶資料,再將三者合併整理就好。

2008年10月14日 星期二

台灣家庭收支暨所得分配訪問(一) 讀取資料

台灣家庭收支暨所得分配是行政院主計處下面的一個計畫。http://win.dgbas.gov.tw/fies/index.asp 家庭收支調查的網頁

這個資料一開始並不是我自己在用的,是別人委託的一個CASE,要我幫忙抓出其中幾個變項和簡單整理資料。還沒有看到DATA 之前,我心裡還以為這是個"簡單任務",不過就是挑變項而已,那有什麼難的。一拿到DATA點開後,天阿,我瞬間了解到這個CASE果然值錢>"< 這筆資料編排方式跟我以往使用的資料有許多差異,不但如此,變項足足有1000個以上= = 雖然一般這種政府統計資料都會附有語法檔,但是因為第一次見到這種編碼方式,我光是研究CODEBOOK、問卷和DATA就花了一個多小時,才得以理解。 以上是抱怨,接下來就看一下這個語法檔的部份,由於這個資料並沒有開放免費下載,我僅用網站上提供的範例說明: DATA:
http://win.dgbas.gov.tw/fies/doc/Sample96.txt
因為原始資料太大啦~放不上來~請各位點一下上面的原始檔連結唄。(那絕不是廣告阿!!)

一般原始DATA會將一個CASE編成一列。
例如 01838457239857023750238752938752.......
在讀取檔案時,每一列分別代表一個case。但是這筆資料因為變項太多,上面這一個區塊都是屬於同一個CASE。(很驚人吧,我第一次看到也嚇了一大跳)

這筆資料以家戶為單位抽樣,調查大致分為三個部份
1.分別調查家中每個人口變項
2.家庭基本狀況
3.收入還有家庭總收支

光是"一個人"的人口變項就有近20個,由於每個家戶人數有所差異,一筆資料最大能夠容許50個人。另外收支項目共有十大類,每一大類裡面又有小類,零零總總加起來有近800種項目。由於變項太多了,就把資料以這種形式編碼,因此也以一種特別的方式來讀取檔案。每一列,前八個字是指樣本編號,也就是戶口編號,最後兩碼為判別式。讀取資料方式為,先判別最後兩碼,不同的判別式會對應不同的input變項,然後在以樣本編號來進行merge。最後兩碼判別式最多有到60還是70幾,內附的sas指令就是以if then指令一次抓出某一列變項,再以merge by戶口編號,將分開的變項合為同一case。


因此sas指令大略長成這樣:(非完整執行指令)

data part1;
set 原始檔案;
input @1 x1 $ 8 @9 cd 2 ;/*x1 表示讀取樣本編號 cd讀取判別式*/
if cd= 1 then do;
data part1;
input sex 1-2 ....;
end;

data all;
merge part1 part2 .......;
run;

類似這樣....不知道各位看官有沒有被弄暈阿~

2008年10月13日 星期一

libname

libname 是SAS中獨特的目錄概念。 SAS的目錄概念是承繼傳統IBM主機,並非現在流行的Micro$oft 架構。 現行我們不管用XP、VISTA、或是其他在這之下的應用程式,要讀取或是記錄檔案, 都是直接去硬碟目錄去找。例如我要開個EXCEL檔,就直接去C:\temp\讀取temp.exl 這個檔案。存檔也是,我要先點點點,先點到C:\ 找到TEMP這個檔案,點進去儲存。

而SAS使用libname的概念來指定目錄,以libname來建立資料夾存取檔案。 假使我使用libname指定C:\temp這個目錄,將其重新命名為TEMP,成為SAS的目錄。 那我要存取檔案的時候,只需要在檔案前面加上"TEMP."就能讀取C:\TEMP中的SAS資料。 或是將我現行的檔案存到C:\temp中,不用在以點擊的方式來存取檔案。

以下是操作實例:

libname Temp 'C:\temp'; /*將C:\temp設定為sas目錄TEMP*/

data new; /*創造一個新的檔案名為new*/
set TEMP.qoo; /*讀取TEMP資料夾中,名為QOO的SAS檔案
(SAS檔案的副檔名為sas7BDAT)*/
run;

這樣就是讀取檔案了,將TEMP資料夾中的sas檔案qoo 複製到現行的檔案new中。 那要存檔的時候呢,也很方便,只要在現行檔案前加上資料夾名稱就好了。

data TEMP.old; /*創造一個名為old的sas資料檔,
該檔案要存在TEMP資料夾中*/

set new; /*將資料檔new複製過來*/
run;

這樣子就好囉,有沒有很方便呢~

為什麼要用SAS呢 ?

sas是一套統計軟體,spss、R、Excel也都是一套統計軟體,為什麼我要用SAS呢?(而且SAS又不好取得) (當然也有很好取得的方法)

SAS是一套功能強大,有點黑心的統計軟體。(SAS公司不要來查我IP阿!!)

他不同於微硬的EXCEL,或是SPSS,這兩者都是使用人性化視窗介面。SAS絕大多數功能都是用語法(也就是ABCDEFG來輸入執行的)。SAS也沒有漂亮的使用者介面,甚至可以說是非常低劣的介面,但是要處理龐大的資料非他莫屬。平常問卷,或是班上學生成績排名,用EXCEL或SPSS做就綽綽有餘,然而當你的資料很大很大,很大很大,很大很大的時候,SAS的效率和價值就出來了。

什麼樣的資料較很大的資料呢?

一個國小班級有50位學生,那我全校總共3000個學生算大筆嗎?

不不不,這還是太小了。

那台北市總共有十萬個小學生,夠大了吧?

不不不,還是太小。

以我目前在整理的人力資源調查資料為例,一個月的調查人數有十萬多人,而這是一個持續二十年,每個月都有調查的資料。10萬X12個月X20年有多少數量您自己算吧。

EXCEL的CASE上限是65536筆,SPSS多一點,但是因為資料顯示的關係(SPSS會將所有CASE顯示在螢幕上,表示說會耗費大量的記憶體來載入資料),運算起來會異常的慢。所以即便SAS如此不方便使用,介面又不漂亮,至今還是有許多地方和機關都在使用,尤其是各國的國家人口統計處,都還是繼續使用SAS來編輯、整理DATA。那我也用SAS來處理分析資料。
偶爾賺點外快

SAS The Power to Know

http://www.sas.com/
這是sas官方網頁

http://www.sas.com/offices/asiapacific/taiwan/
這是SAS Taiwan的網站


SAS 成立於1976年,為新一代商業智慧軟體與服務的領導供應商,同時也是業界唯一可整合先進資料倉儲、分析學和傳統商業智慧(BI, Business Intelligence)應用程式的廠商,讓企業得以從大量資訊中創造無價的企業智慧。SAS的解決方案在全球擁有超過42,000個使用單位,客戶遍及Fortune 500大企業前100名的公司,涵蓋金融、電信、服務、製造、零售業等不同領域。SAS 分公司遍佈全球116個國家,其解決方案不僅可協助企業發展好的客戶與供應商關係,以爭取更高的營收,同時,也可協助企業發展更精準的決策,驅動企業不斷進步。
(引用自
http://www.sas.com/offices/asiapacific/taiwan/ )

簡單來說,SAS是一家很大的公司,軟體功能很多很強大。
由於功能太多太強大了,我只能就我所學來講來用,其他沒提到的功能不表示沒有,而只是我沒用到。軟體這種東西呢,功能很多,但是不用就像不存在一樣,通常就是用到在來學,沒用到學了也是白搭。

K的領域(好像什麼絕對領域或是格鬥天王裡面會出現的名字),
K所學所用為社會科學,比較常用到的功能就是整理人口資料以及簡單的統計計算分析解釋,
所以也只能就這些面向來使用SAS。

我們可以將SAS視為一個島、或一個新大陸,我們各自從不同地方上岸,想在島上尋找寶物,而我們知道的、能用的東西,就只有我所經過的地方,沿途上的東西而已,每個人都會用不同的東西,進行不同的任務,開展不同的故事。