FUNNELCOUNT
FUNNELCOUNT
FUNNELCOUNT 함수는 퍼널 분석 집계 함수로, 각 퍼널 단계에 대한 고유 상관(correlated) 개수의 배열을 반환해요.
출처: 문서
본문
퍼널 분석 집계 함수예요.
각 퍼널 단계에 대한 고유 상관 개수의 배열을 반환해요.
시그니처 (Signature)
FUNNEL_COUNT (
STEPS ( predicate1, predicate2 ... ),
CORRELATE_BY ( correlation_column1 [, correlation_column2 ... ] ),
SETTINGS ( setting1, setting2 ... ) )
| Parameter | Arguments | Description |
|---|---|---|
| STEPS | predicates 1...n |
(필수) where 절이 선택한 행에 적용되는 퍼널 단계를 나타내는 개별 조건문이에요. 이 조건문을 충족하는 고유 상관 키가 단계별로 집계돼요. 단일 CORRELATE_BY 컬럼의 경우 키는 해당 컬럼의 고유 값이에요. 여러 CORRELATE_BY 컬럼의 경우 키는 값들의 고유 조합이에요. 예를 들어 url = '/checkout'과 일치하는 모든 필터링된 행은 집합으로 유니온돼요. 집합은 이전 단계에서 나온 집합과 교집합되며, 각 단계는 이전 단계에 있었던 개체만 유지해요. 마지막으로 퍼널의 각 단계에 대한 고유 개수가 반환돼요. |
| CORRELATE_BY | correlation_column1[, correlation_column2...] |
(필수) 퍼널 상관에 활용할 하나 이상의 컬럼이에요. 단일 컬럼의 고유 값 또는 여러 컬럼에 걸친 고유 조합이 집계 중 단계별로 집계돼요. 모든 CORRELATE_BY 컬럼은 사전 인코딩(dictionary-encoded)되어야 해요. |
| SETTINGS | settings 1...n |
(선택 사항) 퍼널 집계 전략을 선택하고 구성하는 설정이에요: bitmap (기본값): 단일 INT CORRELATE_BY 컬럼에 대해 정확하지만, 다른 단일 컬럼 타입과 다중 컬럼 CORRELATE_BY에서는 근사적이에요. 해시 코드가 고유 집계에 사용되며 해시 충돌이 있을 수 있기 때문이에요. 모든 컬럼 타입에 대해 정확한 고유 집계를 원한다면 대신 set을 사용하세요. DISTINCTCOUNTBITMAP도 참고하세요. set: fastutil 해시 집합을 사용하는 전략이에요. 메모리 비용에 제한이 없으므로 주의해서 사용하세요. DISTINCTCOUNT도 참고하세요. theta_sketch: Theta Sketch 프레임워크를 활용해 작은 메모리 공간으로 근사적인 퍼널 개수를 제공하는 전략이에요. DISTINCTCOUNTTHETASKETCH도 참고하세요. nominalEntries: theta-sketch 전략 매개변수 (기본값 4096). theta_sketch 설정과 함께만 사용할 수 있어요. partitioned: 각 세그먼트별로 퍼널 단계를 집계한 후 세그먼트 간 단계 개수를 합산하는 전략이에요. 첫 번째 CORRELATE_BY 컬럼은 이 전략의 파티션 컬럼으로 구성되어야 해요. SEGMENTPARTITIONEDDISTINCTCOUNT도 참고하세요. sorted: 세그먼트별로 퍼널 단계를 메모리 공간 없이 집계하는 전략이에요. 첫 번째 CORRELATE_BY 컬럼은 이 전략의 정렬 컬럼으로 구성되어야 해요. partitioned 설정과 함께만 사용할 수 있어요. |
사용 예시 (Usage Examples)
많은 데이터 집합은 시간 시리즈 성격을 가지며, 시간에 따른 엔티티의 이벤트를 추적해요. 이런 데이터 집합의 예로는 커머스 웹 애플리케이션의 사용자 분석 활동 로그가 있어요.
예시 (Example)
| user_id | event_time | url |
|---|---|---|
| U1 | 2021-10-01 09:01:00.000 | /product/listing |
| U2 | 2021-10-01 09:17:00.000 | /product/search |
| U1 | 2021-10-01 09:33:00.000 | /product/details |
| U1 | 2021-10-01 09:47:00.000 | /cart/add |
| U3 | 2021-10-01 10:02:00.000 | /product/listing |
| U3 | 2021-10-01 10:05:00.000 | /product/search |
| U2 | 2021-10-01 10:06:00.000 | /product/search |
| U2 | 2021-10-01 10:15:00.000 | /checkout/start |
| U2 | 2021-10-01 10:16:00.000 | /cart/add |
| U3 | 2021-10-01 11:17:00.000 | /product/details |
| U2 | 2021-10-01 11:18:00.000 | /checkout/confirmation |
| U3 | 2021-10-01 11:21:00.000 | /cart/add |
| U1 | 2021-10-01 11:33:00.000 | /cart/add |
| U1 | 2021-10-01 11:46:00.000 | /checkout/start |
| U1 | 2021-10-01 11:54:00.000 | /checkout/confirmation |
퍼널 (Funnel)
다음 결제 퍼널을 분석하려고 해요:
- /cart/add
- /checkout/start
- /checkout/confirmation
집계 (Counts)
위 퍼널에 대해 다음 질문에 답하려고 해요:
- 얼마나 많은 사용자가 퍼널 상단에 진입했는가?
- 이 사용자 중 얼마나 많은 사용자가 두 번째 단계로 진행했는가?
- 모든 단계를 완료한 후 퍼널 바닥에 도달한 사용자는 몇 명인가?
쿼리 (Query)
select
FUNNEL_COUNT(
STEPS(
url = '/cart/add',
url = '/checkout/start',
url = '/checkout/confirmation'),
CORRELATE_BY(user_id)
) AS counts
from user_log
| counts |
|---|
| 3, 2, 2 |
참고 (Notes)
U1 사용자가 장바구니에 두 번 추가했지만, 총 이벤트가 아닌 고유 개수를 보고하므로 첫 단계에서 한 번의 전환으로 집계된다는 점에 주의하세요. 또한 U2 이벤트가 순서에 어긋나게 기록됐지만, 사용자를 전환된 것으로 집계한 점도 주목하세요.
사용자와 기기 카테고리 같은 복합 키 내에서 각 사용자의 진행 상황을 추적해야 한다면, CORRELATE_BY에 여러 컬럼을 전달하세요. 예를 들어 CORRELATE_BY(user_id, device_type)처럼요. 그러면 Pinot은 각 고유한 (user_id, device_type) 조합을 별도로 집계하므로, 다른 카테고리의 이벤트가 같은 퍼널 경로에 기여하지 않아요.
동등성 (Equivalence)
위 쿼리는 아래 presto SQL 쿼리와 동등해요:
select ARRAY[ count_if(steps[1]), count_if(steps[1] and steps[2]), count_if(steps[1] and steps[2] and steps[3]) ] as counts from ( select ARRAY[ bool_or(url = '/cart/add'), bool_or(url = '/checkout/start'), bool_or(url = '/checkout/confirmation') ] as steps from user_log group by user_id )
설정 (Settings)
대규모 데이터 집합에는 예를 들어 theta_sketch 전략을 사용하거나, user_id로 데이터를 분할해 partitioned 전략을 활용할 수 있어요. 필요한 행만 집계하도록 where 절에서 필터링하는 것도 중요해요.
select
FUNNEL_COUNT(
STEPS(
url = '/cart/add',
url = '/checkout/start',
url = '/checkout/confirmation'),
CORRELATE_BY(user_id),
SETTINGS('theta_sketch', 'nominalEntries=4096')
) AS counts
from user_log
where url in ('/cart/add', '/checkout/start', '/checkout/confirmation')
| counts |
|---|
| 3, 2, 2 |
다른 예시 (Another Example)
이제 텍스트 검색 후 체크아웃하는 사용자가 몇 명인지 알고 싶어요. 제품 카테고리 목록을 탐색하는 것 같은 다른 진입점과는 대조적으로요. 그러면 다음 퍼널을 분석하려고 해요:
- /product/search
- /cart/add
- /checkout/start
- /checkout/confirmation
쿼리 (Query)
select
FUNNEL_COUNT(
STEPS(
url = '/product/search',
url = '/cart/add',
url = '/checkout/start',
url = '/checkout/confirmation'),
CORRELATE_BY(user_id)
) AS counts
from user_log
| counts |
|---|
| 2, 2, 1, 1 |
참고 (Notes)
U1은 어떤 제품 검색도 수행하지 않았으므로 이 퍼널에 집계되지 않는 점에 주의하세요. U2와 U3 모두 퍼널 상단에 진입해 두 번째 단계를 수행했지만, 퍼널 바닥으로 전환된 것은 U2뿐이에요.