핵심 요약
결측값의 의미·원인과 삭제·대체 전략, 구조적 결측, 이상값과 오류의 구분, IQR·
본문
결측값의 의미·발생 원인·행/열 단위 진단
결측값은 단순히 0이 아니다. 측정되지 않았거나 기록되지 않았거나 구조상 해당 값이 존재하지 않는 상태를 구분해야 한다.
R에서는 NA로 결측을 표현한다.
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))처럼 계산할 수 있다.
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로 결측을 제외해 계산할 수 있다.
median(c(4, NA, 8, 12), na.rm = TRUE)
# [1] 8
단순 대체가 필요하더라도 집단별 수준 차이가 크고 집단 기준이 신뢰할 수 있다면 전체 평균 하나보다 집단별 대표값을 검토할 수 있다. 또한 -999처럼 업무 명세에서 ‘측정 실패’를 뜻하는 센티널 값은 실제 수치로 평균에 넣지 말고 먼저 NA로 표준화한 뒤 정한 결측 처리 규칙을 적용한다.
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·
MAD(median absolute deviation)는 중앙값에서의 절대편차들의 중앙값을 바탕으로 한 강건한 산포 척도다. base R mad()는 기본 보정상수를 곱하지만 constant=1이면 순수 절대편차 중앙값을 확인할 수 있다.
mad(c(1, 2, 3, 4, 100), constant = 1)
# [1] 1
또한 boxplot.stats()는 결측값을 이상값 자체로 반환하지 않고 계산에서 제외한다.
boxplot.stats(c(1, 2, 3, 4, 100, NA))$out
# [1] 100
삭제·변환·상한처리·강건한 분석과 영향 점검
이상값 처리 방법에는 오류 수정, 제외, 로그 같은 변환, 상·하한 처리(winsorization), 강건한 통계 사용, 별도 집단 분석 등이 있다.
처리 전후로 다음을 비교한다.
- 표본 수와 집단 비율
- 평균·중앙값·분산
- 상관·모델 계수와 성능
- 실제 중요한 희귀 사례가 사라지지 않았는지
결측·이상값 처리는 데이터 정리 작업이 아니라 분석 결론에 영향을 주는 모델링 결정이다.
복습 문제
답을 생각한 뒤 정답과 근거를 펼쳐 보세요.
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은 이 규칙에서 이상값 후보가 된다.
Q1=10, Q3=20일 때 1.5×IQR 규칙의 하한·상한은?
정답과 근거
IQR=10이므로 하한은 -5, 상한은 35다.
예를 들어 Q1=10, Q3=20이면 IQR=10, 하한은 -5, 상한은 35다. 값 40은 이 규칙에서 이상값 후보가 된다.
이상값 후보를 찾았다고 바로 삭제하면 안 되는 이유는?
정답과 근거
이상값은 실제 희귀 사건일 수 있고 오류인지 정상 극단값인지 맥락을 확인해야 하기 때문이다. 삭제하면 중요한 신호나 대표성이 사라질 수 있다.
예를 들어 Q1=10, Q3=20이면 IQR=10, 하한은 -5, 상한은 35다. 값 40은 이 규칙에서 이상값 후보가 된다.
평균 대체가 데이터의 분산에 줄 수 있는 대표적 영향은?
정답과 근거
같은 대표값을 반복해서 채우므로 일반적으로 변동성을 인위적으로 줄이고 변수 관계를 왜곡할 수 있다.