Python数据预处理之异常值的处理——【自定义的three_sigma()函数、boxplot()方法】
文章目錄
- 基于3σ原則檢測異常值
- 代碼實現(xiàn)
- 測試
- 基于箱型圖檢測異常值
- 異常值的處理
基于3σ原則檢測異常值
3σ原則,又稱拉依達(dá)準(zhǔn)則。是指假設(shè)一組檢測數(shù)據(jù)只含有隨機誤差。對其進(jìn)行計算處理得到標(biāo)準(zhǔn)偏差,按一定概率確定一個區(qū)間,凡是超過這個區(qū)間的誤差都是粗大誤差,在此誤差范圍內(nèi)的數(shù)據(jù)應(yīng)予以剔除。
正態(tài)分布概率公式中,σ表示標(biāo)準(zhǔn)差,μ表示平均數(shù),f(x)表示正態(tài)分布函數(shù)。
正態(tài)分布公式
正態(tài)曲線下,
橫軸區(qū)間(μ-σ,μ+σ)內(nèi)的面積為68.268949%。
P{|X-μ|<σ}=2Φ(1)-1=0.6826
橫軸區(qū)間(μ-2σ,μ+2σ)內(nèi)的面積為95.449974%。
P{|X-μ|<2σ}=2Φ(2)-1=0.9544
橫軸區(qū)間(μ-3σ,μ+3σ)內(nèi)的面積99.730020%。
P{|X-μ|<3σ}=2Φ(3)-1=0.9974
由于“小概率事件”和假設(shè)檢驗的基本思想 “小概率事件”通常指發(fā)生的概率小于5%的事件,認(rèn)為在一次試驗中該事件是幾乎不可能發(fā)生的。
由上可知,X落在(μ-3σ,μ+3σ)以外的概率小于千分之三,在實際問題中常認(rèn)為相應(yīng)的事件是不會發(fā)生的,基本上可以把區(qū)間(μ-3σ,μ+3σ)看作是隨機變量X實際可能的取值區(qū)間,超過這個區(qū)間的就屬于異常值,應(yīng)予以剔除。
代碼實現(xiàn)
import numpy as np import pandas as pddef three_sigma(ser1): # ser1表示傳入DataFrame的某一列mean_value = ser1.mean() # 求平均值std_value = ser1.std() # 求標(biāo)準(zhǔn)差rule = (mean_value - 3 * std_value > ser1) | (ser1.mean() + 3 * ser1.std() < ser1)# 位于(u-3std,u+3std)區(qū)間的數(shù)據(jù)是正常的,不在這個區(qū)間的數(shù)據(jù)為異常的# 一旦發(fā)現(xiàn)有異常值,就標(biāo)注為True,否則標(biāo)注為Falseindex = np.arange(ser1.shape[0])[rule] # 返回異常值的位置索引outrange = ser1.iloc[index] # 獲取異常數(shù)據(jù)return outrange測試
將符合正態(tài)分布的包含異常值的測試數(shù)據(jù)保存在D:\數(shù)據(jù)分析\data.xlsx中。使用Pandas的read_excel()函數(shù)從文件中讀取數(shù)據(jù),并轉(zhuǎn)換為DataFrame對象。之后分別對data中的A列數(shù)據(jù)和B列數(shù)據(jù)進(jìn)行檢測。
data = pd.read_excel(r'D:\數(shù)據(jù)分析\data.xlsx') print(data) print(three_sigma(data['A'])) print(three_sigma(data['B']))輸出結(jié)果:
Unnamed: 0 A B 0 0 1 2 1 1 2 3 2 2 3 8 3 3 4 5 4 4 5 6 5 5 560 7 6 6 2 8 7 7 3 9 8 8 4 0 9 9 5 3 10 10 3 4 11 11 2 5 12 12 4 6 13 13 5 7 14 14 5 2 15 15 23 4 16 16 2 55 560 Name: A, dtype: int64Series([], Name: B, dtype: int64)基于箱型圖檢測異常值
箱型圖是一種用作顯示一組數(shù)據(jù)分散情況的統(tǒng)計圖。在箱型圖中,異常值通常被定義為小于QL-1.5QR或大于QU+1.5IQR的值。其中:
QL:下四分位數(shù),表示全部觀察值中有四分之一的數(shù)據(jù)取值比它大。
QU:上四分位數(shù),表示全部觀察值中有四分之一的數(shù)據(jù)取值比它小。
IQR:四分位數(shù)間距,是QU與QL之差,其間包含了全部觀察值的一半。
箱型圖是根據(jù)實際數(shù)據(jù)進(jìn)行繪制,對數(shù)據(jù)沒有任何要求(3σ原則要求數(shù)據(jù)服從正態(tài)分布或近似正態(tài)分布)。箱型圖判斷異常值的標(biāo)準(zhǔn)是以四分位數(shù)和四分位距為基礎(chǔ)的。
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.boxplot(column=['A', 'B', 'C', 'D']))輸出結(jié)果:
異常值的處理
檢測出異常值后,通常會才用如下四種方式處理這些異常值:
1、直接將含有異常值的記錄刪除
2、用具體的值來進(jìn)行替換,可用前后兩個觀測值的平均值修正該異常值
3、不處理,直接在具有異常值的數(shù)據(jù)集上進(jìn)行統(tǒng)計分析
4、視為缺失值,利用缺失值的處理方法修正該異常值
異常數(shù)據(jù)被檢測出來之后,需要進(jìn)一步確認(rèn)他們是否為真正的異常值,等確認(rèn)完以后再決定選用哪種方法進(jìn)行解決。
如果希望對異常值進(jìn)行修改(執(zhí)行操作2),則可以使用Pandas中replace()方法進(jìn)行替換,該方法不僅可以對單個數(shù)據(jù)進(jìn)行替換,也可以多個數(shù)據(jù)執(zhí)行批量替換操作。
replace(to_replace=None, value=None, inplace=False, limit=None, regex=False, method=‘pad’)
部分參數(shù):
to_replace:表示查找被替換值的方式
value:用來替換任何匹配to_replace的值,默認(rèn)值為None
limit:表示前向或后向填充的最大尺寸間隙
regex:接收布爾值或與to_replace相同的類型,默認(rèn)為False,表示是否將to_replace和value解釋為正則表達(dá)式
method:替換時使用的方法,pad/ffill表示前向填充,bfill表示后向填充
replace()方法的使用
print(df.replace(to_replace=30, value=3)) print(data.replace(to_replace=data.loc[5, ['A']], value=6))輸出結(jié)果:
AxesSubplot(0.125,0.11;0.775x0.77)A B C D 0 1 2 1 1 1 2 3 4 5 2 3 4 7 3 3 4 5 4 3Unnamed: 0 A B 0 0 1 2 1 1 2 3 2 2 3 8 3 3 4 5 4 4 5 6 5 5 6 7 6 6 2 8 7 7 3 9 8 8 4 0 9 9 5 3 10 10 3 4 11 11 2 5 12 12 4 6 13 13 5 7 14 14 5 2 15 15 23 4 16 16 2 5總結(jié)
以上是生活随笔為你收集整理的Python数据预处理之异常值的处理——【自定义的three_sigma()函数、boxplot()方法】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 剑指offer之求1+2+...+n
- 下一篇: Python之数据转换——【rename