看到这儿,大家可能猜到,快黔驴技穷,没啥可写了。我在《前言》提到,有些东西非常漂亮,但不容易写出来。但其中的某一些,简单提一下还是可以的。 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多个文件中的每一个都能全部找到。象这样的例子,在我的工作中,不说每天,但可以说每星期都会见到,当然他们是以各种不同面貌出现的。曾经有一次,有个部门要我对某个产品做点分析。我问他们识别标志是什么,对方说这种产品的房贷都是从一家公司来的。我说这家公司又不是只做这一种产品。对方还没反应过来,我就用了下面的例子。有人问你向别人借了多少钱,你说你只向张先生一个人借,但是你怎么能确定张先生只把钱借给你一个人? |