FunnelMatchStep

FunnelMatchStep

Pinot의 FunnelMatchStep 함수는 페이지 조회부터 구매까지의 웹사이트 사용자 상호작용처럼, 퍼널에서 미리 정의된 일련의 단계나 스테이지를 통한 사용자 진행 상황을 추적하도록 설계된 함수예요. 이 함수는 지정한 시간 창 내에서 사용자가 전환 과정을 얼마나 진행했는지 분석하는 데 특히 유용해요.

출처: 문서

본문

문법 (Syntax)

FunnelMatchStep(
    timestampExpression, 
    windowSize, 
    numberSteps, stepExpression
    [, stepExpression[, stepExpression, ...]]
    [, mode [, mode, ... ]]
)

반환값 (Return)

이 함수는 FunnelMaxStep 함수와 유사하지만, 최대 단계 수를 반환하는 대신 '단계 수(number of steps)' 크기의 배열을 반환하고, 매칭된 단계를 1, 비매칭을 0으로 표시해요.

예:

numberSteps = 3, maxStep = 0 -> [0, 0, 0]
numberSteps = 4, maxStep = 2 -> [1, 1, 0, 0]

인자 (Arguments)

  1. timestampExpression:
    • 타입: TIMESTAMP 또는 LONG 표현식
    • 설명: 각 이벤트의 타임스탬프로 평가되는 표현식이에요. 특정 사용자 또는 세션의 이벤트 순서를 결정하는 데 사용돼요. 타임스탬프는 후속 액션이 지정한 창 안에 속하는지 평가하는 데 중요해요.
  2. windowSize:
    • 타입: LONG
    • 설명: 퍼널 단계 시퀀스가 발생해야 하는 시간 창의 크기를 지정해요. 창은 밀리초 단위로 정의돼요. 이 매개변수는 동일한 사용자 여정으로 간주되는 퍼널의 첫 단계와 마지막 단계 사이의 최대 허용 시간을 설정해요.
  3. numberSteps:
    • 타입: Integer
    • 설명: 퍼널의 고유 단계 총 개수를 정의해요. 이 개수는 제공된 stepExpression 매개변수의 수와 일치해야 해요.
  4. stepExpression:
    • 타입: Boolean 표현식 (Boolean Expression)
    • 설명: 퍼널의 각 단계를 정의하는 표현식이에요. 일반적으로 특정 이벤트 타입이나 액션이 발생했는지 평가하는 조건이에요. 여러 단계 표현식은 쉼표로 구분되며, 각 표현식은 퍼널 시퀀스의 한 단계에 대응해요.
  5. mode (선택 사항):
    • 타입: String
    • 설명: 퍼널 분석 계산 방식을 변경하는 추가 모드나 옵션을 정의해요. 일반적인 모드는 중첩된 이벤트 처리, 각 단계에서 창 재설정, 또는 퍼널 분석 요구 사항에 특화된 기타 사용자 지정 동작 설정을 포함할 수 있어요. 지정하지 않으면 Pinot이 정의한 기본 동작이 사용돼요.

지원되는 선택 모드 (Optional Mode Supported)

STRICT_DEDUPLICATION

STRICT_DEDUPLICATION 모드는 퍼널 시퀀스 내에서 같은 이벤트 조건의 반복 발생이 해당 사용자 세션에 대한 퍼널 추가 처리를 중단시키도록 해요. 이 모드는 시퀀스에서 고유하고 반복되지 않는 액션을 식별하고 측정하는 것이 중요할 때 필수적이며, 퍼널의 각 단계가 별개의 액션을 나타내도록 보장해요.

실질적 영향 (Practical Impact)

  • 이벤트 시퀀스 중단: 현재 단계 조건을 충족하는 이벤트가 다음 단계로 진행되지 않고 반복적으로 발생하면, strict_deduplication은 해당 시퀀스에 대한 퍼널 분석을 중단시키고 사실상 종료해요. 이렇게 하면 의도된 단계를 진행하는 대신 같은 액션이 단순히 반복되는 경우 퍼널이 잘못 진행되는 것을 방지해요.
  • 퍼널 진행의 정확성 향상: 이 모드는 정확한 전환 분석을 위해 서로 다른 단계의 연속성과 진행이 중요한 시나리오에 유용해요. 유사한 반복 액션이 퍼널을 통한 잘못된 진행을 암시할 수 있는 사용자 참여의 오해를 피하게 해줘요.

예시 (Example)

예를 들어, 퍼널이 홈페이지 방문 → 검색 → 장바구니에 아이템 추가 → 결제로 진행되는 사용자 진행을 추적하도록 설계됐다면, strict_deduplication 모드는 사용자가 장바구니에 아이템을 추가하지 않고 여러 번 검색을 수행하는 경우 퍼널 시퀀스 처리를 중단해요. 이렇게 하면 이 단계를 통한 선형적이고 반복되지 않는 진행만 유효한 퍼널 이동으로 간주되도록 해요.

이 모드는 사용자 여정의 각 단계 무결성을 유지하는 데 도움이 되며, 데이터가 실제 진행으로 이어지지 않는 반복적 액션을 과대집계하지 않고 진정한 사용자 행동을 반영하도록 보장해요.

STRICT_ORDER

strict_order 모드는 퍼널 내 이벤트에 대해 엄격한 시퀀스 순서를 강제해요. 이 모드는 정의된 시퀀스에 속하지 않는 개입 이벤트 없이 단계 간 진행이 정확히 지정된 순서를 따르도록 보장해요.

strict_order의 동작 (Behavior of strict_order)

  • 시퀀스 준수: strict_order 모드는 이벤트가 다른 유형의 이벤트가 개입하지 않고 정확히 지정된 순서로 발생하도록 요구해요. 정의된 시퀀스의 다음 예상 단계가 아닌 이벤트가 발생하면, 해당 사용자 세션에 대한 퍼널 분석이 중단돼요.
  • 조기 종료: 순서에 없는 이벤트가 나타나면 분석이 멈추고, 최대 이벤트 수준은 중단 전 시퀀스의 마지막 올바른 단계로 결정돼요. 예를 들어 지정된 시퀀스가 A -> B -> C일 때 실제 시퀀스가 A -> B -> D라면, D가 예상되는 다음 단계(C)가 아니므로 퍼널 분석은 B 이후에 종료돼요.

실질적 영향 (Practical Impact)

  • 경로 분석의 정밀성 향상: 이 모드는 엄격한 프로세스 흐름처럼 각 단계가 성공으로 간주되기 위해 특정 순서로 따라야 하는 경우처럼, 액션의 정확한 순서가 분석에 중요한 상황에서 특히 가치가 있어요.
  • 오해 방지: 개입하거나 순서 없는 이벤트가 퍼널을 통한 오해를 불러일으킬 수 있는 퍼널 진행의 오해를 방지해요.

예시 (Example)

퍼널이 로그인(A) → 제품 검색(B) → 장바구니에 제품 추가(C) → 구매 완료(D) 단계를 통한 사용자 진행을 추적하도록 설정된 시나리오를 생각해 봐요. strict_order 모드를 사용할 때 시퀀스가 A -> B -> E -> C라면, E(계정 세부정보 보기 같은 예상치 못한 이벤트)가 예상 다음 단계인 C보다 먼저 개입하므로 분석은 B 이후에 종료돼요. 따라서 도달한 최대 단계는 A와 B의 완료만 나타내는 2로 보고돼요.

이 모드는 프로세스 단계에 대한 엄격한 준수가 필요한 시나리오에 중요하며, 정확히 의도된 시퀀스를 따르는 사용자만 퍼널 분석에 집계되도록 해요.

STRICT_INCREASE

strict_increase는 분석되는 이벤트 시퀀스가 엄격히 증가하는 타임스탬프를 갖도록 보장하기 위해 설계된 모드예요. 이 모드는 이벤트의 시간 순서가 퍼널 내 사용자 행동 해석에 직접 영향을 주는 시나리오에서 사용자 행동을 정확히 추적하고 분석하는 데 중요해요.

strict_increase의 동작 (Behavior of strict_increase)

  • 타임스탬프 순서: 이 모드는 퍼널의 각 후속 이벤트가 이전 이벤트보다 큰 타임스탬프를 가질 것을 요구해요. 사용자의 액션이 올바른 순서일 뿐만 아니라 되돌림이나 동시 액션 없이 시간적 진행을 따르도록 보장해요.
  • 분석 무결성: 시퀀스의 어떤 이벤트가 엄격히 증가하는 타임스탬프 순서를 따르지 않으면, 시간적 시퀀스가 퍼널 로직에 얼마나 중요한지에 따라 해당 시퀀스에 대한 분석이 그 지점에서 멈추거나 순서 없는 이벤트를 무시해요.

실질적 영향 (Practical Impact)

  • 시간 검증: 이 모드는 실시간으로 액션이 차례로 이어져야 하는 세션처럼 이벤트 타이밍이 중요한 시나리오에서 특히 유용해요. 이벤트 유형뿐만 아니라 이벤트가 시간에 따라 점진적으로 발생하는지도 확인해 시퀀스를 검증해요.
  • 데이터 오류 방지: 타임스탬프가 올바르게 기록되지 않았거나 시스템 오류나 이벤트 로깅 지연으로 인해 이벤트가 순서에 어긋나게 나타날 수 있는 잠재적 데이터 오류나 이상치를 피하는 데 도움이 돼요.

예시 (Example)

사용자의 웹사이트 방문부터 구매까지의 여정을 분석하도록 설계된 퍼널을 생각해 봐요. 단계는 페이지 방문(A), 아이템 추가(B), 결제 시작(C), 결제 완료(D)로 정의돼요. strict_increase 모드를 사용하면 퍼널은 각 액션이 이전 액션보다 나중에 발생하는 시퀀스만 고려해요. 사용자 시퀀스가 A (t1) -> B (t2) -> A (t3) -> C (t4)이고 t3이 t2보다 작거나 같다면, 분석은 구체적 구현과 요구사항에 따라 A의 두 번째 발생을 무시하거나 종료돼요.

이 모드는 퍼널 분석이 각 단계가 적시에 순차적으로 발생하며 의도된 액션을 통한 진실하고 선형적인 진행을 반영하도록 보장해요.

KEEP_ALL

KEEP_ALL 모드는 데이터 집합의 모든 이벤트가 퍼널 시퀀스의 지정된 단계 조건과 일치하지 않더라도 분석에 고려되도록 설계된 모드예요. 이 모드는 비일치 이벤트의 맥락이 사용자 행동이나 시스템 성능에 대한 귀중한 통찰을 제공할 수 있는 포괄적인 데이터 분석에 특히 유용해요.

KEEP_ALL의 동작 (Behavior of KEEP_ALL)

  • 포괄적 분석: KEEP_ALL 모드에서 퍼널 함수는 이벤트가 퍼널의 미리 정의된 단계에 해당하는지 여부와 관계없이 지정한 시간 창 내의 모든 이벤트를 분석에 포함해요. 이렇게 하면 세션 중 사용자 액션에 대한 더 포괄적인 관점을 얻을 수 있어요.
  • 맥락 보존: 모든 이벤트를 포함함으로써 이 모드는 사용자 세션의 전체 맥락을 유지하며, 퍼널과 직접 관련이 없지만 다른 시점에서 사용자 행동과 결정에 영향을 주거나 설명할 수 있는 활동을 포착해요.

실질적 영향 (Practical Impact)

  • 향상된 통찰: 이 모드는 복잡한 사용자 여정처럼 주요 퍼널 단계 사이의 추가 액션이 결과에 영향을 주거나 다른 관심 패턴을 나타낼 수 있는 시나리오에서 사용자 상호작용의 전체를 이해하는 것이 중요할 때 매우 가치가 있어요.
  • 데이터 완전성: 비일치 이벤트를 필터링으로 제거하면서 발생하는 데이터 손실을 방지해요. 포괄적 패턴 분석, 문제 해결, 상세 사용자 여정 분석 시 중요할 수 있어요.

예시 (Example)

퍼널이 로그인, 제품 검색, 구매하기 단계를 통한 사용자 진행을 추적하도록 설정된 시나리오를 생각해 봐요. KEEP_ALL 모드가 활성화되면, 사용자가 프로필 정보 업데이트나 약관 보기 같은 추가 액션을 수행해도 이러한 이벤트도 분석에 포함돼요. 이 포괄적 포함으로 분석가는 세션 중 사용자가 무엇을 했는지, 퍼널과 직접 관련된 액션뿐만 아니라 더 완전한 그림을 볼 수 있어요. 이는 다른 활동이 주요 전환 목표에서 주의를 빼앗고 있는지, 아니면 기본 퍼널 단계에 깔끔하게 맞지 않는 더 넓은 사용자 참여의 일부인지 드러낼 수 있어요.

이 모드는 이벤트를 제외함으로써 잠재적 통찰이 손실되지 않도록 보장해, 미리 정의된 퍼널 단계의 엄격한 한계를 넘어 사용자 상호작용을 이해하기 위한 강력한 옵션이 돼요.

예시 (Examples)

데이터 집합 (Data Set)

event_name ts user_id
screen_viewed 1718112402 1
screen_clicked 1718112403 1
purchased 1718112404 1
screen_viewed 1718112405 1
screen_clicked 1718112406 1
purchased 1718112407 1
screen_viewed 1718112405 2
screen_clicked 1718112406 2
purchased 1718112407 2
screen_viewed 1718112404 3
screen_clicked 1718112405 3
cart_viewed 1718112406 3
purchased 1718112407 3
screen_viewed 1717939609 4
screen_clicked 1718112405 4
purchased 1718112405 4

쿼리 (Queries)

기본 퍼널 쿼리 (Query funnels)

SELECT user_id,
  funnelMatchStep(
    ts,
    '1000000',
    4,
    event_name = 'screen_viewed',
    event_name = 'screen_clicked',
    event_name = 'cart_viewed',
    event_name = 'purchased'
  ) as matchedsteps
FROM clickstreamFunnel
GROUP BY user_id
ORDER BY user_id

응답 (Response)

user_id matchedSteps
1 [1, 1, 0, 0]
2 [1, 1, 0, 0]
3 [1, 1, 1, 1]
4 [1, 1, 0, 0]

퍼널 개수 분석 쿼리 (Query with funnel count analysis)

아래 쿼리는 위 쿼리를 CTE에 넣고, sumArrayLong을 사용해 각 단계의 퍼널 전환을 보여줘요.

WITH funnelMatchSteps AS (
  SELECT user_id,
  funnelMatchStep(
    ts,
    '1000000',
    4,
    event_name = 'screen_viewed',
    event_name = 'screen_clicked',
    event_name = 'cart_viewed',
    event_name = 'purchased'
  ) as matchedsteps
  FROM clickstreamFunnel
  GROUP BY user_id
)

SELECT sumArrayLong(matchedsteps) as funnelCounts FROM funnelMatchSteps 

응답 (Response)

funnelCounts
[4, 4, 1, 1]

더 알아보기 (Learn more)