2008年7月13日 星期日

幾種常用的統計分析軟體比較

這一年來接觸了幾種不同的統計軟體,有些是自己有實際去使用過,有些則是只聽別人介紹或只有概念上的初步了解。每一種軟體都各有利弊,我就目前所知道的這幾種軟體做簡單的比較。
本來我只會使用SPSS,但不是很深入。SPSS是專門給社會科學研究人員使用的統計軟體,其好處是視窗的介面與對話方塊與下拉式選單的功能讓一般的電腦使用者很容易上手,使得SPSS成為最普遍的統計軟體之一。

在修計量經濟學時,我們所使用的統計軟體叫做Stata,以前我並不知道有這樣的軟體,但是使用之後也覺得蠻好用的,有其獨特的功能。Stata原本只用簡單的指令,研究人員可以寫一連串的指令去整理資料內容與執行統計分析工作,後來Stata的版本也加入類似SPSS的視窗介面與對話方塊與選單的功能。對我來說,Stata最方便的地方(這也是老師一再強調的好處),是可以將整套的執行指令存成一個do file,可以讓研究人員反覆執行同樣的分析工作。如果要修改分析工作中的某些步驟,只要修改其中相關的部分指令,便可以很容易讓電腦重新進行分析工作,省下很多的時間與避免錯誤的可能性。相較之下,對話方塊每執行一次分析工作,就得重頭勾選對話方塊中的項目,相當耗時,也容易出錯。後來有朋友告訴我其實SPSS也有類似Stata的do file的執行指令檔的功能,如果懂得其執行指令,也可以反覆執行整批的指令。

因此在操作上,我覺得SPSS與Stata其實差不多。不過我個人比較喜歡Stata的分析結果呈現格式,感覺上比較簡潔;此外,Stata所提供的統計功能要比SPSS來得完整。特別是在迴歸分析方面,Stata的涵蓋面比SPSS更為廣泛,而且Stata在進行假設驗證時,比SPSS來得靈活。

SPSS與Stata都不便宜,雖然Stata有簡易版與學生版,價格較低廉,可是能夠處理的資料量與變數量有限制,而且Stata每年都要收費。還有,SPSS與Stata在處理的資料量上面有一定的限制,對於非常大的資料檔(如資料筆數很多),有時這兩種軟體無法處理。

在處理大量的資料方面,目前公認最好的統計軟體是SAS。SAS也是透過寫指令的方式去執行資料整理與統計分析,與Stata相似。SAS的功能也非常完備,可能是統計專業人員最倚重的軟體。但是其缺點是SAS沒有單機版,只有機構版,而且每年計費,且收費不便宜,換句話說,SAS是只提供給機構或團體使用。不是在機構工作的研究人員或沒有與SAS簽約的機構的研究人員都無緣使用SAS。

暑假我修Dr. Luke的健康照護機構策略,Dr. Luke在上課時會用到另一種統計軟體叫做JMP,這是SAS集團的新產品之一,屬於單機版的套裝統計軟體,感覺上相當精巧與友善。JMP是一種互動型的分析軟體,也是使用視窗與對話方塊的功能,研究人員每執行一次動作,結果馬上會呈現出來,使用者可以根據這個結果,再做進一步的資料整理或分析,直到所期望的最終的結果出現。JMP運用很多圖形的方式來呈現分析結果,讓分析人員一目了然。我覺得JMP在整理資料的功能也是我目前所接觸過最友善的,分析人員可以很容易地依照自己的想法操作資料,並且馬上得到自己所想要的資料排列格式。據我所知,JMP可以處理的資料量也相當大,不過其統計功能的涵蓋面可能不像Stata或SAS那麼廣泛與完整。它另外的一個缺點是沒有執行指令檔的功能,因此每個動作都要一次又一次透過對話方塊與下拉式選單去執行。

最近,有位朋友介紹我一種開放程式碼的統計軟體,叫做R。我才剛在了解這個軟體。據我所知,R的統計功能也相當齊全,可以處理的資料量也很大,它是採用寫執行指令的方式去進行分析,但是與SAS、SPSS與Stata不同的地方在於R也是採用互動的方式,讓分析人員一步一步、一層一層分析下去,直到得到自己想要的結果。而且R好像也有執行批次檔的功能。然而最大的好處是R是可以自由取得,不用花錢。不過據說R的上手並不容易,因為它是由專精統計的網友所共同發展出來的,因此還是在變動中,而且沒有一套完整詳盡的操作手冊,而是散布各處,要找到這些使用指南經常要花一些時間。因此,有位好心的統計工作者特別架設了一個網頁[1],專門介紹R給對其他統計軟體有些經驗的人,希望藉此縮短摸索的時間。

對於各種統計軟體所包括的功能,Wikipedia有做比較[2],可以參考看看。

有時候我很納悶,為什麼要有這麼多不同的統計軟體?每一種各有優缺,導致像我這樣,每種都接觸一下,學了一點,卻沒有一種是專精的,還要傷腦筋去想到底要用哪一種作為自己的主要工具。有時候,太多選擇也是頗讓人頭疼,這時就會希望有一種完美的統計軟體:免費、處理無限大的資料量、涵蓋所有的統計功能、可以執行批次指令檔、也有視窗與對話方塊功能,而且,容易學習與上手。

[1] http://www.statmethods.net/index.html
[2] http://en.wikipedia.org/wiki/Comparison_of_statistical_packages

5 則留言:

To New York 提到...

這些統計軟體的多元化跟電腦軟體市場的競爭有直接關係。但是設計統計軟體的考量
和需要﹐因為大過個人使用者的層次﹐才會使這市場變得如此複雜。

就電腦的發展史來看﹐在個人超級電腦還沒有發展出來﹐儲存空間還非常有限的五零甚至到六零年代﹐龐大的資料都是電腦的中央大系統﹐也就是IBM公司發展的Mainframe在作儲存和輸出控制。那時的資料庫語言是Cobol﹐用來寫數學計算的語言是Fortran。

Fortran算是中階語言﹐比最基本的Assembly language高一階而已﹐對不專學電腦語言的研究者來說﹐要學programming很困難。因為這個友善一般使用者的需要﹐在Chicago University教書的幾位社會科學研究者就跟電腦專家合作﹐發展出第一代的SPSS。值得注意的是這雖然是電腦“軟體”﹐是可以讀算和呈現結果的環境﹐卻也是一種新的電腦語言 -- 是用Fortran作底寫創出來新的電腦語法﹐也就是說系統必須先解讀SPSS成為Fortran﹐再由Fortran解作Assembly language﹐然後執行真正的指令。所以SPSS 變成是最高階的語言﹐同時也指由這個語言控制數算和輸出結果的環境。這種模式成為後來發展所有統計軟體語言的典範。

SPSS剛開始也是需要使用者自己寫語言(syntax)。採用視窗的環境和滑鼠點選很後
來的事。

SPSS頭幾代剛設計出來就遇到這語言跟IBM系統相容不是很順利的問題。這問題其實是IBM系統不斷更新﹐Fortran 的發展跟不上﹐導致SPSS也受到限制。另一方面是因為不是專業的程式設計師最先開始使用SPSS﹐卻不擅掌控如何從大系統讀存資料。這兩個問題﹐成為SPSS後來不受工商企業界廣為採用的致命傷。一直要到個人電腦的速度和儲存容量可以和大系統匹敵﹐才有所改善。

SAS 差不多是六零年代末期開始發展進入軟體市場﹐卻一直到七零年代初才比較多人使用。剛開始SAS也是由Fortran寫成。但是能趕過SPSS進佔工商企業﹐是因為電腦語言C的發明。C比Fortran 更容易使用﹐更靈活地能跟Assembly language對談。也就是說C更容易和大系統相容﹐方便使用者從大系統上讀寫存資料。SAS公司的人比較有企業遠見。一看到C的發展具備潛力﹐馬上把後來的SAS 版本改由C﹑而不是Fortran來寫。所以會C的專業程式設計師同時也很容易學會SAS。企業界不缺錢顧人學最新的東西﹐僱了最新的C programmers作系統管理﹐發現這人同時也略懂SAS系統(反之也是)﹐至於統計學者就另外聘請﹐形成企業界裡系統管理專家和統計學者合作﹐而由SAS程式設計師擔任連接兩邊界面的合作團隊﹐促使公司大量採用SAS系統。SAS 就是這樣在整體市場行銷上拼過SPSS ﹐在八零年代幾乎獨佔統計軟體市場。


C 在八零年代初也被用來發展另外一種管理系統﹐叫做Unix ﹐成為IBM Mainframe系
統的勁敵。而且在九零年代起開始有取代IBM Mainframe的趨勢﹐成為新的系統管理
平臺。SAS 當初下對了一步棋﹐現在就騎在浪頭上﹐遠遠超過SPSS。在有進行臨床實驗的藥廠更是如此 ﹐比方美國食品藥物檢驗局在檢查藥廠送交的臨床實驗報告時﹐就同意而且規定藥廠要以SAS檔案格式呈送資料(最近要打破SAS的獨佔﹐規定也能用超越軟體檔案格式限制的XML的格式標準呈送)。

SAS不純粹只是市場行銷上超越SPSS﹐就語言本身的靈活和廣度來看﹐都大到適用於不同的企業。這語言的強處﹐就是因為不需要借助視窗﹐什麼都能辦到﹕比方能用SAS語言本身去讀寫各類商用資料庫﹑輸出全新的報表格式﹑和創造新的統計應用軟體﹐如同用語言C一般。SAS programming本身變成是一種專業。極大部份只用SPSS的人的電腦程度實在不能比。不過對大部份在研究機構的學生和老師來說﹐要精通SAS的程式設計必須花不少時間學﹐實在困難。

STATA原本是由計量經濟學家和電腦程式設計師一起發展出來﹐專用在經濟指數預測。在發展這語言和軟體的時候同時看到SPSS和SAS的優缺點。所以STATA 的語言環境看起來像是SPSS和SAS的混合 -- 要用視窗或純寫程式的功能幾乎一樣 (視窗點選的動作可以記錄成do file 用batch mode送交系統執行)。現代版的SPSS也發現光用視窗會犧牲執行速度和限制用途﹐容許使用者在每個主要視窗按"paste" 的按鈕﹐就可以把語言syntax 記錄下來成為類似do file的syntax file﹐也能交付batch mode執行。

稍微了解STATA多一點之後﹐會知道STATA在處理資料上有一點跟SPSS和SAS很不同。是STATA 的強處﹐比較挑剔的人卻說是STATA的缺點。

SPSS和SAS 在處理資料上是一筆記錄(record or case)讀進來到主要的work memory後﹐在每一個運算的功能(function)處理過﹐把這筆資料寫出到另外的work memory﹐再讀另一筆資料進來到主要的work memory。是線性按照記錄原有存放的次序的處理流程。一筆進來一筆出去﹐下一個記錄才能讀進來。處理完寫出去的記錄不能再回過頭來顛倒做再次的處理。這個流程在SPSS的語言程式裡沒有顯明﹐但系統在檯面下是這樣處理。所以大部份SPSS 的使用者如果沒有被教通﹐就根本不知道為什麼有些指令是必須要先寫才能跟著其他的指令﹐長久來就都搞不通怎樣寫好程式﹐最後只好傻傻地只靠視窗功能。

SAS 的語言裡就把資料讀進來和處理資料的數算功能(在SAS 裡叫做procedure ﹐簡寫作proc)明顯劃分。讀資料的語法部份叫做data step。也是每次只讀一筆資料﹐做基本的資料改寫或操弄﹐寫出到另一個work memory。再讀進另一筆。

但是STATA讀資料的時候就突破這種一筆一筆的處理方式。讀的時候是把所有的記錄一次都讀進到主要的work memory 裡組織形成像Excel裡的table﹐基本上是架構成一個距陣﹐讓使用者可以指明要用哪些變數(variable)﹐而且可以選擇要哪些記錄record ﹐要跳著或是顛倒的順序作處理。舉個例子。比方在SPSS或SAS裡﹐寫程式的方式是要假想一筆資料讀進來﹐能夠處理的是同一筆記錄上不同變數間值的加減乘除(水平方向)。STATA除了水平方向的運算外﹐更可以在一個動作下處理一個特定變數下不同記錄的值之間的加減乘除(垂直方向)。所以更加靈活。

問題是因為是一次讀進所有的資料在work memory裡來架構距陣﹐work memory要夠
大才行。現在一般的個人電腦內設的RAM都足夠處理學術界的研究資料。但是企業界在用的資料庫﹐比方銀行高達數百萬的帳號或是健保資料﹐有時候就大到超過個人電腦上RAM一次讀進所能夠負荷的容量。所以不管學術界和教育界對STATA的靈活程度如何讚不絕口﹐都沒有考慮到企業界的實際顧慮﹐對企業界還是只用SAS的忠誠表示不解。

R處理資料的基本結構跟SPSS和SAS比較像﹐原本是由AT&T Bell lab 在八零年代創
造的電腦語言S演進而來﹐算是最新的發展。所以資料數目比較不是考量。但是處理的速度沒有SAS快。雖然有很多統計學家寫出最新的統計功能﹐在使用者學習手冊上因為沒有市場利益的刺激﹐卻相對欠缺。但只要這兩個問題逐漸得到解決﹐在未來的確可能打破其他統計軟體要使用者付費和不斷提昇版本的困擾。但這也使得R使用者要寫出和其他軟體程式對照的R教學手冊﹐目前受到其他公司用版權百般刁難阻擋。

To New York 提到...

補述一些SPSS 後來的發展。

SPSS 公司看到SAS的優勢﹐後來也趕緊改用C語言作底﹐而不再靠Fortran。但
是使用者社群一分化固定下來﹐讓大部份的專業程式設計師靠攏到SAS陣營去﹐就限
制了SPSS軟體後來的發展。

怎麼說﹖

一個新的程式語言和軟體要能發展成熟﹐起碼都要大概十年的期間。原本開發新語
言和寫新軟體的人沒辦法了解所有行業的需要。是靠使用者用了之後給予回饋和評
價﹐才知道如何改進昇格版本。如前一篇評論所言﹐SPSS的使用者一開始就只是那
些學院裡的社會科學研究者﹐使用統計的程度也許不差﹐但是缺乏對電腦語言廣度
的認知﹐對SPSS和管理系統的相容性也不擅操作。SPSS公司為了繼續留住這群主要
顧客﹐當個人電腦開始躍進時﹐是所有統計軟體中最先接納改用視窗環境﹐好方便
這些設計程式功夫不高的一般使用者。這在當時看起來雖然是最進步的做法﹐長遠
看來卻是劃地自限﹐使專業的程式設計師更避開學SPSS。原因是如果視窗和滑鼠人
人會用﹐那還用得著專業的程式設計師嗎﹖專寫程式的人靠什麼吃飯﹖

所以SAS雖然比較晚接納個人電腦的視窗環境﹐卻比較有耐力﹐能夠靠有好設計程式
功力的使用者社群一起發展更具威力的更新版本﹐提供給各種不同的企業環境運用。


STATA就是看到SAS和SPSS龜兔賽跑的結果﹐雖然也提供視窗環境方便大眾﹐但是不
敢忽略發展STATA語言本身﹐希望能留住不同程度的使用者。淺白地說﹐寫SPSS syntax比
使用視窗功能略為麻煩﹔相反地﹐單寫SAS語言比SAS視窗點選的功能強很多﹔STATA寫
語言跟使用視窗功能的效率差不多﹐但是學會直接寫STATA語法能讓使用者自己設計
統計程序和加強處理數據的功能﹐所以專業的程式設計師學STATA 比一般使用者更
有發揮才能賺飯吃的余地。這種做法也才使得原來是用SPSS或是SAS兩邊不同程度的
人﹐都有改用STATA的好處。

匿名 提到...

看了兩位的留言,在學校教這些軟體應用的我,很佩服你們的見解,實在好奇如何這些知識的,希望可以跟兩位多交流!

張家豪 提到...

受益良多,感謝你們!

thchou 提到...

感謝網友游湘濃提供以下寶貴的留言資訊:

由 游湘濃 於 2016年3月12日 上午5:48 張貼在 為了美麗的地面

以下個人觀點,可能有些錯誤:

SPSS當然是很不錯的,但是價格也很高。大部分人講的SPSS應該是在IBM 將spss改為 business analytics的工具之前的情況吧,現在應該不同了吧。

SAS價格也不便宜,如果你的資料來源是Database,大概還是SAS比較能和Database銜接。如果你是租資料公司的資料庫,或是標準的股票交易的資料庫這種,當然就用SAS最好。

如果你的資料是自己整理出來的,例如將網路原始資料下載下來做整理,那應該是Stata比較好。

因為你整理資料的時候,最重要的是能記錄編輯的每個步驟,也就是說:雖然你手動整理資料,但是,應記錄成一個程式檔,其他人執行這個檔以後,會產生相同的結果,這是最重要的。否則跟作弊沒甚麼兩樣。

其實用Stata整理好資料以後,你可以用matlab來跑矩陣,搞不好才是最快的。

因為很多的convex optimization的運算,也就是找最小值的運算(統計不就是再找最小值嗎?),其實你要考慮矩陣的特性,有很多數學定理對特殊矩陣的運算有特殊解法,例如稀疏矩陣等等。這些定理的運用大部分都只有在matlab上實現,所以跑矩陣建議還是用matlab。

統計模型不就是矩陣的運算嗎?何必要用甚麼統計軟體?很多統計軟體都是不能做擾動分析的,例如你可以告訴我,假設資料中的一個變數紀錄時有1%上下的錯誤,對估計值有多少影響?

這類問題很多統計軟體都做不出來,因為統計公式的估計值,很多只是一個矩陣的多項式運算的公式,而不是用數值方法推算的結果。所以沒法做這類的擾動分析。

如果要做business analytics,你可以將資料傳至主機伺服器,用網頁的方式進行視覺化分析,也不輸給SPSS (SAS也有analytics視覺化分析也很不錯)。當然將資料視覺化圖表是指以瀏覽器來檢視,必須要開發網站,需要花個5~10萬美金請工程師開發。但應該比用SPSS划算。畢竟開發出來可以讓所有人使用,不需按人頭計費。

SAS我覺得還是金融機構的分析才會用吧!因為金融資料比較有結構性,也比較沒有錯誤或紀錄缺失。

如果是microeconometrics的資料,例如公司的股東股權資料,家戶的所得與消費資料,進出口貿易資料,保險的保單資料,選舉的投票資料,政府官員的發言資料,報紙新聞稿上的內容,軍事武器設備資料,網頁瀏覽次數連結次數的資料,網路社群活動的資料,通話紀錄的資料。這類的資料如果先整理存成資料庫,然後再sql取出來分析,就是在做重複的工作了。

因為你要存成資料庫,你的資料是要很結構化的,如果是非結構化的,當你存成資料庫時,可能已經把很多不乾淨的資料剃除了。但存成資料庫的人和分析的人可能是不同人,那就無法因應分析的條件與假設來分類與剔除資料,就會做重工。

而且非結構化的資料有時資料量是很大的,硬要把100T的資料存成單一檔案(因為整個資料庫就是一個檔案)是有問題的。一般的檔案系統(如EXT4)只能存16T,所以你的資料庫如果大於16T,等於你就要花大錢在硬體上了。

所以重點應該是要做一個分類資料、剔除資料、推算缺失資料的的代入值的模型。而不是要討論乾淨資料怎麼分析。

統計的價值是建立一個將原始資料變成乾淨資料的模型。而不是在分析乾淨資料。說真的誰會在乎甚麼變數和甚麼變數之間有沒有顯著的因果關係?根本不重要。那只有學術價值。

事實上有了乾淨資料後,用甚麼模型做分析不重要,因為你可以提出報告,如果A模型就有A預測,如果B模型就有B預測。

事實上有乾淨資料後,其實你用視覺化的方法呈現資料,基本上就可做決策判斷了。

當然這是microeconometrics的觀點。
從這種觀點來看,Stata可能才是最合適的工具



由 游湘濃 於 2016年3月12日 上午5:48 張貼在 為了美麗的地面