이상치 탐지에서 Z-점수·IQR·DBSCAN을 선택하는 기준

Z-점수, IQR, DBSCAN의 가정과 적용 조건을 비교하고 전처리·검증·운영 파이프라인까지 정리한 이상치 탐지 가이드

2026-08-14 · 최초 발행 2024-04-29

이상치는 데이터 오류만을 뜻하지 않는다

관측값이 일반적인 분포 패턴에서 벗어났다고 해서 모두 제거 대상은 아니다. 측정 오류나 데이터 유실일 수도 있지만, 시스템 이벤트나 실제로 드문 현상일 수도 있다. 이상치 탐지는 이런 샘플을 식별해 데이터 전처리, 보안·운영 이벤트 탐지, 학습 데이터 정제에 활용하는 절차다.

접근 방식은 크게 통계량을 이용하는 방법, 거리나 밀도 구조를 보는 방법, 예측 오차를 활용하는 모델 기반 방법으로 나뉜다. 여기서는 Z-점수, IQR, DBSCAN이 각각 어떤 조건에서 맞는지에 초점을 둔다.

탐지 전에 정리해야 할 데이터 조건

Z-점수와 DBSCAN은 특성 스케일의 영향을 크게 받는다. 중위수와 IQR을 기준으로 변환하는 RobustScaler를 사용할 수 있다.

결측치는 대치하고 분산이 0인 컬럼은 제거해야 한다. 왜도가 큰 분포는 로그 변환이나 박스-콕스 변환으로 완화할 수 있다. 시계열 데이터라면 이동평균이나 STL 분해로 추세와 계절성을 분리한 뒤 잔차를 대상으로 탐지하는 방식이 적합하다.

분포와 밀도 구조에 따른 선택

Z-점수는 데이터가 근사적으로 정규분포를 따른다는 전제에서 작동한다. 일반적으로 |z| > 3 또는 2.5를 임계값으로 사용한다. 다만 왜도가 크거나 중복첨인 분포에서는 오탐이 늘어날 수 있다.

IQR은 분포 가정이 비교적 적다. Q1−k·IQR보다 작거나 Q3+k·IQR보다 큰 샘플을 이상치로 본다. k=1.5는 약한 기준, 3.0은 강한 기준으로 사용한다. 단변량 데이터에서 특히 다루기 쉽다.

DBSCAN은 밀도 기반의 비모수 방법이다. 다양한 형태의 군집과 노이즈를 구별할 수 있지만 eps, min_samples 설정에 민감하며, 스케일과 차원의 저주도 결과에 영향을 준다.

임계값을 검증하고 운영에 연결하는 흐름

Z-점수의 임계값, IQR의 k, DBSCAN의 epsmin_samples는 데이터에 맞춰 조정해야 한다. DBSCAN에서는 그리드 탐색과 k-거리 플롯을 함께 적용할 수 있다.

라벨이 충분하지 않은 경우에는 Precision@k, PR-AUC surrogate와 도메인 검수 라운드를 검증 수단으로 삼는다. 처리 전에 예상 이상치 비율에 대한 가설을 세우고, 결과에 따라 방법별 컷오프를 다시 조정한다.

오탐↑과소탐↑에러 처리결측 과다분산 0이웃 없음입력: 원천데이터(배치/스트림)전처리: 결측/중복 제거,스케일링, 계절성 분해방법 선택Z-점수(정규 가정, |z|>τ)IQR(Q1−k·IQR, Q3+k·IQR)DBSCAN(eps, min_samples)이상치 후보검증/튜닝임계값 재조정τ,k,eps 재튜닝특성/스케일 재검토RobustScaler, 차원축소출력: 라벨·스코어·근거로그/모델 버전 기록운영: 알람·대응 실행전처리 예외컬럼 드롭·대치 전환특성 제거eps 증가·스케일 확인

배치 처리에서는 윈도우 단위 집계와 데이터 스냅샷 일관성(CDC, Read Committed)을 확보한다. 스트리밍 환경에서는 지연 허용치와 워터마크를 설정한다. 평균·분산·분위수·kNN 거리 분포를 지속적으로 추적해 재튜닝 트리거를 정하고, 휴먼 인 더 루프 기반 라벨 보강과 감사 로그를 남긴다. 특정 모델·특성·파라미터 버전도 재현 가능하게 관리해야 한다.

방법별 비교

방법 성능(정확도) 확장성 일관성 안정성 운영 편의
Z-점수 정규 근사 시 우수, 왜도 큰 분포에서 저하 O(N) 계산, 대규모에 유리 임계값 고정 시 일관성 높음 스케일·극단값에 민감 구현·설명 용이
IQR 분포 비가정적, 단변량에 강점 O(N log N) 분위수 계산 분위수 안정성 높음 소량 데이터에서도 견고 파라미터 단순(k)
DBSCAN 복잡 군집·노이즈에 강점 고차원/대규모에서 비용↑ 파라미터 민감도 존재 스케일·eps 설정에 민감 튜닝 노력 필요

성능과 안정성은 데이터의 분포, 차원, 스케일링 적용 여부에 따라 달라진다.

센서·거래·서비스 지표에서의 활용

제조 설비 센서 데이터에서는 IQR 또는 Z-점수로 센서별 노이즈를 먼저 걸러낼 수 있다. 다변량 공정 이상은 DBSCAN으로 정상 군집 밖의 노이즈 포인트를 찾고, 공정 단계와 부하 조건을 함께 반영한다.

금융 거래와 이커머스에서는 IQR을 금액·빈도 기반의 1차 필터로 두고 규칙 기반 탐지와 병행할 수 있다. 세션과 행동 패턴은 라벨이 부족한 환경에서 DBSCAN으로 희귀 패턴을 탐색하는 보안 분석에 사용할 수 있다.

서비스 운영과 로그 모니터링에서는 이동 윈도우 Z-점수로 KPI의 급증·급락을 조기에 감지한다. 고차원 메트릭은 표준화와 PCA를 적용한 뒤 DBSCAN으로 서비스 라인별 이질 이벤트를 구분한다.

도메인 튜닝을 전제로 알람 품질에서는 오탐 2040% 감소와 누락 탐지율(Recall) 515% 개선을 기대할 수 있다. 알람 처리 시간은 2535% 단축되고 MTTR은 1020% 개선될 수 있다. 학습 데이터 클린징은 예측 RMSE를 3~8% 개선하고 배포 후 성능 드리프트를 완화하는 데 기여한다.

측정 지표로는 Precision@k, PR-AUC 대용 지표, 알람당 처리 시간, 운영자 피드백 수용률을 사용할 수 있다.

실행 가능한 탐지 코드

전제조건은 Python 3.10+, numpy>=1.24, pandas>=1.5, scikit-learn>=1.3, matplotlib(optional)이다. 설치 명령은 pip install numpy pandas scikit-learn matplotlib이며, df는 수치 컬럼을 포함한 pandas DataFrame이라고 가정한다.

Z-점수로 행 단위 이상치 찾기

import numpy as np
import pandas as pd

def zscore_outliers(df, cols=None, tau=3.0):
    cols = cols or df.select_dtypes(include=np.number).columns.tolist()
    X = df[cols].astype(float)
    mu = X.mean()
    sigma = X.std(ddof=0).replace(0, np.nan)  # 분산 0 보호
    z = (X - mu) / sigma
    # 행 단위 이상치: 어떤 컬럼이라도 임계값 초과
    row_outlier = (z.abs() > tau).any(axis=1)
    return row_outlier, z

# 사용 예
# mask, z = zscore_outliers(df, tau=3.0)
# df_outliers = df[mask]

사분위수 범위로 이상치 찾기

import numpy as np
import pandas as pd

def iqr_outliers(df, cols=None, k=1.5):
    cols = cols or df.select_dtypes(include=np.number).columns.tolist()
    X = df[cols].astype(float)
    Q1 = X.quantile(0.25)
    Q3 = X.quantile(0.75)
    IQR = (Q3 - Q1).replace(0, np.nan)  # 널리 분포 동일 시 보호
    lower = Q1 - k * IQR
    upper = Q3 + k * IQR
    cond = (X.lt(lower) | X.gt(upper))
    row_outlier = cond.any(axis=1)
    return row_outlier, (lower, upper)

# 사용 예
# mask, bounds = iqr_outliers(df, k=1.5)

DBSCAN으로 노이즈 포인트 분리하기

import numpy as np
import pandas as pd
from sklearn.preprocessing import StandardScaler, RobustScaler
from sklearn.cluster import DBSCAN
from sklearn.neighbors import NearestNeighbors

def dbscan_outliers(df, cols=None, eps=None, min_samples=10, scaler='robust'):
    cols = cols or df.select_dtypes(include=np.number).columns.tolist()
    X = df[cols].astype(float).values
    scaler_obj = RobustScaler() if scaler == 'robust' else StandardScaler()
    Xs = scaler_obj.fit_transform(X)

    # eps 자동 힌트: k-거리(=min_samples) 평균 무릎점 근사
    if eps is None:
        nn = NearestNeighbors(n_neighbors=min_samples).fit(Xs)
        dists, _ = nn.kneighbors(Xs)
        kdist = np.sort(dists[:, -1])
        # 간단한 무릎 탐색(변곡점 근사)
        grad = np.gradient(kdist)
        eps = np.percentile(kdist, 95) if np.nanmax(grad) == 0 else kdist[np.argmax(grad)]

    model = DBSCAN(eps=eps, min_samples=min_samples, n_jobs=-1)
    labels = model.fit_predict(Xs)
    outlier_mask = (labels == -1)
    return outlier_mask, labels, eps

# 사용 예
# mask, labels, eps_used = dbscan_outliers(df, min_samples=10)

운영에서는 스케일러와 파라미터 버전을 고정하고 아티팩트를 모델 레지스트리에 저장한다. 스트리밍에서는 윈도우링(예: 5분·1시간)과 워터마크로 지연 데이터를 처리한다. 고차원 데이터에는 PCA, UMAP으로 차원을 줄인 뒤 DBSCAN을 적용할 수 있다.

운영에서 남는 트레이드오프

배치에서는 스냅샷 기반 읽기를, 스트림에서는 이벤트 타임·워터마크와 CDC 지연 보정을 적용한다. 강한 일관성을 확보할수록 처리 지연은 늘어난다.

표준화나 견고 스케일러, PCA, 샘플링은 성능과 eps 튜닝을 돕지만, 차원 축소는 해석력을 낮출 수 있다. Canary 튜닝과 피드백 루프, DEV·QA·PROD 환경 분리는 파라미터 관리에 유용하지만 자동 조정은 과적합 위험을 가진다.

Z-점수와 IQR은 이상 판정 근거를 제시하기 쉽다. DBSCAN은 근접도와 군집 요약을 함께 제공할 수 있으나, 밀도 기반 결과는 파라미터 설명이 더 어렵다.

단변량 필터인 Z-점수 또는 IQR로 1차 정제를 수행하고, 이후 DBSCAN으로 다변량의 잔여 이상을 탐색하는 조합을 사용할 수 있다. 분포 가정, 스케일, 차원, 운영 맥락을 함께 고려하고 재현성·일관성·피드백을 갖춘 모니터링 체계를 유지하는 것이 핵심이다.

이상치 탐지Z-점수IQRDBSCAN데이터 전처리