3sigma原理一般在工程科学中比较常用,我们在故障预警中用过这个原理,数据是用传感器采集的数据,这些数据假定符合正态分布,然后在进行模型识别后用3sigma原则来对异常数据进行准确定位。在实际应用中可以根据业务场景来确定 k sigma中的k值。
3sigma原理可以简单描述为:若数据服从正态分布,则异常值被定义为一组结果值中与平均值的偏差超过三倍标准差的值。即在正态分布的假设下,距离平均值三倍
(为标准查)之外的值出现的概率很小(如下式),因此可认为是异常值。
若数据不服从正态分布,也可以用远离平均值的多少倍标准差来描述(这就使该原理可以适用于不同的业务场景,只是需要根据经验来确定 k sigma中的k值,这个k值就可以认为是阈值)。
代码如下:
#-*- coding: utf-8 -*-
#基于3sigma的异常值检测
import numpy as np
import pandas as pd
import as plt #导入绘图库
n = 3 # n*sigma
catering_sale = 'D:/PythonTestCode/dadm/chapter3/chapter3/demo/data/catering_sale.xls' #数据路径
data = pd.read_excel(catering_sale, index_col = False) #读取数据
data_y = data[u'销量']
data_x = data[u'日期']
ymean = (data_y)
ystd = (data_y)
threshold1 = ymean - n * ystd
threshold2 = ymean + n * ystd
outlier = [] #将异常值保存
outlier_x = []
for i in range(0, len(data_y)):
if (data_y[i] < threshold1)|(data_y[i] > threshold2):
(data_y[i])
outlier_x.append(data_x[i])
else:
continue
print('\n异常数据如下:\n')
print(outlier)
print(outlier_x)
(data_x, data_y)
(outlier_x, outlier, 'ro')
for j in range(len(outlier)):
(outlier[j], xy=(outlier_x[j], outlier[j]), xytext=(outlier_x[j],outlier[j]))
()
数据取自销量数据,得到的结果如下:销量异常数据预警
python代码及数据见github:SnailDM/git-test