누락된 자료의 처리*

통계 처리에 있어 missing data를 어떻게 처리할까 하는 문제는 연구자에게 가장 골치 아픈 문제 중 하나이다. 대부분의 통계 방법은 입력된 자료가 완전하고 누락된 자료가 없다고 가정한다. 하지만 실제 우리가 사용하는 대부분의 데이터는 누락된 자료가 있다. 따라서 자료를 분석하기에 앞서 누락된 자료를 제거하거나 합당한 대체값으로 바꾸어야 한다. 때로 통계 패키지가 누락된 자료에 대한 디폴트 방법을 제공하기도 하지만 최선의 방법은 아닐 수도 있다. 따라서 누락된 자료에 대한 여러 가지 대처 방법들과 각각의 장단점을 이해하는 것이 중요하다. 이번 장에서는 누락된 자료를 찾아내고 누락된 패턴을 확인하는 법을 다루고 누락된 자료를 다루는 세 가지 중요한 방법(rational approach, listwise deletion, multiple imputation)을 배워보고자 한다.

누락된 자료(NA, not available) 확인

moonBook 패키지의 acs 데이터를 이용하여 누락된 자료가 얼마나 있는지 확인해보자. acs 데이터는 857명의 환자 자료이나 누락된 자료가 꽤 있다. acs 데이터 중 누락된 자료의 개수를 세어 na.count에 저장하고 이 중 0개가 아닌 자료만 고르면 다음과 같다.

require(moonBook)
na.count=apply(acs,2,function(x) sum(is.na(x)))
na.count[na.count>0]
    EF height weight    BMI     TC   LDLC   HDLC     TG 
   134     93     91     93     23     24     23     15 

이를 그래프로 나타내면 다음과 같다.

barplot(na.count[na.count>0])

누락된 자료의 패턴 분석

그래프로 보기

VIM 패키지의 aggr() 함수는 이들 누락된 자료의 조합이 어떤지 그래프로 보여준다. 함수를 실행시키기 전에 VIM 패키지를 설치한다.

install.packages("VIM")
require(VIM)
aggr(acs,prop=FALSE,numbers=TRUE)

왼쪽 그래프는 각 변수별로 NA값이 얼마나 되는지 보여주고 있으며, 오른쪽 그래프는 NA값이 어느 변수의 조합으로 있는지를 보여준다. 오른쪽 그래프의 제일 마지막 행을 보면 누락된 자료가 없는 행이 677개이고, 다음 행을 보면 EF만 누락된 자료가 74개, EF, height, weight, BMI가 누락된 자료가 47개 등으로 나타난다.

VIM 패키지의 marginplot은 두 개의 변수 간의 missing data의 관계를 보여준다.

marginplot(acs[c("EF","BMI")],pch=20,col=c("darkgray","red","blue"))

상관관계를 이용해 보기

다음은 누락된 자료들 간의 상관관계를 보기 위한 코드이다. 최종결과를 보면 키와 몸무게 누락 자료의 상관관계는 0.99, 키와 BMI 누락 자료의 상관관계는 1이며 TC와 LDLC의 상관관계는 0.98, TC와 HDLC의 누락자료의 상관 관계는 1이다.

x=as.data.frame(abs(is.na(acs)))
y=apply(x,2,function(x) sum(x)>0)
round(cor(x[y]),2)
         EF height weight  BMI   TC LDLC HDLC   TG
EF     1.00   0.46   0.45 0.46 0.13 0.12 0.13 0.11
height 0.46   1.00   0.99 1.00 0.20 0.19 0.20 0.21
weight 0.45   0.99   1.00 0.99 0.20 0.19 0.20 0.21
BMI    0.46   1.00   0.99 1.00 0.20 0.19 0.20 0.21
TC     0.13   0.20   0.20 0.20 1.00 0.98 1.00 0.75
LDLC   0.12   0.19   0.19 0.19 0.98 1.00 0.98 0.73
HDLC   0.13   0.20   0.20 0.20 1.00 0.98 1.00 0.75
TG     0.11   0.21   0.21 0.21 0.75 0.73 0.75 1.00

Missing Data의 종류

Missing data는 MCAR(Missing completely at random)과 MAR(Missing at random) 그리고 MNAR(Missing at not random)으로 나누어 볼수 있다.

MCAR (missing completely at random)

MCAR은 변수의 종류와 변수의 값과 상관없이 전체에 걸쳐 무작위적으로 나타나는 것으로, 이러한 missing data는 분석에 영향을 주지 않는다. 실제로 MCAR의 경우는 거의 없다.

MAR (Missing at random)

누락된 자료가 특정 변수와 관련되어 일어나지만 그 변수의 값과는 관계가 없는 경우이다. 예를 들어 어떤 설문조사에서 누락된 자료가 특정 변수들에 국한되어 발견되었는데 알고 보니 일부 대상자가 설문지 3페이지에 반대쪽 면이 있는 것을 모르고 채우지 않았을 경우 MAR로 볼 수 있다.

MNAR (Missing at not random)

누락된 변수의 값과 누락된 이유가 관련이 있는 경우이다. 예를 들어 노인에서 우울증에 대한 설문조사를 했는데 실제로 우울증이 심한 경우는 우울한 기분에 대해 자세히 조사하는 항목을 대답하는 것이 괴로워 일부러 회피하여 누락되는 경우 등이다. 일부 설문에 정치적인 이유로 일부러 대답을 회피하거나 하는 경우도 MNAR로 볼수 있다.

그 외에 많은 시간을 두고 진행하는 연구인 경우 dropout도 누락의 원인이 될 수 있고 연구자의 데이터 수집이 불충분했거나 데이터 입력 과정에서 실수한 경우 등도 누락의 원인이 될 수 있다.

누락 자료에 대한 rational approach

누락된 자료의 경우 수학적인 방법이나 논리적인 방법으로 누락 자료를 회복시킬 수 있는 경우가 있다. 예를 들어 나이가 누락된 경우 생년월일을 알고 있으면 태어난 연도에서 계산하여 나이를 채워 넣을 수 있다. 또한 성별이 누락되어 있을 경우 주민등록번호 뒷자리로 성별을 채워 넣을 수 있으며, Body Mass Index가 누락된 경우 \(BMI= weight \div height^2\) 공식을 이용하여 채워 넣을 수 있다. 마찬가지로 LDLC 값이 누락된 경우 \(LDLC=TC-HDLC-TG\div 5\) 공식을 이용해 채워 넣을 수 있다.

Listwise deletion vs Pairwise deletion

Listwise deletion(Complete-case analysis)은 모든 변수들이 정확한 값으로 다 채워져 있는 관측치만을 대상으로 분석을 진행하는 것이다. 이 방법은 사실상 한 개라도 누락이 있는 자료들은 모두 제거하는 것으로, 많은 통계 프로그램에서 디폴트 방법으로 되어 있어 회귀나 ANOVA를 시행하면서 누락된 자료가 있다는 문제를 인지하지 못하는 경우도 있다. 데이터 프레임에서 누락된 자료를 제거하는 방법은 na.omit()를 이용하는 방법과 comlpete.cases()를 이용하는 방법이 있는데 두 가지 방법은 같은 결과를 얻는다.

# 누락된 자료 제거하기: 두 가지 방법은 같은 결과를 얻는다. 
newdata = mydata[complete.cases(mydata),]  
newdata = na.omit(mydata)

moonBook 패키지의 acs 데이터를 예로 들어보자. acs 자료의 전체 예는 857명이지만 이 중 데이터가 누락된 열이 있는 자료를 모두 제거하면 677명이 된다.

nrow(acs)
[1] 857
acs1=na.omit(acs)
nrow(acs1)
[1] 677

환자의 체질량지수(BMI)와 좌심실구혈률(EF)의 상관관계를 확인하기 위해 cor() 함수를 써서 r값을 구해본다.

  1. 전체 자료에서 cor() 함수를 사용하여 EF과 BMI의 관계를 보면 NA값 때문에 계산이 안 된다.
cor(acs$EF,acs$BMI)
[1] NA
  1. acs에서 na.omit() 함수로 na값을 모두 제거한 acs1으로 계산을 해본다.
res1=round(cor(acs1$EF,acs1$BMI),4) ; res1
[1] 0.0904

677명의 데이터에서 계산한 r 값은 0.0904이다. 이 방법은 listwise-deletion에 의한 방법이다.

  1. 전체 환자 수가 857명에서 677명으로 줄은 이유는 na 값이 하나라도 있는 자료를 모두 삭제했기 때문이다. 즉 EF이 누락된 134명, BMI가 누락된 93명 이외에도 LDLC(LDL 콜레스테롤) 수치가 없는 24명도 제외되었다. 따라서 전체 데이터 중 EF과 BMI의 데이터가 누락이 안 된 자료만 골라서 r값을 구하려면 다음과 같이 한다.
acs2=na.omit(acs[c("EF","BMI")])
nrow(acs2)
[1] 689
res2=round(cor(acs2$EF,acs2$BMI),4) ;res2
[1] 0.0933

689명의 데이터에서 계산한 값은 0.0933이다. 이 방법은 pairwise deletion에 의한 방법이다.

또 다른 방법은 데이터셋에서 미리 na값을 모두 삭제하지 말고 cor() 함수를 실행할 때 use 옵션을 주는 방법이다.

cor(acs$EF,acs$BMI,use="pairwise.complete.obs")
[1] 0.09332209

이 결과는 예상대로 pairwise deletion 방법과 같은 결과를 얻었다.

세 가지 방법으로 얻은 상관계수를 표로 비교해보면 다음과 같다.

방법 대상환자수 r 값
전체 857 NA(계산 안 됨)
listwise deletion 677 0.0904
pairwise deletion 689 0.0933

단순회귀분석의 경우

그렇다면 lm() 함수를 써서 단순회귀분석을 실시하면 어떻게 될까? 다음을 보자.

fit=lm(EF~BMI,data=acs)
summary(fit)

Call:
lm(formula = EF ~ BMI, data = acs)

Residuals:
    Min      1Q  Median      3Q     Max 
-38.157  -4.860   2.031   6.427  24.090 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  49.4581     2.6130  18.928   <2e-16 ***
BMI           0.2626     0.1069   2.457   0.0143 *  
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 9.453 on 687 degrees of freedom
  (168 observations deleted due to missingness)
Multiple R-squared:  0.008709,  Adjusted R-squared:  0.007266 
F-statistic: 6.036 on 1 and 687 DF,  p-value: 0.01427

회귀분석의 결과 자료의 누락으로 168명의 자료가 제거되었음을 알수 있다. 비교를 위해 acs2 데이터로 한 회귀분석과 비교해보자.

fit2=lm(EF~BMI,data=acs2)
summary(fit2)

Call:
lm(formula = EF ~ BMI, data = acs2)

Residuals:
    Min      1Q  Median      3Q     Max 
-38.157  -4.860   2.031   6.427  24.090 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  49.4581     2.6130  18.928   <2e-16 ***
BMI           0.2626     0.1069   2.457   0.0143 *  
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 9.453 on 687 degrees of freedom
Multiple R-squared:  0.008709,  Adjusted R-squared:  0.007266 
F-statistic: 6.036 on 1 and 687 DF,  p-value: 0.01427
identical(fit$coef,fit2$coef)
[1] TRUE

identical 함수는 두 개의 객체를 비교해주는 함수로 fit$coef와 fit2$coef는 동일하다. lm() 함수는 내부적으로 pairwise deletion을 사용하여 누락된 자료를 제외하고 분석하는 것을 알수 있다.

장단점

Listwise deletion자료가 MCAR 인 것을 전제로 한다. 즉, complete observation이 전체 데이터의 random subsample임을 전제로 한다. 우리가 listwise deletion을 한다는 것은 677명의 환자 데이터가 전체 857명의 데이터의 random subsample임을 전제한다. MCAR 가정이 흔들리는 정도에 따라(즉 데이터의 누락이 random이 아닐 때) 회귀분석의 계수는 편향되어 나타나게 된다(biased). 또한 누락된 값이 있는 모든 관측치를 제거함으로써 sample size가 줄어들기 때문에 통계의 검정력(power)이 줄어들게 된다. 이 모형에서는 listwise deletion을 통해 sample size가 21% 줄어들었다.

Pairwise deletion은 na값이 있는 관측치를 모두 제거하는 것이 아니라 통계에 따라 그때그때 각 쌍의 변수들에 대해 누락된 자료를 제거한다. 다음의 예를 보자.

round(cor(acs[c("EF","BMI","LDLC")],use="pairwise.complete.obs"),3)
        EF   BMI  LDLC
EF   1.000 0.093 0.033
BMI  0.093 1.000 0.086
LDLC 0.033 0.086 1.000

r 값은 모두 계산되었으나 EF는 모두 134 예에서 누락되어 있고 BMI는 93 예에서, LDLC는 24 예에서 누락이 되어 있으므로 EF-BMI의 분석에는 688 예가, EF-LDLC의 분석에는 707 예가 사용되었고 BMI-LDLC의 분석에는 750 예가 사용되었다. 이러한 방법은 분석에 사용 가능한 모든 데이터를 사용한다는 장점이 있는 반면에 모든 분석결과의 대상 subset이 다르기 때문에 분석결과가 왜곡되어질 수 있고(distorted) 해석하기가 힘들어진다.

다중대입법(multiple imputation, MI)*

다중대입법(Mutilple imputation, MI)은 시뮬레이션을 반복하여 누락된 데이터를 채워넣는다. MI는 복잡한 누락된 자료 문제가 있을 때 method of choice이다. MI 방법에서는 missing data가 있는 데이터셋이 있을 때 simulation을 통하여 누락된 자료를 채운 complete dataset을 3-10개 만든다. 누락된 자료는 몬테카를로 방법을 사용해서 채운다. 그런 다음 각각의 dataset에 대해 표준적인 통계방법을 적용하여 그 결과를 바탕으로 통계 결과 및 신뢰구간을 제공해준다.
R에서는 훌륭한 다중비교 방법을 제공하는 패키지가 여럿 있는데 대표적인 것으로는 Amelia, mice, mi 패키지 등이 있다. 여기서는 mice(multiple imputation by chained equations) 패키지에 대해 살펴보기로 하자. 다음 그림을 보자.

먼저 누락된 자료가 있는 데이터 프레임이 있는 경우 mice() 함수를 적용하면 누락된 값은 데이터 프레임에 있는 다른 모든 변수를 사용하여 값을 예측하여 채워넣는다. 이렇게 누락된 자료가 채워진 완성된 데이터셋(complete dataset)을 여러 개 만든다(디폴트로는 5개 만든다.) 대입 과정에는 무작위 구성 성분이 있기 때문에 각각의 완성된 데이터셋은 조금씩 다르다. 이들 각각의 완성된 데이터셋에 대해 with() 함수를 사용하여 통계모형을 순서대로 적용한다. 마지막으로 pool() 함수를 사용하여 이들 각각의 분석결과를 하나의 결과로 통합한다. 최종 모형의 표준오차와 p값은 누락된 자료와 다중 대입에 의한 불확실성을 정확하게 반영한다.

mice 패키지에 의한 분석은 다음 과정을 따른다.

require(mice) 
imp <- mice(mydata,m)     # dataset을 m개 만든다. 디폴트는 5 
fit <- with(imp,analysis) # analysis는 lm(), glm(), gam(), nbrm() 등이다  
                          # fit에는 m개의 분석결과가 들어간다 
pooled <- pool(fit)       # pooled 는 m개의 분석결과의 평균이다               
summary(pooled)

실제 예를 들어보자. mice() 패키지에 의한 다중대입이 어느 정도 정확한지 실제 데이터 중 일부를 일부러 누락시켜 mice()로 대입해보고 실제 값과 비교해보도록 하자.

iris 데이터는 붓꽃의 세 종류(setosa, versicolor, virginica)의 꽃잎과 꽃받침에 대한 자료로 각 종류마다 모두 50 예씩 150개의 자료로 되어 있다. 이 자료에 대해 회귀분석을 해본다.

data(iris)             #붓꽃 데이터 사용
fit=lm(Sepal.Length~Petal.Length+Species,data=iris)  #회귀분석 실시
summary(fit)

Call:
lm(formula = Sepal.Length ~ Petal.Length + Species, data = iris)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.75310 -0.23142 -0.00081  0.23085  1.03100 

Coefficients:
                  Estimate Std. Error t value Pr(>|t|)    
(Intercept)        3.68353    0.10610  34.719  < 2e-16 ***
Petal.Length       0.90456    0.06479  13.962  < 2e-16 ***
Speciesversicolor -1.60097    0.19347  -8.275 7.37e-14 ***
Speciesvirginica  -2.11767    0.27346  -7.744 1.48e-12 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.338 on 146 degrees of freedom
Multiple R-squared:  0.8367,    Adjusted R-squared:  0.8334 
F-statistic: 249.4 on 3 and 146 DF,  p-value: < 2.2e-16

꽃받침의 길이(Sepal.Length)를 꽃잎의 길이(Petal.Length) 및 종(Species)에 따라 회귀분석한 결과, 꽃잎의 길이에 따라 꽃받침의 길이도 커지며 setosa에 비해 versicolor와 virginica는 꽃받침의 길이가 짧으며 매우 유의하다(p값이 매우 적다).

이 중 10%에 해당하는 10개의 데이터를 무작위로 선택해 자료의 일부를 무작위로 누락시켜 보자.

iris1=iris                           # 누락시킬 데이터셋 만듦
set.seed(123)
random1=sample(1:150,10)             # 150개의 자료 중 10개 선택
random2=sample(1:5,10,replace=TRUE)  # 몇 번째 열을 누락시킬 것인지 10개 선택 
# 무작위로 만든 random1번째 행의 random2번째 열을 NA로 바꾼다.
for(i in 1:10) iris1[random1[i],random2[i]]<-NA
iris1[random1,]        # 일부러 누락시킨 데이터 확인
    Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
44           5.0         3.5          1.6         0.6       <NA>
118          7.7         3.8           NA         2.2  virginica
61           5.0         2.0          3.5          NA versicolor
130          7.2         3.0           NA         1.6  virginica
138           NA         3.1          5.5         1.8  virginica
7            4.6         3.4          1.4         0.3       <NA>
77           6.8          NA          4.8         1.4 versicolor
128           NA         3.0          4.9         1.8  virginica
79           6.0          NA          4.5         1.5 versicolor
65           5.6         2.9          3.6         1.3       <NA>
iris[random1, ]        # 원래 누락시키기 전의 데이터
    Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
44           5.0         3.5          1.6         0.6     setosa
118          7.7         3.8          6.7         2.2  virginica
61           5.0         2.0          3.5         1.0 versicolor
130          7.2         3.0          5.8         1.6  virginica
138          6.4         3.1          5.5         1.8  virginica
7            4.6         3.4          1.4         0.3     setosa
77           6.8         2.8          4.8         1.4 versicolor
128          6.1         3.0          4.9         1.8  virginica
79           6.0         2.9          4.5         1.5 versicolor
65           5.6         2.9          3.6         1.3 versicolor

누락된 데이터 iris1이 준비되었으므로 이 데이터셋에 대하여 mice 방법으로 누락된 자료을 다중대입하여 5개의 완성된 데이터셋을 만든다.

require(mice)
imp=mice(iris1,seed=1234)

 iter imp variable
  1   1  Sepal.Length  Sepal.Width  Petal.Length  Petal.Width  Species
  1   2  Sepal.Length  Sepal.Width  Petal.Length  Petal.Width  Species
  1   3  Sepal.Length  Sepal.Width  Petal.Length  Petal.Width  Species
  1   4  Sepal.Length  Sepal.Width  Petal.Length  Petal.Width  Species
  1   5  Sepal.Length  Sepal.Width  Petal.Length  Petal.Width  Species
  2   1  Sepal.Length  Sepal.Width  Petal.Length  Petal.Width  Species
  2   2  Sepal.Length  Sepal.Width  Petal.Length  Petal.Width  Species
  2   3  Sepal.Length  Sepal.Width  Petal.Length  Petal.Width  Species
  2   4  Sepal.Length  Sepal.Width  Petal.Length  Petal.Width  Species
  2   5  Sepal.Length  Sepal.Width  Petal.Length  Petal.Width  Species
  3   1  Sepal.Length  Sepal.Width  Petal.Length  Petal.Width  Species
  3   2  Sepal.Length  Sepal.Width  Petal.Length  Petal.Width  Species
  3   3  Sepal.Length  Sepal.Width  Petal.Length  Petal.Width  Species
  3   4  Sepal.Length  Sepal.Width  Petal.Length  Petal.Width  Species
  3   5  Sepal.Length  Sepal.Width  Petal.Length  Petal.Width  Species
  4   1  Sepal.Length  Sepal.Width  Petal.Length  Petal.Width  Species
  4   2  Sepal.Length  Sepal.Width  Petal.Length  Petal.Width  Species
  4   3  Sepal.Length  Sepal.Width  Petal.Length  Petal.Width  Species
  4   4  Sepal.Length  Sepal.Width  Petal.Length  Petal.Width  Species
  4   5  Sepal.Length  Sepal.Width  Petal.Length  Petal.Width  Species
  5   1  Sepal.Length  Sepal.Width  Petal.Length  Petal.Width  Species
  5   2  Sepal.Length  Sepal.Width  Petal.Length  Petal.Width  Species
  5   3  Sepal.Length  Sepal.Width  Petal.Length  Petal.Width  Species
  5   4  Sepal.Length  Sepal.Width  Petal.Length  Petal.Width  Species
  5   5  Sepal.Length  Sepal.Width  Petal.Length  Petal.Width  Species

완성된 자료에 대해 회귀분석을 실시한다.

fit1=with(imp,lm(Sepal.Length~Petal.Length+Species))
pooled = pool(fit1)
summary(pooled)
                    est         se         t       df     Pr(>|t|)
(Intercept)   3.6863394 0.11734295 31.415090 94.19159 0.000000e+00
Petal.Length  0.9026406 0.07284622 12.391044 82.18161 0.000000e+00
Species2     -1.5955885 0.21540159 -7.407506 89.16945 6.952594e-11
Species3     -2.0883702 0.31300792 -6.671941 64.81070 6.639014e-09
                  lo 95     hi 95 nmis       fmi    lambda
(Intercept)   3.4533584  3.919320   NA 0.1250615 0.1066788
Petal.Length  0.7577311  1.047550    2 0.1499427 0.1295041
Species2     -2.0235757 -1.167601   NA 0.1351395 0.1159565
Species3     -2.7135248 -1.463216   NA 0.1928400 0.1683102

mice 방식에 의해 다중대입된 자료의 회귀분석 결과 누락시키기 전 자료와 거의 결과가 같은 것을 알 수 있다. 다음 표는 원본 데이터와 mice()로 다중대입한 자료의 회귀분석 결과를 요약한 것이다.

항목 slope (원본 data) slope(mice 데이터) p(원본 data) p(mice 데이터)
Intercept 3.68 3.69 <0.001 <0.001
Petal.Length 0.90 0.90 <0.001 <0.001
SpeciesVersicolor -1.60 -1.60 <0.001 <0.001
SpeciesVirginica -2.12 -2.09 <0.001 <0.001

분석을 하기 위해 만들어진 객체 imp를 검사해보면 다중대입에 대한 정보를 얻을 수 있다.

imp
Multiply imputed data set
Call:
mice(data = iris1, seed = 1234)
Number of multiple imputations:  5
Missing cells per column:
Sepal.Length  Sepal.Width Petal.Length  Petal.Width      Species 
           2            2            2            1            3 
Imputation methods:
Sepal.Length  Sepal.Width Petal.Length  Petal.Width      Species 
       "pmm"        "pmm"        "pmm"        "pmm"    "polyreg" 
VisitSequence:
Sepal.Length  Sepal.Width Petal.Length  Petal.Width      Species 
           1            2            3            4            5 
PredictorMatrix:
             Sepal.Length Sepal.Width Petal.Length Petal.Width Species
Sepal.Length            0           1            1           1       1
Sepal.Width             1           0            1           1       1
Petal.Length            1           1            0           1       1
Petal.Width             1           1            1           0       1
Species                 1           1            1           1       0
Random generator seed value:  1234 

출력결과를 보면 5개의 데이터셋이 만들어졌음을 알 수 있고, 각각의 열 중 몇 개의 데이터가 누락되었는지 알수 있다. 대입에 사용된 방법은 연속변수에 대하여는 predictive mean matching(pmm)이 사용되었고 종을 예측하기 위하여는 “polyreg” 방법이 사용되었음을 알수 있다. 마지막 부분의 Predicotr Matrix에서는 누락된 열의 자료를 대입하기 위해 다른 모든 열의 자료가 사용되었음을 보여준다.

실제로 어떤 값이 대입되었는지는 imp$imp를 보면 알 수 있다. 5개의 완성된 데이터셋에 대입된 값을 모두 볼 수 있다.

imp$imp
$Sepal.Length
      1   2   3   4   5
128 5.7 6.7 6.9 6.2 5.8
138 6.1 6.7 6.9 6.2 6.9

$Sepal.Width
     1   2   3   4   5
77 3.1 3.3 3.2 3.0 2.8
79 2.9 2.8 2.7 2.8 3.0

$Petal.Length
      1   2   3   4   5
118 6.1 6.1 6.1 6.1 6.1
130 5.6 5.8 4.9 5.5 6.0

$Petal.Width
   1 2 3 4 5
61 1 1 1 1 1

$Species
            1          2          3          4          5
7      setosa     setosa     setosa     setosa     setosa
44     setosa     setosa     setosa     setosa     setosa
65 versicolor versicolor versicolor versicolor versicolor

이 값을 누락시키기 전의 실제 데이터와 비교해보면 매우 유사하다는 것을 알 수 있다.

iris[random1,]
    Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
44           5.0         3.5          1.6         0.6     setosa
118          7.7         3.8          6.7         2.2  virginica
61           5.0         2.0          3.5         1.0 versicolor
130          7.2         3.0          5.8         1.6  virginica
138          6.4         3.1          5.5         1.8  virginica
7            4.6         3.4          1.4         0.3     setosa
77           6.8         2.8          4.8         1.4 versicolor
128          6.1         3.0          4.9         1.8  virginica
79           6.0         2.9          4.5         1.5 versicolor
65           5.6         2.9          3.6         1.3 versicolor

단순대입법

단순대입법은 어떤 변수의 누락 값을 하나의 값(예를 들어 그 변수의 평균값, 중앙값 등)으로 채워넣는 방법이다. 하지만 이러한 대입은 무작위적이 아니기 때문에 무작위 오차가 발생하지 않는다. 이 방법은 분석에 사용되는 sample size의 감소 없이 누락된 자료의 문제를 해결할 수 있다는 장점이 있다. 단순대입법은 비교적 쉽고 잘 동작하는 방법이지만 데이터가 MCAR이 아닌 경우 편향된 결과를 만들 수 있다. 누락된 데이터의 양이 많을 때에는 단순대입법은 표준오차를 과소평가하게 하고 변수들간의 상관관계를 뒤틀며 통계 검정에서 부정확한 p값을 얻게 한다. 따라서 pairwise deletion과 마찬가지로 추천하고 싶은 방법은 아니다.

요약

대부분의 통계 방법은 입력된 자료가 완전하고 누락된 자료가 없다고 가정한다. 하지만 실제 우리가 사용하는 대부분의 데이터는 누락된 자료가 있다. 따라서 자료를 분석하기에 앞서 누락된 자료를 제거하거나 합당한 대체값으로 바꾸어야 한다. 때로 통계 패키지가 누락된 자료에 대한 디폴트 방법을 제공하기도 하지만 최선의 방법은 아닐 수도 있다. 따라서 누락된 자료에 대한 여러 가지 대처 방법들과 각각의 장단점을 이해하는 것이 중요하다.

이번 장에서는 누락된 자료를 찾아내고 누락된 패턴을 확인하는 법을 배웠고 자료가 누락된 기전 및 그에 따라 분석에 미치는 영향을 이해하였다. 누락된 자료를 다루는 세 가지 중요한 방법(rational approach, listwise deletion, multiple imputation)을 리뷰하였다.

Rational approach는 missing value를 찾아낼 수 있는 방법으로 자료가 풍부하고 외적인 정보가 있는 경우 사용할 수 있다. Listwise deletion은 자료가 MCAR이고 자료를 제거했을 때 sample size의 감소가 통계의 검정력에 심각한 영향을 미치지 않을 때 유용하다. 다중대입법은 데이터가 MCAR 또는 MAR인 경우 복잡한 missing data 문제를 해결하는 데 쓸 수 있는 method of choice이다. 많은 분석가들이 다중대입법에 익숙하지는 않지만 여러 패키지들이 있어 쉽게 접근할 수 있기 때문에 가까운 장래에 널리 사용될 수 있으리라 생각한다. 끝으로 pairwise deletion 또는 단순대입법 등은 피해야만 한다.