除了缺失值外,異常值也是數(shù)據(jù)中常有的噪音,但并非異常值都需要被處理,異常值出現(xiàn)的原因有很多,結(jié)合實(shí)際業(yè)務(wù),他們往往可以被分為“真異常”和“假異?!薄?br> 有時特定業(yè)務(wù)動作的變化會引發(fā)“真異?!?,此時異常值反應(yīng)的是真實(shí)情況,如果直接處理掉,可能就錯失了信息。與缺失值處理的過程類似,在進(jìn)行異常分析之前,需要進(jìn)行數(shù)據(jù)讀取與簡單描述統(tǒng)計。
筆記大綱:
~~·數(shù)據(jù)讀取
~~·數(shù)據(jù)概覽
~~·異常值識別
~~·異常值處理
1、數(shù)據(jù)讀取
導(dǎo)入excel數(shù)據(jù),這里的數(shù)據(jù)來源于“猴子聊人物”所發(fā)布的數(shù)據(jù)資料。
百度網(wǎng)盤:https://pan.baidu.com/s/14Ulh_S1JqZUAD02-M_3Zlw
提取碼:wg18
>>> import pandas as pd
>>> import numpy as np
>>> data = pd.read_excel('朝陽醫(yī)院2018年銷售數(shù)據(jù).xlsx', header=0, sheetname=0)
# header表示讀取第一行作為列名,sheetname為讀取sheet1,你也可以直接用sheet的名字
2、數(shù)據(jù)概覽
在進(jìn)行數(shù)據(jù)讀取之后,我們需要查看數(shù)據(jù)的基本結(jié)構(gòu),包含但不限于行列數(shù)(名)、數(shù)據(jù)類型、數(shù)據(jù)分布等。
# 查看行列數(shù)
>>> data.shape
(6578, 7)
# 查看前10行數(shù)據(jù)
>>> data.head(10)
購藥時間 社保卡號 商品編碼 商品名稱 銷售數(shù)量 應(yīng)收金額 實(shí)收金額
0 2018-01-01 星期五 1.616528e+06 236701.0 強(qiáng)力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
# 數(shù)值型數(shù)據(jù)的分布情況
>>> data.describe()
社??ㄌ? 商品編碼 銷售數(shù)量 應(yīng)收金額 實(shí)收金額
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
銷售數(shù)量、應(yīng)收金額和實(shí)收金額存在負(fù)數(shù),且金額字段離散程度較大。
3、異常值識別
異常值的測量標(biāo)準(zhǔn)有很多,比較常見的是描述性統(tǒng)計法、三西格瑪法、箱型圖等:
①描述性統(tǒng)計:比如在之前的數(shù)據(jù)概覽步驟中,基于描述性統(tǒng)計方法,發(fā)現(xiàn)銷售數(shù)量等字段存在負(fù)數(shù),這與基本認(rèn)知是不符的。
>>> neg_list = ['銷售數(shù)量', '應(yīng)收金額', '實(shí)收金額']
>>> for item in neg_list:
... neg_item = data[item]<0
... print(item + '小于0的有' + str(neg_item.sum()) + '個')
...
銷售數(shù)量小于0的有16個
應(yīng)收金額小于0的有16個
實(shí)收金額小于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()) + '個')
...
銷售數(shù)量小于0的有0個
應(yīng)收金額小于0的有0個
實(shí)收金額小于0的有0個
②三西格瑪:當(dāng)數(shù)據(jù)服從正態(tài)分布時,99%的數(shù)值應(yīng)該位于距離均值3個標(biāo)準(zhǔn)差之內(nèi)的距離,P(|x?μ|>3σ)≤0.003,當(dāng)數(shù)值超出這個距離,可以認(rèn)為它是異常值。
>>> 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()) + '個異常值')
...
銷售數(shù)量中有190個異常值
應(yīng)收金額中有98個異常值
實(shí)收金額中有106個異常值
③箱型圖:IQR(差值) = U(上四分位數(shù)) - L(下四分位數(shù))
上界 = 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()) + '個異常值')
...
銷售數(shù)量中有974個異常值
應(yīng)收金額中有513個異常值
實(shí)收金額中有537個異常值
4、異常值處理
對于異常值,可以刪除、可以不處理,也可以將其當(dāng)做缺失值,采用缺失值的處理辦法。
對于離散程度過大的字段,也可以采取對數(shù)轉(zhuǎn)化、分類數(shù)據(jù)轉(zhuǎn)化等方法,減輕或消除異常值帶來的影響,但同時這也意味著可能損失部分?jǐn)?shù)據(jù)信息。