데이터 전처리

jh_k·2023년 2월 6일
0

데이터 분석

목록 보기
1/17

이상치

  • 이상치를 확인하는 방법은 여러가지가 존재한다.
  • 일반적인 수치형 변수의 경우에는 IQR 방식을 이상치 판단 기준으로 사용할 수 있다.
  • IQR(Inter Quantile Range)방식은 시각화에서 사용한 Boxplot의 이상치 결정 방법을 그대로 사용한 것이다.
  • IQR의 값을 구하는 방법은 Q3(제3사분위수)와 Q1(제1사분위수)의 차이의 값을 말한다.
  • 이상치의 경계는 (Q3 + 1.5 IQR)보다 크거나 (Q1 - 1.5 IQR)보다 작은 범위를 이상치로 간주한다.
  • IQR를 이용한 방법은 많은 데이터를 이상치로 간주할 위험이 존재한다.
  • 무조건 1.5 * IQR 규칙을 사용하기 보다는 데이터의 유형을 살펴보고 필요에 따라 곱하는 값을 조정하는것도 좋은 방법이다.

실습

  1. 사이킷런의 wine 데이터를 로드하여 "color_intensity" 컬럼의 이상치를 IQR 방식으로 확인해보자
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import load_wine
import numpy as np
## wine 데이터를 로드하여 데이터프레임화
wine_load = load_wine()
wine = pd.DataFrame(wine_load.data, columns=wine_load.feature_names)
wine.head()
## wine target을 class 컬럼에 삽입
wine['Class'] = wine_load.target
## map 함수를 이용하여 데이터의 값을 변환
wine['Class'] = wine['Class'].map(
    {
        0 : 'class_0', 
        1 : 'class_1', 
        2 : 'class_2'
    }
)
wine['Class'].value_counts()
## matplotlib 라이브러리의 boxplot을 이용하여 이상치 확인
plt.boxplot(wine['color_intensity'])
plt.show()
## 이상치를 출력하는 함수 생성
## 매개변수 2개 데이터 프레임, 컬럼의 이름
def outliers_iqr(df, col):
    quartile_1, quartile_3 = np.percentile(df[col], [25, 75]) # (25% , 75%) 의 값
    iqr = quartile_3 - quartile_1
    # 하단 경계 값, 상단 경계 값
    lower_whis = quartile_1 - (1.5 * iqr)
    upper_whis = quartile_3 + (1.5 * iqr)
    outliers = df[(df[col] > upper_whis) | (df[col] < lower_whis)]
    ## 데이터 프레임 형태로 return
    return outliers[[col]]
outliers = outliers_iqr(wine, 'color_intensity')
outliers

이상치의 정제

  1. 이상치의 제거
    • 데이터의 수가 매우 많고 이상치가 존재하는 행이 전체 데이터의 비해 많지 않을 경우는 이상치를 제거할 수 있다.
  2. 이상치의 대체
    • 이상치를 다른 값으로 대체하여 사용하는 방법이다.
## 이상치 제거 
drop_outliers = wine.drop(outliers.index,axis=0)
print("원본 데이터의 크기 :", wine.shape)
print("이상치 제거한 데이터의 크기 :", drop_outliers.shape)
## 이상치 대체
## 이상치를 결측치로 변경 후 결측치를 채워넣는 방식을 추천
wine.loc[outliers.index, 'color_intensity'] = np.NaN

##결측치의 값을 color_intensity의 평균값으로 대체
wine['color_intensity'] = wine['color_intensity'].fillna(wine['color_intensity'].mean())
wine.loc[outliers.index, 'color_intensity']
profile
Just Enjoy Yourself

0개의 댓글