히스토그램과 히트맵 소개
히스토그램과 히트맵 소개 (Introduction to histograms and heatmaps)
히스토그램은 숫자 데이터의 분포를 시각적으로 보여 주는 대표적인 그래프예요. 이 페이지에서는 히스토그램과 그 확장 개념인 히트맵(heatmap)이 무엇인지, 그리고 언제 어떤 것을 써야 하는지를 기본부터 설명해 줘요. 시계열 데이터의 "값 분포"를 다룰 때 핵심이 되는 개념이랍니다.
본문
히스토그램이란?
히스토그램은 숫자 데이터 분포의 그래픽 표현이에요. 값들을 **버킷(bucket, 혹은 bin)**으로 묶은 다음, 각 버킷에 몇 개의 값이 들어가는지를 세는 방식이에요.
히스토그램은 실제 값 자체가 아니라 버킷을 그래프로 그려요. 각 막대는 하나의 버킷을 나타내고, 막대의 높이는 그 버킷 구간에 들어온 값의 빈도(예: 개수)를 나타내요.
예를 들어 어느 시계열의 값 분포를 그리면 대부분의 값이 240300 사이에 몰려 있고, 특히 260280 구간에서 최고점을 이루는 것을 쉽게 알 수 있어요. 사람의 키 분포 예시도 마찬가지로 그릴 수 있죠.
히스토그램 시각화 옵션에 대한 자세한 내용은 Histogram 문서를 참고하세요.
히스토그램은 특정 시간 범위에서의 값 분포만 바라봐요. 즉, 시간에 따른 분포의 추세나 변화는 볼 수 없다는 단점이 있어요. 이 한계를 해결해 주는 것이 바로 **히트맵(heatmap)**이에요.
히트맵 (Heatmaps)
히트맵은 시간 축을 추가한 히스토그램이에요. 각 시간 조각(time slice)이 각자의 히스토그램을 가지죠. 막대 높이 대신 **셀(cell)**을 사용하고, 버킷에 들어있는 값의 수에 비례해 셀의 색을 칠해요.
이 예시에서는 어떤 값이 더 흔한지, 그리고 그 값들이 시간에 따라 어떻게 변화하는지를 한눈에 볼 수 있어요.
히트맵 시각화 옵션에 대한 자세한 내용은 Heatmap 문서를 참고하세요.
사전 버킷팅된 데이터 (Pre-bucketed data)
시간에 따른 히스토그램(histogram over time)을 지원하는 데이터 소스는 여럿 있어요. 예를 들어 Elasticsearch는 Histogram bucket 집계를, Prometheus는 histogram 메트릭 타입을 지원하죠(FORMAT AS 옵션을 Heatmap으로 설정). 일반적으로는 다음 요구사항 중 하나를 충족하기만 하면 어떤 데이터 소스든 사용 가능해요.
- 버킷 경계(bucket bounds)를 나타내는 이름을 가진 시리즈를 반환하거나
- 경계 기준 오름차순으로 정렬된 시리즈를 반환
원본 데이터 vs 집계 데이터 (Raw data vs aggregated)
히트맵을 일반 시계열 데이터(사전 버킷팅되지 않은)와 함께 쓴다면, 데이터가 이미 시계열 백엔드에 의해 집계되어 있는 경우가 많다는 점을 유의해야 해요. 대부분의 시계열 쿼리는 원본 샘플 데이터를 반환하지 않고, group by time 간격이나 maxDataPoints 제한과 함께 집계 함수(보통 average)를 적용한 결과를 반환하거든요.
물론 이는 쿼리의 시간 범위에 달려 있어요. 하지만 중요한 점은 Grafana가 수행하는 히스토그램 버킷팅이 이미 집계되고 평균화된 데이터에 대해 수행될 수 있다는 거예요. 더 정확한 히트맵을 원한다면 메트릭 수집 시점에 버킷팅을 수행하거나, 원본 데이터에 대한 히스토그램 버킷팅을 지원하는 Elasticsearch 같은 데이터 소스에 데이터를 저장하는 것이 좋아요.
쿼리에서 group by time을 제거하거나 낮추고(혹은 maxDataPoints를 높여) 더 많은 데이터 포인트를 반환하면 히트맵은 더 정확해져요. 다만 이는 브라우저에 상당한 CPU·메모리 부담을 줄 수 있고, 데이터 포인트 수가 비현실적으로 많아지면 화면이 멈추거나 크래시할 수도 있으니 주의하세요.