사전 분위수
개념

분위수

gabury1고친 사람 github-actions[bot]

분위수는 값 여럿을 크기순으로 줄 세운 뒤 정해진 위치에 있는 값을 집어 줍니다. 「백 건 중 아흔아홉 건은 얼마 안에 끝났나」처럼 한쪽 끝을 물을 때 답이 되는 수입니다. 값을 섞어 새 수를 만들지 않고 원래 나온 값 하나를 가리킵니다.

쉽고 빠른 이해

분위수는 값 묶음에서 「아래쪽 몇 할이 이 값 안에 든다」는 경계를 집어 줍니다. 요청 천 건의 응답 시간에서 「늦은 열 건을 빼면 나머지는 0.3초 안에 끝났다」를 0.3초라는 수 하나로 말해 줍니다.

이게 없으면 늦은 쪽을 가리킬 말이 평균밖에 없습니다. 평균은 늦은 몇 건을 나머지에 섞어 버려서, 늘 고른 서비스와 가끔 크게 늦는 서비스가 같은 수로 나옵니다.

  1. 값을 작은 것부터 큰 것까지 줄 세웁니다
  2. 줄의 어디를 볼지 비율로 정합니다. 절반이면 한가운데, 열에 아홉이면 뒤쪽 끝 가까이입니다
  3. 그 위치에 선 값을 읽습니다

대가는 둘입니다. 줄을 세워야 하니 값을 전부 들고 있어야 합니다. 평균처럼 더해 가며 셀 수도 없습니다. 그리고 건수가 적으면 뒤쪽 분위수가 한두 건에 휘둘립니다.

합계나 용량을 셀 때는 평균이 맞습니다. 평균에 건수를 곱하면 합계가 나오지만 분위수에는 그 성질이 없습니다.

상세

달리기 기록을 놓고 생각하면 잡힙니다. 백 명이 뛰고 나서 기록이 짧은 사람부터 줄을 세웁니다. 「한가운데 선 사람의 기록」이나 「뒤에서 열 번째 사람의 기록」을 물으면, 답은 계산해서 만든 수가 아니라 누군가 뛴 기록 그대로입니다. 줄이 딱 떨어지지 않으면 물어본 위치에 선 사람이 없어서 앞뒤 두 사람 사이에서 답을 정해야 합니다.

분위수는 값들을 크기순으로 늘어놓고 아래에서부터 정해진 비율만큼 센 곳의 값입니다. 비율이 열에 아홉이면 아래쪽 아홉은 그 값보다 작거나 같고 위쪽 하나는 그보다 큽니다. 응답 시간 천 건에서 그 값이 0.4초로 나왔다면 구백 건은 0.4초 안에 끝났고 백 건은 더 걸렸다는 뜻입니다.

분위수를 집는 두 단계

값 네 개짜리 묶음 [3, 1, 9, 5] 를 놓고 절반 위치와 열에 아홉 위치를 집어 봅니다. 그다음 열 건을 잰 응답 시간으로 같은 일을 한 번 더 봅니다.

셈은 두 단계입니다. 먼저 값을 작은 것부터 줄 세웁니다. 그다음 보고 싶은 비율의 위치에 선 값을 읽습니다. 기본 셈에는 더하기도 나누기도 없어서 결과로 나오는 것은 줄 안에 있던 값 하나입니다.

줄을 세우는 첫 단계가 정렬입니다. 건수가 많으면 분위수를 구하는 비용은 거의 이 단계에서 나옵니다.

Python
import math
xs = sorted([3, 1, 9, 5])   # [1, 3, 5, 9]
q = lambda p: xs[math.ceil(p * len(xs)) - 1]
q(0.5)   # 3   ← 한가운데
q(0.9)   # 9   ← 뒤쪽 끝

q 는 비율 p 를 받아 그 위치의 값을 돌려줍니다. 네 건이면 절반 위치가 두 번째이고 열에 아홉 위치가 네 번째입니다. 순서만 보는 셈이라 뒤쪽 값이 몇 배로 커져도 앞쪽 위치의 값은 움직이지 않습니다.

열 건을 재 봤다고 합시다. 아홉 건은 0.4초 안에 끝났고 한 건만 3.7초였습니다. 줄을 세우면 이런 모양이 됩니다.

flowchart TD
    subgraph 줄["작은 값부터 줄 세운 열 건 · 초"]
        A["1~3번째 · 0.1"]
        B["4~6번째 · 0.2"]
        C["7~8번째 · 0.3"]
        D["9번째 · 0.4"]
        E["10번째 · 3.7"]
        A --> B --> C --> D --> E
    end
    M["절반 위치"] --> B
    N["열에 아홉 위치"] --> D

절반 위치는 다섯 번째라 0.2초이고 열에 아홉 위치는 아홉 번째라 0.4초입니다. 제일 늦은 3.7초는 두 값 어느 쪽도 끌어올리지 못합니다. 그 한 건을 보려면 더 뒤쪽 비율을 물어야 합니다.

위치가 정수로 떨어지지 않을 때 무엇을 돌려줄지는 하나로 정해져 있지 않습니다. 위 코드는 올림으로 한쪽 값을 골랐지만, 앞뒤 두 값 사이를 비율로 갈라 중간 수를 내는 방식도 씁니다. 이 방식에서는 결과가 줄에 없던 값이 되기도 합니다.

같은 데이터라도 고르는 방식이 다르면 분위수가 조금씩 다르게 나옵니다. 건수가 많아지면 그 차이는 줄어듭니다.

자주 묻는 비율에 붙은 이름

분위수는 비율을 아무 값으로나 물을 수 있습니다. 그런데 자주 묻는 비율에는 따로 이름이 붙어 있습니다. 줄을 몇 토막으로 자르느냐가 그 이름을 가릅니다.

이름 몇 토막으로 자르나 비율로 쓰면
중앙값 둘 절반
사분위수 넷 사분의 일 · 절반 · 사분의 삼
십분위수 열 십분의 일 단위
백분위수 백 백분의 일 단위

넷이 다른 셈인 것은 아닙니다. 눈금이 촘촘해질수록 뒤쪽 끝을 잘게 물을 수 있을 뿐입니다. 성능 이야기에 나오는 p50·p95·p99 는 백분위수를 줄여 적은 것입니다. p99 는 백 토막 중 아흔아홉 번째 경계라, 요청 백 건 중 아흔아홉 건이 그 값 안에 끝났다는 뜻입니다.

사분위수에서는 세 번째 경계와 첫 번째 경계의 차이를 따로 보기도 합니다. 가운데 절반이 얼마나 넓게 퍼져 있는지를 재는 수이고 사분위 범위라고 부릅니다.

평균과 갈리는 대목

평균은 값을 모두 더해 개수로 나눕니다. 모든 값이 조금씩 결과에 들어가므로 유난히 큰 값 하나가 평균을 끌어올립니다. 분위수는 줄 세운 순서만 보기 때문에 그 한 값이 몇 배가 되든 가운데 위치의 값은 그대로입니다.

앞의 열 건이 그 차이를 보여 줍니다. 열 건의 평균은 0.56초입니다. 절반 위치의 값은 0.2초입니다. 아홉 건이 평균보다 짧게 끝났는데도 평균은 그렇게 나옵니다.

나머지에서 멀찍이 떨어진 이런 값을 이상치라고 부릅니다. 평균은 이상치에 끌려다니고 분위수는 버팁니다.

평균 안에 섞여 버리는 늦은 건을 꼬리 지연이라고 부릅니다. 뒤쪽 분위수는 그 꼬리를 가리키려고 봅니다.

분위수를 합칠 수 없는 까닭

평균은 건수만 알면 다시 묶을 수 있습니다. 두 묶음의 평균에 각각 건수를 곱해 더하고 전체 건수로 나누면 됩니다. 분위수에는 그런 길이 없습니다.

서버 A 가 잰 다섯 건이 1, 2, 3, 4, 5 이고 서버 B 가 잰 세 건이 10, 20, 30 이라고 합시다. A 의 절반 위치 값은 3 이고 B 의 절반 위치 값은 20 입니다. 두 수를 평균 내면 11.5 가 나옵니다.

여덟 건을 다시 줄 세우면 1, 2, 3, 4, 5, 10, 20, 30 이고 절반 위치 값은 4 입니다. 건수도 다르고 값이 퍼진 모양도 달라서 생긴 차이입니다.

그래서 서버마다 잰 p99 를 모아 평균 내면 전체 p99 가 안 나옵니다. 여러 대의 값을 합치려면 원래 값을 다시 모아 줄을 세우거나 히스토그램을 써야 합니다. 값의 분포를 구간마다 몇 건인지로 담아 두는 구조입니다.

건수가 적을 때의 흔들림

뒤쪽 분위수일수록 적은 건수에 기댑니다. 백 건을 재서 p99 를 읽으면 그 값을 떠받치는 건 한 건뿐입니다. 그 한 건이 어쩌다 오래 걸렸으면 p99 도 같이 튑니다.

그래서 뒤쪽 분위수를 볼 때는 몇 건을 재서 나온 값인지 같이 적습니다. 건수가 적으면 여러 번 재서 값이 얼마나 흔들리는지 함께 봅니다.

쓰는 때와 안 쓰는 때

한 건 한 건의 경험을 말할 때 씁니다. 사용자는 평균 지연을 겪지 않고 자기 요청 한 건의 시간을 겪습니다. 그래서 「백 건 중 아흔아홉 건이 0.3초 안에 끝난다」처럼 분위수와 시간을 짝지어 목표를 적습니다. 서비스 수준 목표를 이런 꼴로 씁니다.

합계나 용량을 셀 때는 평균이 맞습니다. 평균에 건수를 곱하면 합계가 그대로 나오지만 분위수에는 그런 성질이 없습니다. 하루에 오간 데이터 양을 잡으면서 분위수를 곱하면 엉뚱한 수가 나옵니다.

값들이 한 덩이로 몰려 있을 때도 분위수를 여러 개 볼 까닭이 없습니다. 퍼짐이 좁으면 절반 위치와 뒤쪽 위치가 거의 같은 값이 됩니다. 이럴 때는 평균 하나로도 묶음을 충분히 가리킵니다.

관련 항목

등분 수로 갈린 분위수의 이름

중앙값 · 백분위수 · 사분위수 · 십분위수 · 사분위 범위 · 높은 분위수

분위수와 나란히 분포를 요약하는 통계량

평균 · 분산 · 표준편차 · 최빈값 · 범위 · 요약 통계 · 분포

분위수로 재는 성능 지표

지연 · 응답 시간 · 꼬리 지연 · 처리량 · 서비스 수준 목표 · 오류율

분위수를 셈하거나 어림하는 방법

선택 알고리즘 · 정렬 · 히스토그램 · t-digest · HdrHistogram · 근사 분위수 · 누적 분포 함수

분위수가 집어내는 치우친 값

이상치 · 긴 꼬리 · 치우침 · 조율된 누락

분위수를 도구로 쓰는 분야

성능 · 모니터링 · 데이터 분석 · 용량 계획 · 부하 테스트 · 탐색적 자료 분석

다른 이름: quantile · 분위 · 분위값