
作者 | 劉順祥
來源 | 數(shù)據(jù)分析1480
在《Python數(shù)據(jù)清洗(一):類型轉(zhuǎn)換和冗余數(shù)據(jù)刪除》和《Python數(shù)據(jù)清洗(二):缺失值識別與處理》文中已經(jīng)講解了有關(guān)數(shù)據(jù)中重復觀測和缺失值的識別與處理,在本節(jié)中將分享異常值的判斷和處理方法。
異常值也稱為離群點,就是那些遠離絕大多數(shù)樣本點的特殊群體,通常這樣的數(shù)據(jù)點在數(shù)據(jù)集中都表現(xiàn)出不合理的特性。如果忽視這些異常值,在某些建模場景下就會導致結(jié)論的錯誤(如線性回歸模型、K均值聚類等),所以在數(shù)據(jù)的探索過程中,有必要識別出這些異常值并處理好它們。
異常值的識別
通常,異常值的識別可以借助于圖形法(如箱線圖、正態(tài)分布圖)和建模法(如線性回歸、聚類算法、K近鄰算法),在本期內(nèi)容中,將分享兩種圖形法,在下一期將分享基于模型識別異常值的方法。
箱線圖法
箱線圖技術(shù)實際上就是利用數(shù)據(jù)的分位數(shù)識別其中的異常點,該圖形屬于典型的統(tǒng)計圖形,在學術(shù)界和工業(yè)界都得到廣泛的應(yīng)用。箱線圖的形狀特征如下圖所示:
圖中的下四分位數(shù)指的是數(shù)據(jù)的25%分位點所對應(yīng)的值(Q1);中位數(shù)即為數(shù)據(jù)的50%分位點所對應(yīng)的值(Q2);上四分位數(shù)則為數(shù)據(jù)的75%分位點所對應(yīng)的值(Q3);上須的計算公式為Q3+1.5(Q3-Q1);下須的計算公式為Q1-1.5(Q3-Q1)。其中,Q3-Q1表示四分位差。如果采用箱線圖識別異常值,其判斷標準是,當變量的數(shù)據(jù)值大于箱線圖的上須或者小于箱線圖的下須時,就可以認為這樣的數(shù)據(jù)點為異常點。
所以,基于上方的箱線圖,可以定義某個數(shù)值型變量中的異常點和極端異常點,它們的判斷表達式如下表所示:
在Python中可以使用matplotlib模塊實現(xiàn)數(shù)據(jù)的可視化,其中boxplot函數(shù)就是用于繪制箱線圖的。下面以1700年至1988年太陽黑子數(shù)量的數(shù)據(jù)為例,利用箱線圖法識別數(shù)據(jù)中的異常點和極端異常點。具體的代碼如下:
# 導入第三方模塊 import pandas as pd import matplotlib.pyplot as plt # 導入數(shù)據(jù) sunspots = pd.read_csv(r'C:\Users\Administrator\Desktop\sunspots.csv') # 繪制箱線圖(1.5倍的四分位差,如需繪制3倍的四分位差,只需調(diào)整whis參數(shù)) plt.boxplot(x = sunspots.counts, # 指定繪制箱線圖的數(shù)據(jù) 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'}, # 指定中位數(shù)的標記符號(虛線)和顏色 labels = [''] # 去除箱線圖的x軸刻度值 ) # 顯示圖形 plt.show()
如上圖所示,利用matplotlib子模塊pyplot中的boxplot函數(shù)可以非常方便地繪制箱線圖,其中左圖的上下須設(shè)定為1.5倍的四分位差,右圖的上下須設(shè)定為3倍的四分位差。從左圖可知,發(fā)現(xiàn)數(shù)據(jù)集中至少存在5個異常點,它們均在上須之上;而在右圖中并沒有顯示極端異常點。
通過上圖可以直觀地發(fā)現(xiàn)數(shù)據(jù)中是否存在異常點或極端異常點,但無法得知哪些觀測為異常點,以及這些異常點的具體數(shù)值。為解決該問題,讀者可以通過下方的代碼實現(xiàn)查詢:
# 計算下四分位數(shù)和上四分位 Q1 = sunspots.counts.quantile(q = 0.25) Q3 = sunspots.counts.quantile(q = 0.75) # 基于1.5倍的四分位差計算上下須對應(yīng)的值 low_whisker = Q1 - 1.5*(Q3 - Q1) up_whisker = Q3 + 1.5*(Q3 - Q1) # 尋找異常點 sunspots.counts[(sunspots.counts > up_whisker) | (sunspots.counts < low_whisker)]
根據(jù)正態(tài)分布的定義可知,數(shù)據(jù)點落在偏離均值正負1倍標準差(即sigma值)內(nèi)的概率為68.2%;數(shù)據(jù)點落在偏離均值正負2倍標準差內(nèi)的概率為95.4%;數(shù)據(jù)點落在偏離均值正負3倍標準差內(nèi)的概率為99.6%。
所以,換個角度思考上文提到的概率值,如果數(shù)據(jù)點落在偏離均值正負2倍標準差之外的概率就不足5%,它屬于小概率事件,即認為這樣的數(shù)據(jù)點為異常點。同理,如果數(shù)據(jù)點落在偏離均值正負3倍標準差之外的概率將會更小,可以認為這些數(shù)據(jù)點為極端異常點。為使讀者直觀地理解文中提到的概率值,可以查看標準正態(tài)分布的概率密度圖,如下圖所示:
進一步,基于上圖的結(jié)論,可以按照下表中的判斷條件,識別出數(shù)值型變量的異常點和極端異常點,如下表所示:
利用正態(tài)分布的知識點,結(jié)合pyplot子模塊中的plot函數(shù)繪制折線圖和散點圖,并借助于兩條水平參考線識別異常值或極端異常值。
接下來以某公司的支付轉(zhuǎn)化率數(shù)據(jù)為例,使用正態(tài)分布的特性識別數(shù)據(jù)集中的異常點和極端異常點,該數(shù)據(jù)呈現(xiàn)的是2017年第三季度每天的支付轉(zhuǎn)化率。我們利用如上介紹的plot函數(shù),識別數(shù)據(jù)中可能存在的異常點或極端異常點。具體代碼如下:
# 讀入外部數(shù)據(jù) pay_ratio = pd.read_excel(r'C:\Users\Administrator\Desktop\pay_ratio.xlsx') # 繪制單條折線圖,并在折線圖的基礎(chǔ)上添加點圖 plt.plot(pay_ratio.date, # x軸數(shù)據(jù) pay_ratio.ratio, # y軸數(shù)據(jù) linestyle = '-', # 設(shè)置折線類型 linewidth = 2, # 設(shè)置線條寬度 color = 'steelblue', # 設(shè)置折線顏色 marker = 'o', # 往折線圖中添加圓點 markersize = 4, # 設(shè)置點的大小 markeredgecolor='black', # 設(shè)置點的邊框色 markerfacecolor='black') # 設(shè)置點的填充色 # 顯示圖形 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() # 設(shè)置日期的顯示格式 date_format = mpl.dates.DateFormatter("%m-%d") ax.xaxis.set_major_formatter(date_format) # 設(shè)置x軸每個刻度的間隔天數(shù) xlocator = mpl.ticker.MultipleLocator(7) ax.xaxis.set_major_locator(xlocator) # 為了避免x軸刻度標簽的緊湊,將刻度標簽旋轉(zhuǎn)45度 plt.xticks(rotation=45)
如上圖所示,左圖中的兩條水平線是偏離均值正負2倍標準差的參考線,目測有6個樣本點落在參考線之外,可以判定它們屬于異常點;而對于右圖中偏離均值正負3倍標準差的參考線來說,僅有1個樣本點落在參考線之外,即說明該樣本點就是2017年第三季度的唯一極端異常點。
同理,也可以借助于下面的代碼,查詢出異常點所對應(yīng)的水流量:
# 計算判斷異常點和極端異常點的臨界值 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']]
異常點
極端異常點
盡管基于箱線圖的分位數(shù)法和基于正態(tài)分布的參考線法都可以實現(xiàn)異常值和極端異常值的識別,但是在實際應(yīng)用中,需要有針對性的選擇。如果待判斷的變量近似服從正態(tài)分布,建議選擇正態(tài)分布的參考線法識別異常點,否則使用分位數(shù)法識別異常點。
數(shù)據(jù)分析咨詢請掃描二維碼
若不方便掃碼,搜微信號:CDAshujufenxi
MySQL 大表拆分與關(guān)聯(lián)查詢效率:打破 “拆分必慢” 的認知誤區(qū) 在 MySQL 數(shù)據(jù)庫管理中,“大表” 始終是性能優(yōu)化繞不開的話題。 ...
2025-09-18CDA 數(shù)據(jù)分析師:表結(jié)構(gòu)數(shù)據(jù) “獲取 - 加工 - 使用” 全流程的賦能者 表結(jié)構(gòu)數(shù)據(jù)(如數(shù)據(jù)庫表、Excel 表、CSV 文件)是企業(yè)數(shù)字 ...
2025-09-18DSGE 模型中的 Et:理性預(yù)期算子的內(nèi)涵、作用與應(yīng)用解析 動態(tài)隨機一般均衡(Dynamic Stochastic General Equilibrium, DSGE)模 ...
2025-09-17Python 提取 TIF 中地名的完整指南 一、先明確:TIF 中的地名有哪兩種存在形式? 在開始提取前,需先判斷 TIF 文件的類型 —— ...
2025-09-17CDA 數(shù)據(jù)分析師:解鎖表結(jié)構(gòu)數(shù)據(jù)特征價值的專業(yè)核心 表結(jié)構(gòu)數(shù)據(jù)(以 “行 - 列” 規(guī)范存儲的結(jié)構(gòu)化數(shù)據(jù),如數(shù)據(jù)庫表、Excel 表、 ...
2025-09-17Excel 導入數(shù)據(jù)含缺失值?詳解 dropna 函數(shù)的功能與實戰(zhàn)應(yīng)用 在用 Python(如 pandas 庫)處理 Excel 數(shù)據(jù)時,“缺失值” 是高頻 ...
2025-09-16深入解析卡方檢驗與 t 檢驗:差異、適用場景與實踐應(yīng)用 在數(shù)據(jù)分析與統(tǒng)計學領(lǐng)域,假設(shè)檢驗是驗證研究假設(shè)、判斷數(shù)據(jù)差異是否 “ ...
2025-09-16CDA 數(shù)據(jù)分析師:掌控表格結(jié)構(gòu)數(shù)據(jù)全功能周期的專業(yè)操盤手 表格結(jié)構(gòu)數(shù)據(jù)(以 “行 - 列” 存儲的結(jié)構(gòu)化數(shù)據(jù),如 Excel 表、數(shù)據(jù) ...
2025-09-16MySQL 執(zhí)行計劃中 rows 數(shù)量的準確性解析:原理、影響因素與優(yōu)化 在 MySQL SQL 調(diào)優(yōu)中,EXPLAIN執(zhí)行計劃是核心工具,而其中的row ...
2025-09-15解析 Python 中 Response 對象的 text 與 content:區(qū)別、場景與實踐指南 在 Python 進行 HTTP 網(wǎng)絡(luò)請求開發(fā)時(如使用requests ...
2025-09-15CDA 數(shù)據(jù)分析師:激活表格結(jié)構(gòu)數(shù)據(jù)價值的核心操盤手 表格結(jié)構(gòu)數(shù)據(jù)(如 Excel 表格、數(shù)據(jù)庫表)是企業(yè)最基礎(chǔ)、最核心的數(shù)據(jù)形態(tài) ...
2025-09-15Python HTTP 請求工具對比:urllib.request 與 requests 的核心差異與選擇指南 在 Python 處理 HTTP 請求(如接口調(diào)用、數(shù)據(jù)爬取 ...
2025-09-12解決 pd.read_csv 讀取長浮點數(shù)據(jù)的科學計數(shù)法問題 為幫助 Python 數(shù)據(jù)從業(yè)者解決pd.read_csv讀取長浮點數(shù)據(jù)時的科學計數(shù)法問題 ...
2025-09-12CDA 數(shù)據(jù)分析師:業(yè)務(wù)數(shù)據(jù)分析步驟的落地者與價值優(yōu)化者 業(yè)務(wù)數(shù)據(jù)分析是企業(yè)解決日常運營問題、提升執(zhí)行效率的核心手段,其價值 ...
2025-09-12用 SQL 驗證業(yè)務(wù)邏輯:從規(guī)則拆解到數(shù)據(jù)把關(guān)的實戰(zhàn)指南 在業(yè)務(wù)系統(tǒng)落地過程中,“業(yè)務(wù)邏輯” 是連接 “需求設(shè)計” 與 “用戶體驗 ...
2025-09-11塔吉特百貨孕婦營銷案例:數(shù)據(jù)驅(qū)動下的精準零售革命與啟示 在零售行業(yè) “流量紅利見頂” 的當下,精準營銷成為企業(yè)突圍的核心方 ...
2025-09-11CDA 數(shù)據(jù)分析師與戰(zhàn)略 / 業(yè)務(wù)數(shù)據(jù)分析:概念辨析與協(xié)同價值 在數(shù)據(jù)驅(qū)動決策的體系中,“戰(zhàn)略數(shù)據(jù)分析”“業(yè)務(wù)數(shù)據(jù)分析” 是企業(yè) ...
2025-09-11Excel 數(shù)據(jù)聚類分析:從操作實踐到業(yè)務(wù)價值挖掘 在數(shù)據(jù)分析場景中,聚類分析作為 “無監(jiān)督分組” 的核心工具,能從雜亂數(shù)據(jù)中挖 ...
2025-09-10統(tǒng)計模型的核心目的:從數(shù)據(jù)解讀到?jīng)Q策支撐的價值導向 統(tǒng)計模型作為數(shù)據(jù)分析的核心工具,并非簡單的 “公式堆砌”,而是圍繞特定 ...
2025-09-10CDA 數(shù)據(jù)分析師:商業(yè)數(shù)據(jù)分析實踐的落地者與價值創(chuàng)造者 商業(yè)數(shù)據(jù)分析的價值,最終要在 “實踐” 中體現(xiàn) —— 脫離業(yè)務(wù)場景的分 ...
2025-09-10