
R語言:異常值檢驗(yàn)、離群點(diǎn)分析、異常值處理
筆者寄語:異常值處理一般分為以下幾個(gè)步驟:異常值檢測、異常值篩選、異常值處理。其中異常值檢測的方法主要有:箱型圖、簡單統(tǒng)計(jì)量(比如觀察極值)
異常值處理方法主要有:刪除法、插補(bǔ)法、替換法。
提到異常值不得不說一個(gè)詞:魯棒性。就是不受異常值影響,一般是魯棒性高的數(shù)據(jù),比較優(yōu)質(zhì)。
一、異常值檢驗(yàn)
異常值大概包括缺失值、離群值、重復(fù)值,數(shù)據(jù)不一致。
1、基本函數(shù)
summary可以顯示每個(gè)變量的缺失值數(shù)量.
2、缺失值檢驗(yàn)
關(guān)于缺失值的檢測應(yīng)該包括:缺失值數(shù)量、缺失值比例、缺失值與完整值數(shù)據(jù)篩選。
[plain] view plain copy
print?在CODE上查看代碼片派生到我的代碼片
#缺失值解決方案
sum(complete.cases(saledata)) #is.na(saledata)
sum(!complete.cases(saledata))
mean(!complete.cases(saledata)) #1/201數(shù)字,缺失值比例
saledata[!complete.cases(saledata),] #篩選出缺失值的數(shù)值
3、箱型圖檢驗(yàn)離群值
箱型圖的檢測包括:四分位數(shù)檢測(箱型圖自帶)+1δ標(biāo)準(zhǔn)差上下+異常值數(shù)據(jù)點(diǎn)。
箱型圖有一個(gè)非常好的地方是,boxplot之后,結(jié)果中會(huì)自帶異常值,就是下面代碼中的sp$out,這個(gè)是做箱型圖,按照上下邊界之外為異常值進(jìn)行判定的。
上下邊界,分別是Q3+(Q3-Q1)、Q1-(Q3-Q1)。
[plain] view plain copy
print?在CODE上查看代碼片派生到我的代碼片
sp=boxplot(saledata$"銷量",boxwex=0.7)
title("銷量異常值檢測箱線圖")
xi=1.1
sd.s=sd(saledata[complete.cases(saledata),]$"銷量")
mn.s=mean(saledata[complete.cases(saledata),]$"銷量")
points(xi,mn.s,col="red",pch=18)
arrows(xi, mn.s - sd.s, xi, mn.s + sd.s, code = 3, col = "pink", angle = 75, length = .1)
text(rep(c(1.05,1.05,0.95,0.95),length=length(sp$out)),labels=sp$out[order(sp$out)],
sp$out[order(sp$out)]+rep(c(150,-150,150,-150),length=length(sp$out)),col="red")
代碼中text函數(shù)的格式為text(x,label,y,col);points加入均值點(diǎn);arrows加入均值上下1δ標(biāo)準(zhǔn)差范圍箭頭。
4、數(shù)據(jù)去重
數(shù)據(jù)去重與數(shù)據(jù)分組合并存在一定區(qū)別,去重是純粹的所有變量都是重復(fù)的,而數(shù)據(jù)分組合并可能是因?yàn)橐恍┲麈I的重復(fù)。
數(shù)據(jù)去重包括重復(fù)檢測(table、unique函數(shù))以及重復(fù)數(shù)據(jù)處理(unique/duplicated)。
常見的有unique、數(shù)據(jù)框中duplicated函數(shù),duplicated返回的是邏輯值。
二、異常值處理
常見的異常值處理辦法是刪除法、替代法(連續(xù)變量均值替代、離散變量用眾數(shù)以及中位數(shù)替代)、插補(bǔ)法(回歸插補(bǔ)、多重插補(bǔ))
除了直接刪除,可以先把異常值變成缺失值、然后進(jìn)行后續(xù)缺失值補(bǔ)齊。
實(shí)踐中,異常值處理,一般劃分為NA缺失值或者返回公司進(jìn)行數(shù)據(jù)修整(數(shù)據(jù)返修為主要方法)
1、異常值識(shí)別
利用圖形——箱型圖進(jìn)行異常值檢測。
[plain] view plain copy
print?在CODE上查看代碼片派生到我的代碼片
#異常值識(shí)別
par(mfrow=c(1,2))#將繪圖窗口劃為1行兩列,同時(shí)顯示兩圖
dotchart(inputfile$sales)#繪制單變量散點(diǎn)圖,多蘭圖
pc=boxplot(inputfile$sales,horizontal=T)#繪制水平箱形圖
2、蓋帽法
整行替換數(shù)據(jù)框里99%以上和1%以下的點(diǎn),將99%以上的點(diǎn)值=99%的點(diǎn)值;小于1%的點(diǎn)值=1%的點(diǎn)值。
[html] view plain copy
print?在CODE上查看代碼片派生到我的代碼片
#異常數(shù)據(jù)處理
q1<-quantile(result$tot_derog, 0.001) #取得時(shí)1%時(shí)的變量值
q99<-quantile(result$tot_derog, 0.999) #replacement has 1 row, data has 0 說明一個(gè)沒換
result[result$tot_derog
summary(result$tot_derog) #蓋帽法之后,查看數(shù)據(jù)情況
fix(inputfile)#表格形式呈現(xiàn)數(shù)據(jù)
which(inputfile$sales==6607.4)#可以找到極值點(diǎn)序號(hào)是啥
把缺失值數(shù)據(jù)集、非缺失值數(shù)據(jù)集分開。
[plain] view plain copy
print?在CODE上查看代碼片派生到我的代碼片
#缺失值的處理
inputfile$date=as.numeric(inputfile$date)#將日期轉(zhuǎn)換成數(shù)值型變量
sub=which(is.na(inputfile$sales))#識(shí)別缺失值所在行數(shù)
inputfile1=inputfile[-sub,]#將數(shù)據(jù)集分成完整數(shù)據(jù)和缺失數(shù)據(jù)兩部分
inputfile2=inputfile[sub,]
3、噪聲數(shù)據(jù)處理——分箱法
將連續(xù)變量等級(jí)化之后,不同的分位數(shù)的數(shù)據(jù)就會(huì)變成不同的等級(jí)數(shù)據(jù),連續(xù)變量離散化了,消除了極值的影響。
4、異常值處理——均值替換
數(shù)據(jù)集分為缺失值、非缺失值兩塊內(nèi)容。缺失值處理如果是連續(xù)變量,可以選擇均值;離散變量,可以選擇眾數(shù)或者中位數(shù)。
計(jì)算非缺失值數(shù)據(jù)的均值,
然后賦值給缺失值數(shù)據(jù)。
[plain] view plain copy
print?在CODE上查看代碼片派生到我的代碼片
#均值替換法處理缺失,結(jié)果轉(zhuǎn)存
#思路:拆成兩份,把缺失值一份用均值賦值,然后重新合起來
avg_sales=mean(inputfile1$sales)#求變量未缺失部分的均值
inputfile2$sales=rep(avg_sales,n)#用均值替換缺失
result2=rbind(inputfile1,inputfile2)#并入完成插補(bǔ)的數(shù)據(jù)
5、異常值處理——回歸插補(bǔ)法
[plain] view plain copy
print?在CODE上查看代碼片派生到我的代碼片
#回歸插補(bǔ)法處理缺失,結(jié)果轉(zhuǎn)存
model=lm(sales~date,data=inputfile1)#回歸模型擬合
inputfile2$sales=predict(model,inputfile2)#模型預(yù)測
result3=rbind(inputfile1,inputfile2)
6、異常值處理——多重插補(bǔ)——mice包
注意:多重插補(bǔ)的處理有兩個(gè)要點(diǎn):先刪除Y變量的缺失值然后插補(bǔ)
1、被解釋變量有缺失值的觀測不能填補(bǔ),只能刪除,不能自己亂補(bǔ);
2、只對(duì)放入模型的解釋變量進(jìn)行插補(bǔ)。
比較詳細(xì)的來介紹一下這個(gè)多重插補(bǔ)法。筆者整理了大致的步驟簡介如下:
缺失數(shù)據(jù)集——MCMC估計(jì)插補(bǔ)成幾個(gè)數(shù)據(jù)集——每個(gè)數(shù)據(jù)集進(jìn)行插補(bǔ)建模(glm、lm模型)——將這些模型整合到一起(pool)——評(píng)價(jià)插補(bǔ)模型優(yōu)劣(模型系數(shù)的t統(tǒng)計(jì)量)——輸出完整數(shù)據(jù)集(compute)
步驟詳細(xì)介紹:
函數(shù)mice()首先從一個(gè)包含缺失數(shù)據(jù)的數(shù)據(jù)框開始,然后返回一個(gè)包含多個(gè)(默認(rèn)為5個(gè))完整數(shù)據(jù)集的對(duì)象。
每個(gè)完整數(shù)據(jù)集都是通過對(duì)原始數(shù)據(jù)框中的缺失數(shù)據(jù)進(jìn)行插補(bǔ)而生成的。 由于插補(bǔ)有隨機(jī)的成分,因此每個(gè)完整數(shù)據(jù)集都略有不同。
其中,mice中使用決策樹cart有以下幾個(gè)要注意的地方:該方法只對(duì)數(shù)值變量進(jìn)行插補(bǔ),分類變量的缺失值保留,cart插補(bǔ)法一般不超過5k數(shù)據(jù)集。
然后, with()函數(shù)可依次對(duì)每個(gè)完整數(shù)據(jù)集應(yīng)用統(tǒng)計(jì)模型(如線性模型或廣義線性模型) ,
最后, pool()函數(shù)將這些單獨(dú)的分析結(jié)果整合為一組結(jié)果。最終模型的標(biāo)準(zhǔn)誤和p值都將準(zhǔn)確地反映出由于缺失值和多重插補(bǔ)而產(chǎn)生的不確定性。
[plain] view plain copy
print?在CODE上查看代碼片派生到我的代碼片
#多重插補(bǔ)法處理缺失,結(jié)果轉(zhuǎn)存
library(lattice) #調(diào)入函數(shù)包
library(MASS)
library(nnet)
library(mice) #前三個(gè)包是mice的基礎(chǔ)
imp=mice(inputfile,m=4) #4重插補(bǔ),即生成4個(gè)無缺失數(shù)據(jù)集
fit=with(imp,lm(sales~date,data=inputfile))#選擇插補(bǔ)模型
pooled=pool(fit)
summary(pooled)
result4=complete(imp,action=3)#選擇第三個(gè)插補(bǔ)數(shù)據(jù)集作為結(jié)果
結(jié)果解讀:
(1)imp對(duì)象中,包含了:每個(gè)變量缺失值個(gè)數(shù)信息、每個(gè)變量插補(bǔ)方式(PMM,預(yù)測均值法常見)、插補(bǔ)的變量有哪些、預(yù)測變量矩陣(在矩陣中,行代表插補(bǔ)變量,列代表為插補(bǔ)提供信息的變量, 1和0分別表示使用和未使用);
同時(shí) 利用這個(gè)代碼imp$imp$sales 可以找到,每個(gè)插補(bǔ)數(shù)據(jù)集缺失值位置的數(shù)據(jù)補(bǔ)齊具體數(shù)值是啥。
[plain] view plain copy
print?在CODE上查看代碼片派生到我的代碼片
> imp$imp$sales
1 2 3 4
9 3614.7 3393.1 4060.3 3393.1
15 2332.1 3614.7 3295.5 3614.7
(2)with對(duì)象。插補(bǔ)模型可以多樣化,比如lm,glm都是可以直接應(yīng)用進(jìn)去,詳情可見《R語言實(shí)戰(zhàn)》第十五章;
(3)pool對(duì)象。summary之后,會(huì)出現(xiàn)lm模型系數(shù),可以如果出現(xiàn)系數(shù)不顯著,那么則需要考慮換插補(bǔ)模型;
(4)complete對(duì)象。m個(gè)完整插補(bǔ)數(shù)據(jù)集,同時(shí)可以利用此函數(shù)輸出。
其他:
mice包提供了一個(gè)很好的函數(shù)md.pattern(),用它可以對(duì)缺失數(shù)據(jù)的模式有個(gè)更好的理解。還有一些可視化的界面,通過VIM、箱型圖、lattice來展示缺失值情況。
三、離群點(diǎn)檢測
離群點(diǎn)檢測與第二節(jié)異常值主要的區(qū)別在于,異常值針對(duì)單一變量,而離群值指的是很多變量綜合考慮之后的異常值。下面介紹一種基于聚類+歐氏距離的離群點(diǎn)檢測方法。數(shù)據(jù)分析師培訓(xùn)
基于聚類的離群點(diǎn)檢測的步驟如下:數(shù)據(jù)標(biāo)準(zhǔn)化——聚類——求每一類每一指標(biāo)的均值點(diǎn)——每一類每一指標(biāo)生成一個(gè)矩陣——計(jì)算歐式距離——畫圖判斷。
[plain] view plain copy
print?在CODE上查看代碼片派生到我的代碼片
Data=read.csv(".data.csv",header=T)[,2:4]
Data=scale(Data)
set.seed(12)
km=kmeans(Data,center=3)
print(km)
km$centers #每一類的均值點(diǎn)
#各樣本歐氏距離,每一行
x1=matrix(km$centers[1,], nrow = 940, ncol =3 , byrow = T)
juli1=sqrt(rowSums((Data-x1)^2))
x2=matrix(km$centers[2,], nrow = 940, ncol =3 , byrow = T)
juli2=sqrt(rowSums((Data-x2)^2))
x3=matrix(km$centers[3,], nrow = 940, ncol =3 , byrow = T)
juli3=sqrt(rowSums((Data-x3)^2))
dist=data.frame(juli1,juli2,juli3)
##歐氏距離最小值
y=apply(dist, 1, min)
plot(1:940,y,xlim=c(0,940),xlab="樣本點(diǎn)",ylab="歐氏距離")
points(which(y>2.5),y[which(y>2.5)],pch=19,col="red")
數(shù)據(jù)分析咨詢請掃描二維碼
若不方便掃碼,搜微信號(hào):CDAshujufenxi
DSGE 模型中的 Et:理性預(yù)期算子的內(nèi)涵、作用與應(yīng)用解析 動(dòng)態(tài)隨機(jī)一般均衡(Dynamic Stochastic General Equilibrium, DSGE)模 ...
2025-09-17Python 提取 TIF 中地名的完整指南 一、先明確:TIF 中的地名有哪兩種存在形式? 在開始提取前,需先判斷 TIF 文件的類型 —— ...
2025-09-17CDA 數(shù)據(jù)分析師:解鎖表結(jié)構(gòu)數(shù)據(jù)特征價(jià)值的專業(yè)核心 表結(jié)構(gòu)數(shù)據(jù)(以 “行 - 列” 規(guī)范存儲(chǔ)的結(jié)構(gòu)化數(shù)據(jù),如數(shù)據(jù)庫表、Excel 表、 ...
2025-09-17Excel 導(dǎo)入數(shù)據(jù)含缺失值?詳解 dropna 函數(shù)的功能與實(shí)戰(zhàn)應(yīng)用 在用 Python(如 pandas 庫)處理 Excel 數(shù)據(jù)時(shí),“缺失值” 是高頻 ...
2025-09-16深入解析卡方檢驗(yàn)與 t 檢驗(yàn):差異、適用場景與實(shí)踐應(yīng)用 在數(shù)據(jù)分析與統(tǒng)計(jì)學(xué)領(lǐng)域,假設(shè)檢驗(yàn)是驗(yàn)證研究假設(shè)、判斷數(shù)據(jù)差異是否 “ ...
2025-09-16CDA 數(shù)據(jù)分析師:掌控表格結(jié)構(gòu)數(shù)據(jù)全功能周期的專業(yè)操盤手 表格結(jié)構(gòu)數(shù)據(jù)(以 “行 - 列” 存儲(chǔ)的結(jié)構(gòu)化數(shù)據(jù),如 Excel 表、數(shù)據(jù) ...
2025-09-16MySQL 執(zhí)行計(jì)劃中 rows 數(shù)量的準(zhǔn)確性解析:原理、影響因素與優(yōu)化 在 MySQL SQL 調(diào)優(yōu)中,EXPLAIN執(zhí)行計(jì)劃是核心工具,而其中的row ...
2025-09-15解析 Python 中 Response 對(duì)象的 text 與 content:區(qū)別、場景與實(shí)踐指南 在 Python 進(jìn)行 HTTP 網(wǎng)絡(luò)請求開發(fā)時(shí)(如使用requests ...
2025-09-15CDA 數(shù)據(jù)分析師:激活表格結(jié)構(gòu)數(shù)據(jù)價(jià)值的核心操盤手 表格結(jié)構(gòu)數(shù)據(jù)(如 Excel 表格、數(shù)據(jù)庫表)是企業(yè)最基礎(chǔ)、最核心的數(shù)據(jù)形態(tài) ...
2025-09-15Python HTTP 請求工具對(duì)比:urllib.request 與 requests 的核心差異與選擇指南 在 Python 處理 HTTP 請求(如接口調(diào)用、數(shù)據(jù)爬取 ...
2025-09-12解決 pd.read_csv 讀取長浮點(diǎn)數(shù)據(jù)的科學(xué)計(jì)數(shù)法問題 為幫助 Python 數(shù)據(jù)從業(yè)者解決pd.read_csv讀取長浮點(diǎn)數(shù)據(jù)時(shí)的科學(xué)計(jì)數(shù)法問題 ...
2025-09-12CDA 數(shù)據(jù)分析師:業(yè)務(wù)數(shù)據(jù)分析步驟的落地者與價(jià)值優(yōu)化者 業(yè)務(wù)數(shù)據(jù)分析是企業(yè)解決日常運(yùn)營問題、提升執(zhí)行效率的核心手段,其價(jià)值 ...
2025-09-12用 SQL 驗(yàn)證業(yè)務(wù)邏輯:從規(guī)則拆解到數(shù)據(jù)把關(guān)的實(shí)戰(zhàn)指南 在業(yè)務(wù)系統(tǒng)落地過程中,“業(yè)務(wù)邏輯” 是連接 “需求設(shè)計(jì)” 與 “用戶體驗(yàn) ...
2025-09-11塔吉特百貨孕婦營銷案例:數(shù)據(jù)驅(qū)動(dòng)下的精準(zhǔn)零售革命與啟示 在零售行業(yè) “流量紅利見頂” 的當(dāng)下,精準(zhǔn)營銷成為企業(yè)突圍的核心方 ...
2025-09-11CDA 數(shù)據(jù)分析師與戰(zhàn)略 / 業(yè)務(wù)數(shù)據(jù)分析:概念辨析與協(xié)同價(jià)值 在數(shù)據(jù)驅(qū)動(dòng)決策的體系中,“戰(zhàn)略數(shù)據(jù)分析”“業(yè)務(wù)數(shù)據(jù)分析” 是企業(yè) ...
2025-09-11Excel 數(shù)據(jù)聚類分析:從操作實(shí)踐到業(yè)務(wù)價(jià)值挖掘 在數(shù)據(jù)分析場景中,聚類分析作為 “無監(jiān)督分組” 的核心工具,能從雜亂數(shù)據(jù)中挖 ...
2025-09-10統(tǒng)計(jì)模型的核心目的:從數(shù)據(jù)解讀到?jīng)Q策支撐的價(jià)值導(dǎo)向 統(tǒng)計(jì)模型作為數(shù)據(jù)分析的核心工具,并非簡單的 “公式堆砌”,而是圍繞特定 ...
2025-09-10CDA 數(shù)據(jù)分析師:商業(yè)數(shù)據(jù)分析實(shí)踐的落地者與價(jià)值創(chuàng)造者 商業(yè)數(shù)據(jù)分析的價(jià)值,最終要在 “實(shí)踐” 中體現(xiàn) —— 脫離業(yè)務(wù)場景的分 ...
2025-09-10機(jī)器學(xué)習(xí)解決實(shí)際問題的核心關(guān)鍵:從業(yè)務(wù)到落地的全流程解析 在人工智能技術(shù)落地的浪潮中,機(jī)器學(xué)習(xí)作為核心工具,已廣泛應(yīng)用于 ...
2025-09-09SPSS 編碼狀態(tài)區(qū)域中 Unicode 的功能與價(jià)值解析 在 SPSS(Statistical Product and Service Solutions,統(tǒng)計(jì)產(chǎn)品與服務(wù)解決方案 ...
2025-09-09