사전 이상치
개념

이상치

gabury1고친 사람 github-actions[bot]

이상치는 값 묶음에서 무리와 동떨어진 값입니다. 응답 시간 대부분이 0.1초 안팎인 곳에 끼어든 3초짜리 한 건이 그런 값입니다. 이런 값 하나가 평균 같은 요약을 크게 흔듭니다. 그래서 묶음을 요약하기 전에 이런 값을 먼저 골라 따로 봅니다.

쉽고 빠른 이해

이상치는 숫자 묶음에서 혼자 멀리 떨어진 값입니다. 거의 다 0.1초 안에 끝난 요청 사이에 3초 걸린 한 건이 섞여 있으면 그 한 건이 이상치입니다.

이걸 가려 보지 않으면 요약이 엉뚱한 말을 합니다. 오래 걸린 한 건이 평균을 몇 배로 끌어올립니다. 요청 대부분이 금방 끝났어도 평균만 보면 전부 오래 걸린 것처럼 보입니다. 반대로 무작정 지우면 정말 오래 기다린 사용자를 못 보게 됩니다.

  1. 무리의 가운데와 퍼진 폭을 잽니다
  2. 그 폭에 비해 너무 멀리 나간 값에 표시를 합니다
  3. 왜 생겼는지 보고 고칠지, 나눠 볼지, 남겨 둘지 정합니다

이상치를 가려내는 데는 대가가 있습니다. 기준을 사람이 정해야 합니다. 「얼마나 멀어야 먼가」에는 정답이 없습니다. 같은 값도 기준에 따라 이상치가 되거나 안 됩니다.

상세

반 아이들이 한 달 용돈을 적어 냈습니다. 거의 다 3만 원에서 5만 원 사이입니다. 그런데 한 칸에만 300만 원이 적혀 있습니다. 담임은 그 칸부터 다시 봅니다. 0을 잘못 붙였는지, 정말 그만큼 받는 아이인지 알아보려는 것입니다.

이상치는 한 묶음의 값 가운데 나머지 대부분과 멀리 떨어진 값입니다. 영어로는 outlier 라고 부릅니다. 우리말로 이상값이라고도 씁니다. 요청 열두 건의 응답 시간을 재서 작은 것부터 세우면 이렇습니다. 값의 단위는 밀리초입니다.

100 · 110 · 120 · 120 · 120 · 130 · 130 · 140 · 150 · 150 · 150 · 3000

열한 건은 100에서 150 사이에 모여 있습니다. 마지막 한 건만 3000, 곧 3초입니다. 이 한 건이 이 묶음의 이상치입니다.

「멀리」는 늘 무리를 기준으로 잽니다. 3초짜리 한 건은 이 묶음에서는 이상치입니다. 대부분이 2초에서 4초 사이인 묶음에 들어가면 평범한 값이 됩니다. 이상치는 값 하나의 성질이 아니라 그 값과 무리 사이의 관계입니다.

이상치가 요약값을 흔드는 모습

묶음을 수 하나로 줄인 것이 요약값입니다. 같은 열두 건으로 요약값 셋이 이상치 한 건에 얼마나 움직이는지 재 봅니다.

평균은 모든 값을 더해 건수로 나눈 값입니다. 열두 건의 평균은 약 368 입니다. 3000 한 건을 빼고 열한 건으로 다시 내면 약 129 입니다. 한 건이 평균을 세 배 가까이 끌어올렸습니다.

중앙값은 값을 크기순으로 세웠을 때 한가운데에 오는 값입니다. 열두 건의 중앙값은 130 입니다. 3000 을 빼도 130 입니다. 줄에서 몇 번째인지만 보고 값의 크기는 안 보기 때문입니다.

표준편차는 값들이 평균에서 얼마나 퍼져 있는지를 수 하나로 나타냅니다. 값마다 평균과의 거리를 재서 제곱합니다. 그 제곱들의 평균에 제곱근을 씌우면 표준편차입니다. 거리를 제곱하므로 멀리 떨어진 값 하나가 결과를 크게 키웁니다.

요약값 열두 건 3000 을 뺀 열한 건
평균 약 368 약 129
중앙값 130 130
표준편차 약 794 약 16

표에서 보듯 평균과 표준편차는 한 건에 크게 움직였습니다. 중앙값은 안 움직였습니다. 이상치에 잘 버티는 요약값을 묶어 강건 통계라고 부릅니다. 이상치가 섞였을 법한 묶음을 요약할 때 이쪽을 고르는 까닭이 이 표에 있습니다.

사분위 범위로 울타리를 치는 방법

이상치를 가르려면 「멀다」를 수로 정해야 합니다. 가장 흔히 쓰는 규칙 하나를 같은 열두 건에 적용해 봅니다.

사분위수는 값을 크기순으로 세워 네 토막으로 자르는 경계입니다. 아래에서 4분의 1 지점이 아래 사분위수입니다. 4분의 3 지점은 위 사분위수입니다. 열두 건에서는 120 과 150 입니다.

두 경계 사이에 가운데 절반의 값이 모여 있습니다. 위 사분위수에서 아래 사분위수를 뺀 그 폭을 사분위 범위라고 부릅니다. 줄여서 IQR(Interquartile Range)이라고 씁니다. 열두 건의 사분위 범위는 30 입니다. 가운데 절반만 보고 재므로 양 끝에 선 몇 건이 이 수를 못 흔듭니다.

규칙은 이 폭의 1.5배만큼 바깥에 울타리를 치는 것입니다. 위 울타리는 150 + 1.5 × 30 = 195 입니다. 아래 울타리는 120 − 1.5 × 30 = 75 입니다. 울타리 밖에 선 값을 이상치로 봅니다.

flowchart TD
    E["3000 · 울타리 밖 · 이상치"]
    H["위 울타리 · 195"]
    subgraph 상자["가운데 절반 · 120 ~ 150"]
        Q3["위 사분위수 · 150"] --- Q1["아래 사분위수 · 120"]
    end
    L["아래 울타리 · 75"]
    E --- H --- Q3
    Q1 --- L

그림은 값을 세로로 세운 것입니다. 위로 갈수록 큽니다. 3000 은 위 울타리 195 를 한참 넘어 섰습니다. 나머지 열한 건은 100 에서 150 사이라 전부 두 울타리 안에 듭니다.

1.5 라는 배수는 관례로 굳은 값입니다. 아주 멀리 나간 값만 골라내고 싶을 때는 3배를 쓰기도 합니다.

두 사분위수를 상자로 그리고 울타리 밖 값을 점으로 따로 찍는 그래프가 상자 그림입니다. 앞의 세로 그림도 같은 꼴입니다. 가운데 절반이 상자로 묶이고 3000 만 울타리 밖에 따로 섭니다.

같은 셈을 파이썬 표준 라이브러리로 적으면 이렇습니다.

Python
from statistics import quantiles

ms = [100, 110, 120, 120, 120, 130,
      130, 140, 150, 150, 150, 3000]
q1, _, q3 = quantiles(ms)  # 120.0 150.0
iqr = q3 - q1              # 30.0
hi = q3 + 1.5 * iqr        # 195.0
[x for x in ms if x > hi]  # [3000]

quantiles 는 기본으로 네 토막의 경계 셋을 돌려줍니다. 가운데 경계는 중앙값이라 이 셈에는 안 쓰여서 _ 로 버렸습니다. 마지막 줄이 위 울타리를 넘은 값만 모읍니다.

평균에서 떨어진 거리로 재는 방법

두 번째 규칙은 평균과 표준편차로 거리를 잽니다. 널리 쓰이지만 이상치가 자기를 재는 자를 늘려 버리는 약점이 있습니다. 같은 묶음에 적용하면 그 약점이 드러납니다.

표준 점수는 한 값이 평균에서 표준편차 몇 개만큼 떨어졌는지를 나타냅니다. 값에서 평균을 빼고 표준편차로 나눠 얻습니다. 이 점수가 3을 넘으면 이상치로 보는 것이 흔한 관례입니다.

3이라는 수는 정규 분포에서 왔습니다. 정규 분포는 평균을 가운데 두고 양쪽으로 고르게 퍼진 종 모양의 분포입니다. 이 분포에서는 값 천 개 가운데 약 997개가 평균에서 표준편차 셋 안에 듭니다.

열두 건에 적용하면 3000 의 표준 점수는 약 3.3 입니다. 겨우 3을 넘깁니다. 3000 자신이 평균을 368 로, 표준편차를 794 로 부풀려 놓았기 때문입니다.

이상치가 둘이 되면 이 규칙이 놓칩니다. 150 한 건을 3000 으로 바꾸면 평균은 약 606, 표준편차는 약 1,071 로 커집니다. 3000 두 건의 표준 점수는 약 2.2 로 내려와 기준 3 아래에 섭니다.

3000 이 한 건 3000 이 두 건
평균 약 368 약 606
표준편차 약 794 약 1,071
3000 의 표준 점수 약 3.3 약 2.2
표준 점수 3 규칙 잡는다 놓친다
사분위 범위 울타리 잡는다 잡는다

마지막 줄이 두 규칙의 차이입니다. 3000 이 두 건이 되어도 사분위수는 120 과 150 에 머물러 울타리가 안 움직입니다. 자를 가운데 절반으로만 만들었기 때문입니다.

응답 시간은 대개 정규 분포를 따르지 않습니다. 짧은 쪽은 0 아래로 못 내려갑니다. 오래 걸린 쪽은 길게 늘어집니다. 이런 모양의 분포에서는 3이라는 기준의 근거부터 맞지 않습니다.

이상치가 생기는 까닭

찾은 이상치를 어떻게 할지는 왜 생겼는지에 달려 있습니다. 응답 시간에서 흔한 원인은 셋입니다.

첫째는 기록이 잘못된 경우입니다. 초 단위 값을 밀리초 칸에 적었거나, 타이머가 시작 시각을 못 받아 엉뚱한 값이 찍힌 경우입니다. 이런 값은 무리에 대해 아무것도 알려 주지 않습니다.

둘째는 성격이 다른 갈래가 한 묶음에 섞인 경우입니다. 캐시에 값이 없어 원본 저장소까지 다녀오는 일이 캐시 미스입니다. 캐시에서 바로 나간 요청과 캐시 미스를 겪은 요청이 한 묶음에 있으면, 원본까지 다녀온 쪽이 이상치처럼 보입니다.

셋째는 드문 일이 정말 일어난 경우입니다. 런타임이 안 쓰는 메모리를 거둬 가는 일이 가비지 컬렉션입니다. 그동안 프로그램이 잠깐 멈추기도 합니다. 그 사이에 들어온 요청은 기록도 정상이고 종류도 같습니다. 그래도 오래 걸립니다.

찾은 뒤에 다루는 방법

원인 셋이 곧 갈림길 셋입니다. 원인마다 할 일이 다릅니다.

flowchart TD
    A["울타리 밖 값을 찾았다"] --> B{"기록이 잘못된 값인가"}
    B -->|그렇다| C["고치거나 지운다"]
    B -->|아니다| D{"성격이 다른 갈래가 섞였나"}
    D -->|그렇다| E["갈래별로 나눠 다시 본다"]
    D -->|아니다| F["남겨 두고 따로 지켜본다"]

기록이 잘못된 값이면 고치거나 지웁니다. 분석하기 전에 이런 값을 걸러 내는 일이 데이터 정제입니다. 틀린 값은 남겨 둬도 알려 주는 것이 없습니다. 요약값을 틀어 놓기만 합니다.

성격이 다른 갈래가 섞였으면 나눠서 봅니다. 캐시에서 나간 요청과 캐시 미스를 겪은 요청을 따로 세우면, 각 묶음 안에서는 그 값이 더는 멀리 떨어져 있지 않을 수 있습니다.

드문 일이 정말 일어났으면 남겨 둡니다. 요약은 평균 대신 중앙값처럼 잘 버티는 값으로 합니다. 이상치는 따로 봅니다.

분석에서는 지우는 대신 누르기도 합니다. 양 끝의 값을 바로 안쪽 값으로 바꿔 두는 방법이 윈저화입니다. 열두 건이면 가장 큰 3000 을 그 아래 150 으로 바꾸는 식입니다.

이렇게 하면 값의 개수는 그대로 지킵니다. 한 건이 요약을 끌고 가는 힘만 줄어듭니다.

양 끝에서 정해진 비율만큼 떼어 내고 평균을 내는 방법도 있습니다. 이것이 절사평균입니다. 열두 건에서 위아래 한 건씩 떼면 3000 과 100 이 셈에서 빠집니다. 남은 열 건의 평균은 132 로, 약 368 이던 평균이 무리 쪽으로 돌아옵니다.

성능 지표에서 이상치를 읽는 법

응답 시간에서 오래 걸린 이상치는 대개 지울 값이 아닙니다. 그 요청을 보낸 사용자는 그만큼 기다렸기 때문입니다. 그래서 성능 쪽에서는 이상치를 지우지 않고 읽는 도구를 씁니다.

백분위수는 값을 크기순으로 세워 아래에서 몇 퍼센트 지점에 선 값을 읽은 것입니다. p99 는 백 토막 가운데 아흔아홉 번째 경계의 값입니다. 백 건 가운데 가장 오래 걸린 한 건 언저리를 가리킵니다.

오래 걸린 쪽 끝에 몰린 응답 시간이 꼬리 지연입니다. 이상치 한 건은 우연일 수 있습니다. 오래 걸린 건이 꾸준히 쌓여 꼬리가 두꺼워지면 그건 시스템의 성질입니다. 그래서 성능 지표에서는 평균 옆에 p99 같은 뒤쪽 눈금을 같이 적어 이 꼬리를 지켜봅니다.

값이 구간마다 몇 건씩 들어갔는지 세어 두는 히스토그램을 쓰면 이상치가 사라지지 않습니다. 평균에 섞여 묻히는 대신 뒤쪽 구간의 건수로 남습니다.

이상 탐지와 가르는 법

이상치는 이미 모인 묶음을 놓고 멀리 떨어진 값 하나를 가리키는 말입니다. 흘러드는 데이터에서 평소와 다른 것을 자동으로 찾아내는 일은 이상 탐지입니다. 서버 지표가 갑자기 튀면 알리는 경보나 결제 기록에서 수상한 거래를 찾는 일이 그 예입니다.

평소 조용하던 새벽에 요청이 갑자기 몰려왔다고 합시다. 그때 요청 한 건 한 건의 시간은 평범합니다. 평소와 다른 것은 요청이 몰려드는 흐름입니다.

이상 탐지는 이런 흐름까지 찾으므로 값 하나보다 넓게 봅니다. 값 하나가 무리에서 떨어진 이상치는 그 가운데 가장 단순한 경우입니다.

관련 항목

이상치를 가르는 기준 통계량

사분위수 · 사분위 범위 · 표준편차 · 표준 점수 · 중앙값 절대 편차 · 상자 그림

이상치에 크게 흔들리는 요약값

평균 · 분산 · 범위 · 상관 계수 · 선형 회귀

이상치에 잘 버티는 요약값

중앙값 · 분위수 · 백분위수 · 절사평균 · 윈저화 · 강건 통계

이상치가 드러나는 분포의 모양

분포 · 정규 분포 · 치우침 · 긴 꼬리 · 꼬리 지연 · 히스토그램

이상치를 찾아 다루는 분석 작업

이상 탐지 · 데이터 정제 · 결측치 · 탐색적 자료 분석 · 데이터 분석 · 경보

응답 시간에 이상치를 만드는 원인

캐시 미스 · 가비지 컬렉션 · 가비지 컬렉션 정지 · 재시도 · 타임아웃 · 측정 오류

다른 이름: outlier · 이상값 · 특이값 · 아웃라이어