背景
flow数据对外连接统计,用于检测异常,一般情况下超过一个阈值(threshold),那我们就可以粗略的认为这是一个异常数据
那阈值怎么定义:
第一:通过经验值,比如设置threshold>1000
第二:假设每次事件都是独立的且没有上下文关联,我们可以采用3sigma模型来检测
算法
数据需要服从正态分布。在3∂原则下,异常值如超过3倍标准差,那么可以将其视为异常值。正负3∂的概率是99.7%,那么距离平均值3∂之外的值出现的概率为P(|x-u| 3∂) = 0.003,属于极个别的小概率事件。如果数据不服从正态分布,也可以用远离平均值的多少倍标准差来描述。
3∂的概率为0.3%
2∂的概率为5%
检测这一段时间的统计数据,假如符合正态分布,计算均值与方差。如果后来的统计值不在这个范围3sigma范围内,就可以认为这个值是异常值。
置信度和置信区间
案例
3σ原则又称为拉依达准则,该准则具体来说,就是先假设一组检测数据只含有随机误差,对原始数据进行计算处理得到标准差,然后按一定的概率确定一个区间,认为误差超过这个区间的就属于异常值。
正态分布状况下,数值分布表:
image.png
code
import pandas as pd
import numpy as np
# 定义3σ法则识别异常值函数
def three_sigma(Ser1):
'''
Ser1:表示传入DataFrame的某一列。
'''
rule = (Ser1.mean()-3*Ser1.std()>Ser1) | (Ser1.mean()+3*Ser1.std()< Ser1)
index = np.arange(Ser1.shape[0])[rule]
outrange = Ser1.iloc[index]
return outrange
# 导入数据并调用three_sigma
df = pd.read_csv('./data.csv',encoding= 'gbk')
three_sigma(df['counts']).head()
网友评论