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뿐이에요.

더 알아보기 (Learn more)