11.对数据做简单的描述统计(一)使用procmeans描述数据用procmeans过程步,可以对数据做简单的描述统计,包括:非缺省值个数、均值、标准差、最大值、最小值等。基本语法:PROCMEANSdata=数据集可选项;VAR变量列表;CLASS分组变量;BY变量;WEIGHT变量;(加权平均的权数)FREQ变量;(相应观测出现的频数)说明:(1)可选项“MAXDEC=n”用来指定输出结果的小数位数;(2)默认是对数据集的所有数值变量的非缺省值做描述统计,若想包含缺省值,加上可选项“MISSING”;(3)VAR语句指定要做描述统计的变量;CLASS语句指定按分组变量对数据进行分组分别做描述统计;BY语句同CLASS语句(需要事先按BY变量排好序);(4)默认输出非缺省值个数、均值、标准差、最大值、最小值;也可以自己指定需要输出的描述统计量:MAX——最大值;MIN——最小值;MEAN——均值;MEDIAN——中位数;MODE——众数;N——非缺省值个数;NMISS——缺省值个数;RANGE——极差;STDDEV——标准差;SUM——累和;例1鲜花销售的数据(C:\MyRawData\Flowers.dat),变量包括顾客ID,销售日期,petunias,snapdragons,marigolds三种花的销量:读取数据,计算新变量销售月份month,并使用procsort按照月份排序,并使用procmeans的by语句来按照月份描述数据。代码:datasales;infile'c:\MyRawData\Flowers.dat';inputCustID$@9SaleDateMMDDYY10.PetuniaSnapDragonMarigold;Month=MONTH(SaleDate);procsortdata=sales;byMonth;/*CalculatemeansbyMonthforflowersales;*/procmeansdata=salesMAXDEC=0;byMonth;varPetuniaSnapDragonMarigold;title'SummaryofFlowerSalesbyMonth';run;运行结果:(二)使用统计量有时候需要将统计量存入新数据集,以便进一步做数据分析,或者与原数据集合并。一、将统计量存入新数据集可以用ODS(OutputDeliverySystem)系统或者OUTPUT语句,下面介绍用OUTPUT语句。语法:OUTPUTOUT=数据集名统计量名(变量列表)=新列名;示例:PROCMEANSDATA=zooNOPRINT;VARLionsTigersBears;OUTPUTOUT=zoosumMEAN(LionsBears)=LionWeightBearWeight;RUN;例2仍然是例1的鲜花数据,读取数据,按照CustomerID排序,使用procmeans过程,将mean和sum值存入新数据集totals中。代码:datasales;infile'c:\MyRawData\Flowers.dat';inputCustID$@9SaleDateMMDDYY10.PetuniaSnapDragonMarigold;procsortdata=sales;byCustID;/*CalculatemeansbyCustomerID,outputsumandmeantonewdataset;*/procmeansNOPRINTdata=sales;byCustID;varPetuniaSnapDragonMarigold;outputout=totalsmean(PetuniaSnapDragonMarigold)=MeanPMeanSDMeanMsum(PetuniaSnapDragonMarigold)=PetuniaSnapDragonMarigold;procprintdata=totals;title'SumofFlowerDataoverCustomerID';formatMeanPMeanSDMeanM3.;run;运行结果:程序说明:(1)“NOPRINT”告诉SAS不产生任何输出结果,因为已经存入新数据集zoosum;(2)保存统计量的新数据集,包括想要的统计量、BY/CLASS语句的变量、_TYPE_、_FREQ_;(3)BY语句变量有3个水平:756-01、834-01、901-02,结果是3个观测,CLASS类似。二、合并统计量到原数据集1.前面讲到将按“BY变量”分组统计量保存为统计量数据集,进一步可以用MERGE语句,将统计量数据集按照公共的“BY变量”,通过一对多匹配合并到原数据集。例3运动鞋经销商的销售数据(C:\MyRawData\Shoesales.dat),变量包括风格名称、运动类型、第四季度销量:市场经理想要一个报表,每种风格运动鞋占该运动类型销量中的百分比。代码:datashoes;infile'c:\MyRawData\Shoesales.dat';inputStyle$1-15ExerciseType$Sales;run;procsortdata=shoes;byExerciseType;run;/*SummarizesalesbyExerciseTypeandprint;*/procmeansNOPRINTdata=shoes;varSales;byExerciseType;outputout=summarydatasum(Sales)=Total;run;procprintdata=summarydata;title'SummaryDataSet';run;/*Mergetotalswiththeoriginaldataset;*/datashoesummary;mergeshoessummarydata;byExerciseType;Percent=Sales/Total*100;run;procprintdata=shoesummary;byExerciseType;idExerciseType;varStyleSalesTotalPercent;title'SalesSharebyTypeofExercise';run;运行结果:2.若统计量是全体观测的汇总统计量(无BY变量做分组统计),此时,就不能直接采用一对多匹配(没有共同“BY变量”)合并。但可以用SET语句实现。语法:DATA新数据集;IF_N_=1THENSET汇总统计量数据集;SET原数据集;注:“汇总统计量数据集”只有一条观测值。创建新数据集时,第一次迭代循环(_N_=1)就读入该观测值,并一直为后续读入“原数据集”保留它(相当于RETAIN语句)。该语法机制也可用于:没有匹配变量情况下,将一条观测与多条观测合并。例4仍是例3的数据,市场经理想要一个报表,每种风格运动鞋占总销量的百分比。代码:datashoes;infile'c:\MyRawData\Shoesales.dat';inputStyle$1-15ExerciseType$Sales;run;*Outputgrandtotalofsalestoadatasetandprint;procmeansNOPRINTdata=shoes;varSales;outputout=summarydatasum(Sales)=GrandTotal;RUN;procprintdata=summarydata;title'SummaryDataSet';run;*Combinethegrandtotalwiththeoriginaldata;datashoesummary;if_N_=1thensetsummarydata;setshoes;Percent=Sales/GrandTotal;run;procprintdata=shoesummary;varStyleExerciseTypeSalesGrandTotalPercent;formatPercentPERCENT.2;title'OverallSalesShare';run;运行结果:(三)使用procfreq为数据计数用procfreq过程步可以对数据集的变量计算频数,再用tables命令以表格的形式输出:只输出一个变量(单向表);输出两个变量(双向表);输出多个变量(交叉表)。频数表也可以用来检查错误数据。语法:PROCFREQdata=数据集;TABLES变量组合/可选项;注:(1)关于变量组合:一个变量的单向表,用“TABLES变量;”;两个变量的双向表,用“TABLES变量1*变量2;”;(2)常用的可选项有:LIST——用list形式打印交叉表(而不是网格);MISSING——频数统计量中包含缺失值;NOCOL——强制在交叉表中不打印列百分比;NOROW——强制在交叉表中不打印行百分比;OUT=data-set——输出数据集;例5咖啡店的销售数据(C:\MyRawData\Coffee.dat),记录了销售的咖啡种类(cappuccino,espresso,kona,icedcoffee),以及每次购买的顾客是打包还是原地就饮:读入数据,计算两个变量的频数。代码:dataorders;infile'c:\MyRawData\Coffee.dat';inputCoffee$Window$@@;*PrinttablesforWindowandWindowbyCoffee;procfreqdata=orders;tablesWindowWindow*Coffee;*输出两个表:Window的单向表、Window和Coffee双向表;run;运行结果:程序说明:(1)默认缺省值不计入频数,使用可选项MISSING可以包含缺省值;(2)观察表2,可以发现Kon是错误数据,应该是kon.(四)使用proctabulate生成表格报表用proctabulate过程步可以生成表格报表,相当于给普通输出报表做个“礼盒包装”,让报表更美观好看。该过程还可以计算、加入、输出统计量。基本语法:PROCTABULATEMISSINGdata=数据集指定格式;VAR指定作统计分析的变量;CLASS分组变量;(按变量的值对数据做分组,分别处理)TABLE分页变量,分行变量,分列变量/可选项;说明:(1)TABLE语句定义表格形式:页维度、行维度、列维度;指定一个变量默认是列形式,指定两个变量默认是行列形式;(2)tabulate可以加上如下的关键词(用在TABLE变量中计算各统计量):ALL——增加一行、一列或一页,显示总数目;MAX——最大值;MIN——最小值;MEAN——平均值;MEDIAN——中位数;N——非缺省值个数;NMISS——缺省值个数;P90——90%分位数;PCTN——某类的观测值百分数;PCTSUM——某类值总和的百分数;STDDEV——标准差;SUM——求和;(3)TABLE语句中,可以对变量做连接、交叉,或者它们的组合:“连接”示例:TABLELocomotionTypeALL;“交叉”示例:TABLEMEAN*Price;“组合”示例:TABLEPCTN*(LocomotionType);(4)可以在proc步用可选项指定格式(全局),指定所有数据的输出格式,例如,PROCTABULATEDATA=boatsFORMAT=COMMA10.0;(5)TABLE语句的可选项:/BOX=’str’,可以给表格报表的左上角方框输出“说明性短句”;/MISSTEXT=’str’,可以给表格中的缺省数据指定一个“值”;例如,TABLERegion,MEAN*Sales/BOX='MeanSalesbyRegion'MISSTEXT='NoSales';例6关于船的数据(C:\MyRawData\Boats.dat),变量包括名称、港口、动力方式、类型、价格、船长(英尺):读入数据生成二维(列×行)表格报表:变量L