공부/AIFFEL

FUNDAMENTAL 14. 다양한 데이터 전처리 기법

dong_dong_2 2021. 1. 29. 17:31

1. 결측치
    - 결측치를 처리하는 방법은 크게 두 가지가 있다.
       1) 결측치가 있는 데이터를 제거한다.
       2) 결측치를 어떤 값으로 대체한다. : 대체하는 방법은 다양하니 데이터마다 특성을 반영하여 해결한다.
    - 결측치 여부를 살펴보기 : 전체 데이터 건수(len(data))- 컬럼별 값이 있는 데이터 수(data.count())

    - 만약 결측치가 있어서 해당 컬럼을 제거한다면 data.drop("colname", axis = 1)을 사용한다.

    - data.isnull() : 데이터마다 결측치 여부를 bool형식으로 반환한다.

    - data.any(axis = 1) : 행마다 하나라도 True가 있으면 True, 그렇지 않으면 False를 반환한다.

    - 위 두가지 메서드를 조합하여 결측치가 하나라도 있는 행을 찾을 수 있다. : data.isnull().any(axis = 1)

    - data.dropna(how = "all", subset = [list], inplace = True) : 결측치를 삭제해주는 메서드

       1) how : 선택한 컬럼 전부가 결측치인 행을 삭제하겠다는 의미의 "all", 하나라도 결측치인 경우의 "any"를 쓴다
       2) subset : 특정 컬럼들을 선택한다.
       3) inplace : 해당 data 원본에 바로 적용시키려면 True, 원본을 보존하고 복사본을 만드려면 False
    - 결측치가 수치형 데이터 컬럼인 경우
       1) 결측치를 특정 값을 지정해줄 수 있다. 그러나 결측치가 많은 경우, 모두 같은 값을 넣는다면 분산이 실제보다 작아진다는 문제가 발생할 수 있다.
       2) 평균, 중앙값 등으로 대체할 수 있다. 특정값으로 대체했을 때와 마찬가지의 문제가 발생할 수 있다.
       3) 다른 데이터를 이용해 예측값으로 대체할 수 있다.
       4) 시계열 특성을 가진 데이터의 경우 앞 뒤 데이터를 통해 결측치를 대체할 수 있다.
    - 결측치가 범주형 데이터 컬럼인 경우 : 수치형일 때와 유사하다.
       1) 특정 값을 지정해줄 수 있다.
       2) 최빈값 등으로 대체할 수 있다.
       3) 다른 데이터를 이용해 예측값으로 대체할 수 있다.
       4) 시계열 특성을 가진 데이터의 경우 앞 뒤 데이터를 통해 결측치를 대체할 수 있다.

2. 중복된 데이터
    - 같은 값을 가진 데이터 없이 행별로 값이 유일해야 한다면 중복된 데이터를 제거해야 한다.

    - data.duplicated() : 중복된 데이터 여부를 bool값으로 반환해준다.

    - data.drop_duplicates(subset = [list], keep = "first") : 중복된 데이터를 삭제할 수 있다.

       1) subset : 특정 컬럼들을 선택한다.
       2) keep : 중복이 있는 경우 첫 번째를 제외하고 중복을 삭제하려면 "first", 마지막을 제외하고 중복을 삭제하려면 "last", 모든 중복을 삭제하려면 "False"를 쓴다.

3. 이상치(Outlier)
    - 이상치란 대부분 값의 범위에서 벗어나 극단적으로 크거나 작은 값을 의미한다.
    - z score : 평균과 표준편차를 이용하는 방법이다. 평균을 빼주고 표준편차로 나눠 계산한다. ((데이터 - 평균) / 표준편차)
    - IQR(Interquartile range, 사분위범위수) : IQR = Q3 - Q1
       1) (Q1 - (1.5 * IQR))보다 작은 수가 있거나, (Q3 + (1.5 * IQR))보다 큰 수가 있으면 이상치라 판단한다.
    - z score의 단점 : 평균과 표준편차 자체가 이상치의 존재에 크게 영향을 받고, 작은 데이터셋일 경우 이 방법으로 이상치를 알기 어렵다.

4. 정규화(Normalization)
    - 컬럼간의 범위(또는 단위)가 크게 다를 경우 정규화를 해준다.
    - 정규화 방법은 다양하나, 가장 잘 알려진 표준화(Standarddization)와 Min-Max Scaling을 알아본다.
    - Standardization : 데이터의 평균을 0으로, 분산은 1로 변환해준다. ((데이터 - 평균) / 표준편차)
    - Min-Max Scaling : 데이터의 최솟값은 0으로, 최댓값은 1로 변환해준다. ((데이터 - 최솟값) / (최댓값 - 최솟값))
    - train 데이터와 test 데이터가 나눠져 있는 경우 train 데이터를 정규화시켰던 기준 그대로 test 데이터도 정규화 시켜줘야 한다.
    - scikit-learn패키지의 standardscaler, minmaxscaler를 사용하는 방법도 있다.

5. 원-핫 인코딩(One-Hot Encoding)
    - 원-핫 인코딩이란 카테고리별 이진 특성을 만들어 해당하는 특성만 1 나머지는 0으로 만드는 방법이다.
    - pandas에서 get_dimmies 함수를 통해 쉽게 원-핫 인코딩을 할 수 있다.

6. 구간화(Binning)
    - 데이터를 구간별로 나누고자 할 때 구간화(Data binning, bucketing)을 한다.

    - pandas의 cut과 qcut을 이용해 구간화를 할 수 있다.

       1) cut : 데이터와 구간을 입력하면 데이터를 구간별로 나눠준다. ex) pd.cut(data, bins = ) : bins에는 특정 구간을 지정하거나 구간의 갯수를 지정할 수 있다.

       2) qcut : 구간을 일정하게 나누는 것이 아니라 데이터의 분포를 비슷한 크기의 그룹으로 나눈다. ex) pd.qcut(data, q = )

    - 구간별로 값이 몇 개인지는 value_counts()로 확인할 수 있다. ex) pd.cut().value_counts().sort_index()