老贾所在的项目组重点测试金融业务的BI工具,于是自然会有很多数理统计方面的需求。这几天,他们就碰到了一个关于标准差(Standard Deviation)计算的问题。
小科普
标准差(Standard Deviation),又称均方差,是离均差平方的算术平均数的平方根,用σ表示。标准差是方差的算术平方根。标准差能反映一个数据集的离散程度。
在金融投资领域,标准差经常被用来衡量投资的风险。
基于同一批数据在两个地方计算的标准差值有时候就会不一致。从系统的数据表中直接取出的标准差σ,要比业务场景中计算出来的σ’略大那么一点点。用Excel里面提供的STDEV函数去验证,和从表中取出的标准差σ又是一致的。看起来,应该是开发同学在业务场景计算时,哪里弄错了。那必须要报一个BUG啊~~
关于数据错误,开发同学们也很重视,一起分析这个场景。可是很快事情出现了反转。看起来似乎不是他们的BUG,而是Oracle数据库的默认计算规则埋的锅。
原来,在标准差的计算中,一般会有两种:
STDEV,计算样本的标准差
STDEVP,计算样本总体的标准差
借用度娘给的解释:
直接取的数据库值是Oracle默认提供的标准差计算规则,即STDEV,毕竟这个属于主流场景啊;而回到我们的业务场景,还似乎真的是对数据总集的应用,所以用上STDEVP是非常合理的。而且往往因为数据总集的量足够大,考虑到四舍五入的因素,两者的数据偏差在现实场景中往往可以忽略不计,一直以来危害也没有爆发出来。
于是,这个问题的结论就是Oracle的“自做主张”所带来的,而解决的方案自然是人为地再揪回来。关于默认值、尤其是默认算法,在测试的环节会是一个需要特别关注的点;尤其是现在无论是用户还是码农,都有越来越“懒”的趋势。
现实中,也经常有一些软件提供的“智能化”处理,不仅没有带来便利,反而带来了一些困扰。测略君一直以来都有着和Word关于自动格式调整功能进行斗争的经验,当中郁闷之经历可谓不胜枚举;目前,又在和新入手的华为手机自带的输入法进行艰难的磨合。
更高的层面就是现在很火的人工智能。近期阿尔法狗战胜柯洁,实现全满贯,可谓举世关注。其结果对于我们IT行业的人而言倒不意外,但是同期还举行的阿尔法狗与人组队的配对赛,其过程则着实让我吃惊不小。与古力组队的AlphaGo在判定局面已经失利的情况下,即使队友古力仍然试图坚持,它却我行我素地扯后腿,采用自暴自弃的下法,逼着古力投子认输。这样的自作主张,确实让人细思极恐。