오늘의 인기 글
최근 글
최근 댓글
Today
Total
12-21 08:06
관리 메뉴

우노

[ML] Data Preprocessing - Missing Value (결측치 처리) 본문

AI/Machine Learning

[ML] Data Preprocessing - Missing Value (결측치 처리)

운호(Noah) 2020. 8. 11. 17:17

결측치란?

  • 대부분의 머신러닝 알고리즘은 Missing feature, 즉 누락된 데이터가 있을 때, 제대로 역할을 하지 못합니다. 그래서 먼저 Missing feature에 대해 처리해주어야 합니다.
    • Missing feature, NA(Not Available) : '결측치'라고 하며 값이 표기되지 않은 값

결측치의 종류

  • Random : 패턴이 없는 무작위 값
  • No Random : 패턴을 가진 결측치

결측치 처리 전략

  • 제거 (Deletion)
  • 대치 (Imputation)
  • 예측 모델 (Prediction model)

결측치 확인

  • 결측치 여부 확인

      df["col"].isnull()
  • 결측치 개수 확인

      df["col"].isnull().value_counts()

제거 (Deletion)

  • 결측치의 특성이 '무작위로 손실' 되지 않았다면, 대부분의 경우 가장 좋은 방법은 제거하는 것이다.

  • 제거하는 방식은 목록 삭제(Listwist) 단일값 삭제(Pairwise) 방식으로 다시 구분된다.

  • 사용함수 : dropna()

    • pandas에서 제공하는 Na/NaN과 같은 누락 데이터를 제거하는 함수입니다.
    • axis: 파라미터 값으로 0을 주면 행 제거, 1을 주면 열 제거입니다. default값은 0입니다.
    • subset: array, 특정 feature를 지정하여 해당 Feature의 누락 데이터 제거가 가능합니다.
  • 목록삭제(Listwise)

    • 결측치가 있는 행은 전부 삭제

        df = df.dropna()
    • 결측치가 있는 열은 전부 삭제

        df = df.dropna(axis = 1)
  • 단일값 삭제(Pairwise)

    • 행 전체가 결측치인 행만 삭제

        df = df.dropna(how = 'all')
    • 행의 결측치가 2개 초과인 행만 삭제

        df = df.dropna(thresh = 2)
    • 특정 열들중에 결측치가 있을 경우에 해당 행을 삭제

        df = df.dropna(subset=['col1', 'col2', 'col3'])
      
        # 특정열 모두가 결측치일 경우 해당 행 삭제
        df = df.dropna(subset=['col1', 'col2', 'col3'], how = 'all')
      
        # 특정열에 1개 초과의 결측치가 있을 경우 해당 행 삭제
        df = df.dropna(subset=['col1', 'col2', 'col3'], thresh = 1 )
  • 결측치 삭제 상태 바로 적용하기

    • 결측치를 제거한 상태를 함수 사용 시에 바로 적용하려면 inplace 옵션을 True로 설정해주면 따로 데이터프레임을 지정해서 저장하지 않고도 바로 적용된다.

        df.dropna(inplace = True)

대치 (Imputation)

  • 결측치를 특정 값으로 대치하는 것이다.

  • 대치 값 종류

    • 최빈값(mode)
      • 범주형에서 결측값이 발생시, 범주별 빈도가 가장 높은 값으로 대치한다.
    • 중앙값(median)
      • 숫자형(연속형)에서 결측값을 제외한 중앙값으로 대치방법
    • 평균(mean)
      • 숫자형(연속형)에서 결측값제외한 평균으로 대치방법
    • Similar case Imputation
      • 조건부 대치
    • Generalized Imputation
      • 회귀분석을 이용한 대치
  • 사용함수 : fillna(), replace(), interpolate()

    • pandas에서 제공하는 누락 데이터에 특정 값을 채우는 함수이다.
    • 각 함수의 기준에 맞게 NaN 값을 지정한 값으로 바꾸는 역할을 하게 된다.
  • fillna()

    • 전체 결측치를 특정 단일값으로 대체하기

        df.fillna(0)
    • 특정열에 결측치가 있을 경우 다른 값으로 대체하기

        # 0으로 대체하기
        df['col'] = df['col'].fillna(0)
      
        # 컬럼의 평균으로 대체하기
        df['col'] = df['col'].fillna(df['col'].mean())
    • 결측치 바로 이전 값으로 채우기

        df.fillna(method = 'pad')
    • 결측치 바로 이후 값으로 채우기

        df.fillna(method = 'bfill')
  • replace()

      # 결측치 값을 -50으로 채운다.
      df.replace(to_replace = np.nan, value = -50)
  • interpolate()

    • interpolate는 인덱스를 무시하고 값들을 선형적으로 같은 간격으로 처리하게 된다.

        df.interpolate(method = 'linear' , limit_direction = 'forward')

예측 모델 (Prediction model)

  • 예측 기법을 사용한 결측치 추정은 결측치들의 특성이 패턴을 가진다고 가정하고 진행하게 된다.
  • 결측값이 없는 컬럼들로 구성된 dataset으로 결측값이 있는 컬럼을 예측한다.
  • 회귀 분석 기술을 활용하거나 SVM과 같은 기계 학습 방법 또는 이러한 결측치를 채우는 데이터 마이닝 방법과 같은 다양한 통계 방법이 있다.

결측치 처리 가이드 라인

  • 10% 미만
    • 삭제 or 대치
  • 10% ~ 50%
    • regression or model based imputation
  • 50% 이상
    • 해당 컬럼(변수) 자체 제거
Comments