데이터에 난 구멍, 결측치를 어떻게 다룰 것인가

건강 설문조사에 1,000명이 참여했다고 하자. 연령, 체질량지수, 혈압은 대부분 기록되었지만 주당 운동시간에는 100개의 빈칸이 남았다.

분석자는 세 가지 방법을 생각할 수 있다.

  • 운동시간이 빠진 100명을 제외한다.
  • 결측값을 평균 운동시간으로 채운다.
  • 연령, 건강상태와 혈압을 이용해 여러 개의 가능한 운동시간을 생성한다.

세 방법 모두 분석을 계속할 수 있게 해준다. 그러나 결과의 의미는 서로 다르다.

운동시간이 빠진 사람이 우연히 정해졌다면 100명을 제외해도 큰 편향이 생기지 않을 수 있다. 반면 운동을 거의 하지 않는 사람이 응답을 피했다면 완전한 응답자만 분석한 결과는 전체 운동시간을 과대평가할 수 있다.

평균으로 채우면 표본 수는 1,000명으로 유지된다. 하지만 서로 다른 100명에게 똑같은 운동시간을 부여하므로 개인차가 인위적으로 줄어든다.

결측치는 단순히 비어 있는 셀이 아니다. 데이터가 어떤 과정에서 수집되었고, 누가 응답하지 않았으며, 어떤 정보가 관찰되지 않았는지를 보여주는 연구설계의 일부다.

결측치 처리에서 가장 먼저 물어야 할 질문은 다음과 같다.

빈칸을 무엇으로 채울 것인가?

그보다 먼저 물어야 할 질문은 이것이다.

왜 이 값이 관찰되지 않았는가?

모든 빈칸이 같은 결측치는 아니다

데이터 파일에서 값이 비어 있다고 해서 모두 같은 방식으로 처리해서는 안 된다.

형태처리 방향
일반적인 결측설문 문항 무응답결측기전 검토
구조적 결측비흡연자에게 흡연량을 묻지 않음‘해당 없음’으로 구분
추적탈락치료 후 방문하지 않음탈락 원인과 시간구조 검토
측정실패혈액검사 장비 오류오류 발생과정 확인
검출한계 미만농도가 장비 한계보다 낮음검열자료 방법 검토
입력 누락자료전송 과정에서 일부 값 손실원자료 확인 및 복구
특수코드999, -9, ‘모름’실제 결측값으로 변환
계산 불가능0으로 나눈 결과분석식과 원자료 점검

특히 구조적 결측은 일반적인 결측과 다르다.

비흡연자에게 하루 흡연량이 기록되지 않은 것은 데이터 손실이 아니다. 질문 자체가 해당하지 않는 것이다. 이를 흡연자의 평균 흡연량으로 대체하면 존재하지 않는 행동을 만들어내게 된다.

검출한계 미만의 값도 단순한 결측이 아니다. 실제 값이 없다는 뜻이 아니라 특정 경계보다 작다는 정보를 알고 있다. 이러한 자료를 검출한계의 절반으로 일괄 대체하면 분포와 불확실성이 왜곡될 수 있다.

결측값을 처리하기 전에 먼저 결측의 의미를 분류해야 한다.

R에서 NA와 빈 문자열은 다르다

R에서는 일반적인 결측값을 NA로 표시한다.

하지만 다음 값들은 서로 다르다.

표현의미
NA관찰되지 않은 값
NaN정의되지 않은 수치 연산 결과
NULL객체나 구성요소 자체가 없음
Inf무한대
""길이가 0인 문자열
"NA"문자 N과 A로 이루어진 문자열
999일반 숫자이지만 결측코드로 사용되었을 가능성

다음 벡터에서 실제 결측값은 하나뿐이다.

values <- c(
  "12",
  "",
  "NA",
  NA,
  "999"
)

is.na(values)
R

빈 문자열과 문자 "NA"는 자동으로 결측값으로 인식되지 않는다.

CSV 파일을 읽을 때 결측표현을 지정할 수 있다.

survey <- read.csv(
  "survey.csv",
  na.strings = c(
    "",
    "NA",
    "N/A",
    "."
  )
)
R

다만 999-9를 결측으로 바꾸기 전에는 반드시 자료사전을 확인해야 한다. 어떤 변수에서는 999가 실제 값일 수 있기 때문이다.

특수 결측코드가 확실하다면 다음처럼 변환할 수 있다.

survey$income[
  survey$income %in% c(-9, -99)
] <- NA
R

결측치 분석은 빈칸을 채우는 작업이 아니라 결측표현을 올바르게 정의하는 작업에서 시작된다.

결측기전은 세 가지로 구분한다

Rubin(1976)이 정립한 결측자료 체계에서는 결측이 발생하는 방식을 MCAR, MAR와 MNAR로 구분한다. 이 구분은 어떤 처리방법이 타당한지를 결정하는 핵심 조건이다.

완전무작위결측

MCAR는 Missing Completely At Random의 약자다.

결측 여부가 관찰된 변수와 관찰되지 않은 값 모두와 관련되지 않은 상황을 의미한다.

예를 들어 다음과 같은 상황을 생각할 수 있다.

  • 운송 중 설문지 일부가 무작위로 훼손되었다.
  • 검사장비의 일시적 오류가 환자특성과 무관하게 발생했다.
  • 자료전송 오류로 임의의 레코드가 손실되었다.

MCAR에서는 완전응답자들이 전체 표본의 무작위 부분표본처럼 작동할 수 있다. 따라서 완전사례분석이 많은 상황에서 편향되지 않은 결과를 제공할 수 있다.

그러나 표본 수가 줄어들기 때문에 정밀도와 검정력은 감소한다. 또한 현실의 결측이 정말 MCAR인지 강하게 정당화하기 어려운 경우가 많다(Little & Rubin, 2019).

MCAR는 “결측 비율이 작다”는 뜻이 아니다.

결측률이 1%여도 특정 집단에 집중되었다면 MCAR가 아니다. 반대로 결측률이 높더라도 결측이 모든 특성과 무관하게 발생했다면 이론적으로 MCAR일 수 있다.

무작위결측

MAR는 Missing At Random의 약자다.

명칭 때문에 아무 이유 없이 무작위로 빠진 상태라고 오해하기 쉽지만, 실제 의미는 다르다.

MAR에서는 결측 여부가 관찰된 정보와 관련될 수 있다. 다만 관찰된 정보를 조건으로 고려한 뒤에는 아직 관찰되지 않은 값 자체와 추가로 관련되지 않는다고 가정한다.

예를 들어 고령자가 소득 문항에 덜 응답한다고 하자.

연령은 관찰되어 있고, 같은 연령대 안에서는 실제 소득 수준이 결측 여부에 추가적인 영향을 주지 않는다고 가정한다면 MAR로 볼 수 있다.

다른 예는 다음과 같다.

  • 건강이 좋지 않은 사람이 추적조사에 덜 참여하지만 이전 건강점수가 기록되어 있다.
  • 남성이 특정 심리문항에 덜 응답하지만 성별은 관찰되어 있다.
  • 저학력 집단에서 소득 무응답이 많지만 학력은 자료에 포함되어 있다.

MAR에서 중요한 것은 결측을 설명하는 관찰변수를 분석에 포함하는 것이다.

연령이 소득 결측과 관련되어 있는데 연령을 대체모형에서 제외하면 MAR 가정을 활용하기 어려워진다.

다중대체와 우도기반 방법은 적절한 모형 아래에서 MAR를 가정해 사용할 수 있다(Sterne et al., 2009; White et al., 2011).

비무작위결측

MNAR는 Missing Not At Random의 약자다. NMAR라고 표기하기도 하지만 현재는 MNAR가 더 일반적이다.

MNAR에서는 관찰된 변수들을 고려한 뒤에도 결측 여부가 관찰되지 않은 값 자체와 관련된다.

예를 들어 소득이 매우 높은 사람이 실제 소득 때문에 응답을 피한다고 하자. 연령, 학력과 직업을 모두 고려해도 관찰되지 않은 소득값이 무응답 가능성에 영향을 준다면 MNAR다.

다음 상황도 MNAR일 수 있다.

  • 우울증상이 심한 사람이 증상 때문에 추적조사에서 탈락한다.
  • 부작용이 심한 환자가 부작용 문항에 응답하지 않는다.
  • 운동을 전혀 하지 않는 사람이 운동시간을 보고하지 않는다.
  • 매출이 매우 낮은 기업이 매출자료 제출을 거부한다.

MNAR에서는 관찰된 자료만으로 결측과정 전체를 알아낼 수 없다.

선택모형, 패턴혼합모형, 델타 조정과 전환점 분석 같은 민감도 분석이 필요할 수 있다(Carpenter & Kenward, 2013; National Research Council, 2010).

MCAR·MAR·MNAR는 데이터만 보고 확정할 수 없다

결측기전은 관찰되지 않은 값과 결측 여부의 관계를 포함한다. 관찰되지 않은 값은 말 그대로 확인할 수 없으므로 데이터만으로 MAR와 MNAR를 완전히 구분할 수 없다.

관찰된 변수와 결측 여부의 관계는 분석할 수 있다.

예를 들어 운동시간이 빠졌는지를 나타내는 변수를 만들고 연령, 성별과 체질량지수와의 관계를 확인할 수 있다.

survey$exercise_missing <- as.integer(
  is.na(
    survey$exercise
  )
)

missing_model <- glm(
  exercise_missing ~
    age +
    sex +
    bmi,
  family = binomial,
  data = survey
)

summary(
  missing_model
)
R

연령이 결측 여부와 관련되어 있다면 MCAR 가정에는 의문을 제기할 수 있다.

그러나 이 분석에서 관계가 나타나지 않았다고 MCAR가 증명되는 것은 아니다.

  • 표본이 작아 관계를 발견하지 못했을 수 있다.
  • 결측과 관련된 변수가 측정되지 않았을 수 있다.
  • 관계가 비선형일 수 있다.
  • 실제 결측값과 결측 여부가 관련된 MNAR일 수 있다.

Little(1988)의 MCAR 검정도 사용할 수 있지만, 유의하지 않은 결과가 MCAR를 입증하지는 않는다. 검정력과 모형가정의 영향을 받기 때문이다.

결측기전은 통계검정 하나가 아니라 자료수집 과정, 현장 기록, 연구대상자의 행동과 분석결과를 함께 고려해 판단해야 한다.

결측률만으로 처리방법을 정하면 안 된다

다음과 같은 경험적 규칙이 자주 사용된다.

결측률이 5% 미만이면 삭제해도 된다.

결측률이 20%를 넘으면 해당 변수를 제거한다.

이 기준은 편리하지만 보편적인 통계규칙은 아니다.

결측률이 2%에 불과해도 모두 중증 환자에게 발생했다면 결과는 크게 편향될 수 있다. 반대로 결측률이 30%라도 결측을 잘 예측하는 관찰변수가 충분하고 분석모형이 적절하다면 유용한 추론이 가능할 수 있다.

Madley-Dowd 등(2019)은 결측자료의 비율만으로 다중대체 사용 여부를 결정해서는 안 된다고 강조했다.

중요한 것은 다음과 같다.

  • 왜 결측되었는가?
  • 어느 변수에서 결측되었는가?
  • 어떤 집단과 시점에 집중되었는가?
  • 결측을 설명하는 관찰변수가 있는가?
  • 결과변수와 관련된 결측인가?
  • 분석목적이 추론인가 예측인가?
  • 결측 후 남은 정보가 충분한가?

결측률은 문제의 크기를 보여주는 정보 가운데 하나일 뿐이다.

완전사례분석은 가장 단순하지만 항상 틀린 것은 아니다

완전사례분석은 분석에 필요한 모든 변수의 값이 있는 관측대상만 사용하는 방법이다.

Listwise deletion 또는 complete-case analysis라고 부른다.

R의 많은 분석함수는 기본적으로 필요한 변수에 NA가 있는 행을 제외한다.

complete_model <- lm(
  systolic ~
    exercise +
    age +
    sex +
    bmi,
  data = survey,
  na.action = na.omit
)

summary(
  complete_model
)
R

장점

  • 구현과 설명이 쉽다.
  • 원래 관찰된 값만 사용한다.
  • 같은 분석에서 일관된 표본을 사용한다.
  • MCAR에서는 많은 추정량이 편향되지 않을 수 있다.
  • 특정한 결측구조에서는 MAR에서도 타당할 수 있다.

완전사례분석이 타당하려면 반드시 모든 결측이 MCAR여야 한다고 단정할 수도 없다.

회귀분석에서는 결측 여부가 결과변수와 무관하고 관찰된 공변량에만 의존하는 등 특정 조건에서 완전사례분석이 편향되지 않을 수 있다(Hughes et al., 2019).

다만 이러한 조건은 분석대상과 결측위치에 따라 달라지므로 기계적으로 적용해서는 안 된다.

한계

  • 표본 수와 검정력이 감소한다.
  • 완전응답자와 제외된 사람이 다르면 일반화가 어려워진다.
  • 여러 변수를 사용할수록 제외되는 행이 급격히 증가한다.
  • 결측이 결과나 노출과 관련되면 편향될 수 있다.
  • 결측이 많은 하위집단이 분석에서 사라질 수 있다.

변수별 결측률이 작아도 여러 변수를 함께 사용하면 완전사례 수는 크게 줄 수 있다.

10개 변수에서 각각 5%의 결측이 서로 독립적으로 발생한다고 단순화하면, 모든 변수에 응답할 비율은 약 60%에 불과하다.

따라서 변수별 결측률과 함께 실제 완전사례 수를 확인해야 한다.

쌍별삭제는 분석마다 표본이 달라진다

쌍별삭제는 각 통계량을 계산할 때 필요한 두 변수의 값이 모두 존재하는 사례만 사용하는 방법이다.

상관행렬을 계산할 때 자주 사용된다.

cor(
  survey[
    c(
      "age",
      "bmi",
      "exercise",
      "systolic"
    )
  ],
  use = "pairwise.complete.obs"
)
R

이 방법은 사용 가능한 자료를 더 많이 활용한다는 장점이 있다.

하지만 상관계수마다 서로 다른 표본을 사용하므로 하나의 일관된 모집단 관계를 나타내지 않을 수 있다. 계산된 상관행렬이 수학적으로 적절한 공분산 구조를 갖지 못하는 경우도 있다.

회귀분석, 구조방정식과 주성분분석처럼 변수들의 공동관계가 중요한 분석에서는 쌍별삭제를 신중하게 사용해야 한다.

평균과 중앙값 대체는 간단하지만 추론을 왜곡한다

평균대체는 결측값을 관찰값의 평균으로 채운다.

survey_mean <- survey

exercise_mean <- mean(
  survey_mean$exercise,
  na.rm = TRUE
)

survey_mean$exercise[
  is.na(
    survey_mean$exercise
  )
] <- exercise_mean
R

중앙값 대체도 같은 방식으로 계산할 수 있다.

exercise_median <- median(
  survey$exercise,
  na.rm = TRUE
)
R

이 방법은 표본 수를 유지하고 구현이 쉽다.

그러나 통계적 추론에서는 심각한 문제가 있다.

분산을 줄인다

모든 결측값에 같은 값을 넣으면 새로운 관측값들이 평균에 몰린다.

c(
  observed_sd = sd(
    survey$exercise,
    na.rm = TRUE
  ),
  mean_imputed_sd = sd(
    survey_mean$exercise
  )
)
R

평균대체 후 표준편차가 작아지는 것을 확인할 수 있다.

변수 간 관계를 왜곡한다

운동시간의 결측값을 모두 같은 평균으로 채우면 운동시간과 혈압, 연령 또는 체질량지수 사이의 관계가 약해지거나 예상하지 못한 방향으로 변할 수 있다.

표준오차가 잘못 계산된다

대체된 값을 실제 관찰값처럼 취급하면 결측값을 추정했다는 불확실성이 반영되지 않는다.

분석 프로그램은 모든 값이 완전히 관찰되었다고 생각하므로 표준오차와 신뢰구간이 지나치게 작아질 수 있다.

평균·중앙값 대체는 데이터 화면을 완성하지만 정보까지 복구하지는 않는다.

예측모형의 전처리에서 교차검증을 통해 성능이 확인된 경우에는 단순대체가 실용적인 선택이 될 수 있다. 그러나 회귀계수, p값과 신뢰구간을 추론하려는 연구에서 기본방법으로 사용하기는 어렵다(Donders et al., 2006).

회귀대체도 한 번만 수행하면 불확실성을 놓친다

회귀대체는 다른 변수들을 이용해 결측값을 예측한다.

예를 들어 연령, 성별과 체질량지수로 운동시간을 예측할 수 있다.

imputation_model <- lm(
  exercise ~
    age +
    sex +
    bmi,
  data = survey
)

predicted_exercise <- predict(
  imputation_model,
  newdata = survey
)
R

평균대체보다 개인특성을 반영한다는 장점이 있다.

하지만 예측값을 그대로 한 번만 채우면 같은 예측변수 조합을 가진 사람에게 거의 동일한 값이 부여된다. 회귀선 주변의 실제 개인차와 모형 불확실성이 사라진다.

그 결과 다음 문제가 생길 수 있다.

  • 변수 간 상관이 과도하게 커진다.
  • 잔차분산이 과소평가된다.
  • 표준오차가 작아진다.
  • 예측모형의 오류가 최종분석으로 전달된다.

확률적 회귀대체는 예측값에 잔차를 추가해 일부 변동성을 복원하지만, 한 개의 완성자료만 분석하면 대체과정의 전체 불확실성을 충분히 반영하기 어렵다.

이전 관측값 유지법은 변화가 없다고 가정한다

종단연구에서는 탈락 이후 값을 마지막 관측값으로 채우는 Last Observation Carried Forward 방식이 사용되기도 했다.

예를 들어 8주 차에 탈락한 환자의 12주 차 결과를 8주 차 값으로 채운다.

이 방법에는 강한 가정이 들어 있다.

탈락 이후 환자의 상태는 변하지 않았다.

질병이 자연적으로 악화하거나 회복될 수 있다면 이 가정은 타당하지 않다. 치료효과와 집단 간 차이를 축소하거나 확대할 수 있으며, 대체값을 실제 관측값으로 취급해 불확실성을 과소평가한다.

임상시험에서는 추적탈락과 치료중단 이후의 결과가 연구에서 정의한 추정대상과 어떻게 연결되는지를 먼저 정해야 한다(National Research Council, 2010).

다중대체는 하나가 아니라 여러 가능성을 만든다

다중대체는 결측값을 한 번만 채우지 않는다.

관찰자료와 통계모형을 이용해 여러 개의 서로 다른 완성자료를 만든다. 각 자료에서 결측값은 조금씩 다른 값으로 대체된다.

일반적인 절차는 다음과 같다.

  1. 결측값이 서로 다르게 채워진 자료를 여러 개 생성한다.
  2. 각 완성자료에서 동일한 분석을 수행한다.
  3. 분석결과를 Rubin의 결합규칙으로 통합한다.
  4. 대체 내 변동과 대체 간 변동을 모두 반영한다.

대체자료가 (m)개이고 각 자료의 추정치를 (Q_j)라고 하면 통합 추정치는 다음과 같다.

\[
\bar{Q}=\frac{1}{m}\sum_{j=1}^{m}Q_j
\]

전체 불확실성은 각 완성자료 안의 분산과 완성자료들 사이의 분산을 함께 반영한다.

\[
T=\bar{U}+\left(1+\frac{1}{m}\right)B
\]

여기서 \(\bar{U}\)는 대체자료 내부의 평균분산이고 \(B\)는 대체자료 사이의 분산이다.

다중대체의 핵심은 가장 그럴듯한 값 하나를 찾는 것이 아니다.

관찰되지 않은 값에 여러 가능성이 있다는 사실을 최종 표준오차와 신뢰구간에 반영하는 것이다.

다중대체가 자동으로 정답을 만드는 것은 아니다

다중대체는 강력하지만 버튼 하나로 결측문제가 해결되는 방법은 아니다.

적절한 결과를 얻으려면 다음 조건이 필요하다.

  • MAR 가정이 연구맥락에서 어느 정도 타당해야 한다.
  • 결측과 관련된 관찰변수를 포함해야 한다.
  • 최종 분석의 결과변수를 대체모형에 포함해야 한다.
  • 비선형관계와 상호작용을 고려해야 한다.
  • 변수의 자료형에 맞는 대체모형을 사용해야 한다.
  • 군집, 반복측정과 표본설계를 반영해야 한다.
  • 대체값의 분포와 수렴을 점검해야 한다.
  • MNAR 가능성에 대한 민감도 분석을 실시해야 한다.

결과변수를 대체모형에서 제외하면 안 되는 이유

최종 분석에서 혈압과 운동시간의 관계를 추정한다면 혈압은 운동시간의 결측값을 예측하는 데 유용한 정보를 제공한다.

혈압을 대체모형에서 제외하면 두 변수의 관계가 약화될 수 있다.

다중대체 모형에는 일반적으로 다음 변수를 고려한다.

  • 최종 분석모형의 모든 변수
  • 결측 여부를 예측하는 변수
  • 결측값 자체를 잘 예측하는 보조변수
  • 연구설계 변수
  • 층화·군집 변수
  • 중요한 상호작용과 비선형항

대체모형은 최종 분석모형보다 풍부하게 구성할 수 있다(Sterne et al., 2009; White et al., 2011).

대체자료 수는 항상 5개가 아니다

초기 문헌에서는 5개 정도의 대체자료도 효율적이라고 설명했지만, 현대의 계산환경에서는 더 많은 대체자료를 사용하는 경우가 많다.

결측정보가 적다면 20개가 충분할 수 있지만 결측률과 결측정보가 크거나 매우 안정적인 표준오차가 필요하면 50개 이상이 필요할 수 있다.

대체자료의 수는 단순한 결측률뿐 아니라 추정치에 포함된 결측정보와 몬테카를로 오차를 고려해 정해야 한다(Graham, 2009; White et al., 2011).

MICE는 변수별 조건부 모형을 반복한다

MICE는 Multiple Imputation by Chained Equations의 약자다.

연속형, 이항형, 순서형과 명목형 변수가 섞인 자료에서 변수별로 적합한 조건부 대체모형을 지정할 수 있다.

예를 들어 다음과 같은 방법을 사용할 수 있다.

변수 유형대표적인 MICE 방법
연속형예측평균매칭
이항형로지스틱 회귀
순서형순서형 로지스틱 회귀
명목형다항 로지스틱 회귀
개수자료상황에 맞는 개수모형 또는 변환
다수준자료군집구조를 반영한 다수준 대체

예측평균매칭은 회귀모형으로 예측된 값이 비슷한 실제 관측대상 가운데 하나의 관찰값을 대체값으로 선택한다. 이를 통해 관찰범위를 크게 벗어난 비현실적인 값이 생성되는 문제를 줄일 수 있다.

MICE는 유연하지만 변수별 조건부 모형들이 전체 공동분포와 일관되는지, 상호작용과 비선형성이 유지되는지 검토해야 한다(Lee & Carlin, 2010; van Buuren & Groothuis-Oudshoorn, 2011).

우도기반 방법은 값을 직접 채우지 않을 수도 있다

결측자료를 다루는 방법이 모두 대체는 아니다.

최대우도법은 관찰된 자료의 우도를 이용해 모수를 추정할 수 있다. 선형혼합모형과 구조방정식의 완전정보최대우도법이 대표적이다.

적절한 모형과 MAR 가정 아래에서 관찰된 정보를 활용하면서 결측값을 하나씩 채우지 않고도 추정할 수 있다.

장점은 다음과 같다.

  • 대체자료를 별도로 만들지 않을 수 있다.
  • 모형 안에서 불확실성을 직접 반영한다.
  • 종단자료와 잠재변수모형에 자연스럽게 적용된다.

그러나 분포와 모형가정이 잘못되면 편향될 수 있다. 어떤 분석에서도 자동으로 사용할 수 있는 일반적인 삭제 대체법은 아니다.

역확률가중은 관찰될 가능성을 보정한다

결측되지 않을 확률을 관찰변수로 예측하고, 관찰될 가능성이 낮았던 사례에 더 큰 가중치를 주는 방법도 있다.

이를 역확률가중이라고 한다.

예를 들어 중증 환자가 추적조사에 남을 확률이 낮다면 실제로 남아 있는 중증 환자에게 더 큰 가중치를 줄 수 있다.

이 방법은 관찰확률모형이 올바르게 설정되어야 한다. 관찰확률이 매우 작은 사례가 있으면 극단적인 가중치가 생겨 추정이 불안정해질 수 있다.

다중대체, 우도기반 방법과 역확률가중은 서로 경쟁하는 하나의 정답이 아니다. 연구설계와 추정대상에 따라 선택하거나 결합할 수 있다.

MNAR에서는 민감도 분석이 필요하다

MNAR는 관찰되지 않은 값에 관한 가정을 포함하므로 관찰자료만으로 확인하기 어렵다.

따라서 하나의 MNAR 모형이 참이라고 선언하기보다 여러 가정에서 결론이 얼마나 달라지는지 확인하는 것이 중요하다.

델타 조정

MAR로 대체한 값에 일정한 차이를 추가하거나 뺀다.

예를 들어 추적탈락자의 실제 우울점수가 MAR 대체값보다 평균 2점, 4점 또는 6점 높다고 가정해 결과를 다시 계산할 수 있다.

전환점 분석

결론이 바뀌려면 결측값이 관찰값과 얼마나 달라야 하는지를 확인한다.

다음 질문에 답할 수 있다.

탈락자의 평균 혈압이 관찰된 환자보다 어느 정도 높아야 치료효과 결론이 사라지는가?

필요한 차이가 현실적으로 매우 크다면 결론이 비교적 견고할 수 있다. 작은 차이만으로 결론이 바뀐다면 결과가 결측가정에 민감한 것이다.

패턴혼합모형과 선택모형

결측패턴별 결과분포를 모형화하거나 결과값과 결측과정을 공동으로 모형화할 수 있다.

이 방법도 관찰자료로 검증할 수 없는 가정을 필요로 하므로 여러 시나리오를 제시하는 것이 중요하다(Carpenter & Kenward, 2013).

추론과 예측에서는 결측치 처리의 목표가 다르다

통계적 추론에서는 회귀계수, 효과크기, 표준오차와 신뢰구간을 타당하게 추정하는 것이 중요하다.

예측모형에서는 새로운 관측대상의 예측성능이 더 중요할 수 있다.

예측에서는 평균·중앙값 대체나 결측지시변수를 사용한 방법도 교차검증에서 좋은 성능을 보인다면 실용적일 수 있다. 일부 트리 기반 알고리즘은 결측값을 직접 처리하기도 한다.

그러나 예측모형에서도 중요한 원칙이 있다.

대체 기준은 훈련자료에서만 계산해야 한다.

전체 자료에서 평균을 계산한 뒤 훈련자료와 시험자료를 나누면 시험자료의 정보가 학습단계에 들어가는 데이터 누출이 발생한다.

올바른 기본 절차는 다음과 같다.

set.seed(2026)

index <- sample(
  seq_len(
    nrow(survey)
  ),
  size = floor(
    0.8 * nrow(survey)
  )
)

train_data <- survey[index, ]
test_data <- survey[-index, ]
R

훈련자료의 중앙값을 계산한다.

train_median <- median(
  train_data$exercise,
  na.rm = TRUE
)
R

훈련자료와 시험자료에 같은 기준을 적용한다.

train_data$exercise[
  is.na(
    train_data$exercise
  )
] <- train_median

test_data$exercise[
  is.na(
    test_data$exercise
  )
] <- train_median
R

시험자료의 중앙값을 따로 계산해서는 안 된다.

교차검증을 사용할 때도 각 훈련폴드 안에서 대체기준을 다시 계산해야 한다.

결측지시변수는 정보가 될 수도 있다

특정 값이 빠졌다는 사실 자체가 예측에 도움이 될 수 있다.

예를 들어 소득을 공개하지 않은 고객이 특정 상품을 구매하는 경향이 있을 수 있다. 이 경우 소득 결측 여부를 나타내는 변수를 추가할 수 있다.

survey$income_missing <- as.integer(
  is.na(
    survey$income
  )
)
R

예측에서는 이 변수가 성능을 높일 수 있다.

그러나 인과효과나 회귀계수를 추론할 때 결측지시변수 방법을 기계적으로 사용하면 편향이 발생할 수 있다. 결측지시변수는 결측값의 불확실성을 복원하지 않으며, 결측과 결과의 관계를 단순한 추가계수 하나로 충분히 설명하지 못할 수 있다.

예측상 유용하다는 사실과 인과추론상 타당하다는 사실은 다르다.

건강 설문자료를 R로 만들어 보기

1,000명의 가상 건강자료를 생성해 보자.

set.seed(2026)

sample_size <- 1000L

health <- data.frame(
  age = round(
    rnorm(
      sample_size,
      mean = 50,
      sd = 15
    )
  ),
  sex = factor(
    sample(
      c(
        "여성",
        "남성"
      ),
      sample_size,
      replace = TRUE
    )
  ),
  bmi = round(
    rnorm(
      sample_size,
      mean = 24,
      sd = 3.5
    ),
    1
  ),
  exercise = round(
    pmax(
      rnorm(
        sample_size,
        mean = 3,
        sd = 1.4
      ),
      0
    ),
    1
  )
)
R

혈압을 생성한다.

health$systolic <- round(
  95 +
    0.45 * health$age +
    0.7 * health$bmi -
    1.2 * health$exercise +
    rnorm(
      sample_size,
      mean = 0,
      sd = 10
    ),
  1
)
R

연령과 체질량지수에 따라 운동시간 무응답 가능성이 달라지도록 결측을 만든다.

missing_probability <- plogis(
  -2.6 +
    0.03 *
      (
        health$age - 50
      ) +
    0.20 *
      (
        health$bmi - 24
      )
)

health$exercise[
  runif(sample_size) <
    missing_probability
] <- NA
R

이 예제에서는 결측과 관련된 연령과 체질량지수가 관찰되어 있다. 따라서 이 변수들을 충분히 반영한다는 조건에서 MAR 상황을 단순화해 보여준다.

R로 결측 현황 확인하기

변수별 결측 개수를 계산한다.

colSums(
  is.na(health)
)
R

변수별 결측률을 계산한다.

round(
  100 *
    colMeans(
      is.na(health)
    ),
  1
)
R

완전사례 수를 확인한다.

sum(
  complete.cases(health)
)
R

행별 결측 개수도 확인할 수 있다.

health$missing_count <- rowSums(
  is.na(health)
)

table(
  health$missing_count
)
R

자료 전체의 결측률만 확인하지 말고 집단과 시점별로도 확인해야 한다.

aggregate(
  is.na(exercise) ~ sex,
  data = health,
  FUN = mean
)
R

집단별 결측률 차이는 결측기전을 이해하는 단서가 될 수 있다.

결측 여부와 관찰변수의 관계 확인하기

운동시간 결측 여부를 만든다.

health$exercise_missing <- as.integer(
  is.na(
    health$exercise
  )
)
R

로지스틱 회귀로 관찰변수와의 관계를 살펴본다.

missingness_model <- glm(
  exercise_missing ~
    age +
    sex +
    bmi +
    systolic,
  family = binomial,
  data = health
)

summary(
  missingness_model
)
R

이 분석은 어떤 관찰변수가 결측을 설명하는지 파악하고 다중대체 모형의 보조변수를 선택하는 데 도움을 준다.

하지만 이 모형이 잘 맞는다고 MAR가 증명되는 것은 아니다. 관찰되지 않은 운동시간 자체가 결측에 영향을 주는지는 확인할 수 없기 때문이다.

완전사례분석 실행하기

운동시간과 혈압의 관계를 완전사례만 이용해 분석한다.

complete_fit <- lm(
  systolic ~
    exercise +
    age +
    sex +
    bmi,
  data = health,
  na.action = na.omit
)

summary(
  complete_fit
)
R

신뢰구간도 확인한다.

confint(
  complete_fit
)
R

분석에 실제로 사용된 표본 수를 확인한다.

nobs(
  complete_fit
)
R

논문에는 전체 표본 수뿐 아니라 최종 모형에 포함된 사례 수도 보고해야 한다.

평균대체가 분산을 줄이는지 확인하기

평균대체 자료를 만든다.

health_mean <- health

exercise_mean <- mean(
  health_mean$exercise,
  na.rm = TRUE
)

health_mean$exercise[
  is.na(
    health_mean$exercise
  )
] <- exercise_mean
R

대체 전후 표준편차를 비교한다.

c(
  before = sd(
    health$exercise,
    na.rm = TRUE
  ),
  after = sd(
    health_mean$exercise
  )
)
R

평균으로 대체한 관측값들이 중심에 몰리므로 전체 표준편차가 감소한다.

평균대체 회귀모형도 실행할 수 있지만, 표준오차는 결측값 추정의 불확실성을 반영하지 못한다.

mean_imputed_fit <- lm(
  systolic ~
    exercise +
    age +
    sex +
    bmi,
  data = health_mean
)

summary(
  mean_imputed_fit
)
R

이 결과를 완전사례 또는 다중대체 결과와 비교하면 단순대체가 계수와 표준오차에 어떤 영향을 주는지 확인할 수 있다.

R의 mice로 다중대체하기

먼저 필요한 패키지를 설치한다.

# 최초 한 번만 실행
# install.packages("mice")

library(mice)
R

분석에 사용할 변수만 선택한다.

imputation_data <- health[
  c(
    "systolic",
    "exercise",
    "age",
    "sex",
    "bmi"
  )
]
R

결측패턴을 확인한다.

md.pattern(
  imputation_data
)
R

20개의 대체자료를 생성한다.

imputed_data <- mice(
  imputation_data,
  m = 20,
  maxit = 20,
  seed = 2026,
  printFlag = FALSE
)
R

이 예제에서는 연속형 운동시간에 기본적으로 예측평균매칭이 사용될 수 있다. 실제 연구에서는 methodpredictorMatrix를 직접 확인하고 연구설계에 맞게 지정해야 한다.

사용된 대체방법을 확인한다.

imputed_data$method
R

예측변수 행렬도 확인한다.

imputed_data$predictorMatrix
R

대체모형의 수렴과 분포 확인하기

반복과정의 안정성을 확인한다.

plot(
  imputed_data
)
R

관찰값과 대체값의 분포를 비교한다.

densityplot(
  imputed_data,
  ~exercise
)
R

대체값을 직접 살펴볼 수도 있다.

stripplot(
  imputed_data,
  exercise ~ .imp
)
R

대체값 분포가 관찰값과 완전히 같아야 하는 것은 아니다. 그러나 비현실적인 값, 극단적인 차이와 반복과정의 불안정성이 나타나는지 확인해야 한다.

대체자료별 분석 후 결과 통합하기

각 완성자료에서 같은 회귀모형을 실행한다.

imputed_fit <- with(
  imputed_data,
  lm(
    systolic ~
      exercise +
      age +
      sex +
      bmi
  )
)
R

Rubin의 규칙으로 결과를 통합한다.

pooled_fit <- pool(
  imputed_fit
)
R

신뢰구간을 포함해 확인한다.

summary(
  pooled_fit,
  conf.int = TRUE
)
R

다중대체에서는 한 개의 완성자료를 선택해 일반 회귀분석을 하는 것이 아니다. 모든 대체자료의 추정치와 불확실성을 통합해야 한다.

완전사례와 다중대체 결과를 비교한다

완전사례분석과 다중대체 분석의 운동시간 계수를 비교할 수 있다.

complete_result <- coef(
  summary(
    complete_fit
  )
)

complete_result[
  "exercise",
]
R

다중대체 결과에서 운동시간 행을 확인한다.

pooled_result <- summary(
  pooled_fit,
  conf.int = TRUE
)

pooled_result[
  pooled_result$term == "exercise",
]
R

두 결과가 비슷하다고 한 방법이 자동으로 옳다는 뜻은 아니다.

결과가 비슷하면 결측처리 방법에 대한 결론의 민감성이 크지 않다는 단서가 될 수 있다. 결과가 크게 다르면 결측구조, 대체모형과 분석대상을 더 면밀하게 검토해야 한다.

다중대체에서 반드시 점검할 내용

대체값이 가능한 범위를 벗어나지 않는가

나이는 음수가 될 수 없고 비율은 0과 1 사이에 있어야 한다. 문항점수에는 정해진 최솟값과 최댓값이 있을 수 있다.

예측평균매칭은 관찰범위를 크게 벗어나는 값을 줄이는 데 도움이 되지만 모든 문제를 자동으로 해결하지는 않는다.

범주형 변수를 연속형으로 처리하지 않았는가

성별, 지역과 질병유형을 단순한 숫자로 코딩한 뒤 선형회귀로 대체하면 존재하지 않는 중간범주가 만들어질 수 있다.

변수 유형에 맞는 로지스틱 또는 다항모형이 필요하다.

최종 분석의 상호작용을 보존하는가

최종 분석에 처치와 성별의 상호작용이 들어간다면 대체모형도 그 구조를 적절히 반영해야 한다.

그렇지 않으면 상호작용 효과가 약화될 수 있다.

반복측정과 군집구조를 무시하지 않았는가

동일한 환자의 반복자료와 같은 병원의 환자들은 독립적이지 않다. 일반적인 단일수준 MICE를 적용하면 군집 내 관계가 제대로 보존되지 않을 수 있다.

표본설계 변수를 포함했는가

층화, 군집과 가중치를 사용한 조사자료에서는 이러한 설계정보를 대체모형과 최종분석에 반영해야 한다.

결측원인과 관련된 보조변수를 넣었는가

응답독촉 횟수, 이전 조사점수와 방문기록처럼 최종분석에는 직접 사용하지 않더라도 결측과 관련된 변수가 대체모형을 개선할 수 있다.

임상시험에서는 결측치보다 추정대상을 먼저 정한다

임상시험에서 치료를 중단한 환자의 이후 결과가 결측되었다고 하자.

연구자가 알고 싶은 질문에 따라 필요한 결과가 달라진다.

  • 치료를 중단하더라도 배정된 치료정책의 효과를 알고 싶은가?
  • 치료를 끝까지 유지했을 때의 효과를 알고 싶은가?
  • 구조요법을 사용하지 않았을 때의 효과를 알고 싶은가?
  • 치료 관련 사망과 탈락을 어떻게 다룰 것인가?

이는 단순한 결측치 처리 문제가 아니라 어떤 치료효과를 추정할 것인지에 관한 문제다.

치료중단 이후 결과를 모두 평균이나 마지막 값으로 채워서는 안 된다. 연구계획 단계에서 추정대상, 자료수집 지속 여부와 민감도 분석을 정해야 한다.

결측치를 보고할 때 필요한 내용

연구보고서에서 다음처럼만 쓰면 충분하지 않다.

결측치는 다중대체로 처리하였다.

다음 내용을 구체적으로 제시해야 한다.

  1. 변수별 결측 개수와 비율
  2. 집단별·시점별 결측분포
  3. 알려진 결측원인
  4. 구조적 결측과 일반 결측의 구분
  5. 완전응답자와 결측자의 특성 비교
  6. 가정한 결측기전
  7. 결측처리 방법의 선택근거
  8. 대체모형에 포함한 변수
  9. 변수별 대체방법
  10. 생성한 대체자료의 수
  11. 반복횟수와 수렴진단
  12. 군집·반복측정 구조의 반영 여부
  13. 분석모형과 대체모형의 일치 여부
  14. Rubin 규칙을 사용한 통합방법
  15. 완전사례분석과의 비교
  16. MNAR 민감도 분석
  17. 사용한 프로그램과 패키지
  18. 분석에서 실제 사용된 표본 수

다음처럼 작성할 수 있다.

운동시간은 전체 1,000명 가운데 96명에서 결측이었다. 결측은 연령과 체질량지수에 따라 달랐으며, 이 변수들과 혈압 및 성별을 포함한 연쇄방정식 다중대체를 실시하였다. 예측평균매칭으로 20개의 대체자료를 생성하고 각 자료에서 동일한 선형회귀모형을 적합한 뒤 Rubin의 규칙으로 결과를 통합하였다. 완전사례분석과 MNAR 시나리오를 이용한 민감도 분석도 함께 제시하였다.

결측치 처리에서 자주 발생하는 오류

빈칸을 모두 0으로 바꾼다

0은 관찰된 실제 값일 수 있다. 결측과 0은 완전히 다른 정보다.

결측률이 작으므로 무조건 삭제한다

결측률이 작아도 특정 결과나 집단에 집중되면 편향이 클 수 있다.

결측률이 높으므로 변수를 무조건 제거한다

중요한 결과변수나 교란변수를 제거하면 연구질문 자체가 달라질 수 있다.

평균대체 후 일반 표준오차를 사용한다

대체과정의 불확실성이 무시되어 신뢰구간이 지나치게 좁아질 수 있다.

다중대체를 하면 MNAR 문제가 해결된다고 생각한다

표준적인 다중대체는 일반적으로 MAR를 가정한다. MNAR 가능성은 민감도 분석이 필요하다.

결과변수를 대체모형에서 제외한다

노출과 결과의 관계가 약화되고 최종 분석과 대체모형이 불일치할 수 있다.

대체자료 한 개만 분석한다

다중대체의 핵심인 대체 간 불확실성이 반영되지 않는다.

전체 데이터에서 대체한 뒤 훈련자료와 시험자료를 나눈다

시험자료의 정보가 학습과정에 들어가는 데이터 누출이 발생한다.

여러 번 측정된 자료를 독립자료처럼 대체한다

개인 내 상관과 시간적 변화를 보존하지 못할 수 있다.

결측 이유를 조사하지 않는다

통계모형보다 원자료 확인, 조사현장 기록과 참여자 연락정보가 더 중요한 단서를 제공할 수 있다.

분석 전에 확인할 질문

  1. 빈칸은 실제 결측인가, 해당 없음인가?
  2. 특수 결측코드가 남아 있지 않은가?
  3. 변수별 결측률은 얼마인가?
  4. 집단과 시점에 따라 결측률이 다른가?
  5. 결측이 발생한 실제 이유는 무엇인가?
  6. MCAR, MAR 또는 MNAR 가운데 어떤 가정이 타당한가?
  7. 그 가정을 뒷받침하는 관찰변수와 제도적 근거가 있는가?
  8. 분석목적은 설명·인과추론인가, 예측인가?
  9. 완전사례분석에서 어떤 대상이 제외되는가?
  10. 단순대체가 분산과 관계를 왜곡하지 않는가?
  11. 다중대체 모형에 결과변수와 보조변수를 포함했는가?
  12. 변수의 자료형에 맞는 대체방법을 사용했는가?
  13. 비선형성과 상호작용을 반영했는가?
  14. 군집과 반복측정 구조를 고려했는가?
  15. 대체값의 분포와 수렴을 확인했는가?
  16. 충분한 수의 대체자료를 생성했는가?
  17. Rubin의 규칙으로 결과를 통합했는가?
  18. MNAR에 대한 민감도 분석을 했는가?
  19. 결측처리 방법에 따라 결론이 달라지는가?
  20. 결측과정과 분석방법을 재현할 수 있게 보고했는가?

결측치는 채우는 대상이 아니라 이해해야 할 과정입니다

결측치는 데이터에 난 단순한 구멍이 아니다.

누가 조사에 참여하지 않았는지, 어떤 질문이 불편했는지, 어느 측정장비가 실패했는지, 어떤 환자가 추적과정에서 사라졌는지를 보여주는 정보다.

비전공자는 다음 다섯 문장으로 기억할 수 있다.

결측률보다 결측이 발생한 이유가 중요하다.

평균으로 채운다고 잃어버린 정보가 복구되는 것은 아니다.

완전사례분석은 간단하지만 제외된 사람이 누구인지 확인해야 한다.

다중대체는 여러 가능한 값을 만들어 결측의 불확실성을 반영한다.

MNAR 가능성은 하나의 분석이 아니라 민감도 분석으로 평가해야 한다.

좋은 분석가는 빈칸을 발견하자마자 삭제하거나 채우지 않는다.

먼저 빈칸이 만들어진 과정을 조사하고, 어떤 가정에서 분석이 가능한지 명시하며, 다른 가정에서도 결론이 유지되는지 확인한다.

결측치 처리는 완성된 데이터표를 만드는 기술이 아니다. 관찰하지 못한 정보에 대해 얼마나 정직하게 불확실성을 표현할 것인지 결정하는 통계적 판단이다.

참고문헌

Carpenter, J. R., & Kenward, M. G. (2013). Multiple imputation and its application. Wiley. https://doi.org/10.1002/9781119942283

Donders, A. R. T., van der Heijden, G. J. M. G., Stijnen, T., & Moons, K. G. M. (2006). Review: A gentle introduction to imputation of missing values. Journal of Clinical Epidemiology, 59(10), 1087–1091. https://doi.org/10.1016/j.jclinepi.2006.01.014

Graham, J. W. (2009). Missing data analysis: Making it work in the real world. Annual Review of Psychology, 60, 549–576. https://doi.org/10.1146/annurev.psych.58.110405.085530

Hughes, R. A., Heron, J., Sterne, J. A. C., & Tilling, K. (2019). Accounting for missing data in statistical analyses: Multiple imputation is not always the answer. International Journal of Epidemiology, 48(4), 1294–1304. https://doi.org/10.1093/ije/dyz032

Jakobsen, J. C., Gluud, C., Wetterslev, J., & Winkel, P. (2017). When and how should multiple imputation be used for handling missing data in randomised clinical trials: A practical guide with flowcharts. BMC Medical Research Methodology, 17, 162. https://doi.org/10.1186/s12874-017-0442-1

Lee, K. J., & Carlin, J. B. (2010). Multiple imputation for missing data: Fully conditional specification versus multivariate normal imputation. American Journal of Epidemiology, 171(5), 624–632. https://doi.org/10.1093/aje/kwp425

Little, R. J. A. (1988). A test of missing completely at random for multivariate data with missing values. Journal of the American Statistical Association, 83(404), 1198–1202. https://doi.org/10.1080/01621459.1988.10478722

Little, R. J. A., & Rubin, D. B. (2019). Statistical analysis with missing data (3rd ed.). Wiley. https://doi.org/10.1002/9781119482260

Madley-Dowd, P., Hughes, R., Tilling, K., & Heron, J. (2019). The proportion of missing data should not be used to guide decisions on multiple imputation. Journal of Clinical Epidemiology, 110, 63–73. https://doi.org/10.1016/j.jclinepi.2019.02.016

National Research Council. (2010). The prevention and treatment of missing data in clinical trials. National Academies Press. https://doi.org/10.17226/12955

Rubin, D. B. (1976). Inference and missing data. Biometrika, 63(3), 581–592. https://doi.org/10.1093/biomet/63.3.581

Sterne, J. A. C., White, I. R., Carlin, J. B., Spratt, M., Royston, P., Kenward, M. G., Wood, A. M., & Carpenter, J. R. (2009). Multiple imputation for missing data in epidemiological and clinical research: Potential and pitfalls. BMJ, 338, b2393. https://doi.org/10.1136/bmj.b2393

van Buuren, S. (2018). Flexible imputation of missing data (2nd ed.). CRC Press. https://doi.org/10.1201/9780429492259

van Buuren, S., & Groothuis-Oudshoorn, K. (2011). mice: Multivariate imputation by chained equations in R. Journal of Statistical Software, 45(3), 1–67. https://doi.org/10.18637/jss.v045.i03

White, I. R., Royston, P., & Wood, A. M. (2011). Multiple imputation using chained equations: Issues and guidance for practice. Statistics in Medicine, 30(4), 377–399. https://doi.org/10.1002/sim.4067

scroll to the top of the site