京公网安备 11010802034615号
经营许可证编号:京B2-20210330
SAS应用:都是小数点惹的祸
今天有人用了两种方法通过分组求平均数问题,发现结果不一样。为了说明问题,我自己简单地造了些数据,如下:
data dup;
input id date field value ;
cards;
1 2 0.0001 10
1 2 0.0001 10
1 2 0.00001 10
1 2 0.00001000001 10
1 3 0.00001 10
1 3 0.00001 10
1 3 0.00003 10
1 3 0.00003 10
1 3 0.00003 10
;
run;
proc sql;
create table NoDup1 as
select unique id, date, field, avg(value) as value from Dup group by id, date, field;
quit; ;
*method 2;
proc means data = Dup nway ;
class id date field;
var value;
output out = NoDup2(drop = _type_ _freq_) mean = value;
run;
初一看来,好像代码没什么问题,应该结果一致,然而结果运行后,用sql得到的结果与proc步不一样,这是为什么? 似乎这是SAS的错误,哈哈这个多么伟大的一个发现啊! SAS可以说是总多行业里面的标准,竟然也会错。 其实这不是第一次发现这类问题。 以前也遇到过同样的一个问题,就是:
data ex;
do i= 0.05 to 0.15 by 0.01;
if i=0.1 then output;
end;
run;
这个代码运行后,ex数据集是空的,是不是SAS出错了。后来发现这是由于计算机存储小数的浮点问题,循环5次后,i应该等于0.1,实际上非常接近0.1,是个近似值,并不是等于0.1,因此并无数据输出到ex里面。
那么回到上面的那个问题,根本原因是proc sql和proc mean步对数的小数点处理不同,proc mean考虑到小数点多于sql, 因此会导致nodup1比nodup2少一条观察。下面我提供第三种解决此类问题的代码,data步,也是商业大型数据的常用方法:
data nodup3;
set dup;
by id date field;
if first.field then do; num=0;mean=0;end;
num+1; mean+value;
if last.field then do; value=mean/num; drop num mean; output; end;
run;
这个也是和proc mean步结果是一样的。
有时候也许不需要考虑没必要的小数位,可以用函数round,int,ceil等,还有一种方法就是把需要分组和比较大小的非整数用format格式化一下。
一般来说,我如果发现SAS运行结果和我想的不一样,可以归结于两点:1,自己的代码有问题;2,小数点问题。
数据分析咨询请扫描二维码
若不方便扫码,搜微信号:CDAshujufenxi
平均数是数据分析、数理统计与日常运算中最基础、最常用的统计量,核心作用是浓缩一组数据的整体水平、刻画数据集中趋势。在众多 ...
2026-08-24在MySQL数据库中,InnoDB存储引擎作为主流事务型引擎,默认事务隔离级别为可重复读(Repeatable Read,RR),这与SQL Server、Or ...
2026-08-24 很多数据分析师拿到数据就开始清洗、建模,但当被问到“这批数据属于什么类型——结构化还是非结构化?分类变量还是数值变量 ...
2026-08-24 很多数据分析师画过趋势图、做过业绩预测,但当被问到“这个月销售额增长20%,到底是长期趋势自然增长,还是促销活动的短期 ...
2026-08-21在数据分析与数据可视化工作中,直方图是展示数据分布特征、离散程度、集中区间的核心图表,能够直观呈现数值数据的频次分布规律 ...
2026-08-20在数据分析领域有一句核心准则:垃圾数据进,垃圾数据出。数据清洗是数据分析、数据建模、数据可视化之前的必经前置工序,也是保 ...
2026-08-20 很多数据分析师做过按月份的销售额趋势图,画过按天的流量折线图,但当被问到“时间序列和普通数据有什么本质区别”“季节性 ...
2026-08-20在Python数据分析与数据清洗工作中,Pandas是最核心的数据处理库,DataFrame是结构化数据的标准存储格式。在实时数据采集、循环 ...
2026-08-19在零售行业大数据分析与精细化运营领域,纸尿裤旁摆放啤酒是最经典、最具代表性的商业案例。两种看似毫无关联的商品,一个是婴幼 ...
2026-08-19 很多数据分析师能熟练地计算指标、搭建标签体系,但当被问到“画像到底在解决什么问题”“画像和标签是什么关系”“画像如何 ...
2026-08-19在数据分析、业务监控、质量检测与风险管控工作中,数据波动性是衡量数据稳定性、业务健康度、结果可信度的核心依据。数据波动代 ...
2026-08-18很多分析师在设计标签时思路清晰,但真到落地环节却面临“数据在手,不知如何转化为可用标签”的困境:或因加工方式选择不当导致 ...
2026-08-18在数据分析、业务评价、产品评级、用户分层与综合决策场景中,单一指标往往无法全面、客观地评价事物整体水平。现实中的评价对象 ...
2026-08-18在数理统计、假设检验、数据分析与机器学习领域中,卡方分布(χ²分布)是继正态分布、t分布之后最重要的连续型概率分布之一。 ...
2026-08-17在Python数据清洗、文本校验、账号密码规则校验、脏数据过滤、字符串规整化处理中,正则表达式是最高效、最常用的文本匹配工具。 ...
2026-08-17 很多分析师每天和数据打交道,但当被问到“标签是什么”“标签和指标有什么区别”“标签体系如何设计”时,却常常答不上来。 ...
2026-08-17手游行业具备用户迭代快、竞争激烈、用户粘性易流失的典型特征。随着新游持续上线、玩家审美升级、玩法疲劳等问题出现,存量用户 ...
2026-08-14在数字化产品运营、商业数据分析、业务增长管理中,零散的指标统计无法支撑系统性的业务决策。单一的点击率、转化率、销量数据只 ...
2026-08-14 很多数据分析师每天都在写SQL,但当被问到“数据查询语言(DQL)的本质是什么”“SELECT语句中各子句的书写顺序与实际执行顺 ...
2026-08-14在数据库数据分析、数据清洗、报表统计与业务查询场景中,日期时间是最高频、最核心的基础字段。数据库中存储的日期格式多样,包 ...
2026-08-13