Elasticsearch: Pipeline Aggregations (파이프라인 집계) 완벽 정리 🚀

1. Pipeline Aggregations 개요

Metrics Aggregation의 결과를 다시 연산하는 기능
다른 Aggregation 결과를 입력값으로 사용 가능
데이터의 이동 평균, 미분, 누적 합계, 통계 분석 수행 가능


2. Pipeline Aggregations 주요 기능

설명 사용 예시
min_bucket 버킷 중 최솟값 찾기 월별 최소 승객 수
max_bucket 버킷 중 최댓값 찾기 월별 최대 승객 수
avg_bucket 버킷들의 평균값 주간 평균 방문자 수
sum_bucket 버킷들의 합계 분기별 총 매출
stats_bucket min, max, sum, avg 등 한 번에 계산 다양한 통계 분석
cumulative_sum 누적 합계 계산 매월 누적 방문자 수
moving_avg 이동 평균 계산 3개월 이동 평균 승객 수
derivative 값의 미분 계산 방문자 수 증가율

 

Elasticsearch에서 "버킷(Bucket)"이란?
👉 버킷은 데이터를 특정 기준에 따라 그룹화하는 컨테이너입니다.
👉 **"버킷을 만든다"**는 것은 데이터를 특정 조건에 따라 분류하는 것입니다.
👉 각 버킷에는 해당하는 **도큐먼트 개수(doc_count)**가 자동으로 계산됩니다.


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

먼저 테스트 데이터를 준비합니다.

📌 예제 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}

승객 수 데이터가 포함된 샘플 데이터 생성


4. 누적 합계 (Cumulative Sum Aggregation)

월별 승객 수 합계를 누적 계산
buckets_path 옵션을 이용해 다른 집계 결과를 참조

📌 예제 2: cumulative_sum으로 누적 승객 수 계산

GET my_stations/_search
{
  "size": 0,
  "aggs": {
    "months": {
      "date_histogram": {
        "field": "date",
        "calendar_interval": "month"
      },
      "aggs": {
        "sum_psg": {
          "sum": {
            "field": "passangers"
          }
        },
        "accum_sum_psg": {
          "cumulative_sum": {
            "buckets_path": "sum_psg"
          }
        }
      }
    }
  }
}

각 월별 합계를 누적하여 계산하는 예제
buckets_path: "sum_psg" → sum_psg 값을 입력으로 사용


5. 이동 평균 (Moving Average Aggregation)

이전 버킷 값을 참조하여 이동 평균 계산
데이터의 변동성을 부드럽게 표현 가능

📌 예제 3: moving_avg로 3개월 이동 평균 계산

GET my_stations/_search
{
  "size": 0,
  "aggs": {
    "months": {
      "date_histogram": {
        "field": "date",
        "calendar_interval": "month"
      },
      "aggs": {
        "sum_psg": {
          "sum": {
            "field": "passangers"
          }
        },
        "moving_avg_psg": {
          "moving_avg": {
            "buckets_path": "sum_psg",
            "window": 3
          }
        }
      }
    }
  }
}

3개월 이동 평균을 계산하여 트렌드 파악
window: 3 → 3개월 이동 평균


6. 미분 (Derivative Aggregation)

변화율(증가율/감소율) 계산 가능
트래픽 증가율, 매출 성장률 분석에 활용

📌 예제 4: derivative로 승객 수 증가율 계산

GET my_stations/_search
{
  "size": 0,
  "aggs": {
    "months": {
      "date_histogram": {
        "field": "date",
        "calendar_interval": "month"
      },
      "aggs": {
        "sum_psg": {
          "sum": {
            "field": "passangers"
          }
        },
        "growth_rate_psg": {
          "derivative": {
            "buckets_path": "sum_psg"
          }
        }
      }
    }
  }
}

승객 수의 증가율(미분 값) 계산


7. 최대값이 있는 버킷 찾기 (Max Bucket Aggregation)

여러 버킷 중 최대값이 포함된 버킷을 찾음
가장 많은 승객이 있는 월 확인 가능

📌 예제 5: max_bucket으로 최대 승객 수를 기록한 월 찾기

GET my_stations/_search
{
  "size": 0,
  "aggs": {
    "months": {
      "date_histogram": {
        "field": "date",
        "calendar_interval": "month"
      },
      "aggs": {
        "sum_psg": {
          "sum": {
            "field": "passangers"
          }
        }
      }
    },
    "max_passangers_month": {
      "max_bucket": {
        "buckets_path": "months>sum_psg"
      }
    }
  }
}

가장 승객 수가 많았던 달을 찾는 예제
buckets_path: "months>sum_psg" → 부모 > 자식 관계로 접근


8. 정리

기능 설명 활용 예시
누적 합계 (cumulative_sum) 이전 값들의 합을 누적 총 방문자 수 분석
이동 평균 (moving_avg) 일정 구간의 평균 계산 3개월 이동 평균
미분 (derivative) 값의 증가율 계산 매출 성장률 분석
최대 버킷 (max_bucket) 최대값을 포함한 버킷 찾기 최대 방문자 수가 있는 날짜 찾기

9. 마무리

Pipeline Aggregations을 활용하면 복잡한 데이터 분석 가능
버킷을 기준으로 누적 합, 이동 평균, 증가율 등을 손쉽게 계산 가능
하지만 너무 깊은 Aggregations을 사용하면 성능 저하 가능

이제 Aggregations을 활용하여 더욱 강력한 데이터 분석을 진행할 수 있습니다! 🚀

+ Recent posts