집계
고친 사람 github-actions[bot]
집계는 여러 건의 값을 하나로 접습니다. 낱낱을 다 보지 않아도 전체가 어떤지 알게 해 줍니다. 합계와 개수와 평균이 그렇게 접어 낸 값입니다.
쉽고 빠른 이해
집계는 흩어진 값 여럿을 한 값으로 접는 계산입니다. 하루 동안 쌓인 주문 만 건을 「오늘 매출 한 줄」로 줄이는 일이 집계입니다.
이게 없으면 만 건을 사람이 다 읽어야 합니다. 화면도 저장 공간도 만 건을 그대로 감당해야 합니다.
어떻게 도는가:
- 어떤 것들을 한 무리로 볼지 정합니다. 날짜별이든 지역별이든 기준을 하나 잡습니다
- 무리마다 접는 계산을 고릅니다. 세기 · 더하기 · 평균 내기 같은 것입니다
- 무리 하나가 값 하나가 되어 나옵니다
대가는 접힌 것이 안 돌아온다는 것입니다. 평균 한 줄만 남기면 유난히 오래 걸린 한 건은 그 안에 묻혀 안 보입니다.
상세
영수증은 산 물건을 한 줄씩 적고 맨 아래에 합계 한 줄을 둡니다. 물건 줄을 다 읽지 않아도 얼마를 썼는지는 그 한 줄이 말해 줍니다.
집계는 이렇게 여러 값을 하나로 접는 계산입니다. 접어 낸 값은 원래 값들을 요약한 것입니다. 원래 값은 저장된 곳에 남아 있습니다.
접는 대상은 같은 모양으로 쌓이는 기록입니다. 주문 한 건, 로그 한 줄, 센서 측정값 하나가 그런 기록입니다. 이런 기록은 한 건만 봐서는 알 수 있는 것이 거의 없습니다. 모아 봐야 뜻이 생깁니다.
접기 전의 낱낱 기록을 원자료라고 부릅니다. 집계 결과는 원자료 옆에 따로 생기는 요약 값입니다.
정해야 할 둘 — 무리와 접는 계산
집계에는 정해야 할 것이 둘 있습니다. 어떤 값들을 한 무리로 볼지, 그 무리를 어떤 계산으로 접을지입니다.
무리를 가르는 잣대를 그룹 기준이라고 부릅니다. 주문을 지역별로 가르면 지역이 그룹 기준입니다. 기준을 안 정하면 전체가 무리 하나입니다. 결과도 한 줄입니다.
무리를 접는 계산은 집계 함수입니다. 값 여럿을 받아 값 하나를 내놓는 함수입니다. 세기 · 더하기 · 평균 내기가 거기 듭니다.
flowchart TD
R["주문 기록 여러 줄"]
R --> G1["무리 · 지역이 서울인 줄"]
R --> G2["무리 · 지역이 부산인 줄"]
G1 --> V1["한 줄 · 건수와 합"]
G2 --> V2["한 줄 · 건수와 합"]
줄 여럿이 무리로 갈립니다. 무리마다 한 줄이 나옵니다. 그래서 결과의 줄 수는 무리의 수와 같습니다.
SQL(Structured Query Language, 구조화 질의어)에서는 이 둘이 한 문장에 같이 나옵니다. 접는 계산을 앞에, 무리를 가르는 잣대를 뒤에 적습니다.
SELECT 지역, COUNT(*)
FROM 주문
GROUP BY 지역 -- 서울 12 · 부산 5
지역이 둘뿐인 주문 열일곱 건을 이렇게 접으면 결과는 두 줄입니다.
접는 계산의 종류
접는 계산은 몇 가지로 정해져 있습니다. 무엇을 알고 싶은지가 어느 것을 쓸지 정합니다.
| 접는 계산 | 무엇을 내놓나 | 이럴 때 |
|---|---|---|
| 개수 | 몇 건인가 | 요청이 얼마나 들어왔나 |
| 합 | 다 더하면 얼마인가 | 하루 매출 |
| 평균 | 한 건당 얼마쯤인가 | 보통 얼마나 걸리나 |
| 최소 · 최대 | 양 끝은 얼마인가 | 가장 오래 걸린 요청 |
| 백분위수 | 아래에서 몇 번째쯤 값인가 | 오래 걸린 쪽 꼬리 |
| 고유 개수 | 서로 다른 값이 몇 가지인가 | 접속한 사람 수 |
같은 무리라도 어느 계산으로 접느냐에 따라 다른 것이 보입니다. 개수는 얼마나 많았는지를, 최대는 가장 심했던 한 건을 말해 줍니다.
시간으로 자른 무리
기록이 시간과 함께 쌓이면 무리를 시간으로 가릅니다. 한 시간씩 또는 하루씩 잘라 토막마다 값 하나를 냅니다. 이렇게 자른 한 토막을 집계 구간이라고 부릅니다.
구간을 넓게 잡으면 결과 줄이 적어집니다. 흐름도 매끈해집니다. 좁게 잡으면 잠깐 튄 대목이 드러나는 대신 볼 줄이 많아집니다.
오래된 구간을 더 넓은 구간으로 다시 접어 두는 것을 다운샘플링이라고 합니다. 최근 기록은 촘촘히 두고 옛 기록은 성기게 남기는 방식입니다.
block-beta columns 4 old["옛 기록 · 네 시간이 한 구간"]:4 h1["최근 · 한 시간"] h2["한 시간"] h3["한 시간"] h4["한 시간"]
두 줄이 덮는 시간은 똑같이 네 시간입니다. 윗줄은 그것을 한 구간으로 접었고 아랫줄은 한 시간씩 네 구간으로 두었습니다.
나눠 접고 다시 접기
기록이 여러 서버에 흩어져 있으면 한 군데서 다 못 접습니다. 조각마다 따로 접은 뒤 그 결과를 다시 접습니다.
이때 계산마다 사정이 다릅니다. 합과 개수는 조각 결과를 다시 더하면 전체 값이 됩니다. 평균은 조각 평균을 다시 평균 내면 어긋난 값이 나옵니다. 조각마다 든 건수가 다르기 때문입니다.
그래서 평균을 나눠서 구할 때는 합과 개수를 짝으로 들고 다닙니다. 마지막에 합을 개수로 나눕니다.
flowchart TD
subgraph 조각["조각마다 따로 접는다"]
A["조각 하나 · 합과 개수"]
B["조각 둘 · 합과 개수"]
end
A --> M["합끼리 더하고 개수끼리 더한다"]
B --> M
M --> R["합을 개수로 나눈다 · 전체 평균"]
미리 접기와 물을 때 접기
접는 때는 둘입니다. 물음이 들어올 때 원자료를 훑어 바로 접습니다. 아니면 미리 접어 둔 값을 꺼내 줍니다.
flowchart TD
Q["물음"]
Q --> S["원자료 전체를 훑는다"]
S --> F["그 자리에서 접는다"]
Q --> P["미리 접어 둔 값을 꺼낸다"]
두 경로가 지나는 데가 다릅니다. 한쪽은 원자료를 다 훑습니다. 다른 쪽은 접어 둔 값만 꺼냅니다.
물을 때 접으면 언제나 최신 값이 나옵니다. 대신 원자료가 많을수록 답이 늦어집니다.
미리 접어 두면 답이 곧장 나옵니다. 대신 원자료가 바뀌어도 접어 둔 값은 옛 값입니다. 다시 접기 전까지 둘이 어긋납니다. 이렇게 접어 둔 값을 사전 집계라고 부릅니다.
접으면서 잃는 것
접는 순간 무리 안의 차이는 사라집니다. 평균 한 줄은 모두가 비슷했던 무리와 몇 건만 크게 튄 무리를 같은 값으로 보여 줍니다.
flowchart TD
subgraph G1["값이 고른 무리"]
A["5 · 5 · 5 · 5"]
A --> AX["최댓값 5"]
end
subgraph G2["한 건이 튄 무리"]
B["1 · 1 · 1 · 17"]
B --> BX["최댓값 17"]
end
A --> M["평균 5"]
B --> M
두 무리는 든 값이 다릅니다. 그래도 평균은 똑같이 5입니다.
그래서 평균 하나만 두지 않습니다. 최댓값이나 백분위수를 같이 두면 튄 쪽이 드러납니다.
무리를 잘게 가를수록 묻히는 것이 줄어듭니다. 대신 결과 줄이 늘어납니다. 서로 다른 무리의 수를 카디널리티라고 부릅니다. 이 수가 커지면 저장할 양과 계산할 양이 같이 불어납니다.
flowchart TD
A["잣대 없음 · 1줄"]
A --> B1["서울 · 1줄"]
A --> B2["부산 · 1줄"]
B1 --> C1["서울 0시 · 1줄"]
B1 --> C2["서울 나머지 23시간 · 23줄"]
B2 --> C3["부산 0시 · 1줄"]
B2 --> C4["부산 나머지 23시간 · 23줄"]
잣대를 하나 더 걸 때마다 줄 수는 곱으로 불어납니다. 지역 둘에 시간대 스물넷을 걸면 48줄입니다.
관련 항목
무리를 접는 계산의 종류
집계 함수 · 합계 · 평균 · 중앙값 · 백분위수 · 최댓값 · 최솟값 · 고유 개수 · 표준편차 · 근사 집계
무리를 가르는 잣대
GROUP BY · 그룹화 · 레이블 · 차원 · 카디널리티 · 시간 범위 · 필터
시간으로 잘라 접을 때 쓰는 구간
집계 구간 · 측정 창 · 윈도 집계 · 고정 윈도우 · 슬라이딩 윈도 · 다운샘플링 · 롤업 · 이동 평균
집계한 값을 미리 만들어 두는 방법
사전 집계 · 구체화 뷰 · 요약 테이블 · 증분 집계 · 캐싱
집계를 맡아 굴리는 저장소와 도구
시계열 데이터베이스 · Elasticsearch · Prometheus · MongoDB · 집계 파이프라인 · OLAP · 데이터 웨어하우스
집계한 값을 읽어 쓰는 지표와 화면
메트릭 · 지표 · 대시보드 · 모니터링 · 서비스 수준 지표 · 골든 시그널 · 오류율 · 처리량
집계가 대상으로 삼는 기록
시계열 · 로그 · 이벤트 · 원자료 · 텔레메트리 · 샘플링
접으면서 잃는 것과 그 대비책
다른 이름: aggregation · 애그리게이션