가중 평균 집계
가중 평균 집계 (Weighted average aggregation)
weighted_avg 집계는 문서에서 추출한 숫자 값들의 가중 평균을 계산해요. 각 데이터 포인트가 동일하게 기여하는 일반적인 평균과 달리, 가중 평균은 대응하는 가중치 값에 따라 각 데이터 포인트에 서로 다른 중요도를 부여해요.
가중 평균은 공식 \(\frac{\sum_{i=1}^n \text{value}_i \cdot \text{weight}i}{\sum{i=1}^n \text{weight}_i}\)로 계산돼요.
일반 평균에서는 모든 데이터 포인트가 동일하게 기여하는데, 이는 모든 값에 가중치 1을 부여한 것과 같아요.
출처: 문서
본문
파라미터
weighted_avg 집계는 다음과 같은 파라미터를 받아요.
| 파라미터 | 필수/선택 | 설명 |
|---|---|---|
value |
필수 | 평균할 숫자 값을 얻는 방법을 정의해요. field 또는 script가 필요해요. |
weight |
필수 | 각 값에 대한 가중치를 얻는 방법을 정의해요. field 또는 script가 필요해요. |
format |
선택 | DecimalFormat 형식 문자열이에요. 집계의 value_as_string 속성에 형식화된 출력을 반환해요. |
value_type |
선택 | 스크립트 또는 매핑되지 않은 필드를 사용할 때 값에 대한 타입 힌트예요. |
value 또는 weight 내에 다음 파라미터를 지정할 수 있어요.
| 파라미터 | 필수/선택 | 설명 |
|---|---|---|
field |
선택 | 값 또는 가중치에 사용할 문서 필드예요. |
missing |
선택 | 필드가 없을 때 사용할 기본 값 또는 가중치예요. 누락 값 처리(Missing values) 섹션을 참고하세요. |
script |
선택 | 값 또는 가중치를 제공하는 스크립트예요. field와 상호 배타적이에요. |
예제
먼저 인덱스를 생성하고 일부 데이터를 추가해요. Product C에는 rating과 num_reviews 필드가 없어요:
POST _bulk
{ "index": { "_index": "products" } }
{ "name": "Product A", "rating": 4.5, "num_reviews": 100 }
{ "index": { "_index": "products" } }
{ "name": "Product B", "rating": 3.8, "num_reviews": 50 }
{ "index": { "_index": "products" } }
{ "name": "Product C"}
다음 요청은 각 상품의 rating을 num_reviews로 가중치를 둔 가중 평균 상품 평점을 계산해요. 리뷰가 많은 상품일수록 최종 평균에 더 큰 영향을 미쳐요:
GET /products/_search
{
"size": 0,
"aggs": {
"weighted_rating": {
"weighted_avg": {
"value": {
"field": "rating"
},
"weight": {
"field": "num_reviews"
},
"format": "#.##"
}
}
}
}
예제 응답
응답에는 (4.5 * 100 + 3.8 * 50) / (100 + 50) = 4.27로 계산된 weighted_rating이 포함돼요. rating과 num_reviews 값이 모두 있는 문서만 계산에 포함돼요:
{
"took": 21,
"timed_out": false,
"terminated_early": true,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 3,
"relation": "eq"
},
"max_score": null,
"hits": []
},
"aggregations": {
"weighted_rating": {
"value": 4.266666650772095,
"value_as_string": "4.27"
}
}
}
다중 값 필드 (Multi-valued fields)
value 필드는 문서당 여러 값을 포함할 수 있지만, weight 필드는 정확히 하나의 값으로 귀결되어야 해요. 가중치가 여러 개인 문서는 오류를 발생시켜요. 다중 값 가중치 필드를 처리하려면 이를 단일 숫자로 줄이는 스크립트를 사용하세요.
문서에 여러 값이 포함된 경우 단일 가중치가 각 값에 독립적으로 적용돼요. 다음 예제는 rating이 다중 값 필드인 문서를 인덱스에 넣고 집계를 실행해요:
POST /products/_doc?refresh=true
{
"name": "Product D",
"rating": [1, 2, 3],
"num_reviews": 2
}
GET /products/_search
{
"size": 0,
"query": {
"term": { "name.keyword": "Product D" }
},
"aggs": {
"weighted_rating": {
"weighted_avg": {
"value": {
"field": "rating"
},
"weight": {
"field": "num_reviews"
}
}
}
}
}
세 값(1, 2, 3)이 각각 2로 가중치가 적용되어 ((12) + (22) + (3*2)) / (2+2+2) = 2.0이 됩니다:
{
...
"aggregations": {
"weighted_rating": {
"value": 2.0
}
}
}
스크립트 사용하기 (Using a script)
value, weight 또는 둘 모두에 대한 스크립트를 제공해 파생된 수량을 즉석에서 계산할 수 있어요. 다음 예제는 가중 평균을 계산하기 전에 각 rating과 weight에 1을 더해요:
GET /products/_search
{
"size": 0,
"aggs": {
"weighted_rating": {
"weighted_avg": {
"value": {
"script": "if (doc['rating'].size() == 0) return 0; return doc['rating'].value + 1"
},
"weight": {
"script": "if (doc['num_reviews'].size() == 0) return 0; return doc['num_reviews'].value + 1"
}
}
}
}
}
누락 값 처리 (Missing values)
value 필드가 없는 문서는 기본적으로 계산에서 제외돼요. weight 필드가 없는 문서는 암시적 가중치 1로 여전히 포함돼요.
missing 파라미터는 필드가 없는 문서에 대한 대체 값을 지정해 이러한 기본값을 재정의해요. 다음 예제는 해당 필드가 없는 문서에 기본 rating 3.0과 기본 리뷰 개수 1을 할당해요:
GET /products/_search
{
"size": 0,
"aggs": {
"weighted_rating": {
"weighted_avg": {
"value": {
"field": "rating",
"missing": 3.0
},
"weight": {
"field": "num_reviews",
"missing": 1
},
"format": "#.##"
}
}
}
}
누락 값이 적용된 상태에서 가중 평균은 (4.5 * 100 + 3.8 * 50 + 3.0 * 1) / (100 + 50 + 1) = 4.26으로 계산돼요:
{
...
"aggregations": {
"weighted_rating": {
"value": 4.258278129906055,
"value_as_string": "4.26"
}
}
}