행렬 통계 집계
행렬 통계 집계 (Matrix stats aggregation)
matrix_stats 집계는 두 개 이상의 필드에 대한 공분산(covariance) 통계를 행렬 형태로 생성하는 다중 값(multi-value) 메트릭 집계예요. matrix_stats 집계는 스크립팅을 지원하지 않아요.
출처: 문서
본문
파라미터
matrix_stats 집계는 다음과 같은 파라미터를 받아요.
| 파라미터 | 필수/선택 | 데이터 타입 | 설명 |
|---|---|---|---|
fields |
필수 | String | 행렬 통계를 계산할 필드들의 배열이에요. |
missing |
선택 | Object | 누락 값을 대신할 값이에요. 기본적으로 누락 값은 무시돼요. 누락 값 처리(Missing values) 섹션을 참고하세요. |
mode |
선택 | String | 다중 값 또는 배열 필드에서 샘플로 사용할 값이에요. 허용 값은 avg, min, max, sum, median이에요. 기본값은 avg예요. |
예제
다음 예제는 OpenSearch Dashboards e-커머스 샘플 데이터에서 taxful_total_price와 products.base_price 필드에 대한 통계를 반환해요:
GET opensearch_dashboards_sample_data_ecommerce/_search
{
"size": 0,
"aggs": {
"matrix_stats_taxful_total_price": {
"matrix_stats": {
"fields": ["taxful_total_price", "products.base_price"]
}
}
}
}
응답에는 집계된 결과가 담겨 있어요:
{
"took": 250,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 4675,
"relation": "eq"
},
"max_score": null,
"hits": []
},
"aggregations": {
"matrix_stats_taxful_total_price": {
"doc_count": 4675,
"fields": [
{
"name": "products.base_price",
"count": 4675,
"mean": 34.99423943014724,
"variance": 360.5035285833702,
"skewness": 5.530161335032689,
"kurtosis": 131.1630632404217,
"covariance": {
"products.base_price": 360.5035285833702,
"taxful_total_price": 846.6489362233169
},
"correlation": {
"products.base_price": 1,
"taxful_total_price": 0.8444765264325269
}
},
{
"name": "taxful_total_price",
"count": 4675,
"mean": 75.05542864304839,
"variance": 2788.1879749835425,
"skewness": 15.812149139923994,
"kurtosis": 619.1235507385886,
"covariance": {
"products.base_price": 846.6489362233169,
"taxful_total_price": 2788.1879749835425
},
"correlation": {
"products.base_price": 0.8444765264325269,
"taxful_total_price": 1
}
}
]
}
}
}
다음 표는 응답 필드를 설명해요.
| 통계량 | 설명 |
|---|---|
count |
집계에 샘플링된 문서의 개수예요. |
mean |
샘플에서 계산된 필드의 평균값이에요. |
variance |
평균으로부터의 편차 제곱으로, 데이터의 흩어진 정도를 나타내요. |
skewness |
평균에 대한 분포의 비대칭도를 측정한 값이에요. Skewness 문서를 참고하세요. |
kurtosis |
분포 분포의 꼬리가 두꺼운 정도를 측정한 값이에요. 꼬리가 가벼워질수록 첨도는 감소해요. 첨도와 왜도는 모집단이 정규 분포를 따르는지 여부를 판단하는 데 사용돼요. Kurtosis 문서를 참고하세요. |
covariance |
두 필드 간의 결합 변동성(joint variability)을 측정한 값이에요. 양수이면 두 필드의 값이 같은 방향으로 움직인다는 뜻이에요. |
correlation |
정규화된 공분산으로, 두 필드 간 관계의 강도를 측정한 값이에요. 가능한 값은 -1부터 1까지(양 끝 포함)로, 완벽한 음의 선형 상관에서 완벽한 양의 선형 상관까지를 나타내요. 값이 0이면 변수 사이에 뚜렷한 관계가 없음을 의미해요. |
누락 값 처리 (Missing values)
누락 값이 처리되는 방식을 정의하려면 missing 파라미터를 사용해요. 기본적으로 누락 값은 무시돼요.
예를 들어, 문서 1에 gpa와 class_grades 필드가 없는 인덱스를 생성해 봐요:
POST _bulk
{ "create": { "_index": "students", "_id": "1" } }
{ "name": "John Doe" }
{ "create": { "_index": "students", "_id": "2" } }
{ "name": "Jonathan Powers", "gpa": 3.85, "class_grades": [3.0, 3.9, 4.0] }
{ "create": { "_index": "students", "_id": "3" } }
{ "name": "Jane Doe", "gpa": 3.52, "class_grades": [3.2, 2.1, 3.8] }
먼저 missing 파라미터 없이 matrix_stats 집계를 실행해 봐요:
GET students/_search
{
"size": 0,
"aggs": {
"matrix_stats_taxful_total_price": {
"matrix_stats": {
"fields": [
"gpa",
"class_grades"
],
"mode": "avg"
}
}
}
}
OpenSearch는 행렬 통계를 계산할 때 누락 값을 무시해요:
{
"took": 5,
"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": {
"matrix_stats_taxful_total_price": {
"doc_count": 2,
"fields": [
{
"name": "gpa",
"count": 2,
"mean": 3.684999942779541,
"variance": 0.05444997482300096,
"skewness": 0,
"kurtosis": 1,
"covariance": {
"gpa": 0.05444997482300096,
"class_grades": 0.09899998760223136
},
"correlation": {
"gpa": 1,
"class_grades": 0.9999999999999991
}
},
{
"name": "class_grades",
"count": 2,
"mean": 3.333333333333333,
"variance": 0.1800000381469746,
"skewness": 0,
"kurtosis": 1,
"covariance": {
"gpa": 0.09899998760223136,
"class_grades": 0.1800000381469746
},
"correlation": {
"gpa": 0.9999999999999991,
"class_grades": 1
}
}
]
}
}
}
누락 필드를 0으로 설정하려면 missing 파라미터를 키-값 맵으로 제공해요. class_grades는 배열 필드이지만, matrix_stats 집계는 다중 값 숫자 필드를 문서별 평균으로 평탄화(flatten)하기 때문에 단일 숫자를 누락 값으로 제공해야 해요:
GET students/_search
{
"size": 0,
"aggs": {
"matrix_stats_taxful_total_price": {
"matrix_stats": {
"fields": ["gpa", "class_grades"],
"mode": "avg",
"missing": {
"gpa": 0,
"class_grades": 0
}
}
}
}
}
OpenSearch는 행렬 통계를 계산할 때 누락된 gpa 또는 class_grades 값을 0으로 대체해요:
{
"took": 23,
"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": {
"matrix_stats_taxful_total_price": {
"doc_count": 3,
"fields": [
{
"name": "gpa",
"count": 3,
"mean": 2.456666628519694,
"variance": 4.55363318017324,
"skewness": -0.688130006360758,
"kurtosis": 1.5,
"covariance": {
"gpa": 4.55363318017324,
"class_grades": 4.143944374667273
},
"correlation": {
"gpa": 1,
"class_grades": 0.9970184390038257
}
},
{
"name": "class_grades",
"count": 3,
"mean": 2.2222222222222223,
"variance": 3.793703722777191,
"skewness": -0.6323693521730989,
"kurtosis": 1.5000000000000002,
"covariance": {
"gpa": 4.143944374667273,
"class_grades": 3.793703722777191
},
"correlation": {
"gpa": 0.9970184390038257,
"class_grades": 1
}
}
]
}
}
}