iT邦幫忙

2022 iThome 鐵人賽

DAY 6
0

遺失值處理

  • 遺失值種類
  • 遺失值處理
  • 移除遺失值
  • 遺失值填補
    • 單一插補 Single Imputation
    • 多重插補 Multiple Imputation (mice)
    • 其他方法

遺失值種類

實際收案拿到的資料中常常會有遺失值(Missing Value)出現,產生遺失值的原因有很多種,包含個案中離、試驗者拒絕回答、標記不清處等等原因都有可能。

⇒進行資料分析時我們不能直接忽略這些遺失值,直接忽略它們可能會造成以下幾種問題:

  • 訊息損失、統計檢定力下降 Loss of information/power
  • 結果有偏差 Biased results
  • 結果不可信 Unreliable results

在進行遺失值處理前,我們首先要去了解資料遺失值是哪種的缺失:

  • 完全隨機缺失 Missing Completely at Random (MCAR)

  • 隨機缺失 Missing at Random (MAR)

  • 非隨機缺失 Missing Not at Random (MNAR)

    • 完全隨機缺失
      就是資料中的遺失值是隨機分布的,這種狀態比較好處理。

    • 隨機缺失
      是指特定變數(族群)下,會有缺失資料出現(遺失值是有關連性的)。

    • 非隨機缺失
      遺失值的產生是有意義的,(Censored missing的資料,例如數值低於某個臨界值時,不去輸入資料或以 . 代替)。這種遺失值需要去做特別的處理。

遺失值在資料裡的的表現形態有很多種,包括. NA 空白等等,在 R 裡是顯示為NA(Not Available)。

missing_value <- c(1, 2, 3, NA, 4, 5)

is.na( )可以用來檢查是否有遺失值。

> missing_value
[1]  1  2  3 NA  5
> is.na(missing_value)
[1] FALSE FALSE FALSE  TRUE FALSE

如果是要檢查資料內的遺失值:

data <- data.frame(
  col_a=c( 0, 10, NA, 4, NA),
  col_b=c(-15,13,0,-5,-1),
  col_c=c( 1, 2, 3, NA, 5)
 )

sum(is.na(data)) # 計算缺失值的個數
sum(complete.cases(data)) # 完整資料的資料筆數

which( colSums(is.na(data)) >0) # 有缺失值的欄位,(回傳Column Name 和 Column Index)
complete.cases(data) # 當一筆資料(row)是完整的,回傳TRUE;當一筆資料有遺漏值,回傳FALSE

> data
  col_a col_b col_c
1     0   -15     1
2    10    13     2
3    NA     0     3
4     4    -5    NA
5    NA    -1     5
> sum(is.na(data)) # 計算缺失值的個數
[1] 3
> sum(complete.cases(data)) # 完整資料的資料筆數
[1] 2
> 
> which( colSums(is.na(data)) >0) # 有缺失值的欄位,(回傳Column Name 和 Column Index)
col_a col_c 
    1     3 
> complete.cases(data) # 當一筆資料(row)是完整的,回傳TRUE;當一筆資料有遺漏值,回傳FALSE
[1]  TRUE  TRUE FALSE FALSE FALSE

遺失值處理

  • 移除遺失值
  • 遺失值填補
    單一插補 Single Imputation
    多重插補 Multiple Imputation

接下來介紹的方法主要是對 MCAR、MAR 遺失值的處理方法。

移除遺失值

直接移除有遺失值的資料:

remove_data<- data[complete.cases(data), ]
> data
  col_a col_b col_c
1     0   -15     1
2    10    13     2
3    NA     0     3
4     4    -5    NA
5    NA    -1     5
> remove_data
  col_a col_b col_c
1     0   -15     1
2    10    13     2

遺失值填補

  • 單一插補 Single Imputation
    簡單來說就是找到一個適當的數值(例如:平均、條件分布的抽樣值)去填補它。
    對完全隨機缺失(MCAR)的遺失值會使用整體資料計算出一個平均值(listwise),一口氣填入。隨機缺失(MAR)的遺失值會針對不同群的遺失值各自進行計算(pairwise),再分別填入缺失值。

示範 pairwise 的用各欄的平均值填補缺失位置:

data <- data.frame(
  col_a=c( 0, 10, NA, 4, NA, 1, 8, 6, 4, 5),
  col_b=c(-15,13,0,-5,-1, 8, -6, 4, 9, -9),
  col_c=c( 1, 2, 3, NA, 5, 6, 7, 8, 9, 10)
)
> data
   col_a col_b col_c
1      0   -15     1
2     10    13     2
3     NA     0     3
4      4    -5    NA
5     NA    -1     5
6      1     8     6
7      8    -6     7
8      6     4     8
9      4     9     9
10     5    -9    10
mean_col1 <- mean(data[, 1], na.rm = T)  # column 1 的平均數(na.rm = T 忽略遺失值)
na_c1rows <- is.na(data[, 1])           # column 1 中,有遺失值存在的資料(回傳TRUE/FALSE)
mean_col3 <- mean(data[, 3], na.rm = T) # column 3
na_c3rows <- is.na(data[, 3])            

# 用 mean( column 1 ) ,填補第一欄位的遺漏值
data[na_c1rows, 1] <- mean_col1
data[na_c3rows, 3] <- mean_col3
> data
   col_a col_b     col_c
1   0.00   -15  1.000000
2  10.00    13  2.000000
3   4.75     0  3.000000
4   4.00    -5  5.666667
5   4.75    -1  5.000000
6   1.00     8  6.000000
7   8.00    -6  7.000000
8   6.00     4  8.000000
9   4.00     9  9.000000
10  5.00    -9 10.000000

  • 多重插補 Multiple Imputation
    它是從有遺失值的資料集中生成一個完整的資料集,重複去模擬資料的遺失,並試著去填補缺失值。
    常見的方法之一就是使用套件mice,它是使用利用 Chained Equations 產生插補值填補,它的優點是能夠差補混和類型(類別、二元類別、連續數值)的資料。

  • Multivariate Imputation by Chained Equations (mice)示意圖:

mice_imputation
圖片來源:https://hmtb.tistory.com/34

基本步驟如下:

install.packages("mice")
require(mice) # mice套件

imp <- mice(data, m) # 包含m個插補數據集的列表,默認 m = 5
## fit包含m個單獨統計分析結果的列表對象
fit <- with(imp, analysis) # analysis:設定應用於m個插補數據集的統計分析方法
## pooled是一個包含這m個統計分析平均結果的列表對象
pooled <- pool(fit)
summary(pooled)

complete(imp,n) # 可以看見到其中一筆(第n筆)填補完的資料

範例一:

以CART決策樹進行遺失值預測填補

data# 原始資料(有遺失值)
mice.data <- mice(data,
                  m = 3,           # 產生三個被填補好的資料表
                  maxit = 50,      # max iteration
                  method = "cart", # 使用CART決策樹,進行遺失值預測
                  seed = 188)      # set.seed(),令抽樣每次都一樣

## 填補好的資料:因為m=3,所以會有三個填補好的資料集,可以用以下方式取出
complete(mice.data, 1) # 1st data
complete(mice.data, 2) # 2nd data
complete(mice.data, 3) # 3rd data

## 觀察填補好的資料
df <- complete(mice.data, 1)
head(df)

程式碼參考來源: https://www.rpubs.com/skydome20/R-Note10-Missing_Value

範例二:
以哺乳動物睡眠資料(sleep)為例。
目標: 想知道做夢的時間(Dream)與動物壽命(Span,單位:年)及妊娠期(Gest,單位:天)的線性關係。

install.packages("VIM") # 從VIM套件取得 sleep 資料
library(VIM)
data(sleep, package= "VIM" )
head(sleep)

require(mice) # mice套件

imp <- mice(sleep, seed=123) # 因為會隨機差補所以設定種子數(seed)固定 #默認 m = 5
fit <- with(imp, lm(Dream~Span+Gest)) # 統計分析方法lm()
pooled <- pool(fit)
summary(pooled)
> head(sleep)
   BodyWgt BrainWgt NonD Dream Sleep Span Gest Pred Exp Danger
1 6654.000   5712.0   NA    NA   3.3 38.6  645    3   5      3
2    1.000      6.6  6.3   2.0   8.3  4.5   42    3   1      3
3    3.385     44.5   NA    NA  12.5 14.0   60    1   1      1
4    0.920      5.7   NA    NA  16.5   NA   25    5   2      3
5 2547.000   4603.0  2.1   1.8   3.9 69.0  624    3   5      4
6   10.550    179.5  9.1   0.7   9.8 27.0  180    4   4      4

也可以從 pooled 觀察插補訊息,例如fmi(Fraction of Missing Information)。

> pooled
Class: mipo    m = 5 
         term m     estimate         ubar            b            t dfcom       df        riv     lambda
1 (Intercept) 5  2.525630585 5.706649e-02 5.362455e-03 6.350144e-02    59 45.33857 0.11276225 0.10133544
2        Span 5 -0.004576084 1.271602e-04 1.194255e-06 1.285933e-04    59 56.36165 0.01127008 0.01114448
3        Gest 5 -0.003894918 1.962279e-06 6.919705e-08 2.045315e-06    59 53.56957 0.04231634 0.04059837
         fmi
1 0.13851753
2 0.04446079
3 0.07451772
df <- complete(imp) # 看填補完的資料
head(df)
> head(df)
   BodyWgt BrainWgt NonD Dream Sleep Span Gest Pred Exp Danger
1 6654.000   5712.0  3.2   0.0   3.3 38.6  645    3   5      3
2    1.000      6.6  6.3   2.0   8.3  4.5   42    3   1      3
3    3.385     44.5 10.9   1.5  12.5 14.0   60    1   1      1
4    0.920      5.7 13.8   2.8  16.5  5.0   25    5   2      3
5 2547.000   4603.0  2.1   1.8   3.9 69.0  624    3   5      4
6   10.550    179.5  9.1   0.7   9.8 27.0  180    4   4      4

[補充] 其他方法

還有很多其他方法可以填補遺失值,例如:

  • KNN (impute 套件)
  • Regression methods
  • Singular Value Decomposition Imputation ( SVD, pcaMethods 套件)
  • Local Least Square Imputation
  • Hot deck imputation(熱卡填充、就近補齊)
  • 隨機森林插補
    等等。

參考資料、網站

統計諮詢課上課內容, [STAT4008]統計諮詢, 課程系統碼: H240200。

R筆記–(10)遺漏值處理(Impute Missing Value)
https://www.rpubs.com/skydome20/R-Note10-Missing_Value

MULTIPLE IMPUTATION IN STATA
https://stats.oarc.ucla.edu/stata/seminars/mi_in_stata_pt1_new/
Missing Data Analysis with mice. Firouzeh Noghrehchi.
https://web.maths.unsw.edu.au/~dwarton/missingDataLab.html

결측값 데이터 다루기(處理缺失值數據), Jane Jeon
https://hmtb.tistory.com/34
https://github.com/lifeisgouda


上一篇
Day 5. 資料前處理 [R]
下一篇
Day 7. 什麼是機器學習 ?
系列文
機器學習與資料視覺化的筆記[R、Python]30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言