如何利用SAS使得程序更加標準化、自動化一些,減少人工操作,從而提高運行效率?

新人剛工作3個月,保險精算方向的;公司屬於中小型企業,每個月的數據cube算是利用sas程序臨時搭建起來的,所以在運行時間上還有人為操作上效率比較低但是勉強還是能運行完;我也仔細研究了一下源程序所用到的sas知識幾乎全是sas
base,宏方面的運用都是最基本的,而本人也是只比較熟悉一些sas
base,據說宏方面的內容還有專門的書籍但本人還未來得及涉獵;現在上級希望我能在此程序的基礎上能夠對程序進一步優化,從而實現程序更加標準化、自動化,從而減少每個月的人工操作,省得每個月把相關的名稱、地址改來改去,從而能夠提高運行效率,減少失誤。


所以在這裡請教各位大神,針對樓主這種情況,對程序的優化方面除了對業務知識的深入了解外,在sas方面需要掌握哪部分知識?


謝邀。

並不了解精算師日常的主要工作是什麼。如果要提高SAS程序的標準化,減少人工操作的話,我覺得有一下幾類方法可以嘗試。

1. SAS Enterprise guide

用flowchart來管理程序和數據,能夠在一個有條理的框架下對整個項目進行管理。同時,設置autoexec能夠實現打開SAS EG後自動運行一些SAS程序,我一般在裡面定義一些全局變數,邏輯庫名,Macro和Format,這些就不用每次開機都要去運行一遍了。

2. 利用config文件管理程序中依賴於環境的變數。

自己在項目邏輯庫所定義的文件夾裡面新建一個config文件,設為任意一種可以讀取的格式。利用這個文件儲存那些頻繁改動的信息,比如各種文件的路徑名,一些經常更改的參數等等,都存在config文件裡面。每次運行的時候,通過事先寫好的SAS程序來讀取config文件中,來給SAS程序提供參數。如果需要改動這些參數,直接在config文件裡面修改就行,不需要修改sas程序本身。

3. 利用外部的數據字典來管理SAS數據集的變數名,標籤和格式等。

在外部設置一個數據字典,儲存相應數據集的變數信息,並寫好相應的宏程序。如果需要更改變數名或者標籤或數據類型等,直接在數據字典裡面進行修改,然後在SAS中運行宏程序讀取字典,並自動修改字典對應的數據集。

4. 分解問題,縮小宏程序的規模。

一個宏程序只解決一個具體的問題,如果一段宏程序過長,會影響重複使用的效率,降低可讀性。雖然網上和SAS的Paper上看見的大多是一大段Macro來實現一個複雜的功能,但我在平時寫宏的時候還是傾向於分解成很多塊,然後有一個主要的宏作為框架來調用其他宏程序。這樣容易debug,並且其他人使用的時候也能比較容易理解你的邏輯和意圖。另外多用%local來限制宏變數的作用域。

5. 考慮程序的Robustness。

比如要實現一個文獻中的統計方法,如果只是考慮本次數據集的結構,那麼下次換了數據集又得修改宏程序。如果預先考慮到一些細節,比如允許變數的個數,變數是數值型還是字元型,如果有缺失值則如何處理,某些參數是硬編碼到程序里,還是放在參數里可以自由修改,如果設置了不合理的參數,應該怎樣提醒等等。

6. 寫好注釋,與合作者約定好規範。

特別是宏程序,需要在開頭的地方寫好每一個參數是什麼意思,接受什麼類型的數據,宏程序實現的功能是什麼。此外,變數名盡量起得長一些,可以考慮駝峰命名或者下劃線連接,不然一堆a,b,c自己都忘了是什麼意思了。還有與合作的人約定好一些命名規範,縮進和注釋等等,畢竟看別人寫的東西,尤其是SAS,尤其心累。

以上都是科研用途中的一些經驗,僅供參考。


謝邀。你說的這類需求SAS base能夠解決了,並不需要更多的程序技巧,對數據的熟悉是最重要的。


SAS只是工具

SAS只是工具

SAS只是工具

個人覺得你老闆對你的要求或者期望不是代碼和程序層面的,而是業務層面的。代碼也好程序也好,只是實現最終分析目的的工具。題主既然是精算人員而非IT人員,更因該將注意力放在對業務的理解上。

動手之前

在做工作流程標準化、自動化的工作之前,重要的是找到那些無法自動實現必須人工操作的業務環節。可以從以下幾個問題入手:

1、哪些業務環節是必須由人工來操作的

2、必須由人工來操作的原因是什麼

3、人工操作的失誤可能有哪些

4、如何通過提示、校驗避免人工操作的失誤

開始動手

釐清上面的問題,接下來才是標準化、自動化的工作。雖然說是標準化和自動化,但並不是所有操作都寫進程序里的。標準化和自動化,是對業務需求的提煉,將操作標準化和自動化,將業務需求參數化。在編程之前,需要認真梳理業務流程和流程之中的業務邏輯。在這個過程中,還需要找到業務中,可以參數化的信息。參數化的信息是指,隨著程序執行的場景不同,需要調整,但是調整是有規則的這類信息。即便是自動化的程序,執行前還是要輸入參數的。在設計程序參數時,可以考慮以下三個層級:

1、必要參數

例如日期、流水號、版本號、機構代碼等,執行程序必須錄入的參數。這類參數不應過多。如果一個程序這類必要參數過多,可能是集成的功能太多,不一定每個參數都貫穿程序的始終。這時就要對程序進行分拆。在SAS中,用全局宏變數(%GLOBAL)定義貫穿始終的參數,用本地宏變數(%LOCAL)定義某個宏或者某段程序的變數。

2、默認參數

這類參數通常是扮演OPTION的角色,在編寫宏時可以通過賦予默認值的方式簡化輸入。簡單的比如是否要生成分析需要的臨時數據集,默認值是NO,如果第一次跑程序,可以手工改成YES,之後可以默認調用,提高系統執行效率。

3、額外參數

這類參數通常用來擴展程序的功能。如果不輸入程序也能執行。如果輸入,則會有額外的功能。比如一個生成隨機數的程序,可以配置一個額外參數為隨機數種子,以此來控制生成的隨機數序列。在不輸入隨機數種子的情況下,SAS會取一個默認的種子。當給定一個隨機數種子時,SAS會生成給定種子對應的隨機數序列。同一個種子生成的隨機數序列是相同的。這樣,在測試和檢驗程序的時候,可以指定種子來確保不同人生成的序列是一致的;在日常應用時,該參數又能夠預設以簡化代碼便於使用和閱讀。

最後,程序是個不斷調整的過程

當你進一步完善了程序的自動化之後,就相當於為你的老闆解放了勞動力。老闆在對你感激涕零的同時一定不會辜負你的勞動所給他/她帶來的發揮想像力和創造力的空間。不管是業務還是管理的需求都是在不斷演進的,而你的程序肯定也會經歷不斷修改,增加功能的過程。這個過程中,要及時與老闆保持良好的溝通,闡釋你的程序中的業務邏輯,了解老闆的思路框架,確保自己程序的成長性和延展性,避免開發維護了很久結果還要從頭干起的悲劇。

另外補充大象說的,SAS EG的底子還是SAS BASE。目前在對EG的使用過程中,感覺EG模塊化了一些SAS BASE的分析框架,比如方差分析或者回歸。EG的模塊化對於使用者而言,交互界面變得友好了很多,但執行效率個人感覺不如代碼。另外一點,EG提供了一個工作流程可視化的界面,這個對於多人協作、業務流程標準化發布以及後期的問題查找都是很有幫助的。


使用宏定義報表參數,如日期等,另外code中盡量模塊化,方便日後轉作他用可以任意組合使用,另外可以使用x調用主機自動後台定時提交運行的程序


推薦閱讀:

用 C++ 實現 Spark 有意義嗎?
矩陣補全(matrix completion)的經典演算法有哪些?目前比較流行的演算法是什麼?
處理金融數據為什麼要對數化?
Excel 的 VBA 現在還算是辦公利器嗎?

TAG:數據分析 | SAS | 精算師 | 自動化 | 數據處理 |