요약 통계
고친 사람 github-actions[bot]
요약 통계는 값 수천 개를 수 몇 개로 줄여 전해 줍니다. 값들이 어디쯤 모여 있고 얼마나 흩어져 있는지를 그 몇 개가 말합니다. 값을 전부 늘어놓지 않고도 두 묶음을 견줄 수 있게 됩니다.
쉽고 빠른 이해
요약 통계는 많은 값을 몇 개의 수로 줄여 줍니다. 요청 만 건의 응답 시간을 「평균 0.2초, 가장 오래 걸린 것 4초」처럼 두 마디로 말하게 해 줍니다.
이게 없으면 값 만 개를 눈으로 훑어야 합니다. 사람은 그만한 목록을 한 번에 읽지 못합니다. 어제와 오늘을 견줄 방법도 없습니다.
- 값 묶음을 하나 정합니다
- 「가운데가 어디인가」「얼마나 퍼졌나」 같은 물음을 고릅니다
- 물음마다 수 하나를 계산해 나란히 적습니다
대가는 버린 값이 안 보인다는 것입니다. 값이 두 무리로 갈라져 있어도 평균은 그 사이의 수 하나로 나옵니다. 그래서 성격이 다른 수를 몇 개 함께 보고, 그림도 한 번 그려 봅니다.
상세
반 학생 서른 명의 시험 점수를 누가 물으면 서른 개를 하나씩 불러 주지 않습니다. 「평균은 칠십 점쯤이고 제일 낮은 학생이 사십 점, 제일 높은 학생이 구십팔 점이에요」라고 몇 마디로 답합니다. 듣는 사람은 그 몇 마디만으로 반 성적을 대강 그립니다.
요약 통계는 값 묶음 하나에서 계산해 낸 수들입니다. 수 하나가 묶음의 특징 하나를 맡습니다. 응답 시간 만 건을 두고 「평균 0.2초, p99(99번째 백분위수) 1.1초, 가장 오래 걸린 것 4초」라고 적으면 그 세 수가 요약 통계입니다.
p99 는 백분위수를 줄여 적은 이름입니다. 백 건 중 아흔아홉 건이 그 시간 안에 끝났다는 경계 값입니다. 평균이 놓치는 오래 걸린 쪽 끝을 보려고 함께 적습니다.
값 묶음에서 계산해 낸 수 하나하나를 통계량이라고 부릅니다. 묶음을 요약하려고 고른 통계량이 요약 통계량입니다. 그것들을 한데 묶어 부를 때 요약 통계라고 합니다.
요약이 필요한 까닭은 사람의 눈에 있습니다. 값이 수천 개를 넘으면 그 목록을 읽어서는 아무것도 알 수 없습니다. 모니터링 화면이 원래 값 대신 평균과 백분위수를 그리는 것도 그래서입니다.
요약해 두면 두 묶음을 수 몇 개로 견줄 수 있습니다. 배포 전과 후, 어제와 오늘의 응답 시간을 같은 통계량끼리 나란히 놓으면 무엇이 달라졌는지 바로 보입니다.
요약 통계가 답하는 세 물음
요약 통계를 물음 셋으로 나눠 봅니다. 물음마다 답하는 통계량이 따로 있습니다.
첫째 물음은 값들이 어디쯤 모여 있느냐입니다. 이 물음에 답하는 수를 중심 경향의 척도라고 부릅니다. 묶음을 수 하나로 대표할 때 고르는 값입니다.
둘째 물음은 값들이 얼마나 흩어져 있느냐입니다. 이 물음에 답하는 수를 산포의 척도라고 부릅니다. 가운데가 같은 두 묶음을 가르는 것이 이 수입니다.
셋째 물음은 값들이 어느 쪽으로 치우쳤느냐입니다. 값이 줄지어 그리는 모양을 분포라고 부릅니다. 셋째 물음은 그 분포가 좌우로 고른지, 한쪽 꼬리가 길게 늘어졌는지를 묻습니다.
세 물음에 답하는 대표 통계량을 모으면 이렇습니다.
| 물음 | 통계량 | 셈 |
|---|---|---|
| 가운데 | 평균 | 값을 모두 더해 개수로 나눕니다 |
| 가운데 | 중앙값 | 크기순으로 줄 세웠을 때 한가운데 선 값입니다 |
| 가운데 | 최빈값 | 가장 자주 나온 값입니다 |
| 퍼짐 | 범위 | 최댓값에서 최솟값을 뺍니다 |
| 퍼짐 | 분산 | 값마다 평균에서 떨어진 거리를 제곱해 평균 냅니다 |
| 퍼짐 | 표준편차 | 분산의 제곱근입니다. 단위가 원래 값과 같아집니다 |
| 퍼짐 | 사분위 범위 | 한가운데 절반의 값이 차지하는 폭입니다 |
| 모양 | 왜도 | 한쪽 꼬리가 얼마나 길게 늘어졌나를 잽니다 |
| 모양 | 첨도 | 평균에서 멀리 떨어진 값이 얼마나 자주 나오나를 잽니다 |
표의 셈은 모두 짧습니다. 그런데 한 물음에 답하는 수만 받으면 나머지 두 물음은 모르는 채로 남습니다. 값 다섯 개짜리 묶음 둘이 그 빈틈을 보여 줍니다.
평균이 같은 두 묶음
값 다섯 개짜리 묶음 둘을 견줍니다. 평균은 같습니다. 가운데와 퍼짐을 다른 수로 재면 전혀 다른 묶음이라는 것이 드러납니다.
from statistics import mean, median
a = [10, 10, 10, 10, 10]
b = [0, 0, 0, 0, 50]
mean(a), mean(b) # (10, 10)
median(a), median(b) # (10, 0)
max(a) - min(a) # 0
max(b) - min(b) # 50
두 묶음 모두 평균이 10 입니다. 평균만 받아 든 사람에게 둘은 같은 묶음입니다.
중앙값과 범위를 함께 보면 갈립니다. a 는 모든 값이 10 이라 범위가 0 입니다. b 는 다섯 중
넷이 0 입니다. 한 값만 50 입니다. 그 한 값이 평균을 혼자 10 까지 끌어올렸습니다.
응답 시간으로 옮기면 b 는 요청 다섯 중 넷이 곧바로 끝난 서비스입니다. 남은 하나는 오래 걸렸습니다.
평균 하나로는 오래 걸린 이 한 건이 안 보입니다.
다섯 수 요약
가운데와 퍼짐을 한 번에 보여 주는 요약 통계의 묶음이 있습니다. 값 열한 개에서 그 다섯 수를 뽑아 봅니다.
사분위수는 크기순으로 선 줄을 네 토막으로 자르는 경계 값입니다. 1사분위수 아래로 값의 사분의 일이 들어갑니다. 3사분위수 아래로는 사분의 삼이 들어갑니다. 두 경계 사이에는 한가운데 절반이 놓입니다.
다섯 수 요약은 최솟값, 1사분위수, 중앙값, 3사분위수, 최댓값을 나란히 적은 것입니다. 이 다섯이 줄의 양 끝과 네 토막의 경계를 모두 짚습니다.
응답 시간 열한 건을 재 봤다고 합시다. 단위는 밀리초입니다. 작은 것부터 줄 세우면 12, 14, 15, 15, 17, 18, 20, 22, 25, 31, 90 입니다.
사분위수를 집는 방식은 몇 가지가 있어서 도구마다 값이 조금씩 다르게 나옵니다. 여기서는 한가운데인 6번째 값을 빼고, 아래 다섯 개와 위 다섯 개에서 다시 한가운데를 고릅니다. 아래 다섯의 한가운데는 3번째, 위 다섯의 한가운데는 9번째입니다. 다섯 수는 이렇게 나옵니다.
| 이름 | 줄에서 몇 번째 | 값 |
|---|---|---|
| 최솟값 | 1 | 12 |
| 1사분위수 | 3 | 15 |
| 중앙값 | 6 | 18 |
| 3사분위수 | 9 | 25 |
| 최댓값 | 11 | 90 |
가운데 절반은 15 에서 25 사이, 폭 10 안에 모여 있습니다. 그런데 3사분위수에서 최댓값까지는 65 나 벌어집니다. 다섯 수만 봐도 오래 걸린 쪽 끝에 멀리 떨어진 값이 하나 있다는 것이 보입니다.
같은 열한 건의 평균은 약 25.4 입니다. 90 하나가 평균을 끌어올려 3사분위수보다도 커졌습니다. 평균만 보면 요청 대부분이 25 쯤 걸린 것처럼 읽힙니다.
다섯 수를 그림으로 옮긴 것이 상자 그림입니다. 1사분위수부터 3사분위수까지를 상자로 그립니다. 상자 양옆으로는 선을 뻗어 끝 쪽 값들을 보입니다.
여러 곳에서 잰 요약을 합치는 방법
서버 여러 대가 따로 잰 요약을 하나로 합치는 일을 봅니다. 통계량에 따라 합쳐지는 것과 안 합쳐지는 것이 갈립니다.
서버 A 는 값 1, 2, 3 을 받았습니다. 서버 B 는 10, 20 을 받았습니다. 두 서버의 평균은 2 와 15 입니다. 이 둘을 다시 평균 내면 8.5 가 나옵니다. 다섯 값을 한데 모아 낸 평균은 7.2 입니다.
평균끼리 평균 내면 값이 적은 서버와 많은 서버를 똑같이 쳐 버립니다. 그래서 전체 평균과 어긋납니다.
각 서버가 평균 대신 개수와 합을 들고 있으면 이 어긋남이 없어집니다. 개수는 개수끼리, 합은 합끼리 더한 뒤 나누면 전체 평균이 나옵니다. 최솟값은 최솟값 가운데 작은 쪽을 고르면 됩니다. 최댓값도 같은 식으로 큰 쪽을 고릅니다.
flowchart TD
A["서버 A · 개수 3 · 합 6 · 최솟값 1 · 최댓값 3"]
B["서버 B · 개수 2 · 합 30 · 최솟값 10 · 최댓값 20"]
M["합친 수 · 개수 5 · 합 36 · 최솟값 1 · 최댓값 20"]
R["전체 평균 · 36 ÷ 5 = 7.2"]
A --> M
B --> M
M --> R
그림에서 평균은 어느 서버에도 저장돼 있지 않습니다. 합과 개수를 합친 뒤 마지막에 한 번 나눠서 얻습니다.
분산도 같은 길로 합칠 수 있습니다. 개수와 합에 더해 값을 제곱한 합까지 들고 있으면 됩니다. 분산은 제곱의 평균에서 평균의 제곱을 뺀 값이기 때문입니다. 제곱의 평균은 제곱한 합을 개수로 나누면 나옵니다.
집계 함수는 데이터베이스에서 여러 행을 값 하나로 접습니다. 평균을 내는 집계 함수는 행을 읽으며 개수와 합만 늘려 가다가 마지막에 한 번 나누면 됩니다. 값을 전부 쌓아 두지 않아도 되는 것은 개수·합처럼 더해서 합쳐지는 성질 덕분입니다.
중앙값과 백분위수에는 이런 길이 없습니다. 줄 세운 순서로 정해지는 수라서 서버마다 뽑은 중앙값을 섞어도 전체 중앙값이 안 나옵니다. 원래 값을 다시 모으거나, 값을 구간마다 몇 건인지로 담아 두는 히스토그램을 써야 합니다.
요약이 가리는 값의 모양
요약 통계는 값을 버려서 읽기 쉬워집니다. 버린 값 속에 중요한 모양이 있으면 수는 맞게 나왔는데 읽는 사람은 틀린 그림을 그립니다.
응답 시간 백 건 중 쉰 건은 캐시에 있던 값을 돌려줘서 0.1초에 끝났다고 합시다. 나머지 쉰 건은 캐시에 없어서 0.9초가 걸렸습니다. 평균은 0.5초입니다. 그런데 0.5초 근처에서 끝난 요청은 한 건도 없습니다.
이렇게 값이 두 무리로 갈라진 분포를 쌍봉 분포라고 부릅니다. 평균과 표준편차는 이 갈라짐을 드러내지 못합니다. 히스토그램을 한 번 그리면 두 봉우리가 바로 보입니다.
평균과 분산이 같은데 그려 보면 모양이 전혀 다른 묶음은 얼마든지 만들 수 있습니다. 탐색적 자료 분석이 수를 내면서 그림을 함께 그리는 까닭이 이것입니다.
쓰는 때와 조심할 때
묶음 둘을 견줄 때 씁니다. 배포 전과 후의 응답 시간, 어제와 오늘의 요청량을 몇 개의 수로 나란히 놓습니다. 대시보드와 부하 테스트 결과표가 이런 꼴입니다.
요약 통계 옆에는 개수를 함께 적습니다. 값 열 개로 낸 평균과 만 개로 낸 평균은 같은 수여도 믿을 만한 정도가 다릅니다. 뒤쪽 백분위수는 건수가 적을수록 한두 건에 크게 흔들립니다.
분포의 모양을 모를 때는 가운데를 재는 수 하나에 기대지 않습니다. 한쪽으로 치우친 묶음에서는 평균이 중앙값과 멀어집니다. 둘을 함께 보면 그 차이로 치우침을 먼저 알아챕니다.
가진 데이터를 수와 그림으로 설명하는 통계 전체를 기술 통계라고 부릅니다. 요약 통계는 그 가운데 수로 내는 부분입니다.
요약 통계는 가진 값을 말할 뿐 그 밖을 추측하지 않습니다. 일부만 재서 전체를 말하거나 오늘 잰 값으로 내일을 말하는 일은 추론 통계가 맡습니다.
관련 항목
가운데를 재는 통계량
평균 · 중앙값 · 최빈값 · 중심 경향 · 절사평균 · 가중평균
퍼짐을 재는 통계량
분산 · 표준편차 · 범위 · 사분위 범위 · 산포 · 변동 계수
줄 세운 순서로 정하는 통계량
분위수 · 백분위수 · 사분위수 · 십분위수 · 최솟값 · 최댓값 · 다섯 수 요약
분포의 모양을 재는 통계량
왜도 · 첨도 · 분포 · 정규 분포 · 누적 분포 함수
요약 통계를 흔드는 치우친 값
이상치 · 치우침 · 긴 꼬리 · 쌍봉 분포 · 꼬리 지연
요약 통계를 보완하는 그림
히스토그램 · 상자 그림 · 산점도 · 데이터 시각화 · 앤스컴 콰르텟
요약 통계가 속하는 통계학의 갈래
통계학 · 기술 통계 · 추론 통계 · 통계량 · 표본 · 모집단
여러 곳의 요약을 합치는 방법
집계 · 집계 함수 · 스트리밍 알고리즘 · 근사 분위수 · t-digest · HdrHistogram
요약 통계로 재는 성능 지표
응답 시간 · 지연 · 처리량 · 오류율 · 서비스 수준 목표
요약 통계를 도구로 쓰는 분야
다른 이름: summary statistics · summary statistic · 요약 통계량