R語言:異常數據處理
前言
異常值也是非常痛恨的一類臟數據,異常值往往會拉高或拉低數據的整體情況,為克服異常值的影響,我們需要對異常值進行處理。首先,我們需要識別出哪些值是異常值或離群點,其次如何處理這些異常值。下面仍然以案例的形式,給大家講講異常值的處理:
目錄
1、識別異常值
2、找出異常點
3. 其它
1. 單變量異常值檢測
一般通過繪制盒形圖來查看哪些點是離群點,而離群點的判斷標准是四分位數與四分位距為基礎。
即離群點超過上四分位數的1.5倍四分位距或低於下四分位數的1.5倍四分位距。
例子:
# 隨機產生一組數據
set.seed(1234)
value <- c(rnorm(100, mean = 10, sd = 3), runif(20, min = 0.01, max= 30), rf(30, df1 = 5, df2 = 20))
# 繪制箱線圖,並用紅色的方塊標注出異常值
library(ggplot2)
ggplot(data = NULL, mapping = aes(x = "", y = value)) + geom_boxplot(outlier.colour='red', outlier.shape=15, width=1.2)
通過圖可知,有一部分數據落在上四分位數的1.5倍四分位距之上,即異常值,下面通過編程,將異常值找出來。
#計算下四分位數、上四分位數和四分位距
QL <- quantile(value, probs = 0.25)
QU <- quantile(value, probs = 0.75)
QU_QL <- QU-QL
QL;QU;QU_QL
2、找出異常點
which(value > QU + 1.5*QU_QL)
value[which(value > QU + 1.5*QU_QL)]
結果顯示,分別是第104、106、110、114、116、118和120這6個點。下面就要處理這些離群點,一般有兩種方法,即剔除或替補。剔除很簡單,但有時剔除也會給后面的分析帶來錯誤的結果,接下來就講講替補。
# 用離異常點最近的點替換
test01 <- value
out_imp01 <- max(test01[which(test01 <= QU + 1.5*QU_QL)])
test01[which(test01 > QU + 1.5*QU_QL)] <- out_imp01
# 用上四分位數的1.5倍四分位距或下四分位數的1.5倍四分位距替換
test02 <- value
out_imp02 <- QU + 1.5*QU_QL
test02[which(test02 > QU + 1.5*QU_QL)] <- out_imp02
# 對比替換前后的數據概覽
summary(value)
summary(test01)
summary(test02)
3. 其他
在R語言中,對於多維的數據集來說,當我們可以確定異常點的范圍時,我們可以使用函數which()對其進行查找。下面以一個例子說明:
#首先產生兩組數據,並假設這兩組數據是一對一的
x <- runif(100);
y <- rnorm(100);
plot(x, y);
#現在我們找查找x<0.5且y<0.5的數據都在什么位置
#滿足x<0.5的位置
A <- which(x < 0.5);
#滿足y<0.5的位置
B <- which(y < 0.5);
#滿足x<0.5,y<0.5的位置
intersect(A, B)
引言 近年來,隨着人們對統計數據關注度的不斷提 高,對統計數據的質量要求也越來越高,而要很好 地保證統計數據質量,其中之一就要關注統計數據 中的異常值。所謂異常值,是指一批數據中有部分 數據與整體中其他數據相比存在明顯不一致,也稱 為異常數據,或稱離群值。異常值的出現可能是由 於記錄錯誤引起的,也可能是由於該數據值不屬於 這個數據集。異常值是影響統計數據質量的一個非 常重要的因素,一直以來,我國的統計界以及社會 各界均對此問題給予很高的關注。所以,近年來有 關異常值的理論探討一直是個熱點。但是目前研究 的重點一直放在統計法律制度的健全以及統計工作 程序的完善等方面。雖然這兩點確實能提高統計數 據的質量,但對於已經形成的統計數據,在進行統計 分析之前,我們更關注的是統計數據的誤差問題, 即所提供的統計數據與客觀的社會經濟現象實際的 數量特征之間的差距問題。異常值的存在,使得統 計分析的誤差大大增大,小則出現差錯,大則可能發生事故,甚至可能會導致嚴重的宏觀決策失誤。 因此,在利用已得數據進行統計分析之前,必須對 異常值進行探測和檢驗。 在統計軟件方面,常用的統計軟件有 SPSS、 SAS、 STAT、 R、 S-PLUS等。 R軟件是一個自由、 免費、開源的軟件,是一個具有強大統計分析功能 和優秀統計制圖功能的統計軟件,現已是國內外眾多統計學者喜愛的數據分析工具。
本文文章在基於 R語言的基礎上,結合具體實例,說明R軟件程序包outliers在識別統計數據中異常值的作用.
1 Grubbs法及基於R語言的Grubbs法檢驗程序舉例
1.1 Grubbs法原理 (1)將測量的數據按大小順序排列。 x 1, x 2, x 3, … , x n (2)設第i個數據可疑,計算 (3)查表 T計算>T表則第i個數據為異常值,否則為正常值。
1.2 基於R語言的Grubbs法檢驗程序 在 R軟件中,用 outliers包中的 Grubbs檢驗可以 檢驗出數據集中的1個或2個異常值,具體命令如下: Grubbs.test(x,type=10,opposite=FALSE,two.sided= FALSE) 其中 x是檢測數據向量; type=10表示檢測一個 異常值, type=11表示檢測 2個分別處於兩個端點的 異 常 值 , type=20 表 示 檢 測 2 個 一 側 的 異 常 值 ; two.sided表示雙邊檢驗。
1.3 應用舉例 例1:在一次調查中,收集數據如下: 8.3、5.5、14.0、7.5、4.7、9.0、6.5、10.2、7.7、6.2 請用 Grubbs法判斷是否有異常值?如果有,是 哪個? R程序如下: > utils:::menuInstallPkgs() >local({pkg<-select.list(sort(.packages(all.available= TRUE)),graphics=TRUE) +if(nchar(pkg))library(pkg, character.only=TRUE)}) >x<-c(8.3,5.5,14.0,7.5,4.7,9.0,6.5,10.2,7.7,6.2) >grubbs.test(x) R分析輸出結果: Grubbs test for one outlier data: x G = 2.2595, U = 0.3697, p-value = 0.03051 alternative hypothesis: highest value 14 is an outlier R分析輸出結果分析: 因為p=0.03051<0.05,所以可以判斷14為這組數 據的異常值。當然如果經過實際情況分析,判定14 不是異常值,是正常值。而覺得小值有可能是異常 值的話,可以輸入命令如下: > utils:::menuInstallPkgs() >local({pkg<-select.list(sort(.packages (all.available= TRUE)),graphics=TRUE) + i f ( n c h a r ( p k g ) ) l i b r a r y ( p k g , c h a r a c t e r. only=TRUE)}) >x<-c(8.3,5.5,14.0,7.5,4.8,9.0,6.5,10.2,7.7,6.2) > grubbs.test(x,opposite=TRUE) R分析輸出結果: Grubbs test for one outlier data: x G = 1.1797, U = 0.8282, p-value = 1 alternative hypothesis: lowest value 4.7 is an outlier R分析輸出結果分析: 因為 p=1>0.05,所以可以判斷 4.7為這組數據的 正常值。
2 dixon法原理及基於R語言的dixon法檢驗程序舉例
2.1 dixon法原理 設數據集為 x1,x2,x3,… ,xn,則其順序統計量為設 為: x(1)<x(2)<… <x(n)。其中 x(1)為最小值, x(n)為 最大值,當順序統計量 x(i)是正態分布時, Dixon給 出了不同樣本數量n時統計量D的計算公式。當顯著 水平 a 為 0.05 或 0.01 時, Dixon 給出了其臨界值 D 1a(n)。若某樣本的統計量 D>D1-a(n),則 x(n)為異常 值,如果某樣本的統計量D′> D1-a(n),則x(1)為異 常值,否則都為正常值。
2.2 基於R語言的Dixon法檢驗程序 在R軟件中,用outliers包中的Dixon檢驗可以檢 驗出數據集中的1個或2個異常值,具體命令如下: dixon.test(x,type=10,opposite=FALSE,two.sided =TRUE) 其中 x是檢測數據向量; type=10表示檢測適用 於數據集為 3~7個數據, type=11表示檢測適用於數 據集為8~10個數據,type=21表示檢測適用於數據集 為11~13個數據,type=2,2表示檢測適用於數據集為14個或14個以上數據,;two.sided表示雙邊檢驗。
2.3 應用舉例 例2:利用例1中的測量數據集,利用Dixon檢驗 判斷是否有異常值?如果有,是哪個? R程序如下: > utils:::menuInstallPkgs() >local({pkg<-select.list(sort(.packages(all. available= TRUE)),graphics=TRUE) +if(nchar(pkg))library(pkg, character.only=TRUE)}) >x<-c(8.3,5.5,14.0,7.5,4.7,9.0,6.5,10.2,7.7,6.2) > dixon.test(x,type=11) R分析輸出結果: Dixon test for outliers data: x Q = 0.4471, p-value = 0.0380 alternative hypothesis: highest value 14 is an outlier R分析輸出結果分析: 因為p=0.038<0.05,所以可以判斷14為這組數據 的異常值。當然如果經過實際情況分析,判定14不 是異常值,是正常值。而覺得小值有可能是異常值 的話,可以輸入命令如下: > utils:::menuInstallPkgs() >local({pkg<-select.list(sort(.packages(all. available= TRUE)),graphics=TRUE) + i f ( n c h a r ( p k g ) ) l i b r a r y ( p k g , c h a r a c t e r. only=TRUE)}) >x<-c(8.3,5.5,14.0,7.5,4.7,9.0,6.5,10.2,7.7,6.2) >dixon.test(x, type=11,opposite=TRUE) R分析輸出結果: Dixon test for outliers data: x Q = 0.1296, p-value = 0.7763 alternative hypothesis: lowest value 4.7 is an outlier R分析輸出結果分析: 因為p= 0.7763>0.05,所以可以判斷4.7為這組數 據的正常值。 綜上分析,利用R軟件程序outliers包來實現數理 統計中的Grubbs法、dixon法非常容易實現,也便於 根據自己的實際情況調整程序,易學易記,非常直 觀,所以在以后的數據處理分析中,要多多利用 R 軟件來實現,以提高自己的數據分析能力。
