R語言如何檢測和處理數據缺失值?

2021-03-02 R語言
【R語言】開通了R語言群,大家相互學習和交流,請掃描下方二維碼,備註:R群,我會邀請你入群,一起進步和成長。

面對一份數據,我們會做數據的缺失值檢測和分析,根據數據的缺失程度,以知道數據的完整性和可用性。實際的數據,絕大部分會有缺失值現象。缺失值的產生與諸多因素有關聯,例如:數據採集不成功,數據採集成功了但是數據確實沒有值,數據的值受其它因素控制等。面對有缺失值的數據,我們要怎麼處理、分析和應用,是我們數據工作者要思考和實踐的命題。這篇文章,總結和分享R語言如何檢測數據中的缺失值,以及針對不同情形下處理缺失值的方法。

R語言可以使用is.na()函數來判斷數據集的取值是否為缺失值,並且利用一些匯總函數可以概述數據整體的缺失率、每個樣本的缺失率和每個變量的缺失率。R語言也提供可視化工具來直觀展示變量的缺失分布情況。

【代碼片段】

# R包library(pacman)p_load(tidyverse) # 數據科學套件p_load(mice) # 缺失值分析包p_load(VIM)
# 導入數據telecom_data <- read_csv('./data/telecom.csv')# 數據檢視telecom_data %>% glimpse()# 10行,5列# 4個字符型變量,1個雙精度型變量
# 缺失值檢驗is.na(telecom_data)# 數據整體缺失率sum(is.na(telecom_data))mean(is.na(telecom_data))
# 自定義缺失率計算函數var_na_ratio <- function(x){ return(mean(is.na(x)))}# 變量缺失率apply(telecom_data, 2, var_na_ratio)# 樣本缺失率apply(telecom_data, 1, var_na_ratio)

【結果】

我們可以發現數據集為10行、5列,50個單元,整體缺失情況是5個缺失值,缺失率為10%。變量的缺失率情況,MonthlyCharges為30%、TotalCharges和PaymentMethod為10%,樣本的缺失情況,3個樣本有1個缺失值,1個樣本有2個缺失值。

【代碼片段】

md.pattern(telecom_data)aggr_plot <- aggr(telecom_data,                   col=c('navyblue','red'),                   numbers=TRUE,                   sortVars=TRUE,                   labels=names(data),                   cex.axis=.7,                   gap=3,                   ylab=c("Histogram of missing data","Pattern"))

【結果】

橫向觀察,表示有6個樣本沒有缺失,2個樣本有個1個缺失值,1個樣本有2個缺失依次類推;縱向觀察,TotalChanges有1個缺失值,PaymentMethod有1個缺失,MonthlyCharges有3個缺失值,總共是有5個缺失。

左邊的圖按著變量缺失率做降序排列;右邊的圖從下往上看,第一行,表示60%的樣本無缺失值,第二行,表示20%的樣本在變量MonthlyCharges有1個缺失值,以此類推。

我們可以把缺失值化為兩種類型:

MCAR:完全隨機的缺失,這是缺失值的理想場景。

MNAR:非完全性隨機缺失,這是常見情形,這個時候進一步檢查數據收集過程並嘗試理解數據缺失的原因可能是明智而必要的。數據集含有太多缺失會帶來嚴重問題。在大數據集情況,通常我們會保留變量缺失率不超過5%或者樣本缺失率不超過5%的樣本,當然,這個最佳閾值,可以根據實際情況調整。

【代碼片段】

# 以自帶數據集airquality為例data <- airqualitydata[4:10,3] <- rep(NA,7)data[1:5,4] <- NA
data <- data[-c(5,6)]summary(data)
pMiss <- function(x){sum(is.na(x))/length(x)*100}apply(data,2,pMiss)apply(data,1,pMiss)

【結果】

可以發現變量Ozone的缺失率有24.2%,而其它變量的缺失率是5%以下,我們可以刪除變量Ozone,這也是一種特徵選擇方法,基於數據的可用性來過濾特徵。因為,我們所觀察的數據集變量4個,只要一個有兩個或者以上變量缺失,就出現了樣本50%及以上的缺失率,因此這樣的樣本可以不予納入研究。

上面的這些做法,實際屬於一種常用R語言處理數據缺失值的方法,即根據變量的缺失率和樣本的缺失率,來過濾不符合閾值的變量和樣本集。若是在大數據和缺失率小比例的背景下,這種方法是有效的,也是簡單易行的。

有時候,我們為了保留變量和樣本數,需要採用別的方法來處理缺失值,常用的手段就是插補,不管是基於統計學裡面平均值、中位數或者眾數,還是基於某一種學習模型來完成缺失填充,這些都可以看作是插補法,只是方式不同而已。我們可以利用R語言mice包來做缺失值的插補法。

【代碼片段】

# 缺失值的插補tempData <- mice(data,m=5,maxit=50,meth='pmm',seed=500)completedData <- complete(tempData,1)sum(is.na(data))sum(is.na(completedData))

缺失的值被替換為五個數據集中第一個數據集的輸入值。如果希望使用另一個數據集的結果,只需更改complete()函數中的第二個參數。

【結果】

mice包提供了很多進行缺失值插補的方法,具體方法查詢如下:

【代碼片段】

【結果】

關於這些方法的含義,可以查看mice包的幫助文檔。大家做一下,若是要用隨機森林做插補法,需要用哪個方法?

總結:本文分享缺失值的檢測方法和處理策略,以及缺失值兩種類型,還有R 語言處理缺失值的mice包。

【完整代碼片段】

library(pacman)p_load(tidyverse) p_load(mice) p_load(VIM)
telecom_data <- read_csv('./data/telecom.csv')telecom_data %>% glimpse()
is.na(telecom_data)sum(is.na(telecom_data))mean(is.na(telecom_data))
var_na_ratio <- function(x){ return(mean(is.na(x)))}apply(telecom_data, 2, var_na_ratio)apply(telecom_data, 1, var_na_ratio)
md.pattern(telecom_data)aggr_plot <- aggr(telecom_data, col=c('navyblue','red'), numbers=TRUE, sortVars=TRUE, labels=names(data), cex.axis=.7, gap=3, ylab=c("缺失值直方圖","缺失值模式"))

data <- airqualitydata[4:10,3] <- rep(NA,7)data[1:5,4] <- NA
data <- data[-c(5,6)]summary(data)
pMiss <- function(x){sum(is.na(x))/length(x)*100}apply(data,2,pMiss)apply(data,1,pMiss)

tempData <- mice(data,m=5,maxit=50,meth='pmm',seed=500)completedData <- complete(tempData,1)sum(is.na(data))sum(is.na(completedData))
methods(mice)
summary(tempData)dim(tempData$imp$Ozone)tempData$methxyplot(tempData,Ozone ~ Wind+Temp+Solar.R,pch=18,cex=1)densityplot(tempData)stripplot(tempData, pch = 20, cex = 1.2)tempData
modelFit1 <- with(tempData,lm(Temp~ Ozone+Solar.R+Wind))summary(pool(modelFit1))

參考資料:

1https://datascienceplus.com/imputing-missing-data-with-r-mice-package/

2 https://raw.githubusercontent.com/dataoptimal/posts/master/data%20cleaning%20with%20R%20and%20the%20tidyverse/telecom.csv 

好書推薦

1 R語言做商業智能,助你提高商業生產率

2 用RStudio做數據分析

3 用R、tidyverse和mlr做機器學習

4 推斷統計與數據科學,moderndive和tidyverse包

公眾號推薦

相關焦點

  • 數據分析|R-缺失值處理
    數據中往往會有各種缺失值,異常值,錯誤值等,今天先介紹一下如何處理缺失值,才能更好的數據分析,更準確高效的建模。一 查看數據集的缺失情況    R中使用NA代表缺失值,用is.na識別缺失值,返回值為TRUE或FALSE。由於邏輯值TRUE和FALSE分別等價於數值1和0,可用sum()和mean()來獲取數據集的缺失情況。
  • 數據的預處理基礎:如何處理缺失值
    圖片來源: thermofisher數據集缺少值? 讓我們學習如何處理:數據清理/探索性數據分析階段的主要問題之一是處理缺失值。 缺失值表示未在觀察值中作為變量存儲的數據值。 這個問題在幾乎所有研究中都是常見的,並且可能對可從數據得出的結論產生重大影響。
  • 運用R進行缺失值填補
    本節將會學習到:缺失值數據的快速查看及其可視化缺失值的填補方法:均值法、KNN法、決策樹法等運用mice包實現多重填補方法數據填補的可視化缺失值概述缺失數據主要有兩種類型:1.MCAR:完全隨機缺失,這是數據缺失的理想狀況。
  • Python數據清洗(二):缺失值識別與處理
    Python數據清洗(一):類型轉換和冗餘數據刪除》中分享了有關數據類型轉換和冗餘信息刪除的兩個知識點,接下來繼續講解缺失值的識別和處理辦法。缺失值指的是由於人為或機器等原因導致數據記錄的丟失或隱瞞,缺失值的存在一定程度上會影響後續數據分析和挖掘的結果,所以對他的處理將顯得尤為重要。缺失值的識別判斷一個數據集是否存在缺失觀測,通常從兩個方面入手,一個是變量的角度,即判斷每個變量中是否包含缺失值;另一個是數據行的角度,即判斷每行數據中是否包含缺失值。
  • R語言的數據管理
    基本數據管理目標:操作日期和缺失值熟悉數據類型的轉換變量的創建和重編碼數據集的排序、合併與取子集選入和丟失變量案例:R in action提供,用於研究男性和女性在領導各自企業上的不同manager <- c(1,2,3,4,5)date <- c("10/24/08","10/
  • R語言常用數據處理代碼整理
    在收集好臨床數據,經過初步處理後,就可以導入到R軟體中去。R在進行統計分析前,常常需要對數據進行處理,使數據結構符合我們的統計需要,比如說變量因子化、創建新變量、變量類型轉化等等,因此數據處理是R進行統計分析前很重要的步驟。現基於各類R語言入門書整理R中常見的數據處理代碼。
  • R語言從入門到精通:Day5-R語言數據操作示例及數據
    從這次推文開始,我們就要正式開始接觸R語言對數據處理的強大能力。*plyr包是一個集合了很多數據集操作函數的R包,大家可以查看其幫助文檔進一步學習。幾乎所有項目中,都存在缺失值,在R中缺失值用NA代替(前面我們已經見過了)。R語言提供了一個簡單而重要的函數is.na()來監測數據集中的缺失值。下面是該函數的一個使用實例。
  • 離群值與缺失值的識別與處理
    >在數據處理中,出現離群值和缺失值的情況非常常見。原來咱們在說數據處理的時候也曾經提到過這個情況,這裡,一起再聊聊離群值和缺失值的識別與處理。 離群值的識別與處理離群值(outlier):距離整體數據較遠的數據稱為離群值。沒有搞明白離群值產生的原因之前,不要簡單捨棄,尤其是數據較少的時候。
  • 從零開始的R語言開荒日記 | 假期R語言速成(三)R的簡單數據操作與數據管理
    R的數據處理方式豐富多樣,不過,要想用R處理一份數據,首先需要學會如何將數據導入R以及如何對數據進行預處理(基本數據管理)。
  • Kaggle知識點:缺失值處理
    寫在前面在進行數據競賽中,數據預處理階段經常需要對數據進行缺失值處理。關於缺失值的處理並沒有想像中的那麼簡單。以下為一些經驗分享,基本涵蓋了大部分處理方式。另一個變量X』,將缺失值設為c(可以是任何常數),存在值設為本身。隨後,對X』,D和其他變量(因變量和其他預設模型中的自變量)進行回歸。這種調整的好處是它利用了所有可用的缺失數據的信息(是否缺失)。為了便利,一個好的c的設置方式是現有非缺失數據X的均數。
  • 機器學習之缺失值處理
    我們先看一部分缺失值數據,以對我們要處理的內容有初步了解缺失值數據圖片比較小,其實這段時間的數據缺失值還是較多的(我是特意找了段缺失值多的數據,方便我們後面對比不同處理方法的結果,嘿嘿~~~),這裡面我們以temp_out欄位為例來進行下面的缺失值處理啦
  • R語言學習路線和常用數據挖掘包
    對於初學R語言的人,最常見的方式是:遇到不會的地方,就跑到論壇上吼一嗓子,然後欣然or悲傷的離去,一直到遇到下一個問題再回來。那麼,眾多書籍中,一個生手應該從哪一本著手呢?入門之後如何才能把自己練就成某個方面的高手呢?相信這是很多人心中的疑問。有這種疑問的人有福了,因為筆者將根據自己的經歷總結一下R語言書籍的學習路線圖以使Ruser少走些彎路。本文分為6個部分,分別介紹初級入門,高級入門,繪圖與可視化,計量經濟學,時間序列分析,金融等。
  • R語言數據處理 | 實戰案例:機器學習
    以筆者自己為例,筆者不是學習計算機或統計學出身的,而筆者廣泛學習計算機和應用統計知識只是為了解決遇到的科學研究問題和業務問題,因此在學習機器學習算法時就會有所側重。筆者關心的問題包括算法的輸入是什麼,輸出是什麼,算法的前提假設是什麼,什麼時候應該用這種算法,得到的結果如何解釋,如何把這種算法運用到實際的業務場景或科學研究中,怎麼用現有的計算機工具來對這種算法進行實現?
  • SPSS 經典教材:基於回歸法填充缺失值
    如何能夠合理得當地處理缺失值是至關重要的。缺失值的處理方法很多,包括直接去除,對於大樣本研究來說,直接去除可能對結果造成的影響尚可接受,但是對於樣本量不多的研究來講,可能就是很大的影響。對於缺失值插補的方法也很多,最常見的包括臨近值,均值,中位數,眾數,回歸,多重插補等。前三類的填補,因為缺少隨機誤差,填補顯得比較蒼白,後兩者,尤其是多重插補,因為考慮到存在隨機誤差,在填補效率方面顯得更加優秀。
  • 手把手教你用pandas處理缺失值
    pandas對象的所有描述性統計信息默認情況下是排除缺失值的。pandas對象中表現缺失值的方式並不完美,但是它對大部分用戶來說是有用的。對於數值型數據,pandas使用浮點值NaN(Not a Number來表示缺失值)。
  • 機器學習基礎:缺失值的處理技巧
    在數據分析和建模中,經常會遇到變量值缺失的情況,這是非常常見的。為了保證數據指標的完整性以及可利用性,通常我們會採取特殊的方式對其進行處理。 1、缺失查看 首先,需要查看缺失值的缺失數量以及比例(#數據使用的kaggle平臺上預測房價的數據) 柱形圖可視化
  • R語言數據處理方法~小結
    (1)rbind() :縱向合併兩個數據框(數據集)(2)cbind() :橫向合併兩個數據框(數據集)註:兩個數據框行(列)數必須相同。如果x中擁有y中沒有的變量,在合併它們之前需做以下處理:(1)刪除dataframeA中的多餘變量;(2)在dataframeB中創建追加的變量並將其值設為NA(缺失)。
  • 基於R語言的主成分和因子分析
    主成分分析過程1)數據預處理,可以直接使用原始數據也可以使用相關係數矩陣;2)選擇主成分的個數(可有三種方法參考,1:保留特徵值大於1的主成分;2:碎石圖,在圖形變化最大處之上的主成分均可保留;3:平行分析,將真實數據的特徵值與模擬數據的特徵值進行比較,保留真實數據的特徵值大於模擬數據的特徵值的主成分
  • 全棧數據之R語言常用包和函數
    全棧數據之路系列:全棧數據之Linux常用命令總結全棧數據之MySQL常用命令總結全棧數據之Python常用工具和函數《R語言實戰》,這是高濤、肖楠等翻譯的一本書詳細全面介紹了入門、圖形、統計、回歸、方差、功效分析、廣義線性模型、主成分、因子分析
  • 知識分享 | R語言——大數據分析的一把利劍
    有些人問我是否應該學習在學R語言的同時學習Python。我的答案基本上是否定的,除非你需要使用一種以上的語言,否則你應該選擇一種語言進行學習。專注於一種程式語言的原因是,你需要更多地關注過程和技術,而不是語法。你需要掌握如何通過數據科學工具來分析數據,以及如何解決問題。事實證明,R語言是最佳的選擇。