1. 단변량 이상치 탐지 기법
1.1 Z-Score (Z-점수)
Z-Score는 데이터에서 표준 편차를 활용해 이상치를 감지하는 간단하면서도 강력한 방법입니다.
이 방법은 데이터를 표준화하고, 각 데이터 포인트가 평균으로부터 얼마나 떨어져 있는지를 계산하여 이상치를 식별합니다.
특히 표준화된 데이터 세트에 효과적입니다.
1.2 IQR (Interquartile Range, 사분범위)
IQR은 데이터의 중앙값을 기준으로 하여 '정상 범위'를 벗어나는 데이터 포인트를 찾아냅니다.
Q1(제1사분위수)과 Q3(제3사분위수)를 계산하고, 이를 기반으로 IQR을 구한 후, IQR을 이용하여 이상치를 탐지합니다.
2. Z-Score
2.1. Z-Score 란?
Z-Score는 데이터 포인트가 데이터 세트의 평균으로부터 얼마나 떨어져 있는지를 측정합니다.
이를 통해 데이터 포인트가 전체 데이터 분포에서 어떤 위치에 있는지 파악할 수 있습니다.
이 방법은 데이터 세트 내에서 각 데이터 포인트의 상대적인 위치를 수치화하여, 데이터 포인트가 평균적인 범위 내에 있는지, 아니면 평균에서 벗어나 이상한 값을 가지는지를 판단하는 데 사용됩니다.
Z-Score는 다음과 같은 공식으로 계산됩니다.
2.2. Z-Score의 해석
데이터가 정규 분포를 따른다고 가정할 경우 아래와 같이 해석할 수 있습니다.
- Z-Score = 0: 데이터 포인트가 평균값에 정확히 일치합니다.
- Z-Score > 0: 데이터 포인트가 평균값보다 높습니다.
- Z-Score < 0: 데이터 포인트가 평균값보다 낮습니다.
일반적으로, Z-Score가 매우 높거나 낮은 값(예를 들어, ±2 또는 ±3 이상)은 데이터 세트에서 이상치일 가능성이 높다고 간주됩니다.
이런 값들은 나머지 데이터와 상당히 다르기 때문에 특별한 주의가 필요합니다.
위 그림은 Z-score를 사용한 이상치 탐지를 설명하는 정규 분포를 나타냅니다.
Z-score 값이 -3 이하 또는 3 이상인 지역은 이상치로 간주되며, 붉은색으로 표시되어 있습니다.
-2와 2 사이의 값들은 이상하지 않은(normal) 범위로 간주되며, 노란색으로 표시되어 있습니다.
-2와 -3 사이, 2와 3 사이의 값들은 다소 이상하다고 여겨지는(moderately unusual) 범위로, 주황색으로 표시되어 있습니다.
3. 이상치 탐지를 위한 중고차 가격 예측 데이터셋 준비
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
train = pd.read_csv('train.csv')
X = train.drop('credit', axis=1)
y = train['credit']
X_train, X_valid, y_train, y_valid = train_test_split(X, y, test_size=0.3, random_state=42)
display(X_train.head(3))
display(X_train.shape)
4. 이상치 탐지를 위한 Z-Socore 적용
4.1 Z-Score 직접 계산 후 이상치 제거
- Z-Score는 데이터 포인트에서 평균을 뺀 값을 표준편차로 나누어 계산합니다.
- Z-Score가 ±3을 벗어나는 데이터 포인트, 즉 이상치로 간주되는 데이터를 제외합니다.
Z_train = X_train.copy()
# Train 데이터의 평균, 표준편차 계산
mean_train = Z_train['income_total'].mean()
std_train = Z_train['income_total'].std()
# 임계값 설정
threshold = 3
# Train 데이터로 Z-점수 계산 및 이상치 제거
Z_train['z_score_income'] = (Z_train['income_total'] - mean_train) / std_train
train_no_outliers = Z_train[Z_train['z_score_income'].abs() <= threshold]
train_no_outliers = train_no_outliers.drop('z_score_income', axis=1)
train_no_outliers.shape
(11050, 19)
4.2 Scipy를 이용한 Z-Score 계산과 이상치 제거
- SciPy의 stats 모듈을 사용하여 'income_total' 열의 Z-Score를 계산합니다.
from scipy import stats
Z_scipy_train = X_train.copy()
# Train 데이터에 대해 Z-score 계산
Z_scipy_train['z_score_income'] = stats.zscore(Z_scipy_train['income_total'])
# 임계값 설정
threshold = 3
# 임계값을 기반으로 Train 데이터에서 이상치 제거
train_no_outliers = Z_scipy_train[Z_scipy_train['z_score_income'].abs() <= threshold]
# 임시 Z-score 컬럼 제거
train_no_outliers = train_no_outliers.drop('z_score_income', axis=1)
train_no_outliers.shape
(11050, 19)
4.3 Z-Score 기법의 장점과 단점
※ 장점
- 간단하고 직관적 : Z-Score는 평균과 표준편차를 이용한 간단한 계산으로 이루어져 있어, 구현하기 쉽고 결과 해석이 직관적입니다.
- 표준화된 점수 : 데이터 포인트가 데이터셋의 평균으로부터 얼마나 떨어져 있는지를 표준화된 형태로 표현하여, 서로 다른 데이터셋이나 변수 간 비교가 용이합니다.
- 정규 분포 데이터에 적합 : 데이터가 정규 분포를 따르는 경우, Z-Score는 이상치를 식별하는 데 매우 효과적입니다.
- 확장성 : 다양한 임계값 설정이 가능하며, 데이터의 특성에 맞게 조정할 수 있어 융통성이 뛰어납니다.
※ 단점
- 정규 분포 의존성 : Z-Score 방법은 데이터가 정규 분포를 가정할 때 가장 잘 작동합니다. 데이터가 크게 비대칭적이거나 긴 꼬리를 가진 경우, 이상치 탐지에 오류가 발생할 수 있습니다.
- 극단값에 민감 : 극단적인 값이 포함된 경우, 이들 값이 평균과 표준편차에 큰 영향을 미칠 수 있으며, 이는 Z-Score 계산에 영향을 미칩니다.
- 모든 이상치를 식별하지 못할 수 있음 : Z-Score는 간단한 통계적 접근 방식이기 때문에, 모든 유형의 이상치를 완벽히 식별하지 못할 수 있습니다. 특히, 데이터셋에 이상치가 많은 경우 효과적이지 않을 수 있습니다.
- 이진 결정의 어려움 : 어떤 데이터 포인트를 이상치로 간주할지에 대한 명확한 기준이 없기 때문에, 임계값 설정이 주관적일 수 있으며, 이에 따라 결과가 달라질 수 있습니다.
5. IQR(Interquartile Range)
5.1 IQR (Interquartile Range) 이란?
IQR(Interquartile Range)은 데이터 세트의 중간 50% 범위를 측정하는 통계적 방법으로, 데이터의 중간값 주변의 변동성을 파악하는 데 유용합니다.
구체적으로, IQR은 데이터 세트의 제1사분위수(Q1, 하위 25%)와 제3사분위수(Q3, 상위 25%) 사이의 차이로 정의됩니다.
이는 데이터 세트의 중앙 부분에 대한 분산을 나타내며, 특히 이상치 탐지에 매우 유용합니다.
5.2 IQR의 계산 방법
IQR은 데이터셋의 1사분위수(Q1)와 3사분위수(Q3)를 계산함으로써 얻어집니다.
Q1은 데이터셋의 하위 25%에 해당하는 값이고, Q3는 상위 25%에 해당하는 값입니다.
따라서 IQR은 Q3 - Q1로 계산되며, 이는 데이터의 중간 범위에 대한 전반적인 퍼짐 정도를 나타냅니다.
5.3 이상치의 경계 설정
이상치를 식별하기 위해 IQR을 사용하여 하한 경계와 상한 경계를 설정합니다.
하한 경계는 Q1 - 1.5 * IQR로, 상한 경계는 Q3 + 1.5 * IQR로 계산됩니다.
이러한 방식으로 설정된 경계를 벗어나는 데이터 포인트는 일반적인 범위를 벗어난 것으로 간주되어 이상치로 분류됩니다.
5.4 이상치의 제거
데이터 포인트가 설정된 하한 경계보다 낮거나 상한 경계보다 높은 경우, 해당 데이터는 이상치로 간주되어 제거됩니다.
이렇게 함으로써 데이터 분석이나 모델링 과정에서 이상치의 영향을 줄일 수 있습니다.
6. 이상치 탐지를 위한 IQR 적용
6.1 IQR을 활용하여 이상치 개수 확인
def out_iqr(data):
Q1 = data.quantile(0.25)
Q3 = data.quantile(0.75)
IQR = Q3 - Q1
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
return lower_bound, upper_bound
# 'income_total' 열의 이상치를 찾기 위한 조건
lower_bound, upper_bound = out_iqr(X_train['income_total'])
# 이상치를 각각의 조건으로 찾음
lower_outliers = X_train[X_train['income_total'] < lower_bound]
upper_outliers = X_train[X_train['income_total'] > upper_bound]
# 각각의 이상치 개수 계산
num_lower_outliers = len(lower_outliers)
num_upper_outliers = len(upper_outliers)
print("Number of lower outliers in 'income_total' column:", num_lower_outliers)
print("Number of upper outliers in 'income_total' column:", num_upper_outliers)
Number of lower outliers in 'income_total' column: 0
Number of upper outliers in 'income_total' column: 467
6.2 quantile 함수를 활용하여 IQR 이상치 제거
lower_bound, upper_bound = out_iqr(X_train['income_total'])
train_no_outliers_iqr = X_train[(X_train['income_total'] >= lower_bound) & (X_train['income_total'] <= upper_bound)]
print("Shape of train data after removing outliers using IQR:", train_no_outliers_iqr.shape)
Shape of train data after removing outliers using IQR: (10734, 19)
6.3 percentile() 함수를 활용하여 iqr 이상치 제거
Q1 = np.percentile(X_train['income_total'], 25)
Q3 = np.percentile(X_train['income_total'], 75)
IQR = Q3 - Q1
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
train_no_outliers_iqr = X_train[(X_train['income_total'] >= lower_bound) & (X_train['income_total'] <= upper_bound)]
print("Shape of train data after removing outliers using NumPy's percentile:", train_no_outliers_iqr.shape)
Shape of train data after removing outliers using NumPy's percentile: (10734, 19)
6.4 IQR 를 활용한 이상치 탐지의 장점과 단점
※ 장점
- 극단치에 대한 강한 내성 : IQR은 데이터 세트의 중앙 부분에 초점을 맞추므로 극단적인 값을 가진 이상치의 영향을 덜 받습니다. 이는 데이터가 비대칭적인 분포를 가질 때 특히 유용합니다.
- 직관적 이해 : IQR은 사분위수라는 기본적인 통계 개념에 기반하여, 데이터의 중간 범위를 쉽게 이해하고 해석할 수 있게 합니다.
- 비모수적 접근 : IQR 방법은 데이터가 특정 분포(예: 정규 분포)를 따르지 않는 경우에도 사용할 수 있습니다. 이는 데이터가 다양한 형태의 분포를 가질 수 있는 실제 상황에서 유용합니다.
※ 단점
- 정보 손실의 가능성 : 이상치로 간주되는 데이터 포인트를 제거하면 중요한 정보를 잃을 수 있습니다. 특히, 이상치가 데이터에 대한 중요한 신호를 포함하고 있을 경우, 이러한 정보 손실은 분석 결과에 부정적인 영향을 미칠 수 있습니다.
- 임의의 임계값 설정 : 이상치를 정의하는 데 사용되는 임계값(예: 1.5 x IQR)은 어느 정도 임의적입니다. 이 임계값은 상황에 따라 조정되어야 할 수 있으며, 이에 대한 명확한 가이드라인이 없는 경우가 많습니다.
7. 이상치를 꼭 제거해야 할 필요는 없습니다.
- 데이터 변환: 이상치의 영향을 줄이기 위해 데이터를 변환할 수 있습니다. 데이터를 로그로 변환하거나, 제곱근을 취하거나, 역수를 취하는 등의 방법을 사용하여 데이터의 분포를 조절할 수 있습니다. 이렇게 하면 이상치의 영향을 줄일 수 있습니다.
- 이상치 점수화: 이상치를 제거하지 않고 데이터에서 이상치를 식별하고 점수화할 수 있습니다. 이 점수를 활용하여 모델링에 활용하거나, 이상치의 정도를 파악할 수 있습니다.
- 이상치 치환: 이상치를 다른 값으로 대체할 수 있습니다. 이상치를 해당 특성의 중앙값이나 평균값 등으로 대체하거나, 가장 가까운 정상치로 대체하는 방법을 사용할 수 있습니다.
- 모델 기반 접근: 일부 머신 러닝 모델은 이상치에 강건하며, 이상치를 자동으로 처리할 수 있습니다. 예를 들어, 랜덤 포레스트와 같은 트리 기반 모델은 이상치에 민감하지 않을 수 있습니다.
- 이상치를 고려한 모델링: 때로는 이상치가 중요한 정보를 제공하는 경우도 있습니다. 이런 경우, 이상치를 제거하지 않고 모델링을 수행하고, 결과에 미치는 영향을 조사하는 것이 유용할 수 있습니다.
'머신러닝 > 머신러닝: 기초 내용' 카테고리의 다른 글
데이터 불균형 (0) | 2024.12.15 |
---|---|
피처 엔지니어링 입문 (2) | 2024.12.14 |
다변량 이상치 (0) | 2024.12.13 |
데이터 전처리 입문 (0) | 2024.12.11 |
머신러닝 입문 (2) | 2024.12.10 |