# [데이터 전처리] 이상치

## 이상치란?

---

- 관측된 데이터의 범위에서 많이 벗어난 아주 작거나 아주 큰 값을 의미

- 이상치가 의사결정에 큰 영향을 미칠 수 있기 때문에 적절한 이상치 처리는 필수

- 이상치를 어떤 기준으로 판단할 수 있을까? → Standard Deviation, IQR, z-score, …

**이상치가 중요한 이유**

- 데이터 품질 개선: 데이터 오류 탐지, 결측값 대체

- 모델 성능 향상: 예측 모델 정확도 향상, 머신러닝 모델 학습 개선

- 통찰력 제공: 데이터 이해

- 모델 해석 가능성

## 이상치 탐지 방법

---

### 통계적 방법 (Statistical Methods)

**표준편차 기반 StandardDeviation**

- 데이터의 평균과 표준편차를 계산하여 일반적인 범위를 벗어난 데이터를 이상치로 간주

- 평균에서 3개의 표준편차 이상 떨어진 데이터를 이상치로 판단 가능

**사분위수 기반 IQR (Interquartile Range)**

- IQR을 계산하여 일반적인 범위를 벗어난 데이터를 이상치로 간주

- IQR = Q3(75%) - Q1(25%)

- 일반적으로 Q1 - 1.5_IQR 미만, Q3+1.5_IQR 초과 데이터를 이상치로 판단

### 기계학**습 기반 (Machine-Learning-Based Methods)**

**지도학습 (Supervised Learning)**

- 레이블된 데이터를 사용하여 모델 학습, 새로운 데이터가 얼마나 벗어나는지를 판단

- Isolation Forest, One-Class SVM 등이 사용

**비지도학습 (Unsupervised Learning)**

- 레이블이 없는 데이터에서 이상치를 찾는 방법

- 데이터 클러스터링을 통해 소수의 클러스터에 속하는 데이터 포인트를 이상치로 간주

- DBSCAN, K-Means, Local Outlier Factor (LOF) 등

### 규칙 기반 (Rule-Based Methods)

**사전 정의된 규칙**

- 도메인 전문가들이나 경험에 기반하여 사전에 정의된 규칙을 사용

**휴리스틱 방법**

- 데이터의 특성을 고려하여 휴리스틱한 방법을 사용

## 통계적 기법

---

### Standard Deviation (Z-score)

**정규분포**

![Image](https://upload.cafenono.com/image/slashpagePost/20250201/174733_BDPhxrRXCKHrrcIvVP?q=80&s=1280x180&t=outside&f=webp)

- 데이터의 분포가 정규분포를 이룰 때 데이터의 표준편차를 이용해서 이상치 탐지

- 파란색 범위를 벗어나는 데이터는 이상치로 간주할 수 있다

**z-score**

Z = \frac{X - \mu}{\sigma}

- $\mu$: mean

- $\sigma$: standard deviation

- 해당 데이터가 평균으로부터 얼마나의 표준 편차만큼 벗어나 있는지를 의미한다

- 예를 들어 3표준 편차만큼 벗어나는 데이터를 이상치로 처리하는 것은 z-score가 3보다 크고 -3보다 작은 데이터를 이상치로 처리하는 것과 같은 작업

**z-score를 사용한 이상치 탐지**

- 데이터의 평균과 표준편차를 계산한 후 각 데이터 포인트의 z-score 계산

- 일반적으로 z-score가 특정 값을 넘어가는 데이터를 이상치로 간주

- 이때 데이터가 정규분포를 따라야 하고, 이상치 분포에 민감하게 변경된다

**이상치 판단**

```javascript
def outliers_z_score(ys):
    threshold = 3

    mean_y = np.mean(ys)
    stdev_y = np.std(ys)
    z_scores = [(y - mean_y) / stdev_y for y in ys]
    return np.where(np.abs(z_scores) > threshold)
```

**장점**

- **표준화된 척도**: z-score는 데이터를 평균과 표준 편차로 표준화

- **직관적**: 평균으로부터 몇 표준 편차 떨어져 있는지를 직관적으로 이해

- **계산이 간편**: 각 데이터 포인트의 z-score를 계산하는 것은 간단

**단점**

- **정규분포 가정**: 데이터가 정규 분포를 따른다는 가정을 전제

- **이상치 분포에 민감**: 이상치가 많은 경우, 평균과 표준 편차에 영향을 미쳐 z-score가 과도하게 크거나 작아질 수 있다

- **샘플 크기의 영향**: 샘플 크기가 작을 경우 표본의 특성을 잘 반영하지 못함

### 수정된 z-score

- 중위수(median)와 중위절대편차(Median Absolute Deviation, MAD)를 사용하여 계산

- MAD는 데이터 포인트와 중위수 간의 절대적인 거리의 중위수로, 데이터의 표본 변이성을 나타냄

**이상치 판단**

```javascript
def outliers_modified_z_score(ys):
    threshold = 3.5

    median_y = np.median(ys)
    median_absolute_deviation_y = np.median([np.abs(y - median_y) for y in ys])
    modified_z_scores = [0.6745 * (y - median_y) / median_absolute_deviation_y
                         for y in ys]
    return np.where(np.abs(modified_z_scores) > threshold)
```

**장점**

- **비정규성 대응**: 수정된 z-score는 비정규성에 대응하여 더욱 강건하게 이상치를 탐지

- **중위수와 MAD 사용**: 이상치에 민감하지 않고 강력한 방법

- **유연성**: 데이터의 특성에 따라 기준값을 조정하여 적용

**단점**

- **데이터 분포 의존성**: 여전히 데이터의 분포에 영향, 극단적으로 비대칭적인 분포에서는 적합하지 않을 수 있음

- **상대적으로 복잡한 계산**: 계산이 복잡하며, 대량의 데이터에 대한 계산이 느릴 수 있음

### IQR

![Image](https://upload.cafenono.com/image/slashpagePost/20250201/174750_urpYAb9wFieCvucF9x?q=80&s=1280x180&t=outside&f=webp)

- 데이터 분포가 정규분포를 이루지 않거나 한 쪽으로 skewed 한 경우 → IQR 사용

- **boxplot**: 최소값, 최대값, 중간값, 첫번째 사분위(Q1) 및 세번째 사분위(Q3) 값 제공

- **IQR**: Q3 에서 Q1 을 뺀 값

![Image](https://upload.cafenono.com/image/slashpagePost/20250201/174759_SFWZabI48ku0nw2hQi?q=80&s=1280x180&t=outside&f=webp)

- **(Q1 – 1.5 * IQR)** 보다 작거나 **(Q3 + 1.5 * IQR)** 보다 큰 데이터는 이상치로 처리

**이상치 판단**

```javascript
def outliers_iqr(ys):
    quartile_1, quartile_3 = np.percentile(ys, [25, 75])
    iqr = quartile_3 - quartile_1
    lower_bound = quartile_1 - (iqr * 1.5)
    upper_bound = quartile_3 + (iqr * 1.5)
    return np.where((ys > upper_bound) | (ys < lower_bound))
```

**장점**

- **견고한 측정**: IQR은 중위수와 1사분위수(Q1), 3사분위수(Q3)를 사용하기 때문에 이상치에 대해 견고한 측정을 제공

- **적용성**: IQR은 데이터의 분포의 형태에 크게 영향을 받지 않아 데이터가 비대칭적인 경우에도 잘 작동

- **간단함**: 1.5배의 IQR을 사용하여 이상치를 정의하므로 구현이 쉽다

- **시각적 표현**: Boxplot과 함께 사용되어 데이터의 이상치를 시각적으로 표현 가능

**단점**

- **이상치의 범위**: IQR 방법은 상위 25%와 하위 25% 사이의 범위를 사용하기 때문에 이 범위에 속하지 않는 모든 데이터를 이상치로 처리 → 따라서 IQR 방법은 이상치를 정확하게 식별하지만, 실제로는 많은 데이터를 이상치로 표시할 수 다

- **이상치 유형**: IQR 방법은 이상치를 식별하는 것만으로는 이상치의 종류에 대한 구분을 제공하지 않는다 → 실제로 이상치의 유형을 이해하고 구별하기 위해 추가적인 분석이 필요할 수 있음

- **판단 기준**: IQR 방법은 1.5배 IQR을 사용하여 이상치를 정의 → 주관적인 결정이 필요한데, 이는 얼마나 큰 이상치를 허용할지에 따라 다룰 수 있

## 기계학습 기반

---

### Isolation Forest

- 결정 트리 계열의 비지도학습 알고리즘

- High dimensional 데이터셋에서 이상치 탐지 시 효과적

![Image](https://upload.cafenono.com/image/slashpagePost/20250201/174902_MOzT02WxUeQ38iK8ee?q=80&s=1280x180&t=outside&f=webp)

- 결정 트리 형태로 표현

- 정상데이터를 분리하기 위해 트리가 깊어지고 이상치는 트리 상단에서 분리

- 이상치를 분리하는 것이 더 쉽다

![Image](https://upload.cafenono.com/image/slashpagePost/20250201/174917_Bmau0I9urdukUgiS8J?q=80&s=1280x180&t=outside&f=webp)

- 트리에서 몇 번을 분리해야하는지, 데이터까지의 경로 길이를 기준으로 이상치를 판단

- 다른 관측치에 비해 짧은 경로 길이를 가지면 이상치일 가능성이 높다

s(x, n) = 2^{\frac{E(h(x)}{c(n)}}

- h(x)는 0에서 1사이로 산출되는 경로 길이 점수

- 결과가 1에 가까울수록 이상치로 간주

### DBScan (Density Based Spatial Clustering of Applications with Noise)

![Image](https://upload.cafenono.com/image/slashpagePost/20250201/174959_DatKimPwg2DM5GMMJE?q=80&s=1280x180&t=outside&f=webp)

- 하이퍼파라미터 eps, MinPts를 요구

    - **eps**: 두 데이터 사이의 거리가 eps보다 작거나 같을 때 → 같은 클러스터

    - **MinPts**: 한 클러스터 내에 존재해야하는 데이터의 최소 개수 (최소 3이상, 보통 차원+1)

- Core Point와 Border Point를 제외한 데이터가 이상치

    - eps 거리 내에 MinPts 이상의 데이터를 이웃하는 데이터는 Core Point

    - eps 거리 내에 MinPts 미만의 데이터를 이웃하는 데이터는 Border Point

- KMeans 알고리즘과 달리 클러스터의 개수를 미리 정하지 않아도 되고 선형적으로 나뉘지 않아 다양한 모양을 가질 수 있다

For the site tree, see the [root Markdown](https://slashpage.com/yerim-devnote.md).
