數(shù)據(jù)預(yù)處理之異常值(python)

除了缺失值外,異常值也是數(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ù)信息。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容