결손치 의 처리 방법 을 정리했다

  • 제조업 출신 데이터 과학자가 보낸 글
  • 이번에 우리는 평소에 업무 중에 자주 겪는 손실치를 처리하는 방법을 정리했다.
  • 개시하다
    결손치의 발생 메커니즘에 대해 다음과 같이 정리한다.상세한 상황은 생략할 수 있지만 세 종류로 나눌 수 있다.
  • MCAR(Missing Completely At Random)
  • 특정한 값의 결여 확률은 데이터와 전혀 무관하고 완전히 무작위로 결여된다
  • 손실치가 완전히 무작위로 발생하는 경우다.
  • MAR(Missing At Random)
  • 관측된 데이터에서 조문에 특정한 값이 결손 확률이 있을 때 무작위
  • 를 가리킨다
  • MNAR(Missing Not At Random)
  • 어떤 값의 결여 확률은 결여 데이터 자체에 달려 있다
  • 결손치가 있는 경우 먼저 왜 결손치가 발생했는지 자세히 본 다음에 결손치 처리를 해야 한다.
    손실치에 대한 처리 방법
    이번에는 타이타닉호의 데이터를 대상으로 다양한 결손치 보충 방법을 시도해 보려고 한다.
    우선 데이터를 얻어 타이타닉 호의 데이터를 보자.
    # ライブラリーのインポート
    import pandas as pd
    import numpy as np
    import random as rnd
    
    import seaborn as sns
    import matplotlib.pyplot as plt
    %matplotlib inline
    
    from sklearn.ensemble import GradientBoostingRegressor
    
    import warnings
    warnings.simplefilter('ignore')
    
    # データの読み込み(タイタニックデータ)
    df = pd.read_csv('../data/train.csv')
    df.head()
    

    다음은 데이터의 기본 정보를 확인합니다.
    # データの基本情報を確認
    df.info()
    

    Age, Cabin, Embered에 손실이 있다는 것을 알고 있습니다.
    상술한 말은 몇 개의 결손치가 있는지 모르기 때문에 다시 한 번 결손치를 확인한다.
    # 欠損値の確認
    df.isnull().sum()
    

    부족한 값을 확인하는 처리 방법을 위해 이번에는 필요하지 않은 열을 삭제하고, 부족한 값을 확인하기 위해 열 수를 줄일 것입니다.
    #性別の数値変換
    df.loc[(df['Sex'] == 'male'), 'Sex'] = 0
    df.loc[(df['Sex'] == 'female'), 'Sex'] = 1
    
    # 不要なカラムの削除
    df = df.drop(['Name',
                  'Cabin',
                  'Ticket',
                  'SibSp',
                  'Parch',
                  'Embarked',
                  'Fare'],
                 axis=1)
    
    df.head(10)
    

    여섯 번째 행의 Age가 NaN에서 손상되었습니다.
    나는 아래의 각양각색의 손실치 처리 방법을 시험해 보고 싶다.
    목록 방법
    값이 없는 샘플을 삭제하는 방법입니다.
    df_listwise = df.dropna()
    df_listwise.head(10)
    

    방금 존재했던 여섯 번째 줄의 파손 샘플을 삭제했다.
    단일 대입법
    다음은 결손치 부분에 값을 대입하는 방법을 시험해 봅시다.
    평균치 보완
    평균치로 결손치를 보충하다.
    mean = df.mean()
    df_mean = df.fillna(mean)
    df_mean.head(10)
    

    여섯 번째 행의 Age29.699118가 완료되었습니다.이것은 Age의 평균치이며, 평균치로 모든 결손치를 보충한다.
    중치 보완
    다음은 중치로 결손치를 보충한다.
    median = df.median()
    df_median = df.fillna(median)
    df_median.head(10)
    

    여섯 번째 행의 Age28.0가 완료되었습니다.이것은 Age의 중앙값이며, 모든 결손값은 중앙값으로 보충한다.
    회귀 대입법(GBDT)
    다음은 결손 값이 있는 열(이번에는 Age)을 목표 변수로 삼아 회귀 모델을 구축하여 결손 값을 보충하는 방법이다.
    df_master = df.dropna()
    df_miss = df[df.isnull().any(axis=1)]
    model = GradientBoostingRegressor().fit(df_master.drop(["Age","Survived"], axis=1), df_master["Age"])
    df_miss["Age"] = model.predict(df_miss.drop(["Age","Survived"], axis=1))
    
    df_GBDT = pd.concat([df_master, df_miss]).sort_index()
    df_GBDT.head(10)
    

    여섯 번째 행의 Age30.534716가 완료되었습니다.이는 Age 목적 변수로, 변수가'Passengerld, Pclass, Sex'를 사용해 GBDT에서 회귀 모델을 구축한 뒤 6행 Age를 예측한 결과 누락값을 보완했다는 설명이다.
    IterativeImputer를 통한 대입법
    여기서부터 총서를 사용한 결손치 보완 방법을 정리한다.처음에는 다변수 데이터 집합을 대입하는 데 쓰였다.
    from sklearn.experimental import enable_iterative_imputer
    from sklearn.impute import IterativeImputer
    
    imp = IterativeImputer(max_iter=10, random_state=1)
    df_IterativeImputer = pd.DataFrame(imp.fit_transform(df))
    df_IterativeImputer.columns = df.columns
    df_IterativeImputer.head(10)
    

    여섯 번째 행의 Age26.181867가 완료되었습니다.상세한 보전 논리에 관해서 이번 생략은
    KNNImputer의 대입법
    다음은 K인접역법에 따라 결손치를 보충하는 방법이다.
    from missingpy import KNNImputer
    imp = KNNImputer(n_neighbors=2, weights='uniform')
    df_KNN = pd.DataFrame(imp.fit_transform(df))
    df_KNN.columns = df.columns
    df_KNN.head(10)
    

    여섯 번째 행의 Age18.5가 완료되었습니다.이번에 상세한 보완논리를 생략했지만 K인접역법을 활용해 결손치 보완을 했다.
    MissForest를 통한 대입법(랜덤 숲)
    마지막으로 무작위 삼림을 이용하여 결손치를 보충하는 방법이다.
    from missingpy import MissForest
    imp = MissForest(max_iter=10)
    df_MF = pd.DataFrame(imp.fit_transform(df))
    df_MF.columns = df.columns
    df_MF.head(10)
    

    여섯 번째 행의 Age24.9가 완료되었습니다.이번에는 상세한 보완 논리를 생략했지만 랜덤 숲을 이용해 결손치를 보완했다.
    최후
    끝까지 읽어주셔서 감사합니다.
    손실치에 대한 처리 방법은 일부분으로 정리해 봤습니다.결손치 보완 방법에 따라 결과는 완전히 다르다.실제 업무에서 손실치를 처리할 때 발생 메커니즘을 확인한 다음에 적당한 방법으로 손실치를 처리해야 한다.
    수정 요청이 있으면 연락 주세요.

    좋은 웹페이지 즐겨찾기