pandas - 異常值處理


    異常值概念:是指那些遠離正常值的觀測,即“不合群”觀測。異常值的出現一般是人為的記錄錯誤或者是設備的故障等,異常值的出現會對模型的創建和預測產生

嚴重的后果。當然異常值也不一定是壞事,有些情況下,通過尋找異常值就能夠給業務帶來良好的發展,如銷毀“釣魚”網站,關閉“薅羊毛”用戶的權限等。

 

異常值的判定方法:

1.n個標准差法

2.箱線圖法

標准差法,就是用以樣本均值+樣本標准差為基准,如果樣本離平均值相差2個標准差以上的就是異常值

箱線圖法:以上下四分位作為參考, x > Q3+nIQR 或者 x < Q1 - nIQR 簡單地理解,就是如果樣本值不在上下四分位+標准差范圍內,就是異常值

 

兩種異常值判定是,如數據近似服從正態分布是,優先選擇n個標准差法,因為數據的分布相對比較對稱:否則優先選擇箱線圖法,因為分位數並不會受極端值的影響。

 

異常數據處理方法:

1.刪除法(前提是異常觀測的比例不能太大)

2.替換法(可以考慮使用低於判別上下限的最大值或最小值,均值或中位數替換等)

python處理異常值實例:

原數據(部分):

 

 代碼:

import pandas as pd
sunspots = pd.read_table(r'D:\sunspots.csv',sep = ',')
xbar = sunspots.counts.mean()
xstd = sunspots.counts.std()
print('標准差法異常值上限檢測:\n',any(sunspots.counts > xbar + 2 * xstd))
print('標准差法異常值下限檢測:\n',any(sunspots.counts < xbar - 2 * xstd))

#異常值 箱線圖法
Q1 = sunspots.counts.quantile(q = 0.25)
Q3 = sunspots.counts.quantile(q = 0.75)
IQR = Q3 -Q1
print('箱線圖法異常值上限檢測:\n',any(sunspots.counts > Q3 + 1.5*IQR))
print('箱線圖法異常值下限檢測:\n',any(sunspots.counts < Q1 - 1.5*IQR))

out:

 

 

如上結果所示,不管是標准差檢驗法還是箱線圖法,都發現太陽黑子數據中存在異常值,而且異常值都是超過上限臨界值的。接下來,通過繪制太陽黑子數量的直方圖和核密度曲線圖,用於檢測數據是否近似服從正態分布,進而選擇一個最終的異常值判別方法:

import matplotlib.pyplot as plt
plt.style.use('ggplot')
sunspots.counts.plot(kind='hist',bins = 30,density = True)
sunspots.counts.plot(kind='kde')
plt.show()

 

如上圖所示,不管是直方圖還是核密度曲線,所呈現的數據分布形狀都是有偏的,並且屬於右偏。基於此,這里選擇箱線圖法來判定太陽黑子數據中的那些異常值。接下來要做的就是選用刪除法或替換法來處理這些異常值,刪除法就跟上篇我們講過的一樣處理方式,下面介紹一下替換法,即使用上限下限的最大最小值來替換,代碼如下:(接異常值檢測部分代碼)

 

print('異常值替換前的數據統計特征:\n',sunspots.counts.describe())
UL = Q3 + 1.5 * IQR
print('判別異常值的上限臨界值:\n',UL)
replace_vaule = sunspots.counts[sunspots.counts < UL].max()
print('用以替換異常值的數據:\n',replace_vaule)

sunspots.counts[sunspots.counts > UL] = replace_vaule
print('異常值替換后的數據統計特征:\n',sunspots.counts.describe())

out:

 

經過判別異常值,得知,如果一年內太陽黑子超過 148.85時即為異常值年份,對於這些年份的異常值使用141.7替換。

 

本篇知識導圖:

     

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM