python剔除不合理值:3σ原则

  3σ原则:

        该准则仅局限于对正态或近似正态分布的样本数据处理,此外,当测量次数少的情形用准则剔除粗大误差是不够可靠的。

图中,μ为平均值,σ为标准差。

数值分布在(μ-σ,μ+σ)中的概率为0.6827
数值分布在(μ-2σ,μ+2σ)中的概率为0.9545
数值分布在(μ-3σ,μ+3σ)中的概率为0.9973

一般认为,数据的取值几乎全部集中在(μ-3σ,μ+3σ)区间内,超出这个范围的可能性仅占不到0.3%,这些超出该范围的数据可以认为是异常值。

代码实现

假如你的手头有一个dataframe,

1.首先需要做的是对数据的每一列进行KS检测,看各列数据是否在大致上服从正态分布

import pandas as pd
import numpy as np

# KS检验
def KsNormDetect(df):   # 输出结果是服从正态分布的数据列的名字
    from scipy.stats import kstest 
    list_norm_T = []   # 用来储存服从正态分布的数据列的名字
    for col in df.columns:
        u = df[col].mean()               # 计算均值
        std = df[col].std()              # 计算标准差
        res=kstest(df[col], 'norm', (u, std))[1]  # 计算P值
        if res<=0.05:                        # 判断p值是否服从正态分布,p<=0.05 则服从正态分布,否则不服从
            print(f'{col}该列数据服从正态分布------')
            print('均值为:%.3f,标准差为:%.3f' % (u, std))
            print('-'*40)
            list_norm_T.append(col)             
        else:                                # 这一段实际上没什么必要
            print(f'!!!{col}该列数据不服从正态分布**********')
            print('均值为:%.3f,标准差为:%.3f' % (u, std))
            print('*'*40)
    return list_norm_T

上述操作帮我们确定了数据中大致服从正态分布的列

2.3σ异常点检测(仅对服从正态分布列进行操作),删除异常值

# 对待处理数据中心服从正态分布的数据列
def three_sigma(Ser1):  # Ser1:表示传入DataFrame的某一列
    rule = []
    rule = (Ser1.mean()-3*Ser1.std()>Ser1) | (Ser1.mean()+3*Ser1.std()< Ser1)
    out = Ser1.index[rule]
    return out          # 返回落在3sigma之外的行索引值

def delete_out3sigma(data, list_norm):  # data:待检测的DataFrame;list_norm:服从正态分布的数据列名 
    out_index = []                      # 保存要删除的行索引
    for col in list_norm:            # 对每一列分别用3sigma原则处理
        index = three_sigma(data[col])
        out_index += index.tolist()
    delete_ = list(set(out_index))  # 去除 out_index 中的重复元素
    print(f'\n所删除的行索引共计{len(delete_)}个:\n',delete_)
    data.drop(delete_,inplace=True) # 根据 delete_ 删除对应行的数据
    return data

上述操作先是确定了每一列(服从正态分布)中落在3σ范围外的异常值所属index值,接着根据索引删除异常数据所在行。

实际效果

首先判断原数据各列是否服从正态分布,第一个函数返回值是一个包含列名的列表

调用 delete_out3sigma()函数,打印异常值的索引,并返回删除异常值所在行后的dataframe

 参考

【PYTHON 机器学习】正态分布检验以及异常值处理3Σ原则

三西格玛准则

  • 14
    点赞
  • 73
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值