행렬 통계 집계

행렬 통계 집계 (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
          }
        }
      ]
    }
  }
}

더 알아보기 (Learn more)