[Basic] 데이터 정제 - 결측값 처리

고보·2024년 2월 5일

1 결측값(누락값)

1-1 numpy

import numpy as np

  • 수학, 과학 연산 위한 라이브러리

1-2 결측값 개념

  • NaN(Not a Number), NAN, nan 모두 결측값으로 읽는다.
  • 결측값은 0, ''와 다른 개념. 데이터 자체가 없다는 의미.
  • 따라서 '같다'는 개념도 없다. 비교할 값 자체가 없으므로, 비교를 하면 모두 False.
np.NaN == True #False
np.NaN == False #False
np.NaN == 0 #False
np.NaN == np.NaN #False 자신과 비교해도 비교값이 없으므로
  • 결측값이 하나라도 있는 값과의 연산은 NaN.
    => 무조건 처리 해야 한다. 안그러면 데이터 계속 손상.
  • 결측값의 데이터형은 float이다. 결측값 밖에 없는 컬럼이나 시리즈는 데이터타입 float.
  • 결측값을 확인하는 메서드
    df.isnull() => pd.isnull(df)도 가능.
  • df.isna(), df.notna()도 똑같은 기능.

1-3 결측값이 생기는 원인

  • 1) 데이터를 불러올 때 그 데이터 자체에 있는 결측값
  • 2) 결측값이 있는 데이터 집합을 연결.
    예를 들면, merge를 하는데 좌측에 결측값이 1개 있고, 우측에 그 결측값과 연결되는 행이 4개 있으면 결측값이 4개로 늘어남.
  • 3) 데이터를 입력할 때
  • 4) 범위 지정해서 데이터 추출할 때
    • ex)데이터가 2002, 2004, 2006 이렇게 있는데 데이터를 2000~2007 모든 연도로 늘릴 때

2 결측값 다루기

  • 기본적인 방법
    • 다른 값으로 바꾸기
    • 기존 데이터 채우기
    • 아예 삭제

2-1 데이터 불러올 때 쓰는 메서드

  • pd.read_csv(visited_file, keep_default_na=False)
    keep_default_na를 False로 설정하면 누락값으로 읽는 각종 값들('', 'NA', 'NULL' 등)을 누락값으로 처리하지 않는다
  • pd.read_csv(visited_file, na_values=[''], keep_default_na =False)
    이렇게 na_values=[]로 지정을 하면, 이건 결측값으로 읽음. keep_default_na가 있더라도.

2-2 결측값 개수 구하기

  • df.count(): 칼럼 별로 결측값이 아닌 값 개수 구한다 => 행 수df.shape[0]에서 빼면 된다.
  • np.count_nonzero(df[칼럼이름].isnull()): isnull은 null인 것만 true. count_nonzero는 0이 아닌 것의 갯수만 세고, true는 1이고 False는 0. 칼럼 이름 빼면 df 전체에서 갯수 센다.
  • df[칼럼이름].isnull().sum(): isnull은 True로 1이기 때문에 합치면 갯수 나온다.
  • df[칼럼이름].isna().sum(): 위와 같다.
  • df.열이름.value_counts(dropna=False): 지정한 열에서 각 값의 빈도를 구하는 메서드. dropna=False로 하면 NaN 값도 센다. default는 True.

2-3 결측값 대체하기

  • df.fillna(0): fillna를 쓰면 결측값 모두 찾아 지정한 값으로 대체. 여기선 0.
    • df.fillna(method='ffill'): 위의 값으로 아래 값을 채움. 따라서 0행이 NaN이면 안채워짐.
    • df.fillna(method='bfill'): 아래 값으로 위의 값을 채움. 따라서 마지막 행이 NaN이면 안채워짐.
  • df.interpolate(): 보간법으로 채우기. 결측값 양쪽에 있는 값의 중간값으로 채운다. 보간하는 방법 다양.
  • df.replace(np.NaN, 0) NaN을 0으로 대체.
    df.replace([원래값1, 원래값2], [새값1, 새값2])
    df.replace({원래값1: 새값1, 원래값2: 새값2)
    df.replace({열이름:원래값}, 새값)
    df.replace({열이름1: {원래값1:새값1}, 열이름2: {원래값2:새값2}})
    등으로 사용 가능

2-4 결측값 삭제

  • df.dropna(subset=['열이름'], axis=1, how='all', inplace=True): NaN이 포함된 걸 모두 지운다. axis=1 열을, axis=0은 행을. all은 모두 NaN인 경우. 디폴트는 1개라도 있으면.
    => 데이터 엄청 손상되서 쓸 데이터가 안남는다.
    subset=[]로 하면 해당 열에서 NaN 이 있는 경우만 삭제

3 기타

  • df[열이름].sum(skipna=True): skipna=True로 되면 결측값 무시하고 남은 걸로만 계산. default가 True. 이게 False인 상태로 안에 결측값 있으면 결측값 포함 연산으로 NaN이 된다.
profile
일본에서 일하는 게임 기획자. 시시해서 죽어버리지 않게, 재밌고 의미 있는 컨텐츠에 관심 있습니다. 그 도구로 데이터, AI도 찝적댑니다.

0개의 댓글