python如何实现对于数据中异常值的处理,python找出数据异常值
异常值是指样本中的个别值明显偏离其余的观察值。离群点的存在会干扰数据分析和建模,因此有必要检测数据集中的离群点,并删除或修正离群点,以便更好地进行数据分析和挖掘。对于离群点检测,有描述统计、3原理方法、箱线图、基于聚类的方法等,3原理是最常用的离群点检测方法之一。在3原则下,一般认为数据值99.7%的概率集中在(-3, 3)的范围内(为平均值,为标准差),超过这个范围的概率只占0.3%,属于罕见的小概率事件。因此,超出(-3, 3)范围的值被视为异常值。原则要求数据服从正态或近似正态分布,样本数据大于10。如果数据不服从正态分布,也可以用标准差偏离平均值多少倍来描述。现在用Python实现基于3原理的离群点检测,中国GDP(亿元)、GDP指数((去年=100))、GDP增长率(%)、第二产业增加值(亿元)、第三产业增加值(亿元)等24个指标数据。对中国从1952年到2018年的异常值进行了检查。
# 3基于sigma的离群点检测#-*-编码:UTF-8-*-import numpy as NP import pandas as PD import matplotlib . py plot as PLT # import drawing library # # 3 sigma principle def three sigma(data,n):“”数据:表示时间序列,包括时间和值两列;n:表示几次的标准差 data_x=data.ix[:0]。tolist() ##获取时间序列的时间# print(data _ x)# print( * * * * * * * * * ,J) mintime=data_x[0] ##获取时间序列的起始年份maxtime=data_x[-1] ##获取时间序列的结束年份data_y=data.ix[:1]。tolist() ##获取时间序列值ymean=np.mean(data_y) ##求时间序列平均值ystd=np.std(data_y) ##求时间序列标准差down=ymean-n * ystd ##计算下界up=ymean n * ystd # #计算上界离群值=[]# Save outlier _ x=[]for I in range(0,len(data _ y)):if(data _ y[I]down)(data _ y[I]up):outlier(append . 用于记录结果指标=[] ##指标flag=[] ##是否为异常值outlier_data=[] ##异常值outlier_time=[] ##异常值发生的对应时间max_time=[] ##时间序列开始时间min_time=[] ##时间序列结束时间_ flag。 是否为异常值起始时间# read data data=PD . read _ CSV( data . CSV ,index _ col=false,Encoding= GB 18030 )# read data # print(data . head())col _ name=data . columns . to list()# print(data . columns . to list())# set parameter n=3 # n * sigma print( * * * * * * *:n=,n)##检测j在col _ name[1:]:indicator . append(j)temp _ data=data . IX[:] j]] #print(删除空值前,Len(temp _ data))temp _ data=temp _ data . dropna()#删除空值#print(删除空值后,Len(temp _ data))temp _ data=temp _ data . sort _ values(by=[ time ],axis=0,Ascending=True) #按时间顺序# print (temp _ data) mintime,maxtime,outlier,outlier _ x=threesigma (temp _ data,N) #调用3sigma函数min_time.append(mintime) ## Outlier _ time . append(outlier _ x)if(Outlier _ x中的maxtime)或(Outlier _ x中的mintime):time _ flag . append( Outlier是开始)# print(time _ flag)Else:time _ flag . append()iflen(Outlier)0:flag . append( exception )print( * * * * * * * * * * * * * * * * * * * * * * * *)print( Outlier _ x)# #画出有离群值的时间序列的折线图。异常值用plt.figure (fig size=(12,5)) plt.plot (temp _ data.ix [:0],temp _ data.ix [:1]) plt.plot(. 特别标记ro )for j in range(len(outlier)):PLT . annotate(outlier[j],xy=(outlier_x[j],outlier[j])),xytext=(outlier_x[j],Outside[j]))PLT . show()else:flag . append( normal )result=PD。data frame()result[ indicator ]=indicator result[开始时间]=min_timeresult[结束时间]=max_timeresult[异常]=flagresult[异常值]=outlier_dataresult[异常时间]=outlier_timeresult[异常值所在时间的标识]=time_flagresult
关注抛出的异常值,并结合实际业务情况判断数据是否真的异常,异常的原因是什么,再确定如何处理异常值。
GDP指数(去年=100):1961年,中国刚刚经历了三年的自然灾害。查询了各种数据,确认数据没有问题,所以没有处理。
第三产业占GDP的比重(%):核对各种数据,确认数据有问题,进行修正。
第三产业增加值(亿元):异常值出现在时间序列的开头,通过折线图和各种数据证明数据是正确的,不做处理。
附数据和源程序。链接:https://pan.baidu.com/s/1RLC6769nJLKUG3woWsv17w摘抄代码:rmjc ps:初衷是通过写博文的方式记录自己所学所用,以便整理和积累知识;分享一下,希望对面临同样困惑的小伙伴有所帮助。如果发现博文中有什么问题,欢迎随时交流~ ~
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。