Elasticsearch: Metrics Aggregations (메트릭 집계) 완벽 정리

Elasticsearch의 Metrics Aggregations을 활용하면 **숫자 필드의 연산(최소, 최대, 평균, 합계, 개수 등)**을 수행할 수 있습니다.
검색된 데이터에서 통계 정보를 추출
로그 분석, 사용자 접속 통계, 매출 분석 등에 활용 가능
백분위(Percentiles) 및 유니크 값(Cardinality) 분석 가능

이번 글에서는 Metrics Aggregations 개념, 주요 기능, 실전 예제까지 상세히 알아보겠습니다.


1. Metrics Aggregations 개요

     
개념 숫자 필드를 대상으로 다양한 통계 연산을 수행  
사용 목적 평균, 합계, 최소값, 최대값, 개수 등 통계 값 계산  
주요 유형 min, max, sum, avg, stats, cardinality, percentiles, percentile_ranks  

2. 데이터 예제 (지하철 승객 수 데이터)

Metrics Aggregations을 테스트할 데이터를 준비합니다.

📌 예제 1: my_stations 인덱스 생성 및 데이터 입력

PUT my_stations/_bulk
{"index": {"_id": "1"}}
{"date": "2019-06-01", "line": "1호선", "station": "종각", "passangers": 2314}
{"index": {"_id": "2"}}
{"date": "2019-06-01", "line": "2호선", "station": "강남", "passangers": 5412}
{"index": {"_id": "3"}}
{"date": "2019-07-10", "line": "2호선", "station": "강남", "passangers": 6221}
{"index": {"_id": "4"}}
{"date": "2019-07-15", "line": "2호선", "station": "강남", "passangers": 6478}
{"index": {"_id": "5"}}
{"date": "2019-08-07", "line": "2호선", "station": "강남", "passangers": 5821}
{"index": {"_id": "6"}}
{"date": "2019-08-18", "line": "2호선", "station": "강남", "passangers": 5724}
{"index": {"_id": "7"}}
{"date": "2019-09-02", "line": "2호선", "station": "신촌", "passangers": 3912}
{"index": {"_id": "8"}}
{"date": "2019-09-11", "line": "3호선", "station": "양재", "passangers": 4121}
{"index": {"_id": "9"}}
{"date": "2019-09-20", "line": "3호선", "station": "홍제", "passangers": 1021}
{"index": {"_id": "10"}}
{"date": "2019-10-01", "line": "3호선", "station": "불광", "passangers": 971}

지하철 승객 수 데이터를 포함한 샘플 데이터 생성


3. 기본 Metrics Aggregations

🔹 1) 최소, 최대, 합계, 평균값 계산

✔ **min, max, sum, avg**를 사용하여 숫자 필드의 통계를 계산 가능

📌 예제 2: 전체 승객 수의 평균, 합계, 최대, 최소값 구하기

GET my_stations/_search
{
  "size": 0,
  "aggs": {
    "min_passengers": {
      "min": { "field": "passangers" }
    },
    "max_passengers": {
      "max": { "field": "passangers" }
    },
    "sum_passengers": {
      "sum": { "field": "passangers" }
    },
    "avg_passengers": {
      "avg": { "field": "passangers" }
    }
  }
}

최소값, 최대값, 합계, 평균을 한 번에 계산 가능

📌 예제 3: 특정 역(강남)의 승객 합계 구하기

GET my_stations/_search
{
  "query": {
    "match": { "station": "강남" }
  },
  "size": 0,
  "aggs": {
    "gangnam_passengers": {
      "sum": { "field": "passangers" }
    }
  }
}

강남역의 전체 승객 수 합계를 구하는 예제


4. stats Aggregation

stats를 사용하면 min, max, sum, avg, count를 한 번에 계산 가능

📌 예제 4: 승객 수의 min, max, sum, avg, count 값 구하기

GET my_stations/_search
{
  "size": 0,
  "aggs": {
    "passenger_stats": {
      "stats": { "field": "passangers" }
    }
  }
}

한 번의 Aggregation으로 여러 값을 동시에 계산 가능


5. Cardinality Aggregation (고유 값 개수)

특정 필드에 대해 "고유한 값 개수"를 계산
예: line(지하철 노선)이 몇 개 있는지 확인

📌 예제 5: line 필드에서 고유한 노선 개수 구하기

GET my_stations/_search
{
  "size": 0,
  "aggs": {
    "uniq_lines": {
      "cardinality": { "field": "line.keyword" }
    }
  }
}

1호선, 2호선, 3호선 총 3개의 고유 값이 존재


6. Percentiles Aggregation (백분위 수 계산)

데이터의 특정 백분위 값을 확인 가능 (예: 승객 수의 90% 이상이 몇 명인지 분석)

📌 예제 6: 승객 수의 기본 백분위 계산

GET my_stations/_search
{
  "size": 0,
  "aggs": {
    "pass_percentiles": {
      "percentiles": { "field": "passangers" }
    }
  }
}

기본적으로 1%, 5%, 25%, 50%, 75%, 95%, 99% 백분위 값을 제공

📌 예제 7: 특정 백분위 값(20%, 60%, 80%)을 설정

GET my_stations/_search
{
  "size": 0,
  "aggs": {
    "pass_percentiles": {
      "percentiles": {
        "field": "passangers",
        "percents": [ 20, 60, 80 ]
      }
    }
  }
}

20%, 60%, 80% 백분위 값을 지정하여 확인 가능


7. Percentile Ranks Aggregation

특정 값이 전체 데이터에서 몇 %에 해당하는지 확인
예: 승객 수 1000명, 3000명, 6000명은 상위 몇 %인지 분석

📌 예제 8: 특정 값의 백분위 랭크 구하기

GET my_stations/_search
{
  "size": 0,
  "aggs": {
    "pass_percentile_ranks": {
      "percentile_ranks": {
        "field": "passangers",
        "values": [ 1000, 3000, 6000 ]
      }
    }
  }
}

각 값이 전체 데이터의 몇 % 수준인지 확인 가능 (예: 1000명은 하위 10% 수준)


8. 정리

     
기본 연산 min, max, sum, avg, stats  
고유 값 개수 cardinality  
백분위 수 분석 percentiles, percentile_ranks  

9. 마무리

Metrics Aggregations을 활용하면 데이터 분석이 가능
백분위 수, 고유 값 개수 등을 통해 인사이트 도출 가능
Elasticsearch를 통계 분석 플랫폼으로 활용 가능

다음 학습에서는 고급 Aggregations 및 성능 최적화 전략을 다루겠습니다! 🚀

+ Recent posts