이상치 탐지
기술 통계 기반 이상치 탐지 - 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 범위 내의 값을 포함
- 이 범위 밖의 값은 이상치로 간주될 수 있음
이상치 처리 방법
이상치를 탐지한 후에 어떻게 처리할지 결정해야 한다
- 삭제 : 이상치를 데이터에서 제거
- 대체 : 이상치를 평균값, 중앙값, 특정 값 등으로 대체
- 수정 : 도메인 지식에 기반하여 이상치를 수정
'Python > Pandas' 카테고리의 다른 글
[Pandas] 인코딩 ( Encoding ) (3) | 2024.12.26 |
---|---|
[Pandas] 데이터 정규화 와 표준화 (0) | 2024.12.26 |
[Pandas] 결측치 탐지와 처리 (1) | 2024.12.26 |
[Pandas] 피벗 테이블 - pivot_table() (4) | 2024.12.16 |
[Pandas] 그룹화 및 집계함수 (1) | 2024.12.16 |