
作者 | 劉順祥
來源 | 數據分析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 pd import 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']]
異常點
極端異常點
盡管基于箱線圖的分位數法和基于正態分布的參考線法都可以實現異常值和極端異常值的識別,但是在實際應用中,需要有針對性的選擇。如果待判斷的變量近似服從正態分布,建議選擇正態分布的參考線法識別異常點,否則使用分位數法識別異常點。
數據分析咨詢請掃描二維碼
若不方便掃碼,搜微信號:CDAshujufenxi
CDA數據分析師證書考試體系(更新于2025年05月22日)
2025-05-26解碼數據基因:從數字敏感度到邏輯思維 每當看到超市貨架上商品的排列變化,你是否會聯想到背后的銷售數據波動?三年前在零售行 ...
2025-05-23在本文中,我們將探討 AI 為何能夠加速數據分析、如何在每個步驟中實現數據分析自動化以及使用哪些工具。 數據分析中的AI是什么 ...
2025-05-20當數據遇見人生:我的第一個分析項目 記得三年前接手第一個數據分析項目時,我面對Excel里密密麻麻的銷售數據手足無措。那些跳動 ...
2025-05-20在數字化運營的時代,企業每天都在產生海量數據:用戶點擊行為、商品銷售記錄、廣告投放反饋…… 這些數據就像散落的拼圖,而相 ...
2025-05-19在當今數字化營銷時代,小紅書作為國內領先的社交電商平臺,其銷售數據蘊含著巨大的商業價值。通過對小紅書銷售數據的深入分析, ...
2025-05-16Excel作為最常用的數據分析工具,有沒有什么工具可以幫助我們快速地使用excel表格,只要輕松幾步甚至輸入幾項指令就能搞定呢? ...
2025-05-15數據,如同無形的燃料,驅動著現代社會的運轉。從全球互聯網用戶每天產生的2.5億TB數據,到制造業的傳感器、金融交易 ...
2025-05-15大數據是什么_數據分析師培訓 其實,現在的大數據指的并不僅僅是海量數據,更準確而言是對大數據分析的方法。傳統的數 ...
2025-05-14CDA持證人簡介: 萬木,CDA L1持證人,某電商中廠BI工程師 ,5年數據經驗1年BI內訓師,高級數據分析師,擁有豐富的行業經驗。 ...
2025-05-13CDA持證人簡介: 王明月 ,CDA 數據分析師二級持證人,2年數據產品工作經驗,管理學博士在讀。 學習入口:https://edu.cda.cn/g ...
2025-05-12CDA持證人簡介: 楊貞璽 ,CDA一級持證人,鄭州大學情報學碩士研究生,某上市公司數據分析師。 學習入口:https://edu.cda.cn/g ...
2025-05-09CDA持證人簡介 程靖 CDA會員大咖,暢銷書《小白學產品》作者,13年頂級互聯網公司產品經理相關經驗,曾在百度、美團、阿里等 ...
2025-05-07相信很多做數據分析的小伙伴,都接到過一些高階的數據分析需求,實現的過程需要用到一些數據獲取,數據清洗轉換,建模方法等,這 ...
2025-05-06以下的文章內容來源于劉靜老師的專欄,如果您想閱讀專欄《10大業務分析模型突破業務瓶頸》,點擊下方鏈接 https://edu.cda.cn/g ...
2025-04-30CDA持證人簡介: 邱立峰 CDA 數據分析師二級持證人,數字化轉型專家,數據治理專家,高級數據分析師,擁有豐富的行業經驗。 ...
2025-04-29CDA持證人簡介: 程靖 CDA會員大咖,暢銷書《小白學產品》作者,13年頂級互聯網公司產品經理相關經驗,曾在百度,美團,阿里等 ...
2025-04-28CDA持證人簡介: 居瑜 ,CDA一級持證人國企財務經理,13年財務管理運營經驗,在數據分析就業和實踐經驗方面有著豐富的積累和經 ...
2025-04-27數據分析在當今信息時代發揮著重要作用。單因素方差分析(One-Way ANOVA)是一種關鍵的統計方法,用于比較三個或更多獨立樣本組 ...
2025-04-25CDA持證人簡介: 居瑜 ,CDA一級持證人國企財務經理,13年財務管理運營經驗,在數據分析就業和實踐經驗方面有著豐富的積累和經 ...
2025-04-25