본문 바로가기
Python

2/6 - 머신러닝모델링; 데이터 전처리_이상치(Outlier) 처리 방법

by PETRA_94 2024. 2. 6.

[기억할 개념]

1. 이상치(Outlier)란: 보통 관측된 데이터 범위에서 많이 벗어난 아주 작은 값 혹은 큰 값

1-1. Extreme Studentized Deviation(ESD) 이용

#최대값, 최소값 확인
print(upper_limit, lower_limit)

#값 비교
tips_df[['total_bill']].head(3)

#이상치 확인 (아래 조건에 부합=True 값만 추출)
cond = (tips_df['total_bill'] > 46.4)
cond

tips_df[cond]

1-2. IQR(Inter Quantile Range)를 이용

#이상치 확인 (상한값 40.29보다 큰 값만 추출)
cond2 = (tips_df['total_bill'] > uppner_limit2)
tips_df[cond2]

 

2. 결측치: 존재하지 않는 데이터(N/A)

2-1. 사용 함수

  • 간단한  삭제 & 대치
    df.dropna(axis = 0) : 행 삭제 
    df.dropna(axis = 1) : 열 삭제
  • Boolean Indexing
    df.fillna(value) : 특정 값으로 대치(평균, 중앙, 최빈값) 
  • 알고리즘을  이용
    sklearn.impute.SimpleImputer :평균, 중앙, 최빈값으로 대치
    SimpleImputer.statistics_  : 대치한 값 확인 가능 
    sklearn.impute.IterativeImputer : 다변량대치(회귀  대치) 
    sklearn.impute.KNNImputer : KNN 알고리즘을  이용한  대치
titaninc_df.info()

#행 삭제
titaninc_df.dropna(axis = 0.info()

#isna()는 t/f 표시 => 데이터에 적용하면 N/A값만 추출
cond3 = (titaninc_df['Age'].isna())
titaninc_df[cond3]

#notna()는 t/f 표시 => 데이터에 적용하면 비어있지 않은 값만 추출
cond3 = (titaninc_df['Age'].notna())
titaninc_df[cond3]

#fillna를 이용한 빈 값 대치
age_mean = titaninc_df[['Age']].mean().round(2)
titaninc_df['Age_mean'] = titaninc_df['Age'].fillna(age_mean)

#simpleimputer를 이용한 대치
from sklearn.impute import SimpleImputer
si = SimpleImputer()
si.fit(titaninc_df[['Age']])

si.statistics_

titaninc_df['Age_si_mean'] = si.transform(titaninc_df[['Age']])
titaninc_df.info()

 

[배운 점]

  • 데이터 전처리가 생각보다 과정이 길다. 수강도 길고, 코드 적용도 길다.
  • 바로 프로젝트에 적용해야 해서 강의 들으면서 따라 적고 있는데, 감이 아직 덜 잡힌 듯 하다. (프로젝트에서 바로 실습하면서 헤딩해야 할 듯.)
  • 이번 심화 프로젝트는 주제가 정해져 있어, 데이터셋만 구하면 된다.
  • 개인적인 바람으로는 도메인까지 엮어서 해보라고 고지해주길 바랐건만, 아무래도 나 같이 명확한 목표와 계획을 가진 수강생들이 극히 드물기에, 도메인으로만 팀 배정을 한 것 같다. 그냥 데이터 분석에 집중하라고 함. (이 부분이 상당히 아쉬움.)
  • 그래도 이번 프로젝트는 데이터 분석에 집중되어 있는만큼 포폴에 데이터 분석 측면으로 한 꼭지 넣을 수 있을 것 같다.
  • 자격증 공부도 해야 하는데 수강할 게 너무 많아서 살짝 벅차긴 하다.