99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁(yè)精彩閱讀Python數(shù)據(jù)清洗(三):異常值識(shí)別與處理
Python數(shù)據(jù)清洗(三):異常值識(shí)別與處理
2019-12-20
收藏
Python<a href='/map/shujuqingxi/' style='color:#000;font-size:inherit;'>數(shù)據(jù)清洗</a>(三):異常值識(shí)別與處理

作者 | 劉順祥

來(lái)源 | 數(shù)據(jù)分析1480

在《Python數(shù)據(jù)清洗(一):類型轉(zhuǎn)換和冗余數(shù)據(jù)刪除》和《Python數(shù)據(jù)清洗(二):缺失值識(shí)別與處理》文中已經(jīng)講解了有關(guān)數(shù)據(jù)中重復(fù)觀測(cè)和缺失值的識(shí)別與處理,在本節(jié)中將分享異常值的判斷和處理方法。

異常值也稱為離群點(diǎn),就是那些遠(yuǎn)離絕大多數(shù)樣本點(diǎn)的特殊群體,通常這樣的數(shù)據(jù)點(diǎn)在數(shù)據(jù)集中都表現(xiàn)出不合理的特性。如果忽視這些異常值,在某些建模場(chǎng)景下就會(huì)導(dǎo)致結(jié)論的錯(cuò)誤(如線性回歸模型、K均值聚類等),所以在數(shù)據(jù)的探索過(guò)程中,有必要識(shí)別出這些異常值并處理好它們。

異常值的識(shí)別

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

箱線圖法

箱線圖技術(shù)實(shí)際上就是利用數(shù)據(jù)的分位數(shù)識(shí)別其中的異常點(diǎn),該圖形屬于典型的統(tǒng)計(jì)圖形,在學(xué)術(shù)界和工業(yè)界都得到廣泛的應(yīng)用。箱線圖的形狀特征如下圖所示:

Python<a href='/map/shujuqingxi/' style='color:#000;font-size:inherit;'>數(shù)據(jù)清洗</a>(三):異常值識(shí)別與處理

圖中的下四分位數(shù)指的是數(shù)據(jù)的25%分位點(diǎn)所對(duì)應(yīng)的值(Q1);中位數(shù)即為數(shù)據(jù)的50%分位點(diǎn)所對(duì)應(yīng)的值(Q2);上四分位數(shù)則為數(shù)據(jù)的75%分位點(diǎn)所對(duì)應(yīng)的值(Q3);上須的計(jì)算公式為Q3+1.5(Q3-Q1);下須的計(jì)算公式為Q1-1.5(Q3-Q1)。其中,Q3-Q1表示四分位差。如果采用箱線圖識(shí)別異常值,其判斷標(biāo)準(zhǔn)是,當(dāng)變量的數(shù)據(jù)值大于箱線圖的上須或者小于箱線圖的下須時(shí),就可以認(rèn)為這樣的數(shù)據(jù)點(diǎn)為異常點(diǎn)。

所以,基于上方的箱線圖,可以定義某個(gè)數(shù)值型變量中的異常點(diǎn)和極端異常點(diǎn),它們的判斷表達(dá)式如下表所示:

Python<a href='/map/shujuqingxi/' style='color:#000;font-size:inherit;'>數(shù)據(jù)清洗</a>(三):異常值識(shí)別與處理

在Python中可以使用matplotlib模塊實(shí)現(xiàn)數(shù)據(jù)的可視化,其中boxplot函數(shù)就是用于繪制箱線圖的。下面以1700年至1988年太陽(yáng)黑子數(shù)量的數(shù)據(jù)為例,利用箱線圖法識(shí)別數(shù)據(jù)中的異常點(diǎn)和極端異常點(diǎn)。具體的代碼如下:

# 導(dǎo)入第三方模塊
import pandas as pd
import matplotlib.pyplot as plt

# 導(dǎo)入數(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'}, # 指定箱體的填充色為鐵藍(lán)色
 # 指定異常點(diǎn)的填充色、邊框色和大小
 flierprops = {'markerfacecolor':'red', 'markeredgecolor':'red', 'markersize':4}, 
 # 指定均值點(diǎn)的標(biāo)記符號(hào)(菱形)、填充色和大小
 meanprops = {'marker':'D','markerfacecolor':'black', 'markersize':4}, 
 medianprops = {'linestyle':'--','color':'orange'}, # 指定中位數(shù)的標(biāo)記符號(hào)(虛線)和顏色
 labels = [''] # 去除箱線圖的x軸刻度值
 )
# 顯示圖形
plt.show()
Python<a href='/map/shujuqingxi/' style='color:#000;font-size:inherit;'>數(shù)據(jù)清洗</a>(三):異常值識(shí)別與處理

如上圖所示,利用matplotlib子模塊pyplot中的boxplot函數(shù)可以非常方便地繪制箱線圖,其中左圖的上下須設(shè)定為1.5倍的四分位差,右圖的上下須設(shè)定為3倍的四分位差。從左圖可知,發(fā)現(xiàn)數(shù)據(jù)集中至少存在5個(gè)異常點(diǎn),它們均在上須之上;而在右圖中并沒(méi)有顯示極端異常點(diǎn)。

通過(guò)上圖可以直觀地發(fā)現(xiàn)數(shù)據(jù)中是否存在異常點(diǎn)或極端異常點(diǎn),但無(wú)法得知哪些觀測(cè)為異常點(diǎn),以及這些異常點(diǎn)的具體數(shù)值。為解決該問(wèn)題,讀者可以通過(guò)下方的代碼實(shí)現(xiàn)查詢:

# 計(jì)算下四分位數(shù)和上四分位
Q1 = sunspots.counts.quantile(q = 0.25)
Q3 = sunspots.counts.quantile(q = 0.75)

# 基于1.5倍的四分位差計(jì)算上下須對(duì)應(yīng)的值
low_whisker = Q1 - 1.5*(Q3 - Q1)
up_whisker = Q3 + 1.5*(Q3 - Q1)

# 尋找異常點(diǎn)
sunspots.counts[(sunspots.counts > up_whisker) | (sunspots.counts < low_whisker)]
Python<a href='/map/shujuqingxi/' style='color:#000;font-size:inherit;'>數(shù)據(jù)清洗</a>(三):異常值識(shí)別與處理

正態(tài)分布圖法

根據(jù)正態(tài)分布的定義可知,數(shù)據(jù)點(diǎn)落在偏離均值正負(fù)1倍標(biāo)準(zhǔn)差(即sigma值)內(nèi)的概率為68.2%;數(shù)據(jù)點(diǎn)落在偏離均值正負(fù)2倍標(biāo)準(zhǔn)差內(nèi)的概率為95.4%;數(shù)據(jù)點(diǎn)落在偏離均值正負(fù)3倍標(biāo)準(zhǔn)差內(nèi)的概率為99.6%。

所以,換個(gè)角度思考上文提到的概率值,如果數(shù)據(jù)點(diǎn)落在偏離均值正負(fù)2倍標(biāo)準(zhǔn)差之外的概率就不足5%,它屬于小概率事件,即認(rèn)為這樣的數(shù)據(jù)點(diǎn)為異常點(diǎn)。同理,如果數(shù)據(jù)點(diǎn)落在偏離均值正負(fù)3倍標(biāo)準(zhǔn)差之外的概率將會(huì)更小,可以認(rèn)為這些數(shù)據(jù)點(diǎn)為極端異常點(diǎn)。為使讀者直觀地理解文中提到的概率值,可以查看標(biāo)準(zhǔn)正態(tài)分布的概率密度圖,如下圖所示:

Python<a href='/map/shujuqingxi/' style='color:#000;font-size:inherit;'>數(shù)據(jù)清洗</a>(三):異常值識(shí)別與處理

進(jìn)一步,基于上圖的結(jié)論,可以按照下表中的判斷條件,識(shí)別出數(shù)值型變量的異常點(diǎn)和極端異常點(diǎn),如下表所示:

Python<a href='/map/shujuqingxi/' style='color:#000;font-size:inherit;'>數(shù)據(jù)清洗</a>(三):異常值識(shí)別與處理

利用正態(tài)分布的知識(shí)點(diǎn),結(jié)合pyplot子模塊中的plot函數(shù)繪制折線圖散點(diǎn)圖,并借助于兩條水平參考線識(shí)別異常值或極端異常值。

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

# 讀入外部數(shù)據(jù)
pay_ratio = pd.read_excel(r'C:\Users\Administrator\Desktop\pay_ratio.xlsx')
# 繪制單條折線圖,并在折線圖的基礎(chǔ)上添加點(diǎn)圖
plt.plot(pay_ratio.date, # x軸數(shù)據(jù)
 pay_ratio.ratio, # y軸數(shù)據(jù)
 linestyle = '-', # 設(shè)置折線類型
 linewidth = 2, # 設(shè)置線條寬度
 color = 'steelblue', # 設(shè)置折線顏色
 marker = 'o', # 往折線圖中添加圓點(diǎn)
 markersize = 4, # 設(shè)置點(diǎn)的大小
 markeredgecolor='black', # 設(shè)置點(diǎn)的邊框色
 markerfacecolor='black') # 設(shè)置點(diǎn)的填充色
# 顯示圖形
plt.show()

# 添加上下界的水平參考線(便于判斷異常點(diǎn),如下判斷極端異常點(diǎn),只需將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')

# 導(dǎo)入模塊,用于日期刻度的修改(因?yàn)槟J(rèn)格式下的日期刻度標(biāo)簽并不是很友好)
import matplotlib as mpl
# 獲取圖的坐標(biāo)信息
ax = plt.gca()
# 設(shè)置日期的顯示格式 
date_format = mpl.dates.DateFormatter("%m-%d") 
ax.xaxis.set_major_formatter(date_format) 

# 設(shè)置x軸每個(gè)刻度的間隔天數(shù)
xlocator = mpl.ticker.MultipleLocator(7)
ax.xaxis.set_major_locator(xlocator)
# 為了避免x軸刻度標(biāo)簽的緊湊,將刻度標(biāo)簽旋轉(zhuǎn)45度
plt.xticks(rotation=45)

Python<a href='/map/shujuqingxi/' style='color:#000;font-size:inherit;'>數(shù)據(jù)清洗</a>(三):異常值識(shí)別與處理

如上圖所示,左圖中的兩條水平線是偏離均值正負(fù)2倍標(biāo)準(zhǔn)差的參考線,目測(cè)有6個(gè)樣本點(diǎn)落在參考線之外,可以判定它們屬于異常點(diǎn);而對(duì)于右圖中偏離均值正負(fù)3倍標(biāo)準(zhǔn)差的參考線來(lái)說(shuō),僅有1個(gè)樣本點(diǎn)落在參考線之外,即說(shuō)明該樣本點(diǎn)就是2017年第三季度的唯一極端異常點(diǎn)。

同理,也可以借助于下面的代碼,查詢出異常點(diǎn)所對(duì)應(yīng)的水流量:

# 計(jì)算判斷異常點(diǎn)和極端異常點(diǎn)的臨界值
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()

# 尋找異常點(diǎn)
pay_ratio.loc[(pay_ratio.ratio > outlier_ul) | (pay_ratio.ratio < outlier_ll), ['date','ratio']]
# 尋找極端異常點(diǎn)
pay_ratio.loc[(pay_ratio.ratio > extreme_outlier_ul) | (pay_ratio.ratio < extreme_outlier_ll), ['date','ratio']]

異常點(diǎn)

Python<a href='/map/shujuqingxi/' style='color:#000;font-size:inherit;'>數(shù)據(jù)清洗</a>(三):異常值識(shí)別與處理

極端異常點(diǎn)

Python<a href='/map/shujuqingxi/' style='color:#000;font-size:inherit;'>數(shù)據(jù)清洗</a>(三):異常值識(shí)別與處理

盡管基于箱線圖的分位數(shù)法和基于正態(tài)分布的參考線法都可以實(shí)現(xiàn)異常值和極端異常值的識(shí)別,但是在實(shí)際應(yīng)用中,需要有針對(duì)性的選擇。如果待判斷的變量近似服從正態(tài)分布,建議選擇正態(tài)分布的參考線法識(shí)別異常點(diǎn),否則使用分位數(shù)法識(shí)別異常點(diǎn)。

數(shù)據(jù)分析咨詢請(qǐng)掃描二維碼

若不方便掃碼,搜微信號(hào):CDAshujufenxi

數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機(jī)數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進(jìn)行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個(gè)參數(shù)驗(yàn)證碼對(duì)象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個(gè)配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺(tái)檢測(cè)極驗(yàn)服務(wù)器是否宕機(jī) new_captcha: data.new_captcha, // 用于宕機(jī)時(shí)表示是新驗(yàn)證碼的宕機(jī) product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說(shuō)明請(qǐng)參見(jiàn):http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計(jì)時(shí)完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請(qǐng)輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請(qǐng)輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }