SAS数据统计分析与编程实践
上QQ阅读APP看书,第一时间看更新

2.3 编写你的第一个SAS程序

从本节开始,我们终于可以正式学习SAS的编程了,相信大家有一种“千呼万唤始出来”的感觉,不过请不要忘记下半句,SAS真正的编程对我们还是“犹抱琵琶半遮面”。SAS是一个复杂的数据分析系统,其中包含了各种模块,甚至还能与其他语言,例如SQL、Java等连接。开始学习的时候,不能追求“会当凌绝顶”,相反要记住“众里寻她千百度”。

在开始编程之前,我们需要将某些概念做出说明和区分。

(1)库:SAS中用于存放数据集的定义路径。注意该路径并非真实存在,而是程序定义出来,故称为逻辑库而非物理库。

(2)数据集:SAS数据的存储方式,可以包含若干变量和记录。

(3)记录和变量:这两个概念在初学者中很容易分辨不清,经常会听到诸如“这个记录是数值型的”或“这条变量为缺失值”类似的说法,因此我们需要辨别一下。记录是SAS中的一条数据,英文为observation,因此在某些地方也被翻译为“观测”,本书使用记录这个名称,一条记录一般涵盖某个实体的分领域信息。在学生时代我们都拿到过的成绩条,它就是关于你这个实体的分科目的成绩的值。变量是数据集中用于存储某一类值的“容器”,在成绩条的例子中,每个人的数学成绩、语文成绩等就被分别存储在不同的变量中。

明确了以上概念,我们就可以开始SAS程序的正式学习了。

SAS的主体程序大都放在data步和proc中,在很多材料中,都会简单地总结data步用于数据处理,proc用于建模和分析。这种分类方法不算有大问题,SAS的设计也确实如此,但真正使用下来,data步与proc并非有严格的区分,两者在数据清理和数据分析上都有所作为。

data步的基本语法为:

以“data+此步创建的数据集名称”作为引导,以run结尾,中间是data步中允许的函数、语句等。

在编程窗口输入以下代码,然后点击工具栏中的“运行”按钮。

此步骤创建一个名为demo的数据集,如图2-37所示,它的内容等于sashelp.demographics,在SAS OnDemand版本中选择输出数据面板。

图2-37

左上角的表名为WORK.DEMO,这是我们在data步定义的新数据集名称,它所在的位置是WORK库,这是SAS的临时库,在SAS关闭后就会清空。如果我们对一个数据集不定义它所在的库,那么SAS会默认它属于WORK库,也就是说在上述代码中,“data demo;”等价于“data work.demo;”。

左侧一栏为变量列表,按照变量所在数据集中的位置显示,我们可以通过左侧的复选框选择它们是否在右侧显示,注意这里只能修改是否显示,无论勾选与否,变量都在数据集中存在。变量列表下方是变量的属性标签,当你选中某个变量时,标签中就会显示相应的变量信息,方便我们查询。右侧是数据集的主体部分,横向每一行为一条记录,纵向每一列为一个变量。

SAS Studio版每页只能显示100条记录,更多的记录需要点击右上角的翻页按钮,而在桌面版中可以显示所有的记录,只需要拖动滚动条即可看到。这也是SAS非桌面版只适合学习,而不适合在工作场景下应用的原因。

下面我们试着在以上代码中做些改变,添加更多的功能。

运行以上程序,得到的数据集的记录数没有改变,但是变量只剩下4个,即name、region、pop和popagr,这就是keep语句的功能,它可以筛选数据集中的变量,语法为:

除了keep,SAS还提供了表2-2所示的功能对变量进行操作。

表2-2

相信以上内容还难不倒你,那么我们继续深入学习,首先看一看保留的4个变量的意义。单击顶端的“视图”,选择“列标签”,如图2-38所示。

图2-38

可以看到数据集产生了变化,如图2-39所示。

图2-39

在左侧变量栏和右侧数据中,变量名称被换成了变量的标签。一般而言,SAS变量的标签用于介绍变量的意义,方便我们理解。从标签中我们可以得知,在上一步保留的4个变量分别为国家名称、所在区域、人口数(2005年)和人口增长率。

现在我们希望按照人口的数量来排序,从多到少来排,这个时候就需要用到proc。proc是procedure的缩写,与data步的语法类似,也是由proc和run(或quit)包裹的程序块,完成特定的功能,但不同的是proc后边需要加上对应的操作名,例如本步操作中,我们需要用到proc sort功能,语法如下:

审视以上语句,相信读者可以理解它的意义。使用proc sort,针对名为demo的数据集,按照pop变量降序排列,如果不加descending,排列的顺序是按照变量升序排列,最后用“run;”把语句扩起来表示proc操作完成。

运行此程序,可以发现数据集有所改变,如图2-40所示。

图2-40

不出所料,人口最多的国家前三名是中国、印度和美国,让人出乎所料的是,人口前十名的国家中包含孟加拉国和尼日利亚这些平时不经常听到的国家。这也是数据分析的目的之一:挖掘平时我们不会注意到的信息。

下面使用类似的功能,按照人口增长率将数据集排序,代码如下:

执行后可以获得图2-41所示的数据集,和图2-40一样,仍然只截取前10条记录。

图2-41

这次上榜的国家很多是我们不熟悉的,阿拉伯联合酋长国以5.81%的人口增长率排名第一,接下来的国家分别是卢旺达、科威特、利比亚、卡塔尔、阿富汗、厄立特里亚、尼日尔、乍得和也门,它们都位于中东和非洲。如果我们对于世界国家一无所知,看到以上信息,我们可能会做出推断——是不是中东和非洲独特的地理、政治、文化等因素导致了它们国家的人口高增长率呢?如果你考虑到了这里,恭喜你!你已经获得了从数据获得猜想或者说信息的能力。

在这里我们要明确数据、信息和知识的区别。一般而言,数据是我们从客观世界获取的可以用数字或文本描述的抽象符号。数据的第一特点就是可描述性,如果某些事物无法描述,或者说暂时无法描述,我们就不能称之为数据。例如一幅图片,我们可以把它的每一个像素点的颜色用抽象符号表示,汇集在一起就是关于这幅图片的信息,但一个人看到这幅图片想到了什么,在过去我们无法记录,它就不是数据。但随着神经科学的发展,我们现在已经可以捕捉人看到这幅画时的神经元的相互作用并且记录,那么这些也可以被称为数据。在不同的时代,我们对于数据的理解是不同的,这是因为数据也必须符合可记录性。在没有美团、饿了么这些平台的时候,我们很难记录一个人的餐饮数据,那么一个人一天吃了什么、吃了多少就不能算作数据,当记录手段发达之后,每个人的点餐数据被平台记录,这时一个人的吃饭记录才能算作数据。数据的第三个特点是抽象性,即数据一定是脱离了客观世界,被抽取出来的内容。还是以外卖平台举例,它可以收集你每次点餐的餐馆、菜品、金额、打折券数据,甚至可以记录你每次点餐的等待时间和你投诉的信息,但是它无法记录你每次拿到餐的心跳变化、每次吃饭所用的时间、地三鲜吃干净了还是把茄子挑出来没吃,即使我们预想在未来这些数据也都可以记录,但对于点外卖这个流程,还有更多的东西无法记录,这就是数据的抽象性。

信息的概念非常复杂,如果要完全讲清楚,一本书可能都无法穷尽它的外延与内涵。信息论鼻祖克劳德·香农所写的《通信的数学理论》已经努力深入浅出地讲解信息的概念,普通人阅读起来尚觉得难易理解,即便是维基百科中对于信息的定义,也让人头脑发蒙。在这里我们不妨也使用抽象的能力,概括出信息的基本特点。信息是从数据归纳、演绎、类比出的结论,信息源于数据,又与数据不在同一个维度。信息可以降低一件事的不确定性。不妨试想你有一个很重要的领导,他现在让你为他点一份外卖,其他任何话他都没有说。这时你会非常犹豫:究竟是点川菜还是粤菜?点一个菜还是两个菜?要不要加一份可乐?这时你的选择可以说无穷无尽,你最终选择结果的不确定性也非常大。这时如果有一名同事告诉你:这个领导是湖南人,从小在湖南长大。湖南在这里就是一个数据,通过这个数据,你可以使用一个演绎法得出如下结论。

大前提:大部分湖南人爱吃辣。

小前提:领导是湖南人。

结论:领导在大概率上爱吃辣。

此时,你的选择已经有了一个大致的范围,如果站在外人的视角上思考,你这次做选择的不确定性降低了。如果这时你又获取了领导自己点外卖的数据,发现他最近十次在公司点外卖,选的都是一家湖南菜馆,每次点菜都是小炒肉加另外一个菜,那么你选择的范围就会进一步缩小,这就是从数据到信息的过程。

将信息综合、总结起来,我们可以获得知识。这里还是举例说明,药厂研制一款药品,要经过漫长的临床试验,期间需要收集大量临床试验数据,将这些数据整理、分析、制表、呈报,这就是将数据加工成信息,再加工成知识的过程。在实验中,我们获得的每名患者在不同时间点的各种检测结果,就是数据。将数据制作成表格或图像,让人可以阅读和理解,这就是创造信息的过程。例如我们通过总结数据,获得了表2-3所示的临床试验药物有效性统计信息。

表2-3

表2-3并不会出现在真正的试验报告中,这只是一个极度精简的表格。从这个表格中我们可以得出结论——试验组药物的有效性要明显高于对照组,这就是从数据得到的信息。如果表格中再加入p-value、比值比和置信区间等统计参数,那么我们就可以归纳出更精确的信息。

将通过临床试验数据绘制的各种表格,包括有效性分析表、副作用统计表、生存率、人口统计学数据表等,整理总结,形成报告,呈交审批部门,这份报告中往往都会包含一句话:经过严格且标准的试验数据分析,我们认为该药品具有良好的安全性和有效性。这句话就是对试验药品的知识,它是信息的总结和提炼。

以上内容对数据、信息和知识进行一个简单的区分,目的是为了告诉读者,数据分析师虽然面对的是数据,但真正对我们有用的是信息和知识。在本书的第三篇,我们还会具体讨论一个数据分析师跟数据、信息和知识更深层次的关系。