【轉】異常值處理


異常值處理

覺得有用的話,歡迎一起討論相互學習~

我的微博我的github我的B站

版權聲明:本文為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)


免責聲明!

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



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