重磅推荐
【产品特色】

【编辑推荐】
SAS公司官方推荐学习用书
免费提供本书配套源程序下载

循序渐进掌握数据分析要义和精髓
从数据中获取洞见与智慧

北京大学信息科学技术学院博士生导师、教授 张铭
国务院发展研究中心研究员 刘云中
艾德思奇(adSage)董事长 唐朝晖
SAS中国研发中心总经理 刘政
慧科集团技术产品中心技术副总裁 李嘉
《SAS编程演义》作者 谷鸿秋
北京冲和资产管理有限公司量化投资总监 付春光
致远互联高级副总裁 杨祉雄
华为供应链管理部数据科学家 林建伟
SAS中国销售总监兼合作伙伴与渠道负责人 陈云凯

联袂诚意推荐
【内容简介】
本书共27章,分为上下两卷:上卷介绍SAS编程基础与使用方法,是广大程序员快速掌握SAS编程技术的简明开发教程;下卷阐述数据分析的关键基础知识并提供相应SAS代码实现,目的是激发读者兴趣,跨越传统编程与数据分析的鸿沟,从程序员华丽转身为数据科学家。书中演示代码力图简洁清晰地解释相关概念,追求大道至简。本书兼顾编程技术与数据分析,期许程序员、信息处理与统计分析人员以及对数据分析科学感兴趣的读者都能从本书中获益良多,循序渐进地掌握数据分析的要义和精髓,从数据中获取洞见与智慧。
【作者简介】
巫银良
SAS 中国研发中心技术总监,北京大学信息科学技术学院客座教授。主要负责SAS 中国研发中心大数据与可视化分析技术、可视化数据挖掘与机器学习,商业智能和移动应用等产品线的项目管理。
毕业于北京大学,获理学学士和硕士学位。拥有近 20 年计算机行业研发和管理经验,在企业应用和商业分析领域有深厚的技术功底。专注于研发管理和项目实践,涉及领域包括人工智能、大数据与可视化分析、金融量化分析与自动交易、商业智能与互联网、大型商业软件研发管理等。
【目录】
上 卷

第1章 SAS语言入门 002

1.1 语言概述 005

1.2 编程环境 010

1.3 SAS Studio编程 016

第2章 数据集与DATA步 032

2.1 SAS 逻辑库 032

2.2 SAS 数据集 036

2.3 DATA 步 041

2.3.1 内嵌数据行或外部数据文件 043

2.3.2 通过已有 SAS 数据集生成 048

2.3.3 通过 PROC IMPORT 或 PROC SQL 生成 051

2.4 DATA 步的运行机制 054

2.4.1 编译阶段 055

2.4.2 运行阶段 056

2.5 DATA 步语句快速索引 057

第3章 变量与表达式 062

3.1 常量与变量 062

3.1.1 变量长度与缺失值 063

3.1.2 数值常量 065

3.1.3 日期/时间/日期时间常量 067

3.1.4 字符常量 067

3.2 表达式 068

3.2.1 运算符 068

3.2.2 运算符优先顺序 072

3.2.3 WHERE 语句特定运算符 072

3.2.4 赋值语句 073

3.2.5 累加赋值语句 074

3.2.6 RETAIN 语句 075



SAS技术内幕:从程序员到数据科学家

3.3 SAS数组 077

3.3.1 数组名称 079

3.3.2 数组元素变量列表 079

3.3.3 数组长度 080

3.3.4 隐式下标变量 080

3.3.5 多维数组 081

3.3.6 临时数组 082

3.3.7 数组排序 083

3.3.8 注意事项 084

第4章 流程控制 087

4.1 DO-END语句块 087

4.2 分支控制 088

4.2.1 IF-THEN 分支控制 088

4.2.2 ELSE-IF 多分支控制 090

4.2.3 SELECT-WHEN 多分支控制 090

4.3 循环控制 091

4.3.1 指定次数的循环:DO-TO-BY 091

4.3.2 指定条件的循环:DO-WHILE 与 DO-UNTIL092

4.3.3 指定集合的循环:DO-OVER 093

4.4 特殊的流程控制语句 094

4.4.1 跳出循环语句:LEAVE 094

4.4.2 继续循环语句:CONTINUE 094

4.4.3 返回语句:RETURN 095

4.4.4 中止执行语句:STOP 与 ABORT 095

4.4.5 跳转语句:GOTO 与 LINK 096

第 5章 函数封装 099

5.1 LINK-RETURN 技术 101

5.2 SAS宏函数封装 103

5.3 FCMP函数 105

5.4 系统函数速查 110

第6章 SAS宏 113

6.1 宏变量 114

6.1.1 命名 114

6.1.2 作用域 114

6.1.3 系统宏 115

6.1.4 宏代码调试 117



目 录

XIII

6.1.5 宏表达式 117

6.2 宏函数 119

参数定义 120

6.3 逻辑控制 121

6.3.1 宏语句块 121

6.3.2 条件分支 121

6.3.3 循环控制 121

6.4 系统宏函数 122

第7章 DS2 124

7.1 程序结构 126

7.1.1 变量声明与类型 126

7.1.2 程序实体作用域 129

7.1.3 变量数组与标准数组 130

7.1.4 系统方法与用户自定义方法 131

7.2 数据程序 136

7.3 包程序 137

7.4 线程程序 143

第8章 代码组织 149

8.1 静态文件包含 149

8.2 程序中动态扩展代码 151

8.3 动态执行外部命令 153

第9章 文件读写 157

9.1 二进制文件读写 157

9.2 文本文件读写 159

9.3 顺序读取多个文件 162

9.4 并行读取多个文件 165

9.5 共享缓冲区读写 166

第10章 按位运算 168

10.1 按位运算 168

10.2 实现方法 169

10.3 按位运算应用 173

第11章 扩展SAS功能 177

11.1 通过 Module调用外部 DLL函数 177

11.2 用 C 语言开发用户函数库 182

11.2.1 准备64位 C 编译环境 182



SAS技术内幕:从程序员到数据科学家

11.2.2 开发用户自定义动态库 183

11.3 PROTO 编写 C 代码或注册外部 DLL 184

第12章 数据结构——数组 187

12.1 数组 187

12.1.1 DATA步数组 187

12.1.2 FCMP 数组 189

12.1.3 DS2 数组 192

12.1.4 SAS宏数组 193

12.2 数组应用:高精度数值计算 194

第13章 数据结构——队列与堆栈 196

13.1 队列 196

13.1.1 函数版实现与示例 196

13.1.2 宏版实现与示例 199

13.2 堆栈 202

函数版实现与示例 202

第14章 数据结构——链表 206

14.1 基础知识 206

14.2 如何在 SAS 代码中内嵌 C 语言代码 207

14.3 单向链表和双向链表 209

14.4 链表应用:约瑟夫斯问题 216

第15章 数据结构——二叉树 221

15.1 PROTO 实现与封装 221

15.2 FCMP二叉树实现 227

15.3 二叉树应用:算术表达式求值 231

第16章 数据结构——矩阵运算 235

16.1 FCMP 矩阵运算 236

16.2 DS2 矩阵运算 243

16.3 矩阵应用:线性方程组求解 246

16.4 矩阵应用:非线性方程组求解 248

第17章 数据结构——图 255

17.1 深度优先和广度优先遍历 256

17.2 *短路径问题 260

17.2.1 Dijkstra算法 261

17.2.2 Bellman-Ford 算法 263

17.2.3 Floyd-Warshall 算法 265



目 录

下 卷

第18章 统计学基础 270

18.1 数据特征度量 270

18.1.1 集中趋势度量 272

18.1.2 离散趋势度量 274

18.1.3 分布特征度量 277

18.1.4 置信区间、置信水平与 p-值 279

18.2 统计学上的变量类型 280

18.3 基本数据处理 283

18.3.1 排序与排名 284

18.3.2 数据转置 285

18.3.3 堆叠与拆分 286

18.3.4 过滤数据 287

18.3.5 随机抽样 289

18.3.6 基本统计量 290

18.4 基本图形图表 292

18.5 SAS 产品与过程步概览 303

18.5.1 SAS核心产品功能简介 305

18.5.2 Base SAS 过程步速查 309

18.5.3 SAS/STAT过程步速查 318

第19章 大数定律与中心极限定理 327

19.1 大数定律 327

19.1.1 弱大数定律 327

19.1.2 三种大数定律 329

19.1.3 图形化证明 330

19.1.4 强大数定律 333

19.2 中心极限定理 334

19.2.1 大数定律与中心极限定理关系 335

19.2.2 图形化证明 336

19.2.3 实际用途 340

第20章 统计分布 342

20.1 均匀分布 342

20.2 离散型统计分布 345

20.2.1 伯努利分布 345



SAS技术内幕:从程序员到数据科学家

20.2.2 二项分布 347

20.2.3 几何分布 353

20.2.4 负二项分布 357

20.2.5 超几何分布 360

20.2.6 泊松分布 362

20.3 连续型统计分布 365

20.3.1 正态分布 365

20.3.2 对数正态分布 373

20.3.3 指数分布 376

20.3.4 卡方分布 379

20.3.5 学生t-分布 381

20.3.6 F分布 387

20.3.7 柯西分布 390

20.3.8 贝塔分布 392

20.3.9 伽马分布 395

20.3.10 爱尔朗分布 397

20.3.11 韦布尔分布 399

20.3.12 三角分布 400

20.3.13 Table 分布 401

附录:各统计分布之间的关系 403

第21章 方差分析 404

21.1 假设检验 404

21.2 方差分析 406

21.2.1 学生t-检验 406

21.2.2 单因子方差分析 408

21.2.3 双因子方差分析 418

第22章 数据标准化 421

22.1 常用标准化方法 421

22.2 SAS数据标准化 424

22.3 自定义数据标准化 429

第23章 主成分分析与因子分析 433

23.1 主成分分析 434

23.1.1 主成分分析原理 435

23.1.2 主成分分析的具体步骤 436

23.2 因子分析 443



目 录

23.2.1 因子分析原理 443

23.2.2 巴特利球度检验和 KMO 检验 443

23.2.3 因子分析的具体步骤 445

第24章 相关分析与回归分析 450

24.1 变量关系 450

24.2 相关分析 451

24.2.1 线性相关性度量 451

24.2.2 非参数关联度量 452

24.2.3 定量数据的相关分析 455

24.2.4 类别数据的相关分析 457

24.3 回归分析 460

第25章 聚类分析 467

25.1 聚类度量 469

25.1.1 距离系数 469

25.1.2 相似性/相关系数 471

25.1.3 SAS实践 473

25.2 聚类形成方法 475

25.2.1 一次形成分类系统 475

25.2.2 K-均值聚类 477

25.2.3 逐步形成分类系统 485

25.2.4 R 型聚类分析 491

25.3 自己实现聚类算法 494

25.3.1 K-均值方法 494

25.3.2 逐步形成分类系统 501

附录:聚类度量的自定义实现 509

第26章 神经网络 512

26.1 神经元模型 513

26.2 神经网络 517

26.2.1 训练神经网络 519

26.2.2 反向传播算法 519

26.3 SAS 代码实现与范例 524

第27 章 π高精度求解与探索分析 536

27.1 π值计算 537

27.1.1 蒙特卡罗方法 543

27.1.2 蒲丰投针方法 544



SAS技术内幕:从程序员到数据科学家

27.1.3 微积分方法 545

27.1.4 幂级数方法 546

27.1.5 幂级数高精度方法 548

27.1.6 梅钦类公式高精度方法 550

27.1.7 迭代方法——贝拉公式 554

27.2 π值分析 557

27.2.1 数字分布规律 558

27.2.2 可视化探索 561

附录 564

参考文献 598
【前言】
本书是写给程序员的数据分析技术入门书籍,成书于 2017 年作者在北京大学教授
面向研究生和高年级本科生的“统计分析与商务智能”选修课期间,它试图在程序世界
和数据分析世界之间架起一座坚实的桥梁。

本书主要包括上下两卷内容:程序员视角下的SAS 编程技术和数据结构,数据科学
家视角下的数据分析理论和SAS实践。

上卷主要包括 SAS 语言入门、数据集与DATA步、变量与表达式、流程控制、函
数封装、SAS 宏、DS2、代码组织、文件读写、按位运算以及扩展 SAS 功能。另外,还
从程序员的视角阐述了各种数据结构在 SAS 中的编程实现和应用,包括 SAS 数组、队
列与堆栈、链表、二叉树、矩阵运算和图等。

下卷包括统计学基础、大数定律与中心极限定理、统计分布、方差分析、数据标准化、
主成分分析与因子分析、相关分析与回归分析、聚类分析、神经网络,*后以 π 值高精
度求解和探索分析结束。

本书内容涵盖理论和实践,章节组织采用从简单到复杂的方式。本书囊括数据分析
技术方面较为核心的基础内容,试图与读者一起触及数据世界分析与智能的核心。各章
为读者提供简洁可运行的 SAS 示例代码、算法实现以及快速指南,为广大受过计算机科
学教育的程序员向数据科学家华丽转身提供了必要的快速入门指导。本书附录还提供二
项分布、泊松分布和标准正态分布累积概率表以及t分布、χ2分布和 F 分布临界值表的
制作与查找方法。本书适用于各大专院校统计分析专业和信息处理专业的学生,有志于
从事数据分析的广大程序员、统计分析从业人员以及所有想成为数据科学家的专业人士。

本书与传统的SAS数据分析书籍不同之处在于,它从程序员的视角出发,循序渐进
探讨数据分析的各个方面,避免 “知其然而不知其所以然” 。因此,阅读本书可使你
从完全不了解SAS到对SAS“有所了解”,从而掌握数据分析的要义和精髓,实现从
程序员到数据科学家的华丽转身!

*后,诚挚感谢北京大学信息科学技术学院博士生导师、中国ACM教育专委会主
席张铭教授为本书作序。感谢SAS中国研发中心总经理刘政博士给予的大力帮助和指导,
感谢SAS大中华区前市场总监蒋顺利先生、高级市场经理曾秋媚女士在写作过程中给予
的帮助和支持,感谢在写作过程中给予特别帮助的SAS中国研发中心的同仁们。感谢清
华大学出版社编辑部的刘洋先生和全体同仁的辛勤工作,是他们的努力使本书得以与读
者见面!感谢恩师陈永金先生以及所有在我生命中给予帮助的人们!特别感谢与我一路
同行的知己和家人,是他们赋予了我生命的色彩与力量!

巫银良

 2018年8月
【免费在线读】
SAS技术内幕:从程序员到数据科学家
系统会生成如下数据集(见图2-8),存放在 C:\temp 目录中。与利用临时库 Work 不同,
该数据集在你SAS 会话结束后依然存在,存放在 C:\temp\class.sas7bdat 文件中。
图2-8 由数据生成的 MYLIB.CLASS 数据集内容
磁盘上的数据文件名称依赖于操作系统的文件系统,如 Windows 平台的FAT/FAT32
和NTFS 文件系统,不区分大小写。而Linux/Unix 平台则区分大小写,SAS 则一律使用
小写字母生成数据集文件名。如果我们要读取Unix/Linux 平台上包含大写字母的文件名,
需要在SAS 会话中启用系统选项VALIDMEMNAME=EXTEND 并且数据集的名称必须
与磁盘上的文件名大小写完全匹配才能正常读取。
(2)如果数据行包含特定的分隔符,我们可以利用INFILE 语句来指向系统特殊的
文件引用DATALINES ,并且使用语句参数DELIMITER='< 分隔符>' 来指定分隔符。
指定分隔符时也可以使用十六进制方式,如DELIMITER='2C 'X; 它与下面的代码使用
逗号分隔符等价(见程序 2-17),代码输出结果与程序 2-16 相同。
程序2-17 指定分割符
data myclass;
infile datalines delimiter=',';
input Name $ Sex $ Age Height Weight;
datalines;
Alfred,M,14,112.5,69
Alice,F,13,84,56.5
Barbara,F,13,98,65.3
run;
(3)如果数据行本身包含SAS 语句的结束标志符分号“;”的话,则我们必须使用
DATALINES4 语句来标记后续数据行,该语句表示后续数据行是用4 个连续的分号来标
记数据行结束的。DATALINES4 也可以使用该语句的别名为 LINES4 或CARDS4 表示。
程序 2-18 中字符型变量 NAME 的值包含分号,则我们必须以DATALINES4 来输入数据。
程序2-18 数据包含分号
data myclass;
input Name $ Sex $ Age Height Weight;
datalines4;
Alfred; M 14 112.5 69
Alice; F 13 84 56.5
Barbara; F 13 98 65.3
;;;;
数据包含引号并且引号中的数据包含字段分隔符本身时,我们需要在INFILE 语
句上启用分隔符敏感数据选项DSD(DELIMITOR-SENSITIVE DATA,DSD)。此时

如果数据行中甚至还包含SAS语句结束符分号,则我们同时需要使用DATALINES4
而非DATALINES语句进行标记。下面的代码详细展示了此时如何正确读取数据(见
程序 2-19)。

程序2-19 数据包含分隔符和引号

data myclass;

infile datalines4 dsd; /* DSD 使用逗号分隔,且引号文本中包括逗号*/

input Name:$9. Sex $ Age Height Weight Address:$32. Description $24.;

datalines4;

Alfred,M,14,112.5,69, "Alfred's home Beijing, China", Alfred's

description;

Alice,F,13,84,56.5, "Alice's home, Beijing, China", Alice's

description;

Barbara,F,13,98,65.3, "Babara's adress, Beijing, China", Barbara's
description;

;;;;

读取后的数据中可包括空格、逗号与分号(见图2-9)。



图2-9 读取数据中包含空格和分号

(4)如果数据行本身变长,也就是说数据行参差不齐,其中字符型变量又包含空
格字符。此时我们需要使用 SAS 提供的列指针来明确指定每一个数据行中变量读取的起
止位置,从而正确地截取变长的字符串。如下代码对字符型 NAME 变量明确指示从数
据行前 15 个字节中读取值,而对字符型 SEX 变量则没有指定列指针,默认读取前一
个变量之后到下一个变量之前之间的字符。这种方式一般用于表单化的数据读取(见
程序 2-20),生成的结果如图2-10 所示。

程序2-20 变长数据-按位置读取

data myclass;

input Name $1-15Sex $ Age Height Weight;

datalines;

Alfred Liu M 14 112.5 69

Alice Wang F 13 84 56.5

Barbara Deng F 13 98 65.3

;



图2-10 读取变长数据

(5)如果在一个数据行包括多个观测,数据呈锯齿状。我们该如何读取呢?SAS



SAS技术内幕:从程序员到数据科学家
在INPUT 语句上设计了一个特殊选项@@,用于告诉SAS 从数据行完整读取一个观测
后不要马上读取下一个数据行,而是继续从当前的数据缓冲区中继续读取数据填充观测。
这种灵活设计为读取各种复杂格式的数据,节省 SAS 代码内嵌数据行数非常有用。比如
下面的代码依然可以读取数据行中的锯齿状数据(见程序 2-21)。
程序2-21 忽略原始数据格式从缓冲区连续读取
data myclass;
input Name $ Sex $ Age Height Weight @@;
datalines;
Alfred M 14 112.5 69
Alice F 13 84 56.5 Barbara F 13 98 65.3
;
(6)如果数据集的一个观测来自多行文本,此时需要联合游标控制符# 和@ 来读
取数据,它们分别表示对应数据行和列的偏移位置。此时,input 语句有若干参数可指定
用来接收执行过程中所读取的文件指针信息。下面的代码中数据行格式比较混乱,我们
需要一次读取3 行文本才能获得一个观测的完整数据(见程序 2-22)。
程序2-22 利用游标控制符读取跨行数据
data mydata;
infile datalines line=LN col=COL;
input name $ 1-10#2 @3 Sex $ /*从第2行第三列读取一个字符串变量 Sex */
#3 Age Weight Height; /*从第3行读取三个数值变量 */
datalines;
Alfred
M
14 112.5 69
Alice
F
13 84 56.5
Barbara
F
13 98 65.3
;

返回顶部