사전 요약 통계
개념

요약 통계

gabury1고친 사람 github-actions[bot]

요약 통계는 값 수천 개를 수 몇 개로 줄여 전해 줍니다. 값들이 어디쯤 모여 있고 얼마나 흩어져 있는지를 그 몇 개가 말합니다. 값을 전부 늘어놓지 않고도 두 묶음을 견줄 수 있게 됩니다.

쉽고 빠른 이해

요약 통계는 많은 값을 몇 개의 수로 줄여 줍니다. 요청 만 건의 응답 시간을 「평균 0.2초, 가장 오래 걸린 것 4초」처럼 두 마디로 말하게 해 줍니다.

이게 없으면 값 만 개를 눈으로 훑어야 합니다. 사람은 그만한 목록을 한 번에 읽지 못합니다. 어제와 오늘을 견줄 방법도 없습니다.

  1. 값 묶음을 하나 정합니다
  2. 「가운데가 어디인가」「얼마나 퍼졌나」 같은 물음을 고릅니다
  3. 물음마다 수 하나를 계산해 나란히 적습니다

대가는 버린 값이 안 보인다는 것입니다. 값이 두 무리로 갈라져 있어도 평균은 그 사이의 수 하나로 나옵니다. 그래서 성격이 다른 수를 몇 개 함께 보고, 그림도 한 번 그려 봅니다.

상세

반 학생 서른 명의 시험 점수를 누가 물으면 서른 개를 하나씩 불러 주지 않습니다. 「평균은 칠십 점쯤이고 제일 낮은 학생이 사십 점, 제일 높은 학생이 구십팔 점이에요」라고 몇 마디로 답합니다. 듣는 사람은 그 몇 마디만으로 반 성적을 대강 그립니다.

요약 통계는 값 묶음 하나에서 계산해 낸 수들입니다. 수 하나가 묶음의 특징 하나를 맡습니다. 응답 시간 만 건을 두고 「평균 0.2초, p99(99번째 백분위수) 1.1초, 가장 오래 걸린 것 4초」라고 적으면 그 세 수가 요약 통계입니다.

p99 는 백분위수를 줄여 적은 이름입니다. 백 건 중 아흔아홉 건이 그 시간 안에 끝났다는 경계 값입니다. 평균이 놓치는 오래 걸린 쪽 끝을 보려고 함께 적습니다.

값 묶음에서 계산해 낸 수 하나하나를 통계량이라고 부릅니다. 묶음을 요약하려고 고른 통계량이 요약 통계량입니다. 그것들을 한데 묶어 부를 때 요약 통계라고 합니다.

요약이 필요한 까닭은 사람의 눈에 있습니다. 값이 수천 개를 넘으면 그 목록을 읽어서는 아무것도 알 수 없습니다. 모니터링 화면이 원래 값 대신 평균과 백분위수를 그리는 것도 그래서입니다.

요약해 두면 두 묶음을 수 몇 개로 견줄 수 있습니다. 배포 전과 후, 어제와 오늘의 응답 시간을 같은 통계량끼리 나란히 놓으면 무엇이 달라졌는지 바로 보입니다.

요약 통계가 답하는 세 물음

요약 통계를 물음 셋으로 나눠 봅니다. 물음마다 답하는 통계량이 따로 있습니다.

첫째 물음은 값들이 어디쯤 모여 있느냐입니다. 이 물음에 답하는 수를 중심 경향의 척도라고 부릅니다. 묶음을 수 하나로 대표할 때 고르는 값입니다.

둘째 물음은 값들이 얼마나 흩어져 있느냐입니다. 이 물음에 답하는 수를 산포의 척도라고 부릅니다. 가운데가 같은 두 묶음을 가르는 것이 이 수입니다.

셋째 물음은 값들이 어느 쪽으로 치우쳤느냐입니다. 값이 줄지어 그리는 모양을 분포라고 부릅니다. 셋째 물음은 그 분포가 좌우로 고른지, 한쪽 꼬리가 길게 늘어졌는지를 묻습니다.

세 물음에 답하는 대표 통계량을 모으면 이렇습니다.

물음 통계량 셈
가운데 평균 값을 모두 더해 개수로 나눕니다
가운데 중앙값 크기순으로 줄 세웠을 때 한가운데 선 값입니다
가운데 최빈값 가장 자주 나온 값입니다
퍼짐 범위 최댓값에서 최솟값을 뺍니다
퍼짐 분산 값마다 평균에서 떨어진 거리를 제곱해 평균 냅니다
퍼짐 표준편차 분산의 제곱근입니다. 단위가 원래 값과 같아집니다
퍼짐 사분위 범위 한가운데 절반의 값이 차지하는 폭입니다
모양 왜도 한쪽 꼬리가 얼마나 길게 늘어졌나를 잽니다
모양 첨도 평균에서 멀리 떨어진 값이 얼마나 자주 나오나를 잽니다

표의 셈은 모두 짧습니다. 그런데 한 물음에 답하는 수만 받으면 나머지 두 물음은 모르는 채로 남습니다. 값 다섯 개짜리 묶음 둘이 그 빈틈을 보여 줍니다.

평균이 같은 두 묶음

값 다섯 개짜리 묶음 둘을 견줍니다. 평균은 같습니다. 가운데와 퍼짐을 다른 수로 재면 전혀 다른 묶음이라는 것이 드러납니다.

Python
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 · 요약 통계량