결측값 처리와 이상값 검색

데이터 분석 · 결측값 처리와 이상값 검색

이 페이지의 목차

핵심 요약

결측값의 의미·원인과 삭제·대체 전략, 구조적 결측, 이상값과 오류의 구분, IQR·z-score·MAD 탐지 및 처리 전후 영향 점검을 계산과 R 예제로 정리한다.

본문

결측값의 의미·발생 원인·행/열 단위 진단

결측값은 단순히 0이 아니다. 측정되지 않았거나 기록되지 않았거나 구조상 해당 값이 존재하지 않는 상태를 구분해야 한다.

R에서는 NA로 결측을 표현한다.

R
x <- c(10, NA, 14, 16)
is.na(x)
# [1] FALSE  TRUE FALSE FALSE

mean(x)
# [1] NA

mean(x, na.rm = TRUE)
# [1] 13.33333

행 단위로 완전한 관측인지 보려면 complete.cases()를 사용할 수 있고, na.omit()은 결측이 포함된 행을 제거한 객체를 만든다. 삭제가 실제 분석에 적절한지는 별도로 판단해야 한다. 결측률만 보지 말고 특정 장비·기간·고객군에 결측이 집중되는지도 확인한다.

결측 메커니즘은 학습 수준에서 다음처럼 구분할 수 있다.

  • MCAR: 결측 발생이 관측·미관측 값과 관련이 없는 경우
  • MAR: 관측된 다른 변수와 관련된 경우
  • MNAR: 빠진 값 자체와 결측 가능성이 관련된 경우

실제 판단에는 업무 생성 과정과 수집 절차를 함께 봐야 한다.

R의 is.na()는 일반 NA뿐 아니라 수치형 NaN도 결측으로 판별한다. 데이터프레임의 열별 결측 개수는 colSums(is.na(d))처럼 계산할 수 있다.

R
sum(is.na(c(3, NaN, NA_real_, 5)))
# [1] 2

d <- data.frame(
  a = c(1, NA, 3),
  b = c(NA, 2, NA)
)
colSums(is.na(d))
# a b
# 1 2

삭제·대체·결측 지시자·구조적 결측과 R의 na.rm

결측 처리에는 행·열 삭제, 평균·중앙값·모델 기반 대체, 결측 여부 지시자 추가 등이 있다. 어떤 방법도 항상 정답은 아니다.

  • 결측이 매우 적고 무작위에 가까우면 삭제가 단순할 수 있다.
  • 결측이 특정 집단에 집중되면 삭제가 표본 구성을 왜곡할 수 있다.
  • 평균 대체는 분산을 줄이고 관계를 왜곡할 수 있다.
  • 결측 자체가 업무 정보를 가진다면 지시자 변수를 고려할 수 있다.

‘배송완료일’이 아직 배송 중인 주문에서 비어 있는 경우처럼 구조적으로 값이 존재하지 않는 결측과 센서 장애로 빠진 값을 같은 방식으로 처리하면 안 된다.

중앙값도 na.rm=TRUE로 결측을 제외해 계산할 수 있다.

R
median(c(4, NA, 8, 12), na.rm = TRUE)
# [1] 8

단순 대체가 필요하더라도 집단별 수준 차이가 크고 집단 기준이 신뢰할 수 있다면 전체 평균 하나보다 집단별 대표값을 검토할 수 있다. 또한 -999처럼 업무 명세에서 ‘측정 실패’를 뜻하는 센티널 값은 실제 수치로 평균에 넣지 말고 먼저 NA로 표준화한 뒤 정한 결측 처리 규칙을 적용한다.

R
x <- c(10, -999, 14)
x[x == -999] <- NA_real_
mean(x, na.rm = TRUE)
# [1] 12

이상값과 오류의 구분, 맥락적·다변량 이상값

이상값(outlier)은 다른 관측과 크게 다른 값이지만 반드시 오류는 아니다. 매우 큰 실제 구매나 드문 고장 사례처럼 중요한 신호일 수 있다.

  • 입력 단위 오류·중복 기록이라면 수정 또는 제외 대상이 될 수 있다.
  • 실제 극단값이면 보존한 채 강건한 방법이나 별도 분석을 고려한다.
  • 온도 35℃가 여름 실외에서는 정상이고 냉장고 내부에서는 이상일 수 있듯 맥락적 이상값이 있다.
  • 각 변수는 평범해도 변수 조합이 매우 드문 다변량 이상값도 있다.

IQR·z-score·MAD·boxplot 기반 탐지와 계산

IQR 규칙에서 IQR = Q3 - Q1이다. 흔히 다음 범위를 벗어나는 값을 후보 이상값으로 본다.

[Q1 - 1.5×IQR, Q3 + 1.5×IQR]

예를 들어 Q1=10, Q3=20이면 IQR=10, 하한은 -5, 상한은 35다. 값 40은 이 규칙에서 이상값 후보가 된다.

z-score는 z=(x-평균)/표준편차로 계산한다. 평균과 표준편차가 극단값에 민감하므로 극단값이 심한 자료에서는 중앙값과 MAD 같은 강건한 지표를 함께 고려할 수 있다.

R의 boxplot.stats(x)$out도 박스플롯 규칙에 따른 후보 이상값을 확인할 때 쓸 수 있다. IQR·z-score·MAD·boxplot 규칙은 모두 후보를 찾는 규칙이지 자동 삭제 규칙이 아니다.

MAD(median absolute deviation)는 중앙값에서의 절대편차들의 중앙값을 바탕으로 한 강건한 산포 척도다. base R mad()는 기본 보정상수를 곱하지만 constant=1이면 순수 절대편차 중앙값을 확인할 수 있다.

R
mad(c(1, 2, 3, 4, 100), constant = 1)
# [1] 1

또한 boxplot.stats()는 결측값을 이상값 자체로 반환하지 않고 계산에서 제외한다.

R
boxplot.stats(c(1, 2, 3, 4, 100, NA))$out
# [1] 100

삭제·변환·상한처리·강건한 분석과 영향 점검

이상값 처리 방법에는 오류 수정, 제외, 로그 같은 변환, 상·하한 처리(winsorization), 강건한 통계 사용, 별도 집단 분석 등이 있다.

처리 전후로 다음을 비교한다.

  • 표본 수와 집단 비율
  • 평균·중앙값·분산
  • 상관·모델 계수와 성능
  • 실제 중요한 희귀 사례가 사라지지 않았는지

결측·이상값 처리는 데이터 정리 작업이 아니라 분석 결론에 영향을 주는 모델링 결정이다.

복습 문제

답을 생각한 뒤 정답과 근거를 펼쳐 보세요.

01

mean(c(10, NA, 14, 16), na.rm=TRUE)의 값은?

정답과 근거

13.33333(약 13.33)이다. 결측을 제외해 (10+14+16)/3 = 40/3을 계산한다.

본문 예제

예를 들어 Q1=10, Q3=20이면 IQR=10, 하한은 -5, 상한은 35다. 값 40은 이 규칙에서 이상값 후보가 된다.

02

Q1=10, Q3=20일 때 1.5×IQR 규칙의 하한·상한은?

정답과 근거

IQR=10이므로 하한은 -5, 상한은 35다.

본문 예제

예를 들어 Q1=10, Q3=20이면 IQR=10, 하한은 -5, 상한은 35다. 값 40은 이 규칙에서 이상값 후보가 된다.

03

이상값 후보를 찾았다고 바로 삭제하면 안 되는 이유는?

정답과 근거

이상값은 실제 희귀 사건일 수 있고 오류인지 정상 극단값인지 맥락을 확인해야 하기 때문이다. 삭제하면 중요한 신호나 대표성이 사라질 수 있다.

본문 예제

예를 들어 Q1=10, Q3=20이면 IQR=10, 하한은 -5, 상한은 35다. 값 40은 이 규칙에서 이상값 후보가 된다.

04

평균 대체가 데이터의 분산에 줄 수 있는 대표적 영향은?

정답과 근거

같은 대표값을 반복해서 채우므로 일반적으로 변동성을 인위적으로 줄이고 변수 관계를 왜곡할 수 있다.