Python數據清洗(三):異常值識別與處理

2020-12-05 CDA數據分析師

作者 | 劉順祥 來源 | 數據分析1480

在《Python數據清洗(一):類型轉換和冗餘數據刪除》和《Python數據清洗(二):缺失值識別與處理》文中已經講解了有關數據中重複觀測和缺失值的識別與處理,在本節中將分享異常值的判斷和處理方法。

異常值也稱為離群點,就是那些遠離絕大多數樣本點的特殊群體,通常這樣的數據點在數據集中都表現出不合理的特性。如果忽視這些異常值,在某些建模場景下就會導致結論的錯誤(如線性回歸模型、K均值聚類等),所以在數據的探索過程中,有必要識別出這些異常值並處理好它們。

異常值的識別

通常,異常值的識別可以藉助於圖形法(如箱線圖、正態分布圖)和建模法(如線性回歸、聚類算法、K近鄰算法),在本期內容中,將分享兩種圖形法,在下一期將分享基於模型識別異常值的方法。

箱線圖法

箱線圖技術實際上就是利用數據的分位數識別其中的異常點,該圖形屬於典型的統計圖形,在學術界和工業界都得到廣泛的應用。箱線圖的形狀特徵如下圖所示:

圖中的下四分位數指的是數據的25%分位點所對應的值(Q1);中位數即為數據的50%分位點所對應的值(Q2);上四分位數則為數據的75%分位點所對應的值(Q3);上須的計算公式為Q3+1.5(Q3-Q1);下須的計算公式為Q1-1.5(Q3-Q1)。其中,Q3-Q1表示四分位差。如果採用箱線圖識別異常值,其判斷標準是,當變量的數據值大於箱線圖的上須或者小於箱線圖的下須時,就可以認為這樣的數據點為異常點。

所以,基於上方的箱線圖,可以定義某個數值型變量中的異常點和極端異常點,它們的判斷表達式如下表所示:

在Python中可以使用matplotlib模塊實現數據的可視化,其中boxplot函數就是用於繪製箱線圖的。下面以1700年至1988年太陽黑子數量的數據為例,利用箱線圖法識別數據中的異常點和極端異常點。具體的代碼如下:

# 導入第三方模塊import pandas as pdimport matplotlib.pyplot as plt# 導入數據sunspots = pd.read_csv(r'C:\Users\Administrator\Desktop\sunspots.csv')# 繪製箱線圖(1.5倍的四分位差,如需繪製3倍的四分位差,只需調整whis參數)plt.boxplot(x = sunspots.counts, # 指定繪製箱線圖的數據 whis = 1.5, # 指定1.5倍的四分位差 widths = 0.7, # 指定箱線圖的寬度為0.8 patch_artist = True, # 指定需要填充箱體顏色 showmeans = True, # 指定需要顯示均值 boxprops = {'facecolor':'steelblue'}, # 指定箱體的填充色為鐵藍色 # 指定異常點的填充色、邊框色和大小 flierprops = {'markerfacecolor':'red', 'markeredgecolor':'red', 'markersize':4}, # 指定均值點的標記符號(菱形)、填充色和大小 meanprops = {'marker':'D','markerfacecolor':'black', 'markersize':4}, medianprops = {'linestyle':'--','color':'orange'}, # 指定中位數的標記符號(虛線)和顏色 labels = [''] # 去除箱線圖的x軸刻度值 )# 顯示圖形plt.show()

如上圖所示,利用matplotlib子模塊pyplot中的boxplot函數可以非常方便地繪製箱線圖,其中左圖的上下須設定為1.5倍的四分位差,右圖的上下須設定為3倍的四分位差。從左圖可知,發現數據集中至少存在5個異常點,它們均在上須之上;而在右圖中並沒有顯示極端異常點。

通過上圖可以直觀地發現數據中是否存在異常點或極端異常點,但無法得知哪些觀測為異常點,以及這些異常點的具體數值。為解決該問題,讀者可以通過下方的代碼實現查詢:

# 計算下四分位數和上四分位Q1 = sunspots.counts.quantile(q = 0.25)Q3 = sunspots.counts.quantile(q = 0.75)# 基於1.5倍的四分位差計算上下須對應的值low_whisker = Q1 - 1.5*(Q3 - Q1)up_whisker = Q3 + 1.5*(Q3 - Q1)# 尋找異常點sunspots.counts[(sunspots.counts > up_whisker) | (sunspots.counts < low_whisker)]

正態分布圖法

根據正態分布的定義可知,數據點落在偏離均值正負1倍標準差(即sigma值)內的概率為68.2%;數據點落在偏離均值正負2倍標準差內的概率為95.4%;數據點落在偏離均值正負3倍標準差內的概率為99.6%。

所以,換個角度思考上文提到的概率值,如果數據點落在偏離均值正負2倍標準差之外的概率就不足5%,它屬於小概率事件,即認為這樣的數據點為異常點。同理,如果數據點落在偏離均值正負3倍標準差之外的概率將會更小,可以認為這些數據點為極端異常點。為使讀者直觀地理解文中提到的概率值,可以查看標準正態分布的概率密度圖,如下圖所示:

進一步,基於上圖的結論,可以按照下表中的判斷條件,識別出數值型變量的異常點和極端異常點,如下表所示:

利用正態分布的知識點,結合pyplot子模塊中的plot函數繪製折線圖和散點圖,並藉助於兩條水平參考線識別異常值或極端異常值。

接下來以某公司的支付轉化率數據為例,使用正態分布的特性識別數據集中的異常點和極端異常點,該數據呈現的是2017年第三季度每天的支付轉化率。我們利用如上介紹的plot函數,識別數據中可能存在的異常點或極端異常點。具體代碼如下:

# 讀入外部數據pay_ratio = pd.read_excel(r'C:\Users\Administrator\Desktop\pay_ratio.xlsx')# 繪製單條折線圖,並在折線圖的基礎上添加點圖plt.plot(pay_ratio.date, # x軸數據 pay_ratio.ratio, # y軸數據 linestyle = '-', # 設置折線類型 linewidth = 2, # 設置線條寬度 color = 'steelblue', # 設置折線顏色 marker = 'o', # 往折線圖中添加圓點 markersize = 4, # 設置點的大小 markeredgecolor='black', # 設置點的邊框色 markerfacecolor='black') # 設置點的填充色# 顯示圖形plt.show()# 添加上下界的水平參考線(便於判斷異常點,如下判斷極端異常點,只需將2改為3)plt.axhline(y = pay_ratio.ratio.mean() - 2* pay_ratio.ratio.std(), linestyle = '--', color = 'gray')plt.axhline(y = pay_ratio.ratio.mean() + 2* pay_ratio.ratio.std(), linestyle = '--', color = 'gray')# 導入模塊,用於日期刻度的修改(因為默認格式下的日期刻度標籤並不是很友好)import matplotlib as mpl# 獲取圖的坐標信息ax = plt.gca()# 設置日期的顯示格式 date_format = mpl.dates.DateFormatter("%m-%d") ax.xaxis.set_major_formatter(date_format) # 設置x軸每個刻度的間隔天數xlocator = mpl.ticker.MultipleLocator(7)ax.xaxis.set_major_locator(xlocator)# 為了避免x軸刻度標籤的緊湊,將刻度標籤旋轉45度plt.xticks(rotation=45)

如上圖所示,左圖中的兩條水平線是偏離均值正負2倍標準差的參考線,目測有6個樣本點落在參考線之外,可以判定它們屬於異常點;而對於右圖中偏離均值正負3倍標準差的參考線來說,僅有1個樣本點落在參考線之外,即說明該樣本點就是2017年第三季度的唯一極端異常點。

同理,也可以藉助於下面的代碼,查詢出異常點所對應的水流量:

# 計算判斷異常點和極端異常點的臨界值outlier_ll = pay_ratio.ratio.mean() - 2* pay_ratio.ratio.std()outlier_ul = pay_ratio.ratio.mean() + 2* pay_ratio.ratio.std()extreme_outlier_ll = pay_ratio.ratio.mean() - 3* pay_ratio.ratio.std()extreme_outlier_ul = pay_ratio.ratio.mean() + 3* pay_ratio.ratio.std()# 尋找異常點pay_ratio.loc[(pay_ratio.ratio > outlier_ul) | (pay_ratio.ratio < outlier_ll), ['date','ratio']]# 尋找極端異常點pay_ratio.loc[(pay_ratio.ratio > extreme_outlier_ul) | (pay_ratio.ratio < extreme_outlier_ll), ['date','ratio']]

異常點

極端異常點

儘管基於箱線圖的分位數法和基於正態分布的參考線法都可以實現異常值和極端異常值的識別,但是在實際應用中,需要有針對性的選擇。如果待判斷的變量近似服從正態分布,建議選擇正態分布的參考線法識別異常點,否則使用分位數法識別異常點。

搜索進入CDA小程序,解鎖更多優質內容,還有很多免費的試聽視頻喲,不容錯過

相關焦點

  • Python數據清洗(二):缺失值識別與處理
    Python數據清洗(一):類型轉換和冗餘數據刪除》中分享了有關數據類型轉換和冗餘信息刪除的兩個知識點,接下來繼續講解缺失值的識別和處理辦法。缺失值指的是由於人為或機器等原因導致數據記錄的丟失或隱瞞,缺失值的存在一定程度上會影響後續數據分析和挖掘的結果,所以對他的處理將顯得尤為重要。缺失值的識別判斷一個數據集是否存在缺失觀測,通常從兩個方面入手,一個是變量的角度,即判斷每個變量中是否包含缺失值;另一個是數據行的角度,即判斷每行數據中是否包含缺失值。
  • 在數據中查找異常值的5種方法總結及示例解釋
    在這篇文章中,我將解釋什麼是異常值,以及它們為什麼有問題,並介紹查找它們的各種方法。此外,我將比較各種識別異常值的方法,並分享一些我在識別異常值過程中的首選方法。 異常值及其影響 異常值是一個簡單的概念,它們是與其他數據點明顯不同的值,它們可能會在統計過程中產生問題。
  • 數據清洗在新能源功率預測中的研究綜述和展望
    因此在3原則下,將超過3倍的標準差的數據值視為異常值。然而,實際新能源的發電數據往往並不嚴格服從正態分布,且由於堆積型異常數據的影響,導致識別出的異常值個數少於實際異常值個數。因此,將這種方法用於非正態分布數據的異常值識別時,其有效性有限。3)小波奇異點檢測法新能源異常數據可以看成是功率曲線中的奇異點。
  • Python視頻教程網課編程零基礎入門數據分析網絡爬蟲全套Python...
    22機器學習 23深度學習 24數據結構和算法 25python網絡爬蟲 26機器學習入門篇 27機器學習入門篇2 28機器學習提升篇 29數據挖掘篇 30深度學習必備原理與實戰 31深度學習必備原理與實戰2 32深度學習必備原理與實戰3
  • 箱形圖為什麼能檢測到異常值?
    箱形圖箱形圖(英文:Box plot),又稱為盒須圖、盒式圖、盒狀圖或箱線圖,是一種用作顯示一組數據分散情況資料的統計圖。因型狀如箱子而得名。在各種領域也經常被使用,常見於品質管理,快速識別異常值。箱形圖最大的優點就是不受異常值的影響,能夠準確穩定地描繪出數據的離散分布情況,同時也利於數據的清洗。想要搞懂箱形圖,那麼一定要了解...
  • 2020 版 Python 數據清理終極指南!
    數據清理或清除是指從一個記錄集、表或是資料庫中檢測和修改(或刪除)損壞或不準確的數據記錄的過程,它用於識別數據中不完整的、不正確的、不準確的或者與項目本身不相關的部分,然後對這些無效的數據進行替換、修改或者刪除等操作。這是個很長的定義,不過描述的較為簡單,容易理解。
  • 用python識別驗證碼
    今天,我們就簡單的說下,怎麼用python來處理驗證碼。(注意:我所有的python相關的文章用的都是python3。)準備工作1、tesseract-ocr軟體Tesseract的OCR引擎最先由HP實驗室於1985年開始研發,至1995年時已經成為OCR業內最準確的三款識別引擎之一。然而,HP不久便決定放棄OCR業務,Tesseract也從此塵封。
  • 數據工程師需要掌握的 18 個 Python 庫
    目錄數據獲取SeleniumScrapyBeautiful Soup數據清洗SpacyNumPyPandas數據可視化MatplotlibPyecharts數據建模Scikit-learnPyTorchTensorFlow模型檢查Lime音頻數據處理Librosa圖像數據處理OpenCV-PythonScikit-image數據通信Pymongo數據分析結果web部署FlaskDjango
  • 關於異常值(Outlier),你真的了解嗎?
    這或許是你數據中最令人興奮的發現!如果你對以上三個問題的回答均為「否」,那麼還有兩種可能:4)異常值是由於偶然因素造成的。在此情況下,你應在分析中保留該值。該值與其他值來自相同的分布,因此應包括在內;5)異常值是因為一個錯誤造成的。如錯誤的移液、電壓尖峰、過濾器中的孔洞等。
  • 機器學習、深度學習算法原理與案例實踐暨Python大數據綜合應用...
    三、課程特點 課程重視代碼實踐,使用金融、氣象、農業、交通、安防等工業界實際數據(數據已脫敏)進行機器學習模型的落地應用。雖然課程堅持推導公式,但更重視機器學習和深度學習的原理與實操;將實際工作中遇到的行業應用和痛點做最直觀切實的展示;重視算法模型的同時,更強調實際問題中應該如何模型選擇、特徵選擇和調參。
  • python|圖像識別
    影響力之大和最吸引人的技術就是圖像識別,圖像識別技術是人工智慧的一個重要領域,它是指利用計算機對圖像進行處理、分析和理解,以識別各種不同模式的目標和對象的技術。今天以女神宋慧喬的兩張不同照片為例,利用python識別其相似度,從而判定是否是同一人,同時讓我們對圖像識別有個初步的了解,什麼?照片可以換蒼老師和波老師嗎?我懷疑你們在開車,可是我沒有證據!
  • Python和人工智慧有什麼關係?Python 和人工智慧的區別是什麼?
    人工智慧人工智慧是一個大的概念,在人工智慧下有計算機視覺,語音識別,自然語言處理等不同的技術領域,這些技術領域中在Github上又有許多開源的代碼可以直接用來開發,而這些代碼往往需要或者只支持Python進行調用。
  • 刪除和處理數據中異常值的操作指南
    正文 刪除和處理數據中異常值的指南 異常值是數據集中的不尋常的值,它們可能會扭曲統計分析並違反其假設。所有分析人員都會面臨異常值並被迫決定如何處理它們。這些問題可能使你認為最好的方法是從數據中刪除它們。
  • Python驗證碼識別:利用pytesser識別簡單圖形驗證碼
    計算機涉及到的幾何圖形處理一般有 2維到n維圖形處理,邊界區分,面積計算,體積計算,扭曲變形校正。對於顏色則有色彩空間的計算與轉換,圖形上色,陰影,色差處理等等。在破解驗證碼中需要用到的知識一般是 像素,線,面等基本2維圖形元素的處理和色差分析。
  • Python利用openpyxl處理excel文件(openpyxl的安裝及簡介)
    但是試想,如果把上述excel公式變成諸如python中的if-else結構,其可讀性肯定是不容置疑的……今天,我們來介紹一款excel處理利器—openpyxl(python庫文件)。/~gohlke/pythonlibs/)下載以下幾個文件:et_xmlfile-1.0.1-py2.py3-none-any.whl、jdcal-1.4-py2.py3-none-any.whl、openpyxl-2.6.0-py2.py3-none-any.whl;2.將上述三個文件拷貝到python安裝目錄中的scripts文件夾下;3.按照②、③、④的步驟依次安裝
  • mac使用python識別圖形驗證碼!
    在網上查了很多版本的圖形驗證碼識別,目前看到最多的兩個模塊是pytesseract和tesserocr,但是因為我這裡安裝tesserocr的時候各種出錯,所以最終我鎖定了使用pytesseract。那麼接下來,就記錄下安裝以及使用過程。這裡的系統環境是mac os 10.14.
  • 基於python+OpenCV模塊的人臉識別定位技術
    本文將基於OpenCV模塊,在windows作業系統上,利用python語言,進行人臉識別技術的研究。當然OpenCV的應用領域很廣,除了人臉識別之外,它還支持圖像分割、動作識別、視頻處理等技術。代碼的第3行(以上圖為準,空行也算一行),導入別人已經訓練好的臉部識別資料庫。這裡用到的數據是在github上開源的已經訓練好的分類器,如圖所示:需要將對應的數據文件(.xml文件)下載到指定目錄(代碼中的示例,展示的是與.py文件同一目錄下)。第4行的函數cv2.VideoCapture(0)表示調用相機。第6行是讀取攝像機中的影像。
  • 使用Python和Tesseract來識別圖形驗證碼
    一、關於圖形驗證碼識別與tesseractOCR儘管多數圖型驗證碼只有區區幾個數字或字母,但你可能聽說了,在進行機器識別的過程中,你要收集樣本,對圖片去噪、二值化、提取字符、計算特徵,甚至還要祭出神經網絡去訓練數據進行機器學習……還沒開幹,退堂鼓早打響三遍了。
  • python人工智慧-圖像識別
    PIL:(Python Imaging Library)是Python平臺上的圖像處理標準庫,功能非常強大。pytesseract:圖像識別庫。我這裡使用的是python3.6,PIL不支持python3所以使用如下命令pip install pytesseractpip install pillow如果是python2,則在命令行執行如下命令:pip install pytesseractpip install PIL這時候我們去運行上面的代碼會發現如下錯誤
  • 數據科學的Python軟體包
    巨大的社區支持Python具有廣泛的社區支持之一,在dev op社區上存在各種活躍的論壇,python開發人員在該論壇上發布他們的錯誤,而社區則試圖幫助他們。各種用於數據科學的Python庫到目前為止,我們已經介紹了什麼是數據科學以及為什麼要使用Python,現在讓我們討論可用於數據科學的各種python庫。1.