看到這兒,大家可能猜到,快黔驢技窮,沒啥可寫了。我在《前言》提到,有些東西非常漂亮,但不容易寫出來。但其中的某一些,簡單提一下還是可以的。 A. 逐月平均 很多人,分成許多組。有兩個數據文件。一個是靜態的資訊,姓名、出生年月,組別等等。另一個是逐月變化的,收入、醫療費、食品開支等等。現在要求每個組每個月的各項平均,年齡、收入等等。我們用SAS,從技術上講沒什麼困難。先把靜態文件按姓名排序(Sorting),再把動態文件也按姓名排序,然後作所謂的匯集(Merge)。把匯集後的大文件按組別和月份排序,最後按組按月求平均。這些都有現成的軟件包,指令加在一起大概不超過20行。問題是這些文件都很大,這個所謂大文件往往有100-200G,最後文件可能是20-30G,也可能是40-50G。最大的麻煩出在排序,要對一個文件排序,我們需要至少3.5倍的硬盤空間(包括自己)。開始兩個文件還可以,要花很多時間,但還可以做。對大文件排序實際上是不可能的。即使你是Unix專家,使用好幾個服務器,時間不說,內存(Memory)也容納不了。所以公司以前都是用抽樣的方法,5%,10%,不一而足。後來我把這個問題解決了,使用了SAS中稱為Look up Table 的技術。不但不用抽樣,100%的數據比抽樣還要快。如果一個很大的文件有很多人,幾百萬或幾千萬,現在要從裡面找出幾十或幾百人,用的就是這種技術。知道那種用法的人還是不少的,但知道如何運用在這兒的人就不多了,至少我們公司就我一人。 B. 皮包公司 我在公司做過一個項目,完全講清楚不容易,或許也不妥當,但和下面所說的例子卻是同構的。美國的能源“巨頭”Enron 轟然倒閉,這兒用引號,是說它的主要業務不是生產能源,甚至也不是買賣能源,而是買賣能源期貨,比如明年8月份以XX分一度的價錢提供你一百萬度電。用貶義詞,就是做買空賣空,空手套白狼的。他們把公司搞得非常複雜,以至於虧損了一大堆還沒人察覺。後來,美國負責金融產品編號註冊的Cusip管理局還專門設計了一些新的編號,用於追蹤這類公司複雜的隸屬關係。現在假定有許多製造公司,其中的許多又聯合起來註冊了許多皮包公司,比如公司A拿出自己30%的資本,B20%,C15%,又成立一家公司。注意我特意使三個數目相加不為1,以免混淆。產品、產量、產值、盈利和以前一模一樣,但盈利(或虧損,下面不再重複)的分配就變得很複雜。這些皮包公司還可以“出資”若干再成立皮包公司。現在給你兩個數據文件,一個是這些非皮包公司的實際盈利和資本,另一個就是這些公司的隸屬關係。第一個文件有兩列,無數行。第一列是(非皮包)公司名稱,第二列是盈利數額。第二個文件有三列,第一列為皮包公司名稱,第二列為下屬公司,第三列是百分比,,第三列是這家下屬公司拿出自己資本的百分之幾來註冊皮包公司。如果一家皮包公司由三家公司組成,這家公司就會在第一列出現三次。非皮包公司是最基層的,自己擁有自己,所以不會出現在第一列。下屬公司可以是皮包的,也可以不是。皮包公司如果不在最上層,就會在第一第二列都出現。現在需要利用這兩個文件求出所有皮包公司的盈利。我做的實際情況,“製造公司”有幾十萬家,“皮包公司”有一萬多,最為複雜的有42層。這裡還有許多一開始很容易忽略的途徑(Scenario)。A和別人合資成立A1,B和別人合資成立B1,A1和B1又合資成立C。A或B還可能在C有直接的股份,兩者也有可能在不相干的D另有投資。但環狀結構是不可能的,C不可能和別人合資成立A,因為A比C先成立,愛因斯坦 的相對論也改變不了這一點。這程序需要思考非常嚴密,另外還需要一種專門的數據匯集技術。數據匯集一般有一對一,多對一,或一對多,這兒要用到多對多的技術。為簡化問題,我們假定這些皮包公司是同時成立的,資本數額就是那時的資本。實際情況更為複雜,你必須有非皮包公司資本額的時間序列。 C. 評估模型 30多個產品由7-8個模型描述,有時候同一模型用不同係數描寫不同產品,比如y = ax + b,不同產品a和 b可以不一樣,我們也認為是一個模型。上級要我對這30多個產品的模型適用情況來個評估,好、不好、一般等等。最後是這樣解決的,30多個產品用的是同樣的方法。先把所有房貸嚴格按照建立模型時的分組方法分組,計算出每個月的Prepayment的理論值,然後把每個月的理論和實際數值逐月平均。因為理論和實際數值由同樣的數據產生,所以這次沒有16,17兩篇中蘋果橘子的問題。我們現在對理論實際的每月平均值求相關係數(Correlation),然後考察兩個數字,平均誤差和相關係數。最後我們把結果按照兩者的狀況分成四組:好好、壞好,好壞,壞壞。第一組保留,第四組換模型。大部分情況下,第二組乘個常數就可以了。第三組取捨需要逐個分析,扔掉的占多數。這種做法似乎過於簡單化,為什麼不看逐月平均以前的相關係數(平均值與這一步無關)。模型兩個最重要的因素是利率和房貸的年齡,這兩個變量是每個月都在變化的。一個壞的模型可以使實際和預測在某一兩個月很接近,但不可能持之以恆。我們檢測的時間範圍,少則2-3年,多則4-5年,如果每個月,或大多數月份都很接近,就說明模型在很大範圍內,或最常見的範圍內都很準確,壞模型是做不到這一點的。這兒僅兩個數字,就幾乎提供了作決定需要的所有信息。如果比較每組每個月的理論和實際數值的差別,又是死路一條。作出正確決定需要的數字越少,這個方法就越是有價值。有些人認為這類信息多多益善,實際上是錯的。在這信息爆炸時代,有經驗的分析研究人員,就應該從浩如煙海的信息中,加以歸納,選出最重要的,或自己使用,或給領導作參考,或在小組會議或學術會議上與同行分享。對於當官的,這事有秘書或手下技術人員代勞,在我的情況,就是自己當好自己的秘書。 D. 逼上梁山 公司為某一筆投資,從某公司購買數據。前面常說打包,這兒是100多包。這家公司的數據有兩種版本,一種一年幾千美元,一種是每月一萬美元,公司買的是便宜貨。數據是一模一樣的,但是。。。貴的數據包裝的整整齊齊,任何統計軟件包就可馬上輸入,便宜的那種你就需要些想象力了。文件一開始是內容提要,結束是領導總結,中間的數據部分還要搞鬼。每一列都會有個名字(Heading),一般來說,人們只使用字母、數字、空格,最多再來點下滑線。這兒就熱鬧了,有問號,百分號,括弧,應有盡有。惡作劇還沒結束,每個文件的列數有多有少,大家共有的有80多列(共有變量),另外有14列搗亂變量隨機地穿插在100多個文件里。 主管此事的是個中國人,他知道要解決這個問題的必要條件是一個人同時精通數據結構、SAS、和VBA(Excel 的程序語言),似乎是非我莫屬了,他就向我老闆把我借了好幾天。最後我是用VBA把這一堆亂麻整理成標準數據格式的。大致有四步,放在一個循環(Loop)中做,大循環中還有好多個小循環。 1) 找出內容提要的最後一行和領導總結的第一行,把這兩部分刪掉,然後把文件存下。他們總算沒有壞到連這一點都不讓你做到。 2) 把所有不規範的變量(包括那14個搗亂變量),賦予一個規範的名字,兩者放在同一表格。然後在經過(1)清理過的文件一列列往下讀,每讀一個就去變量名表里尋找,找到後就把讀到的那一列Heading用規範名字代替。現在假定都找到了。請注意每個文件的列數可能不一樣。為使程序層次清楚,再存一次。 3) 把共有變量(即那14列之外)列成一表格,再把經過(2)清理的文件的Heading 逐列往下讀,每讀一個就去共有變量表中搜尋。一旦找到就把這一列(包括Heading)複製至另一空白Excel文件,找不到的顯然屬於14個變量中的一個,我們就去讀文件Heading的下一列,直至讀完。 4) 好像都完成了,但我比較仔細,假如那家公司把共有變量“提拔”一些變成搗亂變量隨機穿插,這100多個文件的最後格式就會不一樣。有些多幾列,有些少幾列。我們就要反過來,把共有變量表中的每個變量到100多個文件中都去找一遍,只要有一個文件中找不到就要出警示。 "逼上梁山“中的(3)(4)兩點合起來是數據處理中一種非常重要的技巧,就是保證兩組數據完全相同。100多文件中的變量中屬於公有變量的,我們要全部找出來。而所有的共有變量,我們要求在100多個文件中的每一個都能全部找到。象這樣的例子,在我的工作中,不說每天,但可以說每星期都會見到,當然他們是以各種不同面貌出現的。曾經有一次,有個部門要我對某個產品做點分析。我問他們識別標誌是什麼,對方說這種產品的房貸都是從一家公司來的。我說這家公司又不是只做這一種產品。對方還沒反應過來,我就用了下面的例子。有人問你向別人借了多少錢,你說你只向張先生一個人借,但是你怎麼能確定張先生只把錢借給你一個人? |