FunnelCompleteCount
FunnelCompleteCount
Pinot의 FunnelCompleteCount 함수는 페이지 조회부터 구매까지의 웹사이트 사용자 상호작용처럼, 퍼널에서 미리 정의된 일련의 단계나 스테이지를 통한 사용자 진행 상황을 추적하도록 설계된 함수예요. 이 함수는 지정한 시간 창 내에서 사용자가 전체 전환 과정을 몇 번 거치는지 분석하는 데 특히 유용해요.
출처: 문서
본문
문법 (Syntax)
FunnelCompleteCount(
timestampExpression,
windowSize,
numberSteps, stepExpression
[, stepExpression[, stepExpression, ...]]
[, mode [, mode, ... ]]
)
반환값 (Return)
이 함수는 퍼널이 몇 번 통과되었는지 반환해요.
인자 (Arguments)
timestampExpression:- 타입:
TIMESTAMP또는LONG표현식 - 설명: 각 이벤트의 타임스탬프로 평가되는 표현식이에요. 특정 사용자 또는 세션의 이벤트 순서를 결정하는 데 사용돼요. 타임스탬프는 후속 액션이 지정한 창 안에 속하는지 평가하는 데 중요해요.
- 타입:
windowSize:- 타입:
LONG - 설명: 퍼널 단계 시퀀스가 발생해야 하는 시간 창의 크기를 지정해요. 창은 밀리초 단위로 정의돼요. 이 매개변수는 동일한 사용자 여정으로 간주되는 퍼널의 첫 단계와 마지막 단계 사이의 최대 허용 시간을 설정해요.
- 타입:
numberSteps:- 타입:
Integer - 설명: 퍼널의 고유 단계 총 개수를 정의해요. 이 개수는 제공된
stepExpression매개변수의 수와 일치해야 해요.
- 타입:
stepExpression:- 타입:
Boolean 표현식 (Boolean Expression) - 설명: 퍼널의 각 단계를 정의하는 표현식이에요. 일반적으로 특정 이벤트 타입이나 액션이 발생했는지 평가하는 조건이에요. 여러 단계 표현식은 쉼표로 구분되며, 각 표현식은 퍼널 시퀀스의 한 단계에 대응해요.
- 타입:
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,
funnelCompleteCount(
ts,
'1000000',
4,
event_name = 'screen_viewed',
event_name = 'screen_clicked',
event_name = 'cart_viewed',
event_name = 'purchased'
) as rounds
FROM clickstreamFunnel
GROUP BY user_id
ORDER BY user_id
응답 (Response)
| user_id | rounds |
| 1 | 0 |
| 2 | 0 |
| 3 | 1 |
| 4 | 0 |
strict_order 쿼리 (Query with strict_order)
SELECT user_id,
funnelCompleteCount(
ts,
'1000000',
3,
event_name = 'screen_viewed',
event_name = 'screen_clicked',
event_name = 'purchased',
'strict_order'
) as rounds
FROM clickstreamFunnel
GROUP BY user_id
ORDER BY user_id
응답 (Response)
| user_id | rounds |
|---|---|
| 1 | 2 |
| 2 | 1 |
| 3 | 1 |
| 4 | 0 |
strict_order와 keep_all 쿼리 (Query with strict_order and keep_all)
SELECT user_id,
funnelCompleteCount(
ts,
'100000',
3,
event_name = 'screen_viewed',
event_name = 'screen_clicked',
event_name = 'purchased',
'strict_order',
'keep_all'
) as rounds
FROM clickstreamFunnel
GROUP BY user_id
ORDER BY user_id
응답 (Response)
| user_id | rounds |
|---|---|
| 1 | 2 |
| 2 | 1 |
| 3 | 0 |
| 4 | 0 |
더 긴 창 쿼리 (Query with longer window)
SELECT user_id,
funnelMaxStep(
ts,
'1000000',
3,
event_name = 'screen_viewed',
event_name = 'screen_clicked',
event_name = 'purchased',
'strict_order'
) as rounds
FROM clickstreamFunnel
GROUP BY user_id
ORDER BY user_id
응답 (Response)
| user_id | rounds |
| 1 | 2 |
| 2 | 1 |
| 3 | 1 |
| 4 | 1 |