数据预处理之异常值(python)

除了缺失值外,异常值也是数据中常有的噪音,但并非异常值都需要被处理,异常值出现的原因有很多,结合实际业务,他们往往可以被分为“真异常”和“假异常”。
有时特定业务动作的变化会引发“真异常”,此时异常值反应的是真实情况,如果直接处理掉,可能就错失了信息。与缺失值处理的过程类似,在进行异常分析之前,需要进行数据读取与简单描述统计。

笔记大纲:
~~·数据读取
~~·数据概览
~~·异常值识别
~~·异常值处理

1、数据读取
导入excel数据,这里的数据来源于“猴子聊人物”所发布的数据资料。
百度网盘:https://pan.baidu.com/s/14Ulh_S1JqZUAD02-M_3Zlw
提取码:wg18

>>> import pandas as pd
>>> import numpy as np

>>> data = pd.read_excel('朝阳医院2018年销售数据.xlsx', header=0, sheetname=0)
# header表示读取第一行作为列名,sheetname为读取sheet1,你也可以直接用sheet的名字

2、数据概览
在进行数据读取之后,我们需要查看数据的基本结构,包含但不限于行列数(名)、数据类型、数据分布等。

# 查看行列数
>>> data.shape
(6578, 7)
# 查看前10行数据 
>>> data.head(10)
                 购药时间          社保卡号      商品编码     商品名称  销售数量   应收金额    实收金额
0  2018-01-01 星期五  1.616528e+06  236701.0  强力VC银翘片   6.0   82.8   69.00
1  2018-01-02 星期六  1.616528e+06  236701.0  清热解毒口服液   1.0   28.0   24.64
2  2018-01-06 星期三  1.260283e+07  236701.0       感康   2.0   16.8   15.00
3  2018-01-11 星期一  1.007034e+10  236701.0    三九感冒灵   1.0   28.0   28.00
4  2018-01-15 星期五  1.015543e+08  236701.0    三九感冒灵   8.0  224.0  208.00
5  2018-01-20 星期三  1.338953e+07  236701.0    三九感冒灵   1.0   28.0   28.00
6  2018-01-31 星期日  1.014649e+08  236701.0    三九感冒灵   2.0   56.0   56.00
7  2018-02-17 星期三  1.117733e+07  236701.0    三九感冒灵   5.0  149.0  131.12
8  2018-02-22 星期一  1.006569e+10  236701.0    三九感冒灵   1.0   29.8   26.22
9  2018-02-24 星期三  1.338953e+07  236701.0    三九感冒灵   4.0  119.2  104.89
# 数值型数据的分布情况
>>> data.describe()
               社保卡号          商品编码         销售数量         应收金额         实收金额
count  6.575000e+03  6.575000e+03  6575.000000  6575.000000  6575.000000
mean   6.092179e+09  1.015458e+06     2.385095    50.478935    46.321582
std    4.889081e+09  5.126518e+05     2.373702    87.607883    80.987682
min    1.616528e+06  2.367010e+05   -10.000000  -374.000000  -374.000000
25%    1.014234e+08  8.614560e+05     1.000000    14.000000    12.320000
50%    1.001650e+10  8.615070e+05     2.000000    28.000000    26.600000
75%    1.004882e+10  8.689265e+05     2.000000    59.600000    53.000000
max    1.283612e+10  2.367012e+06    50.000000  2950.000000  2650.000000

销售数量、应收金额和实收金额存在负数,且金额字段离散程度较大。

3、异常值识别
异常值的测量标准有很多,比较常见的是描述性统计法、三西格玛法、箱型图等:
①描述性统计:比如在之前的数据概览步骤中,基于描述性统计方法,发现销售数量等字段存在负数,这与基本认知是不符的。

>>> neg_list = ['销售数量', '应收金额', '实收金额']
>>> for item in neg_list:
...     neg_item = data[item]<0
...     print(item + '小于0的有' + str(neg_item.sum()) + '个')
...
销售数量小于0的有16个
应收金额小于0的有16个
实收金额小于0的有16个

# 此处将小于0的记录删除
>>> for item in neg_list:
...     for i in range(0, len(data)):
...         if data[item][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,当数值超出这个距离,可以认为它是异常值。

>>> for item in neg_list:
...     data[item + '_zscore'] = (data[item] - data[item].mean())/data[item].std()
...     z_abnormal = abs(data[item + '_zscore'])>3
...     print(item + '中有' + str(z_abnormal.sum()) + '个异常值')
...
销售数量中有190个异常值
应收金额中有98个异常值
实收金额中有106个异常值

③箱型图:IQR(差值) = U(上四分位数) - L(下四分位数)
上界 = U + 1.5IQR
下界 = L-1.5IQR

>>> for item in neg_list:
...     iqr = data[item].quantile(0.75) - data[item].quantile(0.25)
...     q_abnormal_L = data[item] < data[item].quantile(0.25) - 1.5 * iqr
...     q_abnormal_U = data[item] > data[item].quantile(0.75) + 1.5 * iqr
...     print(item + '中有' + str(q_abnormal_L.sum() + q_abnormal_U.sum()) + '个异常值')
...
销售数量中有974个异常值
应收金额中有513个异常值
实收金额中有537个异常值

4、异常值处理
对于异常值,可以删除、可以不处理,也可以将其当做缺失值,采用缺失值的处理办法。
对于离散程度过大的字段,也可以采取对数转化、分类数据转化等方法,减轻或消除异常值带来的影响,但同时这也意味着可能损失部分数据信息。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 数据形式 数据读取 数据预处理 数据收集及读取 很多人认为数据分析就是将数据可视化或者对数据趋势做出预测,其实是不...
    Clemente阅读 2,184评论 0 5
  • 关于Mongodb的全面总结 MongoDB的内部构造《MongoDB The Definitive Guide》...
    中v中阅读 32,039评论 2 89
  • 在数据分析之前对数据进行预处理是十分必要的,这一过程能帮我们清除或处理掉数据中的噪音,为后续的分析和建模工作做准备...
    Taodede阅读 5,333评论 0 1
  • 请点击蓝字收听朗读音频 《最后一滴沧海》作者:赵真仁 我带着无人问津的秘密, 坐在海浪之上, 木头和窗帘外, 众神...
    暖逸阅读 262评论 0 1
  • 我不是她的谁,那她是我的谁呢
    自燃式阅读 70评论 0 0