Learn R | 數據預處理中的缺失值(上)
前言
在任何一個完整的數據分析、數據挖掘流程中,數據預處理都是至關重要的環節。之前在學習這方面的內容時,我們總是基於一個基本假設——那就是所使用的數據都是完整的,不存在缺失情況。但在現實生活中,數據缺失的現象比比皆是,面對這樣的情況,我們應該怎麼辦呢?
當然,數據缺失的原因有很多種,從一般意義上來講,這不是我們今天學習的重點(不過不排除在某一具體問題中,獲知數據缺失的原因可以更有效的找回或填補數據),本文所要講述的是如何識別與處理缺失值。
一、缺失值的分類
統計學家們通常將缺失數據分為三類,分別為:
- 完全隨機缺失(MCAR):即數據集中的某一變數的缺失數據與其他任何觀測或未觀測變數都不相關
- 隨機缺失(MAR):即某一變數上的缺失數據與其他觀測變數相關,與它自己的未觀測值不相關
- 非隨機缺失(NMAR):當缺失數據既不屬於MCAR,也不屬於MAR時,則認為該缺失數據屬於NMAR(這一類型數據較為少見,當前大部分處理缺失數據的方法都假定數據是MCAR或MAR)
缺失值處理的方法有很多,不同的方法自然會生成不同的處理結果,下圖展示了在R中常用的一些缺失值處理方法,後續我們將會對此進行展開學習(圖片來源:R語言實戰(第2版) (豆瓣)):
二、識別缺失值
缺失值的識別早在數據預處理的學習中就有所涉及,這裡進行進一步的補充與完善。
# 識別缺失值,返回TRUE或FALSE,下同> is.na()# 識別不可能值(例如0/0)> is.nan()# 識別無窮值(例如1/0)> is.infinite()
> data <- c(1,NA,1/0,0/0)> is.na(data)[1] FALSE TRUE FALSE TRUE# 不可能值也被看作是缺失值> is.nan(data)[1] FALSE FALSE FALSE TRUE> is.infinite(data)[1] FALSE FALSE TRUE FALSE
除上述函數外,complete.case()函數可用來識別矩陣或數據框中沒有缺失值的行,不過該函數僅將NA與NaN看作是缺失值,無窮值(InF與-InF)仍然是有效的。
> data(airquality)# 列出沒有缺失值的行數據> head(airquality[complete.cases(airquality),],3) Ozone Solar.R Wind Temp Month Day1 41 190 7.4 67 5 12 36 118 8.0 72 5 23 12 149 12.6 74 5 3# 列出含有缺失值的行數據> head(airquality[!complete.cases(airquality),],3) Ozone Solar.R Wind Temp Month Day5 NA NA 14.3 56 5 56 28 NA 14.9 66 5 610 NA 194 8.6 69 5 10# 查詢缺失值的一些有用信息> sum(is.na(airquality))[1] 44> sum(is.na(airquality$Ozone))[1] 37
complete.cases()函數可以使我們獲取數據集中的缺失值,但如果數據集較為龐大的話,單單把這些值列出來不足以幫助我們把握整體的缺失情況。因此,我們可以考慮使用mice包中的md.pattern()函數,它將生成一個以矩陣或數據框形式展示缺失值模式的表格。
> library(mice)> md.pattern(airquality) Wind Temp Month Day Solar.R Ozone 111 1 1 1 1 1 1 0 35 1 1 1 1 1 0 1 5 1 1 1 1 0 1 1 2 1 1 1 1 0 0 2 0 0 0 0 7 37 44
表格中的0與1分別代表含於不含缺失值,第一行數據表示共有111條數據不存在缺失值,第二行數據表示共有35條數據在變數Ozone上存在缺失,第三行表示共有5條數據在變數Solar.R上存在缺失,第四行數據表示共有兩行數據在變數Ozone和Solar.R上同時存在缺失。右側的行合計為缺失的變數數,底部的列合計為實際的缺失數據量,匯總後得到最終的缺失數據總量,為44條。
三、缺失值的可視化分析
在md.pattern()函數的基礎上,我們可以使用VIM包中的一些函數進行缺失值的可視化展示。
> library(VIM)> aggr(airquality, prop=FALSE, numbers=TRUE)
# 將圖形按照變數"Day"進行降序排列> matrixplot(airquality,sortby = "Day")
matrixplot所生成的圖形使用灰度來表示值大小,顏色越深則值越大,並且用紅色表示缺失值。該圖形可以幫助我們探索某一變數的缺失值是否與其他變數的真實值有關。在airquality數據集中,通過將變數"Day"進行降序排列,可以發現變數"Solar.R"的缺失主要對應變數"Day"的較小值。
> marginplot(airquality[c("Ozone","Solar.R")],pch=c(20))
marginplot函數可生成一幅包含散點圖與箱線圖的綜合圖形。首先,圖形的主體是所選取的兩個變數都完整時的散點圖,左側紅色點表示缺失了"Ozone"數據的"Solar.R"值,藍色與紅色箱線圖分別表示包含與不包含在缺失"Ozone"值的前提下"Solar.R"值的變數分布。底部邊界的散點與箱線圖也是同理。
除上述圖形外,VIM包還有許多圖形可以幫助我們理解缺失數據在數據集中的模式,例如平行坐標圖、軸須圖、氣泡圖等等。
缺失值的可視化展示與分析就簡單介紹到這裡,在下一文中我們將學習對缺失值的多種處理方法。
未完待續
References:
1. R語言實戰(第2版) (豆瓣)
2. R語言缺失值處理
3. R語言處理缺失數據的高級方法
4. 數據缺失值的處理:基於R的mice包
5. 【譯文】R語言中的缺失值處理 - 知乎專欄
推薦閱讀:
※Learn R | 交互可視化之Plotly包(二)
※ggplot2雙坐標軸的解決方案
※Quantmod Tutorial:數據獲取(一)
※Learn R | SVM of Data Mining(二)
※一個小案例,教你如何從數據抓取、數據清洗到數據可視化