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

1.2 Python这么火,我为什么要学SAS

看到本节的题目,你可能以为这是一个引战话题,强行罗列SAS的优点和Python的缺点进行对比,然后得出SAS是最好的数据分析语言的结论。以上这种思维方式恰恰是数据分析的大忌。我们做数据分析,最根本的目的是为了获得一些原本不知道的信息和洞见,如果在分析之前就已经有某些观点,在分析过程中只关注可以形成这些观点的数据,那么形成的结论必然偏颇,对于实践的指导性其实很小。数据分析师不是数学家,我们要做的任务不是“证明”,而是“探索”。

每名数据行业从业者都有自己使用的语言,在使用时间长了之后,我们可以很容易地使用它完成各种任务,所谓熟能生巧,分析师很容易产生一种“这个语言很强大,什么活儿都能干”的印象,当你被迫使用某些其他语言或工具完成一个临时任务时,因为对新语言或工具并不熟练,只能使用比较基础的功能,自然会有额外的耗时,这样又反而强化了“其他语言都不好,不如我现在用的语言方便”的印象。

其实,一款数据分析工具之所以好用,不一定是它的设计和底层逻辑优秀,而是使用这个工具的人和工具融会贯通。因此没有最好的语言,只有最好的程序员。

那么,是不是说语言之间就无法比较优劣了呢?其实不是,一个优秀的数据分析师不会简单地推荐你用某个分析语言,而是要讲出各种语言的优劣对比,适用环境和学习曲线。就像一个美食家品评菜品,不会简单地说宫保鸡丁好吃,鱼香肉丝难吃,而是根据不同厨师的水平、经验、流派,提出一个全方位的总结。虽然本节标题中只提到了Python与SAS,但现在主流的数据分析语言有3~4种,它们各有优劣,以下就针对它们的优劣来介绍。

1.2.1 R语言:统计分析专业户

R语言是为统计分析而生的语言。

它是诞生于1980年的S语言的一个分支,S语言是由贝尔实验室创造,用于统计分析和作图的解释性语言。R语言最大的特点是免费开源,并且有跨平台性,无论是Windows、Mac OS或是Linux,都可以直接下载安装程序和扩展包。正因如此,R语言被广泛地用于科研和教学。每个R语言的初学者都会被其琳琅满目的程序包和插件吸引,很多时候,复杂的建模、绘图功能,只需要程序包中几个简单的函数就能搞定。同时,R语言的绘图能力也非常强大,用几个简单的命令,即可创建出鲜明、交互性强的图表,方便报告与展示。更重要的是,R语言的语法简洁,初学者即使没有任何编程基础,也很容易在几天之内轻松入门。

例如,统计分析中常用的建立一元线性回归模型,就可以用以下代码实现:

前两行是为变量x与y赋值,第三行建立模型fit,使用lm函数计算因变量y针对x的一元线性模型,然后用summary函数获取模型fit的相关参数,整个步骤简洁、明确,初学者一看就能够理解。当然,简洁不代表简单,lm函数除了一元线性回归模型,还可以做多元的线性回归,返回的统计量也非常繁多。

虽然R语言的优点难以否认,但缺点很明显。其一就是内存管理的混乱。很多使用R语言的朋友都有这种体会,在学习期间使用R语言非常方便,处理各种数据都是游刃有余,一旦到了工作之中,R语言所写的程序运行效率大大降低,有时还会有奇怪的报错。其实,这些都源于R语言内存管理的缺陷。在学习期间,我们所用的数据往往都是小数据,最多不过几千条,此时R语言的效率非常高,一旦处理真实数据,动辄数十万条的数据很容易让内存被填满,因此内存管理就成了一门必修课,很多时候我们不得不牺牲程序效率,进行一些内存管理工作。

另外,R语言还有一个问题就是包的质量参差不齐。由于是开源软件,任何人都可以自己制作一个包并上传,很多常用的包例如data.table、ggplot2、gbm、lubridate、randomforest,已经被广泛使用并检测,基本不存在问题,但有时你需要的功能比较偏门,需要自己寻找一些包,此时如果使用了逻辑存在问题且未为被发现的包,统计分析的结果难免产生偏差。更重要的是,因为包有时会进行更新,如果修改内容没有及时放到日志里,我们很难察觉,导致几个月前还能得出正确统计结果的模型几个月后再跑一次就会出错。所以很多时候,R语言的程序员会坚持核心或者非常用代码部分完全自己写,避免错误或者难以debug,但这也影响编程的效率。

另外,如果把SAS与R语言对比来看,就会发现R语言的主要优势在数据分析,而在数据整理上并不擅长,类似merge、aggregate之类的函数虽然存在,但与SAS的data步的方便程度相比还是不可同日而语。

总而言之,R语言是一款上手容易、操作方便的数据分析工具,但其对大数据的支持和稳定性确是其弱势之一。

1.2.2 Python:成功“出圈”的编程语言

Python语言是目前最火的数据分析工具。

在2019年,Python语言也被称为最“出圈”的数据分析工具。如果你打开朋友圈,不论你现在的职业是什么,经常会收到Python语言入门课程的广告,8.9元学习原价150元的入门课程,这被称为Python语言“出圈”的典型营销案例。另外,地产大鳄潘石屹在2019年11月发微博表示(见图1-2),自己要开始学习Python语言,之后又发了一条长微博详述学习Python语言的原因。

图1-2

Python语言的热度在经过几年的沉浮后仍然位列各大编程语言排行榜的前茅甚至是榜首(图1-3为2019年编程语言排名),这一点是毋庸置疑的。

图1-3

和R语言一样,Python语言也是开源的,这就注定它与R语言有类似的优点。Python语言的语法简单,容易上手,对新手比较友好。另外,Python语言也有强大的库,当你想编写功能比较复杂的程序时,不用自己费时费力地一行一行敲代码,只需要找到Python库中的某些功能,在设定几个参数后就可以自动实现。同时,Python语言不止可以做数据分析,还可以完成某些编程功能,例如抓取网页,这也注定了Python语言广泛的用途。

在肯定Python语言优点的同时,我们也必须看到它的某些缺点。作为高级语言,Python语言有一个高级语言的通病,就是执行效率低下。例如Python语言是弱变量类型语言,也就是说,我们不需要定义变量类型,程序在执行的时候会自动检查,但检查这个步骤就会影响程序的执行效率。

其实,程序的易用性和效率是一对欢喜冤家。在早期,计算机的性能并不是很好,效率是一门语言重要的评价标准,彼时诞生的语言例如C、Java,执行效率都很高,并且有强大的内存管理能力,但它们的简洁度都不高。但随着计算机硬件的发展,诞生的语言往往注重易用性,即让用户可以快速上手,其中的代表就是Python语言。Python语言代码的简洁度在所有程序中也是名列前茅的,很多在Java语言中需要近百行代码才能完成的程序,在Python语言中有时只需要几行即可实现。但Python语言的缺点也很明显,就是执行效率较低,在处理大规模数据时表现总不尽如人意。

其实,我们不用过分纠结语言的性能与易用度的矛盾关系,而要关注每个语言自身的特点,选择最合适的工具去实现数据分析的功能。事实上,最好的雕塑家绝不会只告诉你自己的工具多么好,而是会拿出一件件美轮美奂的雕塑作品,让你痴迷。

1.2.3 SAS:非开源的强大数据分析工具

终于说到本书的主角——SAS。首先我们要承认SAS的天然缺点,即非开源性。

我们知道,开源软件往往伴随着大量用户贡献的库和包,供其他用户随意使用,因此可扩展性很强。SAS是SAS研究院创建,最开始是用于分析大量农业数据,由美国国家卫生研究院出资,联合8所顶尖大学共同开发,随后SAS又经过了多年迭代,最终成为一个拥有数十个模块的系统化、集成化、模块化的数据分析软件。目前SAS系统在国际上已被誉为统计分析的标准软件。

从以上SAS发展的历史就可以看出,SAS的诞生既不是像Python语言那样由天才程序员天马行空创造,也不是R语言那样脱胎于其他语言(S语言)而来。从诞生之初,SAS就是为了解决复杂问题而生的。并且,SAS诞生之初,针对的问题是特定领域、大样本数据、有限算力,与其他语言面对的问题都不相同。

SAS的非开源性导致其并没有第三方用户贡献的包或库,所有功能都由SAS公司的程序员编写,经过编译、审核后逐步发布在新版本中。如果说R语言和Python语言是越野车,可以随心所欲地开到任何想去的地方,那么SAS就是一列火车,只能按照修好的铁轨行驶,不可以随心所欲,也不能随意“脱轨”。

既然把SAS比喻成了火车,那我们就再用这个模型来说一说SAS相比起R语言和Python语言的优势。

首先,火车的运输能力比汽车强大百倍,反映在软件中就是执行效率。SAS的底层通过高效的C语言编写,然后经过大量优化,效率又得以提升。另外,由于SAS所有的功能都经过SAS公司专业程序员的编写、审核,运行效率比R和Python高数倍以上。在实际工作中,当数据量超过上千条而变量又比较多时,R和Python就已经需要优化才能很好地运行,而SAS处理上万条数据轻而易举,即使是数十万条数据也可以在十秒左右完成操作。

另外,火车另一个优势是它可以通向更深的地方,当然我这里特指我家优秀的铁路网络建设,可以让几乎每个县城的居民都搭上火车,随意在全国畅游。对应到SAS上,就是SAS针对不同数据整理和统计功能所设计的高效的命令。SAS的语句主要分为data步和proc,具体的语法我们会在之后的章节慢慢展开,这里可以先记住data步主要用于数据整理和变形,proc用于数据统计和分析。在proc大框架下内置了大量统计分析所用的常用功能,例如proc sort(排序)、proc transport(转置)、proc means(获取统计量)、proc reg(回归模型)、proc lifetest(生存分析),每个proc内又有大量可以自定义的参数,保证了功能的多样性。

最后,也是SAS最重要的一个相对优势,就是其语言的执行逻辑就是针对数据集而非数据的。对于不熟悉SAS的朋友们,这条可能不好理解。例如图1-4中是未排序的药物副作用记录。

图1-4

图1-4中4列变量的意义分别如下。

●SUBJID:患者的ID编号。

●TRTA:患者所在的实验组。

●AESDTC:该副作用反应的开始时间。

●AEMODIFY:该副作用的名称。

一般而言,我们需要对数据集进行排序,先按患者ID编号排列,在每个编号内按照副作用反应的开始时间进行排序,在SAS中的语法如下:

虽然我们尚未开始SAS编程语句的学习,但相信大家可以简单理解以上的意思。以上语句使用proc的sort排序功能,对数据集AE排序,用于排序的变量为SUBJID和AESDTC。通过以上操作,我们可以获得如图1-5所示的数据集。

可以看到,数据已经按照我们设计的方式排好序,这是因为SAS的数据处理和分析功能针对的都是整个数据集,而非某条记录或某个值,而其他的部分编程语言,尤其是早期的语言例如C和Java,它们面向的最基本的对象都是变量,因此在处理数据集的时候就要烦琐许多。相比于R语言和Python语言,两者虽然有比较好的处理数据集的方法,但其语言设计的基本对象仍然为变量,因此与天然为数据集而生的SAS在语法上有较大区别。

图1-5

以上为各位读者梳理了主流编程语言的优缺点。仍然需要强调,编程语言并没有好坏之分,只有使用的难易和运行效率的区别。另外,每个行业都已经形成了一套自己成熟的数据分析框架,这些框架往往是绑定在某些语言上的,例如医药行业与SAS深度绑定,美国FDA将SAS作为官方唯一推荐的数据分析语言;R语言广泛用于科研;Python语言则在人工智能中发挥独特作用,这些语言在某些行业的使用并不代表它们是最完美的,我们应该将“因为好,所以用”的逻辑反过来,是因为某行业使用,所以该语言迭代发展得越来越适合这个行业。如果你正要步入职场,或者在职场拼搏几年小有成绩,希望发展得更快,请不要纠结于语言的使用,引用网络游戏中经常出现的一句话“没有最强的职业,只有最强的玩家”,我们可以说,“没有最强的语言,只有最强的数据分析师”。