사전 분포
개념

분포

gabury1고친 사람 github-actions[bot]

분포는 값들이 어디에 얼마나 몰려 있는지를 보여 줍니다. 응답 시간 천 건이 몇 초 근처에 몇 건씩 놓였는지가 그 응답 시간의 분포입니다. 평균 하나로는 가려지는 한참 늦은 몇 건이 분포에서는 드러납니다. 통계에서는 값이 나올 확률을 적어 둔 모형도 분포라고 부릅니다.

쉽고 빠른 이해

분포는 값 묶음이 어떤 모양으로 퍼져 있는지를 알려 줍니다. 요청 천 건을 재 보니 0.1초 안에 420건, 0.1초에서 0.2초 사이에 310건이 끝났다는 식의 표가 분포입니다.

이게 없으면 값 묶음을 수 하나로만 보게 됩니다. 평균이 0.17초라는 말만으로는 대부분이 그쯤 끝났는지, 몇 건이 한참 오래 걸렸는지 가려지지 않습니다.

  1. 값이 놓일 범위를 구간으로 나눕니다
  2. 구간마다 값이 몇 건 들어왔는지 셉니다
  3. 건수를 늘어놓고 어디가 두껍고 어디가 얇은지 봅니다

대가는 수 하나보다 다루기 번거롭다는 것입니다. 두 분포를 견주려면 모양 전체를 맞대야 합니다. 그래서 흔히 수 몇 개로 다시 줄여 씁니다. 값을 크기순으로 줄 세워 한가운데 오는 값이나, 느린 쪽 끝의 몇 건이 시작되는 값 같은 것들입니다.

상세

반 학생들에게 키대로 칸을 나눠 서게 한다고 해 봅시다. 150센티미터대 칸, 160센티미터대 칸, 170센티미터대 칸에 각각 몇 명이 섰는지 세면 이 반의 키가 어떻게 퍼져 있는지 한눈에 들어옵니다. 가운데 칸이 붐비고 양 끝 칸이 한산한 모습이 이 반 키의 모양입니다.

분포는 값마다, 또는 값의 구간마다 몇 건이 나왔는지를 값 전체에 걸쳐 적은 것입니다. 서버라면 응답 시간 천 건을 0.1초 폭의 구간에 나눠 센 표가 응답 시간의 분포입니다. 값 하나하나는 사라지고 「어디에 얼마나」만 남습니다.

값 묶음을 수 하나로 줄이면 이 모양이 사라집니다. 평균이 같아도 한 묶음은 모두 비슷한 값일 수 있습니다. 다른 묶음은 대부분 짧다가 몇 건만 크게 튈 수 있습니다. 두 묶음의 차이는 분포를 봐야 보입니다.

셀 수 있는 값의 분포

값의 종류가 몇 개로 끝나면 값마다 건수를 세면 됩니다. 쇼핑몰 주문 100건에 담긴 상품 개수를 세어 보면 아래 표가 나옵니다.

상품 개수 주문 건수 비율
1개 50건 0.50
2개 30건 0.30
3개 15건 0.15
4개 이상 5건 0.05

가운데 열처럼 값마다 몇 번 나왔는지 센 수를 도수라고 합니다. 도수를 값 전체에 걸쳐 늘어놓은 것이 도수 분포입니다. 이 표만 봐도 주문의 절반이 상품 하나짜리라는 것을 알 수 있습니다.

오른쪽 열은 도수를 전체 건수로 나눈 비율입니다. 비율로 바꾸면 합이 언제나 1 이 됩니다. 그래서 건수가 다른 두 묶음도 견줄 수 있습니다. 어제 주문 100건과 오늘 주문 1만 건의 분포를 맞대 볼 때 이 형태를 씁니다.

연속된 값은 구간으로 센다

응답 시간처럼 연속된 값은 같은 값이 거의 두 번 안 나옵니다. 0.1234초와 0.1235초를 따로 세면 모든 값의 도수가 1 이 되어 아무 모양도 안 보입니다. 그래서 값의 범위를 구간으로 잘라 구간마다 셉니다.

요청 천 건의 응답 시간을 0.1초 폭의 구간 열 개로 나눠 세면 아래 그림이 나옵니다. 막대 하나가 구간 하나입니다. 아래 숫자는 그 구간이 끝나는 초입니다. 막대 높이는 그 구간에 들어온 요청 수입니다.

xychart-beta
    title "응답 시간 천 건의 분포"
    x-axis ["0.1", "0.2", "0.3", "0.4", "0.5", "0.6", "0.7", "0.8", "0.9", "1.0"]
    y-axis "건수" 0 --> 450
    bar [420, 310, 130, 60, 30, 20, 12, 8, 5, 5]

그림은 왼쪽이 두껍습니다. 오른쪽으로 갈수록 얇아져 1.0초까지 길게 늘어집니다. 천 건 중 730건이 0.2초 안에 끝났습니다. 0.5초를 넘긴 요청은 50건뿐입니다.

이렇게 구간별 건수를 막대로 그린 그림을 히스토그램이라고 합니다. 값이 어디에 몰렸는지를 눈으로 바로 보려고 그립니다.

구간 폭은 쓰는 사람이 정합니다. 폭을 너무 넓히면 막대가 한두 개로 뭉쳐 모양이 사라집니다. 너무 좁히면 막대마다 건수가 적어서 들쭉날쭉한 잡음이 모양을 덮습니다.

모양을 부르는 이름

분포의 모양에는 자주 쓰는 이름이 있습니다. 모양을 말로 부를 수 있으면 그래프를 띄우지 않고도 동료와 분포를 두고 이야기할 수 있습니다.

주변 막대보다 높이 솟은 막대를 봉우리라고 합니다. 위 그림에는 봉우리가 맨 왼쪽 구간 하나뿐입니다. 봉우리 가운데 가장 높은 막대에 가장 자주 나온 값이 있습니다. 그래서 최빈값도 이 구간에 있습니다.

봉우리에서 한쪽으로 늘어진 부분은 꼬리라고 합니다. 위 그림은 봉우리 오른쪽으로만 꼬리가 1.0초까지 뻗어 있습니다.

이렇게 꼬리가 한쪽으로만 늘어진 분포를 치우친 분포라고 합니다. 치우친 분포에서는 꼬리 쪽의 큰 값들이 평균을 꼬리 쪽으로 끌어당깁니다. 그래서 평균이 봉우리에서 벗어난 곳에 놓입니다.

꼬리 끝의 값이 봉우리 근처 값보다 몇 배, 몇십 배 멀리 떨어져 있으면 긴 꼬리라고 부릅니다. 위 그림에서 봉우리 구간의 요청은 0.1초 안에 끝났습니다. 꼬리 끝의 요청은 그 열 배인 1.0초 가까이 걸렸습니다.

백엔드에서 자주 만나는 모양은 넷으로 추릴 수 있습니다.

모양 생김새 이런 값에서 자주 봅니다
좌우 대칭 가운데 봉우리 하나, 양쪽 꼬리가 비슷하다 사람의 키 · 같은 것을 여러 번 잰 오차
오른쪽 꼬리가 긴 모양 왼쪽에 몰리고 오른쪽으로 길게 늘어진다 응답 시간 · 파일 크기 · 사용자별 요청 수
봉우리 둘 떨어진 봉우리가 두 개 처리 경로가 둘로 갈리는 요청의 응답 시간
평평한 모양 모든 구간이 비슷하게 찬다 해시 함수가 내놓는 값

봉우리가 둘인 분포는 서로 다른 두 무리가 한 그래프에 섞였다는 신호입니다. 캐시를 둔 서버의 응답 시간이 그렇습니다. 캐시에 값이 있으면 곧바로 답합니다. 캐시에 값이 없는 캐시 미스가 나면 데이터베이스까지 다녀옵니다.

이런 분포에서 두 무리를 가르지 않고 평균을 내면 어느 무리에도 속하지 않는 값이 나옵니다. 그 평균 근처에서 끝난 요청은 거의 없습니다.

평평한 모양은 해시 함수가 키를 고르게 흩었다는 뜻입니다. 키를 나눠 담는 칸을 버킷이라고 합니다. 평평하다는 것은 버킷마다 키가 비슷하게 들어갔다는 말입니다. 이 모양이 한쪽으로 기울면 몇몇 버킷에만 키가 몰립니다.

앞에서부터 더해 가는 누적 분포

구간 건수를 앞에서부터 차례로 더해 가면 「이 시간 안에 끝난 요청이 몇 건인가」가 나옵니다. 이렇게 쌓아 올린 분포를 누적 분포라고 합니다. 「0.3초 안에 끝난 요청이 몇 건이냐」 같은 질문에 바로 답하려고 씁니다.

위 그림의 건수를 앞에서부터 더하면 아래 표가 됩니다. 누적 비율은 누적 건수를 천으로 나눈 값입니다.

구간 끝 누적 건수 누적 비율
0.1초 420 0.42
0.2초 730 0.73
0.3초 860 0.86
0.5초 950 0.95
0.8초 990 0.99
1.0초 1000 1.00

표에서 0.3초 줄을 읽으면 천 건 중 860건이 0.3초 안에 끝났다는 것을 알 수 있습니다. 거꾸로 「요청 열에 아홉이 끝나는 데 몇 초가 걸리느냐」를 물을 때도 이 표를 씁니다. 누적 비율을 값에 대한 함수로 적은 것을 누적 분포 함수라고 부릅니다.

분포를 수 하나로 줄이는 통계량

분포는 모양 전체라서 들고 다니기 번거롭습니다. 그래서 분포에서 수 몇 개를 뽑아 대신 씁니다. 이렇게 뽑은 수를 통계량이라고 부릅니다. 통계량마다 분포의 어느 부분을 읽는지가 다릅니다.

수 분포에서 읽는 것
평균 값들이 양쪽으로 균형을 이루는 무게중심
중앙값 값을 크기순으로 줄 세웠을 때 한가운데 오는 값
백분위수 줄 세운 값에서 아래부터 전체의 몇 퍼센트 지점에 오는 값
표준편차 값들이 평균에서 얼마나 벌어져 있나

중앙값은 누적 표에서 읽습니다. 천 건 중 500번째 요청을 찾으면 됩니다. 누적 건수가 0.1초 줄에서 420, 0.2초 줄에서 730이니 500번째는 0.1초에서 0.2초 사이에 있습니다.

99번째 백분위수는 990번째 요청입니다. 누적 건수가 0.8초 줄에서 990에 닿으니 이 값은 0.8초 근처입니다. 한가운데 요청보다 몇 배나 오래 걸린 셈입니다.

평균은 구간별 건수로 어림합니다. 구간마다 두 끝의 중간 시간에 그 구간 건수를 곱합니다. 0.1초에서 0.2초 구간이면 0.15초에 310건을 곱하는 식입니다. 열 구간의 곱을 모두 더해 천으로 나누면 0.17초쯤이 나옵니다.

이 수만 보면 0.8초를 넘게 기다린 열 건이 드러나지 않습니다. 분포의 오른쪽 끝에서 사용자가 겪는 이런 긴 기다림을 꼬리 지연이라고 부릅니다.

백분위수를 포함해 분포를 일정한 비율로 끊는 값을 통틀어 분위수라고 합니다. 중앙값은 절반에서 끊은 분위수입니다.

확률 분포

지금까지 본 분포는 이미 잰 값을 센 것입니다. 통계에서는 아직 안 잰 값이 어떻게 나올지를 확률로 적은 모형도 분포라고 부릅니다. 이것을 확률 분포라고 합니다.

주사위로 보면 쉽습니다. 1부터 6까지가 각각 6분의 1 확률로 나온다는 것이 주사위의 확률 분포입니다. 실제로 60번 던져 센 도수 분포는 이 모양과 조금씩 어긋납니다. 던지는 횟수를 늘릴수록 센 비율이 6분의 1에 가까워집니다.

잰 값 묶음을 표본이라고 합니다. 앞에서 줄곧 본 응답 시간 천 건이 표본입니다.

그 뒤에 있다고 보는 값 전체는 모집단이라고 합니다. 이 서버가 받는 모든 요청의 응답 시간이 모집단입니다. 표본의 분포를 보고 모집단의 확률 분포를 어림하는 것이 통계가 하는 일의 큰 줄기입니다.

자주 쓰는 확률 분포에는 이름이 붙어 있습니다. 어떤 값을 흔히 어느 분포로 어림하는지 아래 표에 모았습니다.

이름 모양 흔히 모형으로 삼는 값
정규 분포 좌우 대칭인 종 모양 작은 요인이 여럿 더해진 값 · 측정 오차
균등 분포 모든 값이 같은 확률 난수 생성기가 내는 값
지수 분포 0 근처가 가장 두껍고 오른쪽으로 얇아진다 요청과 요청 사이의 간격
포아송 분포 셀 수 있는 값에서 평균 근처가 봉우리 1초 동안 들어오는 요청 수

이런 모형이 있으면 값을 다 재지 않고도 셈을 할 수 있습니다. 큐잉 이론은 요청이 들어오는 모습을 이런 분포로 두고 대기열이 얼마나 길어질지를 계산합니다. 모형이 잰 값과 어긋나면 셈도 어긋나므로, 잰 분포와 견줘 보는 일이 뒤따릅니다.

여러 분야에서 보는 분포

백엔드 개발자가 만나는 네 분야를 차례로 봅니다. 네 분야 모두 확률 모형이 아니라 실제로 모은 값을 세어 분포를 봅니다.

성능을 볼 때는 응답 시간의 분포를 봅니다. 배포 뒤에 오른쪽 꼬리만 길어지는 일이 있습니다. 이때 평균은 거의 안 움직입니다. 그래서 서비스 수준 목표를 평균 대신 위쪽 백분위수로 잡곤 합니다.

데이터베이스는 실행 계획을 고를 때 열 값의 분포를 씁니다. 어떤 값이 몇 행쯤 있는지 미리 세어 두면 조건에 맞는 행 수를 어림할 수 있습니다. 그 어림으로 인덱스를 탈지 테이블을 처음부터 끝까지 읽을지 정합니다.

데이터를 여러 서버에 나눠 담는 샤딩에서는 키의 분포를 봅니다. 키가 한 서버에 몰리면 그 서버만 바빠집니다. 이렇게 부하가 한곳에 몰린 곳을 핫스팟이라고 부릅니다.

머신러닝에서는 학습에 쓴 데이터의 분포와 운영 중에 들어오는 데이터의 분포를 견줍니다. 둘이 달라지면 모델의 예측이 어긋납니다. 이 현상을 분포 이동이라고 부릅니다.

분포를 담아 두는 방법

분포를 나중에 다시 보려면 무언가를 남겨야 합니다. 무엇을 남기느냐에 따라 드는 공간과 나중에 읽을 수 있는 것이 갈립니다.

남기는 것 드는 공간 나중에 읽을 수 있는 것
잰 값 전부 건수만큼 늘어난다 모든 통계량 · 구간을 새로 긋는 것까지
구간별 건수 구간 수만큼으로 고정된다 모양 · 백분위수의 어림
통계량 몇 개 수 몇 개 남긴 수뿐. 모양은 되살릴 수 없다

모니터링 도구는 흔히 둘째 줄을 고릅니다. 구간별 건수는 서버 여러 대의 것을 구간끼리 더하기만 하면 합쳐지기 때문입니다. 서버마다 따로 낸 백분위수는 평균을 내도 전체의 백분위수가 되지 않습니다.

그래서 응답 시간 같은 메트릭은 구간별 건수로 모아 두는 경우가 많습니다. 백분위수는 화면에 띄울 때 그 건수에서 어림해 뽑습니다. 구간을 어떻게 그어 두느냐가 나중에 읽을 수 있는 정밀도를 정합니다.

분포를 그려 볼 때와 수 하나로 충분할 때

값이 가운데 한 덩이로 몰리고 좌우가 비슷하면 평균과 표준편차 두 수로 분포의 대부분을 말할 수 있습니다. 이럴 때는 그래프를 그려도 두 수가 알려 준 것 이상을 얻기 어렵습니다.

꼬리가 길거나 봉우리가 둘이면 수 하나가 모양을 가립니다. 응답 시간 · 요청 크기 · 사용자별 활동량이 대개 이런 모양입니다. 그래서 분포를 먼저 그려 보고 나서 요약할 수를 고릅니다.

꼬리 끝에서 무리와 멀찍이 떨어진 값을 이상치라고 부릅니다. 이상치를 측정 오류로 보고 지울지, 분포의 일부로 보고 남길지는 그 값이 어디서 왔는지 확인한 뒤에 정합니다.

관련 항목

분포에서 뽑아내는 요약 통계량

평균 · 중앙값 · 최빈값 · 분산 · 표준편차 · 분위수 · 백분위수 · 사분위수 · 요약 통계

분포를 나타내는 그림과 함수

히스토그램 · 누적 분포 함수 · 상자 그림 · 확률 밀도 함수 · 확률 질량 함수

분포의 모양을 가리키는 이름

치우침 · 긴 꼬리 · 이상치 · 다봉 분포 · 첨도

이름이 붙은 확률 분포

확률 분포 · 정규 분포 · 균등 분포 · 지수 분포 · 포아송 분포 · 이항 분포 · 로그 정규 분포 · 멱법칙

표본으로 분포를 어림하는 통계 개념

표본 · 모집단 · 샘플링 · 확률 · 대수의 법칙 · 중심극한정리

분포로 재는 성능 지표

응답 시간 · 지연 · 꼬리 지연 · 처리량 · 서비스 수준 목표 · 서비스 수준 지표 · 메트릭 · 모니터링

분포가 한쪽으로 쏠려 생기는 문제

핫스팟 · 데이터 편중 · 해시 충돌 · 분포 이동

분포를 근거로 동작을 정하는 기술

실행 계획 · 쿼리 옵티마이저 · 인덱스 · 해시 함수 · 샤딩 · 큐잉 이론 · 머신러닝 · 용량 계획

다른 이름: distribution · 값의 분포