-
[엘라스틱 서치] 엘라스틱 서치로 이상치 제거하기ElasticSearch 2024. 12. 16. 16:04
엘라스틱 서치에서 이상치를 제거하는 방법에 대해 연구해보겠다.
실험에 사용하려는 데이터는 상품 데이터의 "가격"이다.
상품은 카테고리 별로 분류되며, 각 카테고리별 평균 구간값을 구해야 한다.
여기서 문제는 평균 구간값에는 이상치가 제외된 구간이 필요하다는 점이다.
1. 정규분포
독립적인 확률변수들의 평균은 정규분포에 가까워지는 성질이 있기 때문에, 정규분포를 활용한 구간값을 먼저 생각해볼 수 있다.
정규분포는 평균과 표준편차가 주어져 있을 때 엔트로피를 최대화하는 분포이다. 정규분포곡선은 좌우 대칭이며 하나의 꼭지를 가진다. 정규분포는 중앙치에 사례 수가 모여있고, 양극단으로 갈수록 X축에 무한히 접근하지만 X축에 닿지는 않는다
Elastic Search에서 정규분포를 구하기 위해서는 먼저 평균과 표준편차를 구해야 한다.
min, max, sum, avg aggregation하는법 : 아래 Elastic 가이드북에 상세하게 설명되어 있으니 참고
https://esbook.kimjmin.net/08-aggregations/8.1-metrics-aggregationsGET/_search { "size": 0, "aggs": { "price_aggs": { "extended_stats": { "field": "product_price" } } } }
{ "hits": { "total": { "value": 10000, "relation": "gte" }, "max_score": null, "hits": [] }, "aggregations": { "price_aggs": { count, min, max, avg, sum, sum_of_squares, variance, std_deviation ...
extended_stats를 사용해 평균 외에도 분산, 편차 값을 알 수 있다.
이 경우에는 aggs시간만 2.5초를 넘기게 된다. 2. 사분위 수 기반 이상치 제거 방법 (Interquartile Range, IQR)
데이터의 분포가 정규분포를 이루지 않거나 한 쪽으로 치우쳐졌을 경우, 데이터의 IQR값을 이용해 이상치를 탐지할 수 있다.
사분위란 데이터를 크기 순서대로 정렬한 후 4등분 했을 때의 범위를 말한다.
이때 IQR 값은 75번째 백분위수(Q3) 에서 25번째 백분위수(Q1) 을 뺀 값이다.
- IQR = Q3(75%) – Q1(25%)
일반적으로 Q1 – 1.5 * IQR 미만이나 Q3 + 1.5 * IQR 초과하는 데이터를 이상치로 판단한다.
GET {index}/_search { "size": 0, "aggs": { "price_aggs": { "percentiles": { "field": "product_price" } } } }
{ "took": 1073, "timed_out": true, "_shards": { "total": 2, "successful": 2, "skipped": 0, "failed": 0 }, "hits": { "total": { "value": 10000, "relation": "gte" }, "max_score": null, "hits": [] }, "aggregations": { "price_aggs": { "values": { "1.0": 1000, "5.0": 4000, "25.0": 15000, "50.0": 40000, "75.0": 119998.93411788737, "95.0": 520594.4668511803, "99.0": 1599011.698877599 } } } }
위 쿼리로는 백분위를 구할 수 있다.
그러나 한가지 고려해야 할 점은 extended_stats 이나 percentiles aggregation은 생각보다 시간이 많이 걸린다. 따라서 timeout으로 시간을 조절하는 것이 좋다.
결과
68.2% 신뢰 구간 : [0, 20,365,923]
백분위 25-75% 구간 : [15000, 119957]
상품의 가격데이터의 편차가 많이나는 경우, 특히 가격 데이터가 정규분포를 따르지 않는 경우 백분위를 선택하는 것이 적합하다는 결론을 도출했다.
'ElasticSearch' 카테고리의 다른 글
[엘라스틱 서치] REST APIs - Reindex API (0) 2024.09.20 [엘라스틱 서치] Document 관리(수정/삭제/세그먼트) (0) 2024.05.21 [엘라스틱 서치] Aliasese (0) 2024.05.07 [엘라스틱 서치] Search your data - 검색 API (5) (0) 2024.05.07 [엘라스틱 서치] Search your data - 검색 API (4) (0) 2024.04.30