Python/Pandas

[Pandas] 이상치 탐지와 처리

죵욜이 2024. 12. 26. 06:22

이상치 탐지

 

기술 통계 기반 이상치 탐지 -  describe() 

  •  describe()  함수를 통해 기본 통계량을 확인하고, 이상치를 의심
import pandas as pd

# 예시 데이터프레임 생성
data = {
    '이름': ['철수', '영희', '민수', '지수', '상수'],
    '나이': [25, 30, 22, 35, 120],  # 120은 이상치로 의심됨
    '점수': [90, 85, 95, 80, 88]
}
df = pd.DataFrame(data)

# 기술 통계량 확인
print(df['나이'].describe())

 

- 결과

count      5.000000
mean      46.400000
std       41.892848
min       22.000000
25%       25.000000
50%       30.000000
75%       35.000000
max      120.000000
Name: 나이, dtype: float64

 

  • 평균(mean) 과 표준편차(std) 가 큰 차이를 보이는 경우
  • 최대값(max) 가 비정상적으로 높은 경우 이상치를 의심할 수 있다.

통계적 방법 ( Z-Score )

  • 각 데이터 포인트가 평균에서 얼마나 떨어져 있는지를 측정하는 값
  • 특정 임계값(일반적으로는 3)을 초과하는 경우 이상치로 간주될 수 있다
  • 데이터가 정규분포를 따를때 유용
  • 주변 값과의 차이가 명확하게 큰 값이 이상치일 경우 유용
  • ex) 시험 성적, 평균적인 수치에서 크게 벗어난 데이터를 찾을 경우

import pandas as pd
import numpy as np

data = {'col1': [10, 12, 13, 14, 15, 100, 18, 20, 21, 22]}
df = pd.DataFrame(data)

# Z-Score 계산
df['z-score'] = (df['col1'] - df['col1'].mean()) / df['col1'].std()

# Z-Score가 3을 초과하는 이상치 탐지
outliers = df[df['z-score'].abs() > 3]
print(outliers)

사분위수 범위 ( Interquartile Range ) - IQR

  • IQR 은 데이터의 1사분위수(Q1) 과 3사분위수(Q3) 사이의 범위이다
  • 이 범위 밖에 있는 값은 이상치로 간주될 수 있다.
  • 분포에 관계없이 사용할 수 있고 비대칭적이거나 왜곡된 분포에서 효과적
  • 정규분포를 따르지 않고
  • 연령, 소득, 집값 과 같이 비대칭적인 분포를 가진 데이터에서 유용

 

IQR 계산

IQR = Q3 - Q1
  • 하한 (Lower Bound) : Q1 - 1.5  * IQR
  • 상한 (Upper Bound) : Q3 + 1.5 * IQR
# IQR을 사용하여 이상치 탐지
Q1 = df['col1'].quantile(0.25)
Q3 = df['col1'].quantile(0.75)
IQR = Q3 - Q1

lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR

outliers = df[(df['col1'] < lower_bound) | (df['col1'] > upper_bound)]
print(outliers)

박스플롯 ( Boxplot )

  • 박스플롯은 데이터의 사분위수 와 최소값, 최댓값, 이상치 를 시각적으로 보여준다
  • 수염(whiskers) 밖에 위치한 데이터 포인트들이 이상치로 간주된다
import matplotlib.pyplot as plt

# 박스플롯을 그려 이상치 확인
plt.boxplot(df['col1'])
plt.show()

 

박스(Box)

  • 데이터의 Q1 과 Q3 사이를 연결한 직사각형 박스
  • 중간 50%의 데이터를 포함
  • 박스의 중앙에는 중앙값(median) 이 표시된다

수염(whiskers)

  • 박스의 양 끝에서 최솟값과 최댓값을 연결하는 선을 의미
  • 보통 1.5 * IQR 범위 내의 값을 포함
  • 이 범위 밖의 값은 이상치로 간주될 수 있음

이상치 처리 방법

이상치를 탐지한 후에 어떻게 처리할지 결정해야 한다

  • 삭제 : 이상치를 데이터에서 제거
  • 대체 : 이상치를 평균값, 중앙값, 특정 값 등으로 대체
  • 수정 : 도메인 지식에 기반하여 이상치를 수정