$percentile(집계)
정의
구문
$percentile
의 구문은 다음과 같습니다.
{ $percentile: { input: <expression>, p: [ <expression1>, <expression2>, ... ], method: <string> } }
명령 필드
$percentile
은(는) 다음 필드를 사용합니다.
필드 | 유형 | 필요성 | 설명 |
---|---|---|---|
| 표현식 | 필수 사항 |
|
| 표현식 | 필수 사항 |
|
| 문자열 | 필수 사항 |
|
행동
다음에 $percentile
을 사용할 수 있습니다.
$group
단계를 축적자로 사용$setWindowFields
단계를 축적자로 사용$project
단계를 집계 표현식으로 사용
$percentile
축적자로서 다음과 같은 특성을 가지고 있습니다.
단계의 모든 문서에 대해 단일 결과를 계산합니다.
t-digest 알고리즘 을 사용하여 대략적인 백분위 기반 지표 를 계산합니다.
근사치 메서드를 사용하여 대량의 데이터로 확장합니다.
$percentile
집계 표현식으로서 다음과 같은 특성을 가지고 있습니다.
배열을 입력으로 받습니다.
각 입력 문서에 대해 별도의 결과를 계산합니다.
작업 유형
$group
단계에서 $percentile
은 축적자이며 창에 있는 모든 문서의 값을 계산합니다.
$project
단계에서 $percentile
은 집계 표현식이며 각 문서의 값을 계산합니다.
$setWindowFields
단계에서 $percentile
은 집계 표현식과 같이 각 문서에 대한 결과를 반환하지만 결과는 축적자처럼 문서 그룹에 대해 계산됩니다.
계산 고려 사항
$group
단계에서 $percentile
은 항상 대략적인 계산 메서드를 사용합니다.
$project
단계에서 $percentile
은 대략적인 메서드가 지정된 경우에도 이산 계산 메서드를 사용할 수 있습니다.
$setWindowFields
단계에서 워크로드는 $percentile
이 사용하는 계산 메서드를 결정합니다.
계산된 백분위수 $percentile
반환값은 동일한 데이터 세트에서도 다를 수 있습니다. 이는 알고리즘이 근사치를 계산하기 때문입니다.
중복된 샘플은 모호함을 유발할 수 있습니다. 중복된 수가 많은 경우 백분위수 값이 실제 표본 분포를 나타내지 않을 수 있습니다. 모든 표본이 동일한 데이터 세트를 가정해 보겠습니다. 데이터 세트의 모든 값이 특정 백분위수 이하에 속합니다. "50번째 백분위수" 값은 실제로 샘플의 0% 또는 100%를 나타내게 됩니다.
$percentile
p = 0.0
의 최소값을 반환합니다.
$percentile
p = 1.0
의 최대값을 반환합니다.
배열 입력
$project
단계에서 $percentile
을 집계 표현식으로 사용하는 경우 배열을 입력으로 사용할 수 있습니다. 구문은 다음과 같습니다.
{ $percentile: { input: [ <expression1, <expression2>, .., <expressionN> ], p: [ <expression1>, <expression2>, ... ], method: <string> } }
기간 기능
창 함수를 사용하면 인접 문서의 움직이는 "창"에서 결과를 계산할 수 있습니다. 각 문서가 파이프라인을 통과할 때 $setWindowFields
단계는 다음을 수행합니다.
현재 창에서 문서 세트를 다시 계산합니다.
세트의 모든 문서에 대한 값을 계산합니다.
해당 문서에 대한 단일 값을 반환합니다.
$setWindowFields
단계에서 $percentile
을 사용하여 time series 또는 기타 관련 데이터에 대한 롤링 통계를 계산할 수 있습니다.
$setWindowField
단계에서 $percentile
을 사용하는 경우 input
값은 필드 이름이어야 합니다. 필드 이름 대신 배열을 입력하면 작업이 실패합니다.
예시
다음 예시에서는 testScores
컬렉션을 사용합니다. 컬렉션을 만듭니다:
db.testScores.insertMany( [ { studentId: "2345", test01: 62, test02: 81, test03: 80 }, { studentId: "2356", test01: 60, test02: 83, test03: 79 }, { studentId: "2358", test01: 67, test02: 82, test03: 78 }, { studentId: "2367", test01: 64, test02: 72, test03: 77 }, { studentId: "2369", test01: 60, test02: 53, test03: 72 } ] )
축적자로 단일 값 계산
단일 백분위수 값을 계산하는 축적자를 만듭니다.
db.testScores.aggregate( [ { $group: { _id: null, test01_percentiles: { $percentile: { input: "$test01", p: [ 0.95 ], method: 'approximate' } }, } } ] )
출력:
{ _id: null, test01_percentiles: [ 67 ] }
_id
필드 값은 null
이므로 $group
은 컬렉션의 모든 문서를 선택합니다.
percentile
축적자는 test01
필드에서 입력 데이터를 가져옵니다.
이 예시에서 백분위수 배열 p
는 하나의 값을 가지므로 $percentile
연산자는 test01
데이터에 대해 하나의 항만 계산합니다. 95번째 백분위수 값은 67
입니다.
축적자로 여러 값 계산
여러 백분위수 값을 계산하는 축적자를 만듭니다.
db.testScores.aggregate( [ { $group: { _id: null, test01_percentiles: { $percentile: { input: "$test01", p: [ 0.5, 0.75, 0.9, 0.95 ], method: 'approximate' } }, test02_percentiles: { $percentile: { input: "$test02", p: [ 0.5, 0.75, 0.9, 0.95 ], method: 'approximate' } }, test03_percentiles: { $percentile: { input: "$test03", p: [ 0.5, 0.75, 0.9, 0.95 ], method: 'approximate' } }, test03_percent_alt: { $percentile: { input: "$test03", p: [ 0.9, 0.5, 0.75, 0.95 ], method: 'approximate' } }, } } ] )
출력:
{ _id: null, test01_percentiles: [ 62, 64, 67, 67 ], test02_percentiles: [ 81, 82, 83, 83 ], test03_percentiles: [ 78, 79, 80, 80 ], test03_percent_alt: [ 80, 78, 79, 80 ] }
_id
필드 값은 null
이므로 $group
은 컬렉션의 모든 문서를 선택합니다.
percentile
축적자는 test01
, test02
및 test03
의 세 필드에 대한 값을 계산합니다.
축적자는 각 입력 필드에 대해 50번째, 75번째, 90번째 및 95번째 백분위수 값을 계산합니다.
백분위수 값은 p
의 요소와 동일한 순서로 반환됩니다. test03_percentiles
와 test03_percent_alt
의 값은 동일하지만 순서가 다릅니다. 각 결과 배열의 요소 순서는 p
의 해당 요소 순서와 일치합니다.
단계에서 사용 $percentile
$project
$project
단계에서 $percentile
은 집계 표현식이며 각 문서의 값을 계산합니다.
$project
단계에서 필드 이름 또는 배열을 입력으로 사용할 수 있습니다.
db.testScores.aggregate( [ { $project: { _id: 0, studentId: 1, testPercentiles: { $percentile: { input: [ "$test01", "$test02", "$test03" ], p: [ 0.5, 0.95 ], method: 'approximate' } } } } ] )
출력:
{ studentId: '2345', testPercentiles: [ 80, 81 ] }, { studentId: '2356', testPercentiles: [ 79, 83 ] }, { studentId: '2358', testPercentiles: [ 78, 82 ] }, { studentId: '2367', testPercentiles: [ 72, 77 ] }, { studentId: '2369', testPercentiles: [ 60, 72 ] }
$percentile
이 집계 표현식인 경우 각 studentId
에 대한 결과가 있습니다.
단계에서 사용 $percentile
$setWindowField
로컬 데이터 추세를 기반으로 백분위수 값을 만들려면 $setWindowField
집계 파이프라인 단계에서 $percentile
을 사용합니다.
이 예에서는 점수를 필터링하는 창을 생성합니다.
db.testScores.aggregate( [ { $setWindowFields: { sortBy: { test01: 1 }, output: { test01_95percentile: { $percentile: { input: "$test01", p: [ 0.95 ], method: 'approximate' }, window: { range: [ -3, 3 ] } } } } }, { $project: { _id: 0, studentId: 1, test01_95percentile: 1 } } ] )
출력:
{ studentId: '2356', test01_95percentile: [ 62 ] }, { studentId: '2369', test01_95percentile: [ 62 ] }, { studentId: '2345', test01_95percentile: [ 64 ] }, { studentId: '2367', test01_95percentile: [ 67 ] }, { studentId: '2358', test01_95percentile: [ 67 ] }
이 예에서 각 문서의 백분위수 계산에는 앞뒤의 세 문서의 데이터도 통합됩니다.
자세히 알아보기
$median
연산자는 p: [ 0.5 ]
의 고정 값을 사용하는 $percentile
연산자의 특수한 경우입니다.
창 함수에 대한 자세한 내용은 $setWindowFields
를 참조하세요.