
简介《小白学SAS基础教程》面向零基础的数据分析学习者及需用SAS处理日常数据的职场新人采用对话体陪伴“小白”逐步入门重点解决面对庞杂命令无从下手、只会记语法却不会用于实际任务等痛点。全书以解决实际问题为导向围绕数据集建立、常用函数、数据清洗、绘图与制表展开并结合淘宝商品评价分析、缺失值查找、自动分组、规范三线表输出等案例帮助读者理解每一步操作背后的逻辑而非停留在命令罗列。压缩包内仅含1个PDF文件大小约1.76MB结构完整、便于在电脑或移动设备上随时查阅与检索。该资源已有709人学习既可作为SAS基础课程的配套读物也适合自学时按章节查漏补缺。对于曾被SAS吓退或希望提升数据管理效率的初学者本书提供了较清晰的学习路径和可迁移的实战思路。1. 先破一个传言SAS 难不难得问用过的人很多人第一次听到 SAS反应都差不多听说很难听说要写代码听说都是大公司在用。于是软件还没打开心里就先给自己判了死刑。这份《小白学SAS基础教程》想解决的正是这件事——它假设你连 SAS 界面长什么样都不知道从零基础讲起把 SAS 基础入门的路径拆成一段一段对话让你先看懂再敢动手。它不服务老手也不讲宏和复杂建模只盯一个目标让完全没碰过 SAS 的新手能把数据录进去、把第一个结果跑出来并且清楚接下来该练什么。如果你正卡在“想学又怕学不会”这一步往下读就对了。2. SAS 到底是什么先认门再谈入门2.1 它不是“一个软件”是一整套工具箱SAS 的全称是 Statistical Analysis System直译过来是“统计分析系统”。请注意最后那个词是“系统”不是“软件”这个差别对新手特别重要。你装好 SAS 之后看到的不是一个只有“分析”按钮的小窗口而是一整套模块的集合每个模块负责一类活。有人把它比作统计领域的一艘航空母舰意思是它体量大、功能全但也意味着新手一上来容易被甲板上密密麻麻的东西吓到。先看清楚有哪些“舱室”心里就有底了模块主要管什么新手要不要现在碰Base SAS数据管理、数据步、基础描述统计必须整本书的主线SAS/STAT统计分析从简单描述到复杂模型先会用最基础的几个过程SAS/GRAPH作图常规图和自定义图形学到绘图章节再看SAS/ETS时间序列、计量经济相关分析暂时不用SAS/QC质量控制、可靠性分析暂时不用SAS/EM数据挖掘决策树、神经网络一类暂时不用SAS/GIS地理信息、地图绘制暂时不用看完这张表你会发现一件事真正需要你现在动手的其实只有 Base SAS 这一块加上 STAT 和 GRAPH 里最常用的几个过程。剩下的模块等你工作里真碰上对应场景再学一点都不迟。我带过的新人里翻车最多的不是学不会而是一上来就想把整艘航母开走结果三天就放弃了。那为什么还值得学因为 SAS 解决的是一条完整的链路从原始数据进来到清洗、整理、分析、作图、出报表全在一个体系里完成。很多行业的报表是要交付、要复核、要留痕的这种场景下“能跑通并且每一步都可追溯”比“写法时髦”重要得多。这本书最值得学的地方也在这里——它不以软件为导向逐个讲命令语法而是以解决实际问题为导向告诉你一个函数背后能干什么活。比如 round 函数谁都知道它是四舍五入但拿它来自动给变量分组就是另一层思路了。这种“命令背后的用途”才是入门阶段真正该抓的东西。2.2 打开软件先别慌三个窗口就够你用了第一次打开 SAS界面确实眼花。菜单、工具栏、左边一个树状目录、右边好几个标签页看着像飞机驾驶舱。但你只要记住三个窗口就能应付入门阶段的全部操作。第一个是编辑器窗口你所有的 SAS 程序都写在这里。第二个是日志窗口程序运行过程中的信息都记在这儿写错了、读数据出问题了提示都在这。第三个是输出窗口结果在这儿显示。除此之外还有两个值得知道的地方一个是结果查看器它和输出窗口内容一样但排版更好看另一个是左边的资源管理器里面有一串“逻辑库”文件夹你的数据集就存在那里。这个流程可以背下来在编辑器写程序 → 点运行 → 日志看有没有报错 → 输出看结果。四个动作循环往复。新手最容易犯的毛病是只看输出不看日志结果数据读错了一半还不知道后面所有分析全建立在错的数据上——这种坑比语法错误危险得多因为它不报错。关于界面还有两个小细节。第一SAS 的菜单在真正干活时用得不多绝大多数操作靠写程序完成菜单更多是保存、打开、导入这类辅助功能所以别花时间去背菜单。第二SAS 会给不同语句上不同颜色固定的关键字是一种颜色你自己起的名字是另一种颜色写错了会变红。这个设计对新手极其友好相当于自带一个实时拼写检查看到一片红就先别运行回头检查拼写和分号。2.3 SAS 程序长什么样数据步喂数据程序步出结果把一段 SAS 程序摊开看结构其实非常规整永远由两段组成。第一段叫数据步负责把数据弄进 SAS。最朴素的写法就三句话data 给数据集起名字input 声明有哪些变量cards 告诉 SAS“下面是数据了”。这三句话之后跟的是真正的数据行数据写完单独一行写一个分号收尾。第二段叫程序步负责对数据做事情。它一定以 proc 开头后面跟具体的过程名比如 proc sort 是排序proc means 是算描述统计proc sgplot 是画图最后用 run 结束。你可以把 proc 理解成“我要启动一个加工车间”过程名是车间类型run 是“开机干活”。这里有个新手必须建立的习惯SAS 里一句话的结束标志是英文分号不是回车。你写了一行没写分号SAS 会认为这句话还没说完继续往下读直到遇到分号为止。所以很多看着莫名其妙的报错根子就是一个漏掉的分号。我在教新人时第一节课只强调两件事分号以及日志。这两件事守住了入门阶段一半的坑就绕过去了。还有一点值得提前说SAS 输入数据有两种路子。数据少的时候直接在编辑器里敲用 cards 引出来数据多的时候一般先在表格软件里录好再导入 SAS因为 SAS 本身不是专业的数据录入工具大量手工录入并不方便。后面第三章我们会先走“手工录入”这条最直接的路把第一个程序跑通再去碰导入。3. 第一个 SAS 程序三句话把数据装进去3.1 从零到跑通data、input、cards 逐行拆咱们不绕弯直接上第一个能跑的例子。假设你要记录两个人的性别和年龄性别用 1 表示男、0 表示女。下面这段就是完整程序你可以直接抄进编辑器。/* 数据步把数据装进 SAS数据集起名叫 first */ data first; input gender age; /* 声明两个变量gender 性别age 年龄 */ cards; /* 告诉 SAS下面开始是数据 */ 1 30 0 24 ; /* 数据结束这一行单独一个分号 */ run;逐行说清楚。第一行 data first; 是给这份数据起名字名字叫 first以后你要用这份数据就喊这个名字。第二行 input gender age; 是声明变量顺序很重要——它决定了 SAS 怎么理解下面每一行数据里第几个数是哪个变量。第三行 cards; 是一个分界标志它上面是“规则”下面是“内容”。再往下两行是真正的数据一行代表一个人两个数之间用空格隔开因为 SAS 默认拿空格当分隔符。最后单独一行分号表示数据到此为止。这个分号必须另起一行不能直接跟在 24 后面这是个高频翻车点。运行之后你会看到日志里出现一段说明写着读进来了几条观测、几个变量。看到“2 条观测、2 个变量”这样的字样就说明数据进去了。这时候你去左边资源管理器里找 Work 文件夹双击打开就能看到 first 这个数据集点开还能像表格一样浏览。这一步看起来平淡但意义很大你已经完成了 SAS 入门里最基础也最关键的动作——把外部世界的数据变成 SAS 能理解的数据集。后面所有的排序、清洗、统计、作图全部建立在这一步之上。所以别急着往下翻先把这段程序敲一遍故意改改数字再运行一次看看日志里的观测数是不是跟着变了。3.2 命名和标点新手最容易忽略的三条规矩第一个程序跑通之后很多人会立刻想“我要建个自己的数据集”然后就在命名上栽跟头。SAS 对数据集名和变量名有硬性限制规则不复杂但违反了一定报错。第一条只能用英文字母、数字和下划线并且第一个字符不能是数字。所以 score1 可以1score 不行。第二条名字长度有上限别起太长一般远够用。第三条不能有空格、不能有中文、不能有那些数字键上方的特殊符号。新手最容易手滑的是把减号当成连接符写进名字里比如 first-dataSAS 会把它理解成“first 减去 data”直接报错。如果你实在拿不准就用纯英文字母加下划线绝对安全。标点方面有三件事要记住。所有语句以英文分号结尾中文分号不算字符串型的数据如果要带引号用英文引号小数点用英文句点。这些听起来像废话但我在带新人时见过太多“程序看着没问题就是不跑”的情况最后发现是输入法没切回来打了个中文分号。这种问题不叫玄学叫输入法。顺便说一个新手常问的变量能不能用中文名技术上 SAS 提供了选项可以打开这个能力但入门阶段非常不建议。一是容易和编码问题纠缠二是以后你把程序给别人看、或者换台机器跑麻烦会成倍增加。养成用英文命名的习惯成本很低收益很长。3.3 数据存哪了Work 库不留人永久库才留现在回答一个几乎每个人都会问、但书上往往一句话带过的问题我刚建的数据集到底存哪儿了答案在左边的资源管理器里。那里有一串文件夹叫逻辑库。默认情况下有六个Work 是留给用户放自己数据的空文件夹其余几个装的是 SAS 自带的东西比如与地图相关的数据、帮助文件、练习数据。你新建的数据集默认落在 Work 里。问题就出在 Work 这个名字上——它是临时的。你一关软件Work 库自动清空里面的数据集全部消失。第一次遇到这事的人通常会愣住我明明保存了程序怎么数据没了因为程序和数据是两回事程序保存成文件不会丢但数据集存在 Work 里就会随会话结束而消失。解决办法是建一个永久逻辑库把它指向你电脑上的某个文件夹。看代码/* 建一个逻辑库名字叫 mydata指向电脑上的一个文件夹 */ libname mydata d:/saswork; /* 把数据集写进这个库关掉软件也还在 */ data mydata.first; input gender age; cards; 1 30 0 24 ; run;libname 这句话的意思是以后我说 mydata你就去 d:/saswork 这个文件夹找。写数据集的时候把库名加在前面写成 mydata.first这份数据就落到了硬盘上关软件、重启电脑都还在。下次要用重新跑一遍 libname 那句话再引用 mydata.first 就行。两个细节要注意。路径里的斜杠用正斜杠别用反斜杠这个在 Windows 上也能正常识别另外那句 libname 是“本次会话有效”的不是一劳永逸的设置每次新开 SAS 都得重新说一遍所以一般把它写在程序最上面跟其他准备语句放一起。文件夹本身要先在系统里建好SAS 不会替你创建目录。3.4 跑出第一个结果用 proc means 看分组平均分数据装进去了接下来该让它出点东西了。新手最该先掌握的统计过程是 proc means——算均值、极值、观测数这些最基础的描述统计几行代码就能出结果成就感来得快。/* 程序步按性别分组看年龄的观测数、均值、最小值和最大值 */ proc means datamydata.first n mean min max; class gender; /* 分组变量按性别分开算 */ var age; /* 要分析的变量对年龄做计算 */ run;data 后面指定用哪份数据这里用刚才存进永久库的那份。n、mean、min、max 是你要输出的统计量分别对应观测数、均值、最小值、最大值不写的话默认只给观测数和均值。class 后面跟分组变量SAS 会按这个变量的每个取值分别算一遍。var 后面跟要分析的数值变量。运行完输出窗口会给你一张小表按性别分两行各自有观测数和统计量。日志窗口则会记录这次运行的信息包括用了多少条观测。养成习惯每次跑完先扫一眼日志再去看输出。日志里如果出现红色的 ERROR说明程序根本没跑成功如果出现绿色的 NOTE 顺带提到“缺少值”或者“观测被删除”那说明跑是跑完了但数据可能有坑得回头查。到这里你已经完整走了一遍 SAS 入门的最小闭环建数据、存数据、跑分析、看结果。接下来该做的不是马上学新命令而是把这段程序改三次换变量名、加一条数据、换一个统计量。改完之后如果还能跑通说明你是真的理解了结构而不是背下了代码。4. 新手最容易踩的五个坑报错、丢数据、读错格式4.1 坑一日志一片红就慌了其实提示写得很直白现象点完运行结果窗口空空如也日志里一串红色人一下子就懵了不知道该从哪看起。原因SAS 的错误提示是按行给的它告诉你“第几行出了什么问题”但因为新手不熟悉话术看到英文加代码片段就本能地想跳过。实际上 SAS 的报错在软件里算相当客气的它会明确指出是语法错误、变量未找到还是数据行字段不够。解决把日志拉到最上面从第一条 ERROR 开始读一次只解决一个。常见的三种写着 expecting 之类多半是漏分号写着 variable not found多半是变量名拼错或者顺序没对上 input写着 invalid data多半是数据行里的字段和 input 声明的变量对不上比如声明了两个变量某一行只写了一个数。改完再跑一次别一次改五处那样改对了也不知道是哪处起了作用。4.2 坑二关了软件数据就没了Work 库不留人现象昨天辛苦敲进去的数据集今天打开 SAS 找不到了资源管理器里 Work 文件夹是空的。原因Work 是临时逻辑库会话结束就清空这是设计如此不是软件出问题。解决从一开始就养成建永久逻辑库的习惯程序第一行写 libname数据一律存到自己的库里别贪图省事直接写 data xxx。另外提醒一句程序文件本身也要另存为到本地文件夹很多人只保存了数据忘了保存程序第二天想复现都复现不了那种心情确实需要一颗后悔药。4.3 坑三数字变成点、日期读不进去现象打开数据集一看本该是数字的列里全是点或者日期那一列读进来变成了一串看不懂的数字甚至整列缺失。原因SAS 里的“点”就是缺失值的显示方式不是乱码。数字变点通常是这一行数据里该字段为空或者混进了字母、全角字符、千分位逗号这类东西SAS 无法按数值解析只能记为缺失。日期读不进去是因为 SAS 的日期本质上是“从 1960 年 1 月 1 日起算的天数”你不告诉它输入的是什么格式它就不知道该怎么换算。解决先回原始数据里查那一行把多余字符清掉。日期这类有格式的字段要在 input 时用 informativ 告诉 SAS 格式比如按 年-月-日 的写法读入就用对应的日期输入格式写出类似input id birthday yymmdd10.;这样的语句再用 format 控制显示成你习惯的样子。输入格式管“怎么读进来”输出格式管“怎么显示出来”这两个概念分开理解日期问题就不再神秘。4.4 坑四分号、空格、小数点凑在一起的“玄学”报错现象程序看着和书上的一模一样就是不跑或者跑是跑了结果明显不对比如均值大得离谱。原因三类隐形问题。一是分号漏了或者用了中文分号SAS 会把两句拼成一句读。二是数据行里多个数之间用了逗号或者制表符混排而 input 默认认空格于是整个字段被当成一个字符串。三是小数点打成中文句号或者不小心多打一个点数值解析直接崩掉。解决写程序时把输入法固定在英文状态数据行统一用单个空格分隔别混着来跑之前扫一眼有没有红色高亮。结果不对时第一件事不是改程序而是打开数据集本身肉眼看一下数据长什么样——很多错误在数据视图里一眼就能看出来比盯着代码猜快十倍。4.5 坑五一上手就想学建模和宏现象基础还没打牢就开始搜“宏怎么写”“怎么跑复杂模型”折腾一周啥也没跑通然后得出结论SAS 太难。原因SAS 的知识面很宽但入门阶段的性价比极不平均。数据步、排序、清洗、基础统计、简单作图这几块占了日常工作的绝大部分而宏、复杂建模属于后面的事前置知识没到位看再多教程也是黑匣子。解决把学习范围先框死。这本书的内容本身就框得很清楚——数据整理、作图、制表三块其余不贪多。你就照着这个范围走能跑通一个清洗流程、能画出一张像样的图、能出一张规范的表格就算是扎实入门了。等到某天你发现自己在重复写同样十行代码那时候再去学宏动机和效果完全不一样。5. 数据整理、作图、制表入门阶段真正要练的三块5.1 数据清洗三件套重复值、缺失值、异常值真实的数据几乎没有干净的。同一份名单里有人被录了两遍某个字段空着某个年龄写成了 200 岁。这三类问题不处理后面所有分析都是沙上建塔。好消息是处理它们的套路很固定入门阶段掌握四五个过程就够用。先说重复值。最直接的做法是按唯一标识排序排序时加一个去重选项/* 按 id 排序遇到重复的 id 只保留第一条 */ proc sort datamydata.first nodupkey; by id; run;proc sort 是排序过程by 后面跟排序依据nodupkey 的意思是“遇到 by 变量相同的记录只留一条”。用之前要想清楚是按哪个变量判重整行完全相同才算重复还是只要 id 相同就算这两种判断在业务上差别很大选错了会把本该保留的记录删掉删完还找不回来。再说缺失值。SAS 里数值缺失显示为一个点字符缺失显示为空。找缺失的思路有两条一是逐列统计缺失个数看哪列缺得厉害二是用条件筛选把含缺失的记录捞出来。数据列少的时候前者更省事列多的时候通常会用数组把一批变量一起扫一遍这也是书里专门讲的一块内容——把重复劳动打包成一个能反复用的程序这种“造工具”的思路比记住某个函数重要得多。最后说异常值。异常值不一定是错误也可能是真实存在的极端情况所以处理方式不是“一律删掉”而是“先找出来再判断”。常见做法是先算分位数或者均值加减若干倍标准差把落在范围外的记录挑出来单独看。挑出来之后你会发现有些是录入错误比如年龄 200有些是真的特殊样本比如某个超大额订单这两类的处理方式完全不同。5.2 作图先会用菜单再学 proc sgplotSAS 早年作图确实不算强项但从 9.3 版本之后补上了很大一块现在常规图基本都能画而且能画得挺好看。新手学作图我建议分两步走。第一步先用菜单。菜单式作图的好处是所见即所得你选一个图型、拖两个变量进去图就出来了能快速建立“什么数据配什么图”的直觉。分布看直方图两组比较看箱线图两个变量关系看散点图时间变化看序列图。这层直觉比会写命令更值钱。第二步再转到 proc sgplot。它是现在主推的绘图过程语法直观覆盖了大部分常规需求/* 画散点图横轴是年龄纵轴是得分 */ proc sgplot datamydata.first; scatter xage yscore; run;scatter 表示散点图x 和 y 分别指定横纵轴变量。想换成折线就换成 series想加回归线就在后面加一行 reg 语句想要柱状图就用 vbar。它的好处是一套语法能覆盖很多图型参数名字也基本见名知意。学到后面你会发现双坐标轴、瀑布图、风险图这些也能用它做出来只是需要多叠几层语句。我个人的经验是作图这块千万别只看不画。看教程觉得“哦原来是这样”自己动手把变量名换成自己的数据图出来是空白的、坐标轴挤成一团的、图例挡住数据的这些问题只有真画才会遇到。5.3 制表proc tabulate 和结果输出如果说作图是给人看趋势那制表就是给人看数字。工作中要交的往往是规范表格比如分组统计表、交叉汇总表这类需求用 proc tabulate 最合适。/* 按性别分组输出年龄的观测数和均值做成一张交叉表 */ proc tabulate datamydata.first; class gender; /* 分类变量放在行或列上 */ var age; /* 分析变量 */ table gender, age*(n mean); /* 行是性别列是年龄的统计量 */ run;table 这句是核心逗号左边是行右边是列星号表示“在它下面展开”。age*(n mean) 的意思就是“对年龄这一列分别给出观测数和均值”。刚开始看这种写法会觉得别扭练几次就顺了因为它其实就是在描述表格的骨架。制表这块还有一件容易被忽略的事结果怎么交出去。总不能在聊天窗口里截图发给别人。常规做法是用 ODS 把结果直接输出成文件/* 把接下来的统计结果输出成 rtf 文件能直接用文字处理软件打开 */ ods rtf filed:/saswork/report.rtf; proc means datamydata.first n mean min max; class gender; var age; run; ods rtf close;ods rtf file 开启输出中间所有过程的结果都会被写进这个文件最后 ods rtf close 收尾。这里最容易忘的是 close忘了它文件会一直处于打开状态内容可能不完整。输出成 rtf 的好处是排版保留得比较好打开就能继续编辑交报表的场景非常实用。5.4 对话体的书怎么读才不浪费时间这本书的形式比较特别是用一个零基础主人公和一位熟手的对话推进的。这种写法对新手很友好因为书里那个角色问的问题往往就是你想问的。但读法上有个小技巧不然容易读成小说。我的建议是对话部分快速过凡是出现“那我来试试”之类的转折就停下来把接下来那段程序自己敲一遍。书里的对话是帮你消除紧张的真正涨本事的是那些能跑的程序。另外每章的示例数据尽量自己重新录一遍别直接用现成的——手敲的过程会逼你注意变量顺序、分隔符、分号这些细节恰恰是新手最容易出事的地方。还有一点这本书明确说了不贪多只讲数据整理、作图和制表三块。有人会觉得内容少但这恰恰是它的价值。入门最怕的就是样样都碰一点、样样都不熟。把这三块练到能独立完成一个小项目你就已经跨过门槛了。6. 下一步学什么一份零基础的 30 天上手路径入门阶段最怕的不是难而是没有顺序。下面这张表是我建议的四周安排每天投入一小时左右周末可以拉长一点。它不追求学完多少命令只保证每一步都有能跑出来的东西。阶段时间练什么练成的标志第一周第 1 到 7 天界面三个窗口、data/input/cards 三句话、分号规则能独立建一个数据集并保存到永久库第二周第 8 到 14 天输入输出格式、产生新变量、if-then 和常用函数能对原始数据做字段转换生成需要的新列第三周第 15 到 21 天排序、合并、去重、缺失值查找能把两份数据合起来并清洗干净第四周第 22 到 30 天作图两三种、proc tabulate 出表、ODS 导出能交出一张图加一张表的小报告具体到每天怎么练我推荐一个笨办法找一份自己真正关心的数据比如自己的记账记录、跑步记录、读书清单二十来行就够。用自己的数据练动力完全不一样——你会真的想知道“我哪个月花得最多”而不是对着教学数据算平均值。这一路上你会不断遇到格式不对、字段缺失、中文乱码这类问题解决一个就长一分本事比刷十道练习题管用。再给一个具体技巧每写完一段程序先在脑子里过一遍“这段跑完之后数据集应该长什么样”跑完再对照。对不上就说明你对自己的代码理解有偏差这时候去翻日志、看数据视图比盲目改代码高效得多。这个习惯我从很早就开始逼自己养到现在每次写数据步之前还会先在纸上写清楚进来几列出去几列多了哪列少了哪列。最后说个我自己的教训。刚学那阵子我特别爱攒程序看到一个有用的写法就复制到一个文档里觉得存下来就是会了。结果真到要用的时候翻半天找不到找到了也跑不通因为变量名、路径、格式全是别人的。从那以后我每次存代码都强制走一遍“删掉所有依赖、只留骨架、自己重跑一次”的流程跑不通就不算存下来。入门阶段最值钱的不是你看过多少而是你手上有没有几段随时能跑、闭着眼也知道每行在干什么的东西。希望帮到你。本文还有配套的精品资源点击获取