ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [파이썬] 결측값 처리하는 6가지 방법 (fillna, SimpleImputer)
    파이썬 배우기 2023. 11. 22. 17:42

    오늘은 결측값 처리하는 법에 대해 소개하려합니다.

    결측값을 처리해야하는 이유는 결측값이 많으면 데이터의 특성을 제대로 파악하기 어려워서 잘못된 인사이트를 도출하게 되고, 모델을 학습시킬 때 모델의 성능이 크게 저하되어 잘못된 결과를 도출하기 때문입니다. 비즈니스에서 적용시에는 도메인과 데이터의 특성에 따라 결측치 처리하는 법을 논의 후 의사결정하시고 적용하시면 됩니다. 

     

    [결측값 처리하는 법]

    1. 결측값이 있는 행 삭제

    2. 의미있는 값으로 직접 채워넣기

    3. 주변 값들로 대체

    4. 대표값으로 채워넣기

    5. 그룹별 대표값으로 채워넣기

    6. 사이킷런의 SimpleImputer 함수 사용하여 대표값으로 대체

     

    1. 결측값이 있는 행/열 삭제 - 가장 정확한 방법일 수 있지만, 가장 위험할 수도 있습니다. 결측치의 비중에 따라 삭제할지, 채워넣을지 고민해야합니다.

    # 결측값 비중 확인하기
    train.isna().sum()/len(train)
    
    # 결측값이 있는 행 삭제
    train.dropna()
    
    # 결측값이 있는 열 삭제
    train.dropna(axis = 1)

    * dropna 파라미터 종류 설명
    - axis : 0이면 행이 삭제되고, 1이면 열이 삭제된다.
    - how : 'any' 이면 하나라도 결측이면 삭제, 'all'이면 모든 값이 결측일 때 삭제
    - thresh : 임계치를 설정해서, 임계치 이상의 결측치를 가지고 있는 행/열 삭제
    - subset : 원하는 컬럼내 있는 결측값만 확인하여 처리
    - inplace : 기본은 False 이며, True 바꾸면 원본에 바로 적용

     

    2. 비즈니스적으로 의미가 있거나 원인을 알고 있다면, 기준에 따라 직접 채워넣기

    # 비어있는 값의 의미가 있다면, 예를 들어 점수가 0점이거나 미응시거나 등
    train['score'].fillna(0)
    train['score'].fillna('미응시')

     

    3. 주변 값들로 대체 fillna()

    # 앞 데이터로 채우기
    train.fillna(method = 'ffill') # ffill 또는 pad
    
    # 뒤 데이터로 채우기
    train.fillna(metod = 'bfill') # bfill 또는 backfill
    
    # 앞과 뒤 행의 평균값으로 보간
    train.fillna(df.interpolate())

     

    4. 대표값으로 채워넣기

    # 열의 평균값으로 채워넣기
    train.fillna(train.mean()) 
    
    # 열의 중위값으로 채워넣기
    train.fillna(train.median())

     

    5. 그룹별 대표값으로 채워넣기 : groupby + apply + lambda

    # 결측치 대체값 확인용
    train.groupby('gender').mean()
    
    # 그룹별 평균값으로 대체
    train.groupby('gender').apply(lambda x:x.fillna(x.mean())

     

    6. 사이킷런의 SimpleImputer 함수 사용하여 대표값으로 대체

    from sklearn.impute import SimpleImputer
    
    mean_imp = SimpleImputer(strategy= 'mean')
    train['score'] = mean_imp.fit_transform(train[['score']]).ravel()
    
    # fit_transform 은 strategy를 기준으로 계산하는 fit과 결측치를 채워주는 transform가 합쳐진 것입니다.
    # 위 코드와 아래 코드는 동일하다
    # mean_imp = SimpleImputer(strategy= 'mean')
    # mean_imp.fit(train['score'])
    # train['score'] = mean_imp.transform(train['score'])
    
    # 참고 : ravel() 은 다차원 배열(array)을 1차원 배열로 평평하게 펴주는 NumPy 함수

    * SimpleImputer 파라미터 종류 설명

    - missing_values : 어떤 값을 결측치라고 할 것인가. (np.nan가 디폴트이지만, 데이터셋에 따라 -1, 999, 빈칸 등 다양하다)

    - strategy : 채울 값에 대한 기준이 되는 함수 (mean, median, most_frequent, constant(임의의 지정값))

    - fill_value : strategy='constant' 일 때 어떻게 지정할지 부여

     



Designed by Tistory.