異常值處理
覺得有用的話,歡迎一起討論相互學習~
版權聲明:本文為CSDN博主「sljwy」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/sinat_23971513/article/details/114918790
什么樣的值是異常值?
簡單來說,即在數據集中存在不合理的值,又稱離群點。
我們舉個例子,做客戶分析,發現客戶的年平均收入是80萬美元。 但是,有兩個客戶的年收入是4美元和420萬美元。 這兩個客戶的年收入明顯不同於其他人,那這兩個觀察結果將被視為異常值。

什么會引起異常值呢?
每當我們遇到異常值時,處理這些異常值的理想方法就是找出引起這些異常值的原因。 處理它們的方法將取決於它們發生的原因, 異常值的原因可以分為兩大類:
人為錯誤
自然錯誤
數據輸入錯誤
人為錯誤(如數據收集,記錄或輸入過程中導致的錯誤)會導致數據中的異常值。 例如:客戶的年收入是10萬美元,但意外地,數據輸入操作附加一個零。 現在的收入就是100萬美元,是10倍。 顯然,與其他人相比,這將是異常值。
測量誤差
這是異常值最常見的來源。 當使用的測量儀器出現故障時,會引起這種情況。 例如:有10台稱重機。 其中9個是正確的,1個是錯誤的。 故障機器上的人員測量重量將高於或低於組內其余人員。 在故障機器上測量的重量可能導致異常值。
實驗誤差
異常值的另一個原因是實驗誤差。 例如:在7名跑步者的100米沖刺中,有一名選手錯過了跑的口令,讓他開始延遲。 因此,這使得跑步者的跑步時間比其他跑步者要多, 總運行時間可能是一個異常值。
故意異常值
通常在自我報告的措施中涉及敏感數據。 例如:通常青少年報告酒量,只有其中一小部分報告實際價值,這里的實際值可能看起來像異常值,因為其余的青少年正在假值。
數據處理錯誤
無論何時執行數據挖掘,我們從多個來源提取數據。 某些操作或提取錯誤可能會導致數據集中的異常值。
抽樣錯誤
例如,衡量運動員的身高,錯誤地在樣品中包括幾名籃球運動員。 這種包含可能會導致數據集中的異常值。
自然異常值
當異常值不是人為的(由於錯誤),它是一個自然的異常值。 例如:注意到其中一家著名的保險公司,前50名財務顧問的表現遠遠高於其他人。 令人驚訝的是,這不是由於任何錯誤。 因此,每當與顧問一起執行任何數據挖掘活動時,我們都會分別對待此細分。
判別方法:
1.簡單統計分析
對屬性值進行一個描述性的統計,從而查看哪些值是不合理的。比如對年齡這個屬性進行規約:年齡的區間在[0:200],如果樣本中的年齡值不再該區間范圍內,則表示該樣本的年齡屬性屬於異常值。
2. 3δ原則
當數據服從正態分布:
根據正態分布的定義可知,距離平均值3δ之外的概率為 P(|x-μ|>3δ) <= 0.003 ,這屬於極小概率事件,在默認情況下我們可以認定,距離超過平均值3δ的樣本是不存在的。 因此,當樣本距離平均值大於3δ,則認定該樣本為異常值。

當數據不服從正態分布:
當數據不服從正態分布,可以通過遠離平均距離多少倍的標准差來判定,多少倍的取值需要根據經驗和實際情況來決定。
3.箱型圖分析
箱線圖(Boxplot)也稱箱須圖(Box-whisker Plot),是利用數據中的五個統計量:最小值、第一四分位數、中位數、第三四分位數與最大值來描述數據的一種方法,它也可以粗略地看出數據是否具有有對稱性,分布的分散程度等信息,特別可以用於對幾個樣本的比較。
具體含義如下,首先計算出第一四分位數(Q1)、中位數、第三四分位數(Q3)。
中位數我們都知道,就是將一組數字按從小到大的順序排序后,處於中間位置(也就是50%位置)的數字。
同理,第一四分位數、第三四分位數是按從小到大的順序排序后,處於25%、75%的數字。
令 IQR=Q3−Q1,那么 Q3+1.5(IQR) 和 Q1−1.5(IQR) 之間的值就是可接受范圍內的數值,這兩個值之外的數認為是異常值。
在Q3+1.5IQR(四分位距)和Q1-1.5IQR處畫兩條與中位線一樣的線段,這兩條線段為異常值截斷點,稱其為內限;在Q3+3IQR和Q1-3IQR處畫兩條線段,稱其為外限。
處於內限以外位置的點表示的數據都是異常值,其中在內限與外限之間的異常值為溫和的異常值(mild outliers),在外限以外的為極端的異常值(li)的異常值extreme outliers。這種異常值的檢測方法叫做Tukey’s method。
從矩形盒兩端邊向外各畫一條線段直到不是異常值的最遠點 表示該批數據正常值的分布區間點,表示該批數據正常值的分布區間。
一般用“〇”標出溫和的異常值,用“*”標出極端的異常值。

首先我們定義下上四分位和下四分位。
上四分位我們設為 U,表示的是所有樣本中只有1/4的數值大於U
同理,下四分位我們設為 L,表示的是所有樣本中只有1/4的數值小於L
那么,上下界又是什么呢?
我們設上四分位與下四分位的插值為IQR,即:IQR=U-L
那么,上界為 U+1.5IQR ,下界為: L - 1.5IQR
箱型圖選取異常值比較客觀,在識別異常值方面有一定的優越性。
異常值的處理方法常用有四種:
1.刪除含有異常值的記錄
2.將異常值視為缺失值,交給缺失值處理方法來處理
3.用平均值來修正
4.不處理
代碼實現
import pandas as pd
import numpy as np
from collections import Counter
def detect_outliers(df,n, features):
outlier_indices = []
for col in features:
Q1 = np.percentile(df[col], 25)
Q3 = np.percentile(df[col], 75)
IQR = Q3 - Q1
outlier_step = 1.5 * IQR
outlier_list_col = df[(df[col] < Q1 - outlier_step) | (df[col] > Q3 + outlier_step)].index
outlier_indices.extend(outlier_list_col)
outlier_indices = Counter(outlier_indices)
multiple_outliers = list( k for k, v in outlier_indices.items() if v > n)
return multiple_outliers
df = pd.read_csv("data.csv")
Outliers_to_drop = detect_outliers(df, 2 ["Col1", "Col2", "Col3", "Col4"])
df = df.drop(Outliers_to_drop, axis=0).reset_index(drop=True)




