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Σ原则文章来源:https://www.toymoban.com/news/detail-431975.html
三西格玛准则文章来源地址https://www.toymoban.com/news/detail-431975.html
到了这里,关于python剔除不合理值:3σ原则的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!