python异常值处理方法,python 异常值
数据预处理是明确分析目标和思路后进行数据分析的第一步,也是整个项目中最基础、最耗时的工作。下面这篇文章主要介绍python的《数据分析实用指南》中关于离群点处理的相关信息。有需要的可以参考一下。
00-1010异常值1、异常值定义2、异常值处理方法2.1均方误差2.2箱线图3、实战3.1加载数据3.2检测异常值数据3.3显示异常值的指标持仓汇总
目录
异常值是指样本中的个别值,其值明显偏离其他观测值。离群值也叫离群值,对离群值的分析也叫离群值分析。
常用的离群点分析方法有3原理、盒图分析、机器学习算法检测。一般会对离群值进行删除、修正和填充,也就是默认离群值对整个项目影响不大。只有当我们的目的是准确发现和分析异常值时,才有必要使用机器学习算法,否则,我们就不必花费精力去分析它们。
异常值
在统计学中,离群值是不属于特定族群的数据点,是远离其他值的异常观测值。离群点是一种不同于其他结构良好的数据的观察值。
例如,您可以清楚地看到这个列表中的异常值:[20,24,22,19,29,18,4300,30,18]
当观察值是一串数字并且都是一维的时,很容易识别异常值,但是如果有成千上万的多维观察值或数据,您可能需要更聪明的方法来检测这些异常值。
1、异常值定义
2、异常值处理方式
3原则
如果数据服从正态分布,在3原则下,异常值定义为一组测量值中与平均值的偏差超过标准偏差三倍的值。
在正态分布下,3平均值之外的值的概率为P(x-3)=0.003,这是一种概率很小的罕见事件。
如果数据不服从正态分布,也可以用标准差偏离均值多少倍来描述。
这个原则有一个前提条件:数据要服从正态分布。
3原则上,如果观测值与平均值之差超过标准偏差的3倍,可视为异常值。
正负3的概率是99.7%,那么平均值3之外的值的概率是P ( x-u 3)=0.003,这是罕见的小概率事件。
将numpy作为np导入
进口熊猫作为pd
def detect_outliers(数据,阈值=3):
mean_d=np.mean(数据)
std_d=np.std(数据)
离群值=[]
对于data_d:中的y
z得分=(y均值d)/标准差
if NP . ABS(z _ score)threshold :
离群值. append(y)
返回异常值
2.1 均方差
四分位数间距(IQR)的概念用于构建箱线图。IQR是统计学中的一个概念,它通过将数据集分成四分位数来度量统计离差和数据可变性。
简单来说,任何一个数据集或任何一组观测值,都可以根据数据的取值及其与整个数据集的比较,划分为四个确定的区间。四分位数将数据分为三个点和四个区间。
四分位数间距对于定义异常值非常重要。它是第三个四分位数和第一个四分位数的差值(IQR=Q3 -Q1)。在这种情况下,异常值被定义为在箱线图上低于触角(或Q3 1.5xx倍)或高于触角(或Q3 1.5倍iqr)的观察值。
IQR是统计离差程度的度量,可以通过箱线图来观察。
通常把小于 Q1 - 1.5 * IQR 或者大于 Q3 + 1.5 * IQR的数据点视作离群点,探测离群点的公式是:
outliers = value < ( Q1 - 1.5 * IQR ) or value > ( Q3 + 1.5 * IQR )
这种探测离群点的方法,是箱线图默认的方法,箱线图提供了识别异常值/离群点的一个标准:
异常值通常被定义为小于 QL - l.5 IQR 或者 大于 Qu + 1.5 IQR的值,QL称为下四分位数, Qu称为上四分位数,IQR称为四分位数间距,是Qu上四分位数和QL下四分位数之差,其间包括了全部观察值的一半。
def detect_outliers(sr):q1 = sr.quantile(0.25)
q3 = sr.quantile(0.75)
iqr = q3-q1 #Interquartile range
fence_low = q1-1.5*iqr
fence_high = q3+1.5*iqr
outliers = sr.loc[(sr < fence_low) (sr > fence_high)]
return outliers
3、实战
上面数据基础知识的介绍了,下面我们进入今天的正题,也就是利用python与pandas进行数据分析,今天的主要目标就是找到数据中的异常值。(我们使用的是前面介绍的第一种方法)
3.1 加载数据
首先,我们需要加载进行分析的数据,同样使用beer的数据,不过这里的数据是经过处理的,可以看到abv属性列的值中大部分都是0.0*,基本都不超过1,但是也有数据是55,也就是说这些数据是远大于其他数据的,我们主要是对这部分数据进行处理。
class Repair_Dirty(object):__init_data = 0
def __init__(self, filename):
self.filename = filename
def get_data(self):
if self.filename == " ":
# print("您输入的文件路径为空")
return
else:
self.__init_data = pd.read_csv(self.filename)
return self.__init_data
#主函数定义一个对象,并实现对方法的调用
if __name__ == "__main__":
file_path = dirty_beer_last.csv
data_cla = Repair_Dirty(file_path)
data = data_cla.get_data()#得到数据
形如下面的数据图,红色框内数据为55的,就是我们所说的异常值,我们的目标就是通过第一种方法,将此类数据找出来。
3.2 检测异常值数据
使用第一种检测方式来检测异常值,我们主要是定义一个函数find_outlier(),并且函数是在类的内部实现的。
# 找到异常值,abv列def find_outlier(self, attribute):
data_att = self.__init_data[attribute]
# 找到异常值
outlier = data_att[np.abs(data_att - data_att.mean()) > 3 * data_att.std()]
print(data.loc[data[attribute] == 55])#对abv属性的异常值进行输出
#print(np.where(self.__init_data[attribute] == 55)) # 返回指定位置的索引
return outlier
下面的图片中可以看到整个数据表中有108行数据中abv值为55的,所以很明显,我们基本上已经达到了想要的目标,找到了数据中的异常值,根据索引或者id我们便可以将其进行值替换操作,对异常值进行修复。
3.3 显示异常值的索引位置
既然已经找到了异常值,那我们再对其进行索引显示就比较简单了,也就是一行代码的事,其实在上面代码中也可以看到,只不过上面这行代码被我们给注释掉了,下面将其单独拿出来显示。
print(np.where(self.__init_data[attribute] == 55)) # 返回指定位置的索引
这行代码就是对异常值索引进行显示了。
至此,我们今天的数据分析异常值处理的博文就写到这里了,小张同学仍在马不停蹄的进行学习,希望这篇文章能够帮助正在学习数据分析的小伙伴!!!
奥利给
最后,将源代码附上,有需要的小伙伴可以自取。
import pandas as pdimport numpy as np
import re
class Repair_Dirty(object):
__init_data = 0
def __init__(self, filename):
self.filename = filename
def get_data(self):
if self.filename == " ":
# print("您输入的文件路径为空")
return
else:
self.__init_data = pd.read_csv(self.filename)
return self.__init_data
# 找到异常值,abv列
def find_outlier(self, attribute):
data_att = self.__init_data[attribute]
# 找到异常值
outlier = data_att[np.abs(data_att - data_att.mean()) > 3 * data_att.std()]
print(data.loc[data[attribute] == 55])#对abv属性的异常值进行输出
print(np.where(self.__init_data[attribute] == 55)) # 返回指定位置的索引
return outlier
if __name__ == "__main__":
file_path = dirty_beer_last.csv
data_cla = Repair_Dirty(file_path)
data = data_cla.get_data()
print((data))
if data is None:
print("路径为空,程序退出!!!")
else:
data = data_cla.fill_na()
outlier = data_cla.find_outlier()
print(outlier)
总结
到此这篇关于python数据分析实战指南之异常值处理的文章就介绍到这了,更多相关python异常值处理内容请搜索盛行IT软件开发工作室以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT软件开发工作室!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。