python预处理实例,python数据预处理实验报告
本文基于3原理对目录进行离群点检测,代码实现测试,并基于盒图进行离群点检测。
基于3原理的异常值检测
3原则,也称为莱达准则。假设一组测试数据只包含随机误差。计算并处理标准差,按照一定概率确定一个区间。任何超出这个区间的误差都是粗差,应该剔除这个误差范围内的数据。
在正态分布概率公式中,代表标准差,代表平均值,f(x)代表正态分布函数。
正态分布公式
在正常曲线下,
横轴区间(-, )内的面积为68.268949%。
p { X-}=2(1)-1=0.6826
横轴(-2, 2)上的面积为95.449974%。
p { X- 2}=2(2)-1=0.9544
横轴区间(-3, 3)内的面积为99.730020%。
p { X- 3}=2(3)-1=0.9974
由于“小概率事件”和假设检验的基本思想“小概率事件”通常是指概率小于5%的事件,认为这种事件在一个实验中几乎不可能发生。
从以上,X落在(-3,+3)以外的概率小于千分之三,在实际问题中常认为相应的事件是不会发生的,基本上可以把区间(-3,+3)看作是随机变量X实际可能的取值区间,超过这个区间的就属于异常值,应予以剔除。
import numpy as NP import pandas as PD def three _ sigma(ser 1):# ser 1表示传入DataFrame的一列mean _ value=ser 1 . mean()# Average STD _ value=ser 1 . STD()#求标准差规则=(mean _ value-3 * STD _ value ser 1)(ser 1 . mean()3 * ser 1 . STD()ser 1)#在(u-3std,u 3std)区间的数据是正常的, 并且这个区间之外的数据是异常的#一旦发现异常值,就标记为真,否则标记为假index=NP . orange(ser 1 . shape[0])[rule]#返回异常值的位置索引,outrange=ser1.iloc[index] #获取异常数据。 “超出范围返回”测试保存包含异常值的测试数据,这些异常值符合D:\数据分析\data.xlsx中的正态分布。使用Pandas的read_excel()函数从文件中读取数据,并将其转换为DataFrame对象。然后,分别检测数据中的A列数据和B列数据。
data=PD . read _ excel(r d:\ data analysis \ data . xlsx )print(data)print(three _ sigma(data[ a ]))print(three _ sigma(data[ b ]))输出结果:
未命名:0 A B0 0 1 21 1 2 32 2 3 83 3 4 54 4 5 65 5 560 76 6 2 87 7 3 98 8 4 09 9 5 310 10 3 411 11 2 512 12 4 613 13 5 714 14 5 215 15 23 416 16 2 55 50名称:A,dtype: int64 series ([],name: b,dtype: int64)基于箱线图检测异常值。箱线图是一种统计图表,用于显示一组数据的离差。异常值通常在箱线图中定义为小于QL-1.5QR或大于QU+1.5IQR的值。其中包括:
QL:下四分位数,表示所有观测值的四分之一大于它。
曲:上四分位数表示所有观测值的四分之一小于它。
IQR:四分位间距是屈和的差值,它包含了所有观测值的一半。
箱线图根据实际数据绘制,对数据没有要求(3原理要求数据服从正态分布或近似正态分布)。箱线图判断异常值的标准是基于四分位数和四分位数距离。
Pandas中提供了一个专门用来绘制箱型图的boxplot()方法。
df=pd。DataFrame({A: [1,2,3,4], B: [2,3,4,5], C: [1,4,7,4], D: [1,5,30,3]})print(df . box plot(column=[ A , B , C , D ])输出结果:
异常值的处理检测到异常值后,这些异常值通常有以下四种处理方式:
1.直接删除有异常值的记录。
2.用一个具体值代替,异常值可以用前后两次观测值的平均值来修正。
3.不做处理,直接对有异常值的数据集进行统计分析。
4.视为缺失值,通过缺失值的处理方法对异常值进行修正。
检测到异常数据后,需要进一步确认是否是真实的异常值,再决定用哪种方法解决。
如果要修改异常值(执行操作2),可以使用Pandas中的replace()方法进行替换,不仅可以替换单个数据,还可以对多个数据进行批量替换。
replace(to_replace=None,value=None,inplace=False,limit=None,regex=False,method=pad )
部分参数:
To_replace:指示查找被替换值的方式。
Value:用于替换任何与to_replace匹配的值,默认值为None。
极限:表示向前或向后填充的最大尺寸间隙。
Regex:接收布尔值或与to_replace相同的类型,默认为False,表示是否将to_replace和value解释为正则表达式。
方法:替换时使用的方法,pad/ffill表示正向填充,bfill表示反向填充。
replace()方法的使用
print(df.replace(to_replace=30,value=3))print(data . replace(to _ replace=data . loc[5,[A]],value=6))输出结果:
AxesSubplot(0.125,0.11;0.775 x 0.77)A B C D0 1 2 1 11 2 3 4 52 3 4 7 33 4 5 3未命名:0 A B0 0 1 21 1 2 32 2 3 83 3 4 54 4 5 65 5 6 76 6 2 87 7 3 98 8 4 09 9 9 5 310 10 3 411 11 2 4 613 13 5 714 14 5 23 416 16 2 5
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。