본문 바로가기

머신러닝/[기타]

결측치(Missing Value) 처리

데이터를 다루다보면 필연적으로 결측치(Null, NaN, Na 등)를 만나게 됩니다.
학습초기에는 그저 이렇게하면 되지 않을까 싶은데로 데이터를 처리해왔었는데
관련된 가이드라인이 있어 정리하고자 합니다.

결측치의 처리는 대개 아래의 과정을 쫓게됩니다.

  1. 결측치 유형 파악
  2. 결측치 유형에 따른 처리 방법 선택

1.결측치 유형 파악

우선, 결측치는 아래 3개의 종류으로 분류됩니다.

  • 완전 무작위 결측(MCAR: Missing Completely At Random)
    : X1, X2, X3라는 특성이 있다고 가정합시다. 이 때, X2열의 결측치가 X1, X2, X3열의 다른 값들과 아무런 상관관계가 없을 경우, 이를 완전 무작위 결측이라고 합니다. 대부분의 결측치 처리 패키지는 이러한 유형의 결측치를 대상으로 하고 있으며, 데이터를 입력한 이가 실수를 했거나, 전상상의 에러가 난 경우입니다.
  • 무작위 결측(MAR: Missing At Random)
    : X1, X2, X3라는 특성이 있다고 가정합시다. 이 때, X1이 True인 경우, X2는 결측치를 갖고, X1이 False인 경우, X2는 값을 가진다면, 다시 말해 다른 특성의 값에 따라 결측치의 발생 확률이 계산된다면, 그러나 값자체의 상관관계는 알 수 없는 경우. 이를 무작위 결측이라 합니다.
  • 비무작위 결측(NMAR: Not Missing At Random)
    : 위의 두가지 유형이 아닐 때, 비무작위 결측이라 합니다. 이 경우 결측치가 일어난 특성(X2)의 값이 다른 특성(X1)의 값과 상관관계가 있습니다.

예를 들어 정리하겠습니다.
성별(X)을 사용해 체중(y)을 예측하는 모델을 구축하기 위해, 설문조사를 통해 Xy DataFrame을 구성했는데 y열에 결측치가 있다고 가정합시다.

  • 단순히 그냥. 체중을 응답하지 않았던 경우입니다. 즉, y가 누락된 이유는 다른 X, y값들과는 관련이 없습니다. 따라서 이는 완전 무작위 결측입니다.
  • 여성(X)의 경우 체중에 잘 응답하지 않습니다. 즉 y가 누락된 것은 성별(X)에 영향을 받습니다. 따라서 이는 무작위 결측입니다.
  • 체중이 무거운 사람들은 자신의 체중을 잘 응답하지 않습니다. 즉 y가 누락된 것은 y자체에 영향을 받습니다. 따라서 이는 비무작위 결측입니다.

단어들은 굉장히 어렵지만 사실 그냥 사람이 생각하면 당연히 저런 분류로 나눌 수 있게 됩니다. 개인적인 생각으로는 결국 데이터를 받고 얼마나 정성들여 프리뷰를 하고 다음 단계를 넘어가느냐가 최종 데이터의 완성도를 결정짓는 것 같습니다

데이터의 종류를 판단했다면 다음으로는

  1. 결측치의 비율이 어느 정도인가?
  2. 결측치가 특정 변수에 집중되어있는가? 또는 확산되어있는가?
    를 추가적으로 알아보고, 이에 따라 다음 단계로 넘어가면 되겠습니다.

2. 결측치 유형에 따른 처리 방법 선택

결측치에 대한 충분한 해석이 이루어졌다면, 해당 특성을 아예 삭제할 것인지, 새로운 특성으로 변환할 것인지, 기존 특성을 유지하면서 결측치를 치환할 것인지를 판단해야하며, 비율에 따라서는 다음 표와 같이 처리할 수 있습니다.

결측치 비율 처리 방법
10% 미만 제거 또는 치환
10% 이상 20% 미만 모델 기반 처리
20% 이상 모델 기반 처리

- 제거

결측치가 발생한 행 또는 열 삭제해버리는, 가장 쉽고, 단순한 방식입니다. 그러나 당연하게도, 이런 방식은 데이터의 손실(=표본 크기의 축소)로 이어집니다. 또한 경우에 따라 결측값을 무시하고 관측치만으로 분석을 시행할 경우 통계적 편향이 생길 가능성이 커지기에 조심히 시행되어야합니다.

- 치환(합리적 접근)

말 그대로 결측치를 적당한 방법으로 대체하는 것입니다. 데이터의 특성에 맞게 적당한 평균, 중간값, 최빈값 등으로 채울 수도 있으며, 다른 특성과 상관관계가 있을 경우 그에 맞는 값을 넣어 줄 수도 있습니다. (그러나 평균값 등으로 단순 대체하는 방법은 자료의 편향성을 높이고 특성들간의 상관관계를 왜곡할 수 있는 가장 안좋은 방법입니다.) 가령 월급특성에 결측치가 있는데 연봉특성에는 값이 있는 경우 월급 결측치를 채우는 것이 수월할 것입니다. 이런 합리적 접근을 통한 치환 방법은 데이터에 대한 어느정도의 도메인 지식이 있는 경우 굉장히 효율적으로, 그리고 정확하게 작동할 수 있습니다. 다만, 빅데이터의 경우 특성 자체가 굉장히 다양하고, 복잡하게 엉켜있기에 쉬이 처리할 수는 없습니다.

- 모델 기반 처리

결측치를 예측하는 새로운 모델을 구성하고, 이를 기반으로 결측치를 채워나가는 방식입니다. 변수의 특성에 따라 Knn, PolyRegression 등의 방법을 시행할 수도 있고, R 프로그램 패키지로 유명한 Mice 함수를 사용할 수 있습니다. 해당 처리 방식의 내용은 굉장히 복잡하기에, 추후 따로 정리할 수 있도록 하겠습니다.