最近在做分段数据统计的时候,发现某些情况下,离群数据严重干扰了数据统计,所以一直在想办法对离群数据进行处理。
最典型的离群数据,莫过于单根峰了,在气显示相对活跃,特别是钻遇过裂缝的井里,频繁出现因为停泵引起的后效气测异常,这些异常不是地层含气性的真实反映,理应不参与数据统计。平常其实没有太多注意这类现象,但是有的井实在太频繁,并且单根峰与正常的气测值差异太大,有的已经达到10倍左右了,不处理对数据统计确实有很大的影响。
网上搜了一下,常见的方法不外乎平滑与滤波,origin是首选现成的软件。origin里给出了信号处理与滤波两大模块,滤波又分为低通、高通、带限等不同方法,更多的是适合时域信号,所以更多的希望寄托在信号处理这个模块里,当然这个模板本质上也是基于时域信号的,只是这里把它用到石油工程的深度数据里了。
origin给出了好几种平滑去噪的方法,移动平均是最常用的一种方法,但是origin首推的算法是Savitzky-Golay算法,是一种在时域内基于局域多项式最小二乘法拟合的滤波方法,也称卷积平滑。与直接的移动平均算法相比,Savitzky-Golay算法具有更稳定、误差更小的平滑去噪效果。
试用了一下不同的算法和参数设置,对比了效果,Savitzky-Golay的效果确实要比单纯的移动平均要好一些。但是,不管是用哪种算法,应用效果都不是特别好,主要是很多停泵后效的气测异常值非常高,如果遇到多个后效气,会导致最后的结果严重虚高,气测峰形和面积严重变形,虽然与原始数据相比,有一定的作用,但效果不好。
琢磨了几天,想到了一个办法。多数后效气是加单根引起的,如果把这些单根峰去掉,再做平滑,应该就能消除很大一部分后效气的影响,让处理结果不变形。
思路有了,但现成的工具没有找到,只好祭出R语言大法。
给定一个窗口,用平均值来替代离群点。这样处理以后,几乎40-60%的单根峰已经被去掉了,只有那些频繁停泵导致一个深度范围内出现两个以上的后效,特别是深度上有所连续的数值,没有办法完全去掉。如果单根峰不多,实际上这一步已经几乎很完美的把异常值切掉了。
在这个的基础上再做一次Savitzky-Golay平滑,没有大量的离群数据的影响,这个平滑效果就好了很多,全烃的峰形几乎完美的保留了下来。
同时,部分因为钻时特别高,导致的气测极低的异常值,也在处理离群数据的时候进行了补偿,平滑后的效果非常好。