-
[Pandas] 이상치 확인, 이상치 처리하기 :: Z-score 방법, IQR 방법직접 해보기/Python 2024. 7. 1. 15:41728x90반응형
✅ 이상치 (Outlier)
이상치 (Outlier) • 관측된 데이터의 일반적인 범위에서 많이 벗어난 값, 즉 너무 작은 값이나 너무 큰 값
• 기준을 정해서 이상치를 처리하는 것은 필수! 이상치가 모델링 및 의사결정에 영향을 미칠 수 있기 때문.Z-score 방법 • 평균값 기반으로 이상치를 탐지하는 방법
• 평균, 표준편차를 이용해서 특정 데이터가 평균값으로부터 얼마나 멀리 떨어져있는지 계산
→ 특정 임계값을 넘어가면 이상치로 판단
IQR 방법 • 중앙값 기반으로 이상치를 탐지하는 방법
• 사분위수, IQR을 이용해서 특정 데이터가 중앙값으로부터 얼마나 멀리 떨어져있는지 계산
→ 박스플롯의 최솟값, 최댓값을 넘어가면 이상치로 판단
0️⃣ 패키지 & 데이터프레임 불러오기
- 예시가 될 데이터셋은 Kaggle에서 가져온 Flight Price Prediction 입니다.
# 패키지 불러오기 import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns # 데이터셋 불러오기 df = pd.read_csv('./Clean_Dataset.csv', encoding='cp949') df = df.drop([df.columns[0]], axis=1)
1️⃣ Z-score 방법
- Z-score 방법으로 이상치를 탐지하고 처리하는 방법은 아래와 같습니다.
(1) 각 데이터의 Z-score 계산 데이터를 표준화(Standardization) 즉, 평균=0 표준편차=1인 정규분포에 매핑시킴. (2) Z-score가 임계값을 넘어가는지 판단 일반적으로 Z-score의 절댓값이 2~3보다 크면 이상치로 판단함. - 아래는 Z-score 방법으로 이상치를 삭제하는 함수입니다. 임계값은 데이터 특성과 상황에 따라 정할 수 있습니다.
# Z-score로 이상치 탐지하고 처리하는 함수 # 입력값: 데이터프레임, 이상치 처리할 칼럼 이름, 임계값 def drop_outliers_zscore(df, column, threshold): # 각 데이터의 Z-score 계산 z_scores = (df[column] - df[column].mean()) / df[column].std() # Z-score의 절댓값이 threshold 이하인 데이터만 남기기 (초과이면 이상치이므로 제외) df_drop_outliers = df[abs(z_scores) <= threshold] return df_drop_outliers
- 칼럼은 'price', 임계값은 3으로 두고 이상치를 제외해봤어요. 원래 데이터프레임에서 602개 행이 삭제됐습니다.
- 어떤 데이터가 삭제됐는지 한눈에 보려면 시각화해보는 것이 좋습니다.
이상치 처리 전후 각각 히스토그램을 그려보니, 약 90000 넘어가는 너무 높은 값들이 제외된 것 같네요.
2️⃣ IQR 방법
- IQR 방법으로 이상치를 탐지하고 처리하는 방법은 아래와 같습니다.
(1) 중앙값 관련 수치들 계산 데이터의 사분위수를 구하고, IQR=제3사분위수-제1사분위수 를 계산함. (2) 임계값을 넘어가는 데이터 판단 제3사분위수 + 1.5xIQR 보다 크거나, 제1사분위수 - 1.5xIQR 보다 작으면 이상치로 판단함. - IQR 방법으로 이상치를 삭제하는 함수입니다.
# IQR로 이상치 탐지하고 처리하는 함수 # 입력값: 데이터프레임, 이상치 처리할 칼럼 이름 def drop_outliers_iqr(df, column): # 1.5*IQR 계산하기 q1 = df[column].quantile(0.25) q3 = df[column].quantile(0.75) iqr = (q3 - q1) * 1.5 # 이상치 제외한 결과만 남기기 df_drop_outliers = df[(df[column] <= (q3 + iqr)) & (df[column] >= (q1 - iqr))] return df_drop_outliers
- 마찬가지로 칼럼을 'price' 로 두고 이상치를 제외해봤습니다. 원래 데이터프레임에서 123개 행이 삭제됐습니다.
아래와 같이 박스플롯 상에 찍혔던 이상치들이 전부 제외된 것을 확인할 수 있습니다. - 이상치로 판별된 데이터가 Z-score방법보다 적습니다. 확실히 중앙값이 평균보다 이상치에 덜 민감한 모습이네요.
728x90반응형'직접 해보기 > Python' 카테고리의 다른 글
[Pandas][sklearn] 인코딩, 원핫인코딩 범주형데이터 수치형으로 변환하기 :: pd.factorize pd.get_dummies (0) 2024.07.01 [Pandas] 구간화(Binning) 연속형데이터를 범주형으로 변환하기 :: pd.cut pd.qcut (0) 2024.07.01 [Pandas] 데이터프레임 결측치 확인, 결측치 처리 삭제 대체 :: isnull, dropna, fillna, ffill, bfill (0) 2024.06.30 [seaborn] 산점도에 회귀선 회귀식 추가하기 :: sns.lmplot sns.regplot (0) 2024.06.29 [seaborn] 데이터프레임으로 히트맵 그리기 :: sns.heatmap (0) 2024.06.29