异常值是指数据中个别值的数值明显偏离其余的数值,有时也称为离群点,检测异常值
就是检验数据中是否有录入错误以及是否含有不合理的数据。
异常值的存在对数据分析十分危险,如果计算分析过程的数据有异常值,那么会对结果
会产生不良影响,从而导致分析结果产生偏差乃至错误。
比如在分析银行欺诈案例时,核心就是要发现异常值,这个时候异常值对我们是有用的。
再比如,在统计某个城市的平均收入的时候,有人月收入是好几个亿,这个时候这个人就是
一个异常值,这个异常值会拉高城市的整体平均收入,因此可能会得到一个不真实的分析结
果。
常用的异常值检测主要为具体业务法、3σ原则和箱线图分析三种方法。
1、具体业务法
根据你对业务的理解,然后对每一个指标设定一个合理的范围,一旦超过这个范围,则
认为是异常值。
比如收入,一般来说都是正数,如果出现小于 0,则认为是异常值;
再比如年龄,正常的年龄可能在 100 以内,如果出现年龄是好几百的,那么也认为是异
常值。
1 # 如何确定哪些为异常值? 2 # 1、具体业务法 3 # 根据具体的情况,设置一个具体的范围,设置上下阈值,来判定是否为异常值 4 # 如: 销量 > 0 , 价格 > 0, 身高: [30,230] 5 # 年龄: (0,130) 6 7 # # 判定身高 8 # # 自定义 判定身高的 函数 --数据异常值的剔除 9 # def juti_yewu(data): 10 # """ 11 # 根据具体业务法 来进行数据的 异常值剔除 12 # :param data: 身高数据---series 13 # :return: bool_mask(bool数组) 14 # """ 15 # # 确定上限 16 # up = 230 17 # # 确定下限 18 # low = 30 19 # 20 # # bool数组 21 # # --如果为True,即满足在身高数据(30,230)之间, 22 # # --如果为False,即为超过该范围,则为异常值 23 # bool_mask = (data < up) & (data > low) 24 # 25 # return bool_mask 26 # 27 # 28 # # 构建身高数据、验证具体业务法 29 # height = pd.Series(data=[180, 190, 18, 240, 150, 155.5], 30 # index=['stu0', 'stu1', 'stu2', 'stu3', 'stu4', 'stu5']) 31 # 32 # print('height:\n',height) 33 # # 返回一个bool数组 34 # bool_mask = juti_yewu(height) 35 # # 进行筛选 36 # height = height[bool_mask] 37 # print('剔除玩异常值之后的数据为:\n',height)
2、3σ原则
3σ原则又称为拉依达法则。该法则就是先假设一组检测数据只含有随机误差,对原始
数据进行计算处理得到标准差,然后按一定的概率确定一个区间,认为误差超过这个区间的
就属于异常值。
这种判别处理方法仅适用于对正态或近似正态分布的样本数据进行处理,如下表所示,
其中σ代表标准差,μ代表均值,x=μ为图形的对称轴。
数据的数值分布几乎全部集中在区间(μ-3σ,μ+3σ)内,超出这个范围的数据仅占不
到 0.3%。故根据小概率原理,可以认为超出 3σ的部分数据为异常数据。

1 # 2、3sigma原则 2 # 3sigma原则适用于 服从正态分布的数据 3 # 如果数据服从正态分布---> 99.73%的数据---(u-3a,u+3a)之间 4 # u --均值 5 # a --标准差 6 # 剩下的0.27%的数据可以认为是异常的 7 8 def three_sigma(data): 9 """ 10 使用3sigma原则进行异常值的剔除 11 :param data: series--需要剔除异常值的数据 12 :return: bool_mask(bool数组) 13 """ 14 # 确定上限 15 up = data.mean() + 3 * data.std() 16 # 确定下限 17 low = data.mean() - 3 * data.std() 18 19 # 确定满足条件的bool数组 20 bool_mask = (data < up) & (data > low) 21 22 return bool_mask
3、箱线图分析
箱型图提供了识别异常值的一个标准,即异常值通常被定义为小于 QL-1.5IQR 或大于
QU+1.5IQR 的值。
QL 称为下四分位数,表示全部观察值中有四分之一的数据取值比它小。
QU 称为上四分位数,表示全部观察值中有四分之一的数据取值比它大。
IQR 称为四分位数间距,是上四分位数 QU 与下四分位数 QL 之差,其间包含了全部观察
值的一半。
箱线图依据实际数据绘制,真实、直观地表现出了数据分布的本来面貌,且没有对数据
做任何限制性要求,其判断异常值的标准以四分位数和四分位数间距为基础。
四分位数给出了数据分布的中心、散布和形状的某种指示,具有一定的鲁棒性,即 25%
的数据可以变得任意远而不会很大地扰动四分位数,所以异常值通常不能对这个标准施加影
响。鉴于此,箱线图识别异常值的结果比较客观,因此在识别异常值方面具有一定的优越性。
代码实现:
1 # 3、箱线分析法 2 # qu ---上四分位数---75%位置的数值 3 # ql ---下四分位数---25%位置的数值 4 # iqr ---四分位间距--- (qu - ql) 5 # 利用箱线分析法---(ql - 1.5*iqr, qu + 1.5*iqr)之间的数据属于正常的,超过这个区间的数据属于异常值 6 def box_analysis(data): 7 """ 8 利用箱线分析法来剔除异常值 9 :param data: series 10 :return: bool_mask 11 """ 12 # 确定 qu 13 qu = data.quantile(q=0.75) 14 # 确定 ql 15 ql = data.quantile(q=0.25) 16 17 # 确定 iqr 18 iqr = qu - ql 19 20 # 确定 上限 21 up = qu + 1.5 * iqr 22 23 # 确定下限 24 low = ql - 1.5 * iqr 25 26 # bool_mask 27 bool_mask = (data < up) & (data > low) 28 29 return bool_mask 30 31 # 调用,---bool数组---索引