python如何实现对于数据中异常值的处理,python如何处理异常值
除了缺失值,异常值也是数据中常见的噪声,但并不是所有的异常值都需要处理。异常值产生的原因很多,根据实际业务往往可以分为“真异常”和“假异常”。
有时候一个具体业务动作的变化会引起“真异常”。此时,异常值反映的是真实情况。如果直接处理掉,可能会遗漏信息。类似于缺失值处理的过程,在异常分析之前需要进行数据读取和简单的描述统计。
注释大纲:
~ ~数据读取
~ ~数据概述
~ ~异常值识别
~ ~异常值处理
1.数据读取
导入excel数据,这里的数据来自“猴聊人”发布的数据。
百度网盘:https://pan.baidu.com/s/14Ulh_S1JqZUAD02-M_3Zlw
提货代码:wg18
进口熊猫作为pd
将numpy作为np导入
Data=pd.read_excel(朝阳医院2018年销售数据。xlsx ,标题=0,工作表名称=0)
# header表示读取第一行作为列名,sheetname表示读取工作表。您也可以直接使用sheet的名称。
2.数据概述
在读取数据后,我们需要检查数据的基本结构,包括但不限于行数和列数(名称)、数据类型、数据分布等。
#检查行数和列数
数据.形状
(6578, 7)
#查看前10行数据
data.head(10)
购买时间、社会保障卡号、商品代码、商品名称、销售数量、应收金额、实付金额
0 2018年1月01日星期五1.616528e 06 236701.0强大的VC银翘平板6.0 82.8 69.00
1 2018年1月2日星期六1.616528e 06 236701.0清热解毒口服液1.0 28.0 24.64
2018-01-06星期三1.260283e 07 236701.0肝康2.0 16.8 15.00
3 2018年1月11日星期一1.007034e 10 236701.0三九感冒灵1.0 28.0 28.00
4 2018年1月15日星期五1.015543e 08 236701.0三九感冒灵8.0 224.0 208.00
5 2018年1月20日星期三1.338953e 07 236701.0三九感冒灵1.0 28.0 28.00
6 2018年1月31日星期日1.014649e 08 236701.0三九感冒灵2.0 56.0 56.00
7 2018年2月17日星期三1.117733e 07 236701.0三九感冒灵5.0 149.0 131.12
8 2018年2月22日星期一1.006569e 10 236701.0三九感冒灵1.0 29.8 26.22
9 2018年2月24日星期三1.338953e 07 236701.0三九感冒灵4.0 119.2 104.89
#数字数据的分布
data.describe()
社会保障卡号、商品代码、销售数量、应收金额、实收金额
计数6.575000 e 03 6.575000 e 03 6575.000000 6575.000000 6575.000000
平均值6.092179 e 09 1.015458 e 06 2.385095 50 46 . 5465463656
标准4.889081 e 09 5.126518 e 05 2.3737702 87 80 . 58678687
最低1.616528 e 06 2.367010 e 05-10.000000-374.0000000-374.0000000
25% 1.014234 e 08 8.614560 e 05 1.000000 14.000000 12.320000
50% 1.001650 e 10 8.615070 e 05 2.000000 28.000000 26.600000
75% 1.004882 e 10 8.689265 e 05 2.000000 59.600000 53.000000
最大值1.283612 e 10 2.367012 e 06 50.000000 2950.000000 2650.000000
销售数量、应收金额、实收金额都是负数,金额字段相当离散。
3.异常值的识别
异常值的测量标准有很多,比较常见的有描述性统计、三西格马法、箱线图等。
描述性统计:例如,在前面的数据概述步骤中,基于描述性统计方法,发现销售数量等字段存在负数,与基本认知不符。
Neg_list=[销售数量,应收金额,实收金额]
对于neg_list中的项目:
.neg_item=data[item]0
.print(存在item小于0的 str(neg_item.sum())。
.
有16个销售数量小于0。
有16笔应收账款小于0。
有16笔实收金额小于0。
#在此删除小于0的记录。
对于neg_list中的项目:
.对于范围内的I(0,len(data)):
.如果数据[项目][i]0:
.data=data.drop(i)
.neg_item=data[item]0
.print(存在item小于0的 str(neg_item.sum())。
.
有0个销售数量小于0。
有0笔小于0的应收账款。
有0个实收金额小于0。
三适马:当数据服从正态分布时,99%的值应位于距均值3个标准差以内,P ( x 3) 0.003。当数值超过这个距离时,可以认为是异常值。
对于neg_list中的项目:
.data[item _ zscore ]=(data[item]-data[item]。mean())/data[item]。标准()
.z _异常=abs(data[item _zscore])3
.打印(项目有 str(z _ anomaly . sum())异常值)
.
销售数量中有190个异常值。
应收金额有98个异常值。
实收金额有106个异常值
箱线图:IQR(差值)=U(上四分位数)-L(下四分位数)
上限=U 1.5IQR
下限=L-1.5IQR
对于neg_list中的项目:
.iqr=数据[项目]。分位数(0.75) -数据[项目]。分位数(0.25)
.q _异常_L=数据[项目]数据[项目]。分位数(0.25) - 1.5 * iqr
.q _异常_U=数据[项目]数据[项目]。分位数(0.75) 1.5 * iqr
.打印(项目有 str(q _ anomaly _ l . sum()q _ anomaly _ u . sum())异常值)
.
销售数量中有974个异常值。
应收金额有513个异常值。
实收金额有537个异常值
4、异常值处理
对于异常值,可以删除,不做处理,或者作为缺失值处理,采用缺失值的处理方法。
对于离散度过大的领域,也可以采用对数变换和分类数据变换来减少或消除离群值的影响,但同时也意味着可能会丢失部分数据信息。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。