프로젝트/캐글 경진대회 스터디

[kaggle] 이커머스 고객 행동 로그 분석 part 3. (분석 목표 : 방문 후 1시간 이상, Cart를 활용하는 고객들의 구매 요인 분석)

에멜라 2024. 12. 5. 22:02

간단 개요)

해당 분석은 kaggle 의 'eCommerce Behavior Data from Multi-Category Store' 데이터를 기반으로,

월 평균 300만 명의 방문 고객을 보유한, 미국 대형 이커머스의 고객 이벤트 로그 데이터를 활용해 해당 이커머스의 핵심 카테고리인 스마트폰의 구매패턴을 분석하고, 전환률을 높이기 위한 액션을 제안하는 프로젝트입니다. 

 

 


 

 

Part 1 막바지에, 구매/이탈까지의 소요시간을 중심으로 크게 두가지의 고객을 정의했습니다.

 

1. 즉시 구매 고객 : 이미 상품 구매 결심을 마친 상태로 방문, 가격/조건 비교 후 빠르게 구매를 완료하는 고객.
2. 장기 상호작용 고객 : 관심/구매 의지는 있지만 신중하게 고민하며, 구매까지 장기적인 상호작용을 거치는 고객.

 

그중, 이번에는 장기 상호작용 고객(1시간 이상, Cart 활용) 최종 구매로 전환되는데 고려되는 요소는 무엇인지 분석해보고자 합니다.

 

 

 

1. 장기 상호작용 고객의 정의

 

Part 3의 분석 내용은, '첫 구매 / 이탈까지 1시간 이상 소요 & Cart 활용' 고객중 실제 구매 전환된 유저 / 전환되지 않은 유저에 대한 요인 분석입니다.

 

여기서 Cart를 활용한 고객의 경우만을 필터링한 이유는, Cart를 이용하는것 만으로도 구매 확률이 약 10배 이상 높아지기 때문에, 구매로 이어지는 다른 요인들을 탐색하기 어려워지기 때문입니다. 

 

또, Cart를 이용하는 고객들은 그렇지 않은 고객보다 더 명확한 구매동기를 가지고 있으므로 구매로 전환되는 요인을 밝히기에 더 유의미하다고 판단했습니다. 

 

 

 

유저 방문 경과 시간에 따른 전환률 추이 (전환율 : 해당 시간까지 구매/이탈하지 않은 유저 중, 해당 시간대에 구매한 유저 비율)

 

 

 

 

 


 

 

2. 전처리 - 세션 재정의 

 

먼저 세션에 대해 간단히 언급하자면, 세션이란 일정 기간 내에 웹 사이트에 발생한 사용자의 상호작용 집합을 말합니다. 더 간단하게는, '방문 ID'정도로 생각해볼 수 있습니다.

 

예를들어, user_id  437548958 가 해당 서비스내에 총 26번의 event 로그를 남겼다면, 그 유저는 26번아나 방문한 유저일까요? 아닙니다. 한번의 방문에서 13개의 로그를 남기고, 다음날 또 접속해서 13개의 로그를 남겼다면 그 유저는 방문 2회 (세션 2개), 첫날 3개, 둘째날 5개, 셋째날 5개 로그를 남겼다면 방문은 3회로 봐야합니다.

 

여기서 각 세션을 나누는 기준은 "각 이벤트마다 간격이 얼마나 떨어져있나?"입니다.

 

일반적으로 하나의 duration time(세션 유지시간) 을 두어 (GA 기준 30분), 하나의 유저가 세션시간으로 설정된 시간 내에 활동하는 모든 액션들은 하나의 세션으로 묶이고, 반대로 event 간격이 duration time을 넘어서게 되면 새로운 세션(방문) 으로 보게 됩니다. 

 

 

세션 30분 예

 

 

이렇게까지 세션을 장황하게 설명한 이유는, 해당 데이터셋에 세션이 잘못 매겨저있었기 때문입니다.

 

아래 SQL문의 결과와 같이 user_id  437548958 에 대해 약 1분 간격으로 event 가 발생했음에도, 9시 28분 56초 로그만 세션이 이상하게 배정되어있습니다. 또, 이와 반대로 세션 간격이 약 10시간 이상 차이나는데도 동일한 세션이 할당되어있는 경우도 있었습니다. (사실은 part2의 view_time 계산할때 이미 발견했었습니다.) 

 

따라서 해당 문제를 방지하기 위한 새로운 세션으로, Group by 와 Cumsum 을 활용해서 각 유저별로, event_time 간격이 2h 이상인 경우 새로운 세션이 할당되는 new_session을 정의해주었습니다.

 

 

세션이 잘못 매겨진 경우 예

 



 


 

 

3. 장기 이용 고객중 구매자 / 비구매자 간 raw 데이터 행동 비교

 

다음으로 구매로 전환된 유저와 구매하지 않은 유저에 대한 행동을 비교해보고자 합니다.

아래는 각 고객들의 event 행동 흐름을  더 잘 관찰하기 위한, 자체 정의한 함수 'buyers_journey' 의 출력 결과입니다.

 

출력 결과는 예를들면, ''view ⮕ view ⮕ cart ⮕ cart ⮕ purchase' 로 이어지는 한 유저의 구매행동에서 연속된 동작을 묶는 방식으로 작동하는데, 대략 '[('view', 2), ('cart', 2), ('purchase', 1)]' 이런 식입니다. 또한, '//' 기호는 각 세션 단위의 이벤트들을 분리하기 위한 기호입니다. 이렇게 한 이유는, 길어지는 로그 이벤트 흐름을 좀 더 효율적으로 볼 수 있게 하기 위함입니다.

 

이를 각 유저별로 이벤트 행동 패턴, 살펴본 상품 목록, 살펴본 상품의 브랜드 및 가격대, ..., 최종 구매 상품을 각각 구매자/비구매자로 나누어 요약했습니다. 

 

 

<구매자 패턴>

구매자 행동 패턴 1
구매자 행동 패턴 2


<비구매자 패턴>

비구매자 패턴 1
비구매자 패턴 2

 

 


 

 

<Raw 데이터 내 인사이트>

 

event 패턴, 상품 관찰 패턴을 바탕으로 아래와 같은 인사이트를 도출할 수 있었습니다.

 

  1. 구매자의 대부분은 Cart 를 구매 직전에 활용한다.
  2. 세션마다 Cart 를 1회 이상 활용하는 고객은 구매 확률이 높다.
  3. 구매 고객은 구매 직전, 같은 상품을 반복 클릭, 또는, 유사한 가격대 상품을 비교하는 경향을 보인다.
  4. 원하는 상품이 있더라도, 같은 제품 이더라도 무조건 싼 제품을 구매하지는 않는다.

 

 

 

 


 

 

 

 

 

4. 구매 예측을 통한 장기 상호작용 고객의 구매 요인 분석

 

기존 Part2의 즉시 구매고객(방문 후 1시간 이내 구매/이탈)은, 기존에 기대했던 상품 가격/조건에 부합하는 상품을 발견했는가 아닌가라는 비교적 단순한 구매동기를 가진 고객들이었습니다.

 

그러나, 장기 상호작용 고객의 경우, (1) 단순히 흥미에 의한 클릭인지 실제 구매동기인지, (2) 상품 탐색을 통해 원하는 상품군을 좁혔는지, (3) 원하는 상품을 찾았다면 지금 당장 구매하지 않는 이유는 뭔지 (할인 기대/구매 조건 고민) 에 대한 더 디테일한 고민이 필요합니다.

 

따라서, 고객의 (1) 구매 의지(세션당 view횟수, 세션당 cart 횟수 등), (2) 관심 상품 여부(관심 상품 view 횟수, 최근 본 상품의 가격편차 등),  (3) 상품 구매 조건(구매했을 시점의 할인율) 을 고려할 수 있는 파생변수 13개를 생성하여 실제 구매여부를 예측하여 중요도를 평가해봤습니다.

 

 

 

그중 유의미하게 추려진 독립변수와 그에대한 설명은 아래와 같습니다.

 

독립변수 )

  • session_count : 해당 유저가 smartphone 카테고리에 몇 번이나 방문했는지.
  • views_per_session : 해당 유저가 세션당 평균 몇번의 view_event 를 발생시켰는지.
  • carts_per_session  : 해당 유저가 세션당 평균 몇번의 cart_event 를 발생시켰는지.
  • unique_product_clicks : 유저가 최대 몇개까지의 상품을 관찰했는지. 
  • top_brand / top_product : 유저가 가장 관심가진(이벤트를 가장 많이 발생시킨) 상품의 브랜드 / 상품 id
  • top_product_clicks : 유저가 가장 관심가진 상품을 view한 총 횟수.
  • first_price / last_price / price_drop_ratio : 유저가 관심 상품을 처음 봤을때 가격 / 가장 마지막으로 본 가격 / 할인률
  • recent_price_std : 최근 본 상품 (7개)의 가격 편차
  • recent_unique_product : 최근 본 상품 (7개) 중 unique 한 상품 갯수.

 

반응변수 ) 

  • purchase_true : 1/0 (구매여부)

 

( * 이때, 'Brand(고객이 관심갖는 브랜드)' 는 실제 예측에 활용되기보다는, 참고용 변수로 집계했습니다.)

 

 

 


 

 

5. Cart 활용자 중, 실제 구매자 예측 및 구매 요인 분석

 

Part2와 마찬가지로,  표준화 및 변수선택법을 활용하여 예측분석을 진행하였습니다, 추가적으로 xgboot나 random forest 모델을 활용했으나 정확도에 1~2% 내외의 차이를 보여, 상대적으로 해석이 직관적인 logistic regression 추정값을 그대로 해석에 활용했습니다. 전처리 방식은 아래와 같고,

 

 

 Log1p + StandardScaler + UnderSampling + SequentialFeatureSelector

 

 

정확도 지표 역시 동일합니다.

 

Accuracy, ROC-AUC 

 

 

이를 활용하여 예측한 결과는 아래와 같습니다.

 

 

< Logistic 추정 결과>

 

  • Test Accurac y: 0.798
  • Test ROC-AUC: 0.850

 

 

 

 

 

최종 변수로 선정된 아래와 같은 변수들은 모두 매우 높은 Z-score를 가지며, 구매에 유의미한 상관관계를 갖는 변수들로 판단됩니다. 특히 'cart_per_session'이 타 변수에 비해 계수값이 2배나 높게 측정되었는데, 즉 최근 고객이 세션마다 cart 를 이용하는 빈도가 증가한다면 이는 유의미한 구매 신호가 되는 셈입니다.

 

 

  • views_per_session   ⮕ 고객이 최근 세션당 상품을 많이 view 할수록 높은 구매확률 보임. 
  • cart_per_session   ⮕ 고객이 최근 세션당 cart 를 이용하는 빈도가 높을수록 높은 구매확률 보임.
  • top_product_clicks   특정 상품을 5회 이상 클릭한 경우 높은 구매확률을 보임.
  • recent_price_std    최근 고객이 본 상품의 가격편차가 줄어드는 경우 높은 구매확률을 보임.
  • recent_unique_products     고객이 최근 특정 2개 상품으로 관심 품목을 줄인 경우 높은 구매확률을 보임.

 

 

(좌) 세션당 cart 사용 횟수에 따른구매율 비교, (우) 고객이 최근본 상품가격편차에 따른 구매여부 비교

 

 

 


 

 

 

part3 결론) 

 

part3의 회귀분석 계수 추정에서 알 수 있는 'Cart 활용 고객 중, 구매 확률이 높은 고객의 특성'은 고객의 다음의 두가지를 측정하는데 있어 유의미한 변수로 활용될 수 있다고 생각합니다.

 

(1) 단순히 흥미에 의한 클릭인지 실제 구매동기인지  ⮕ view_per_session, cart_per_session : 관심의 척도

(2) 상품 탐색을 통해 원하는 상품군을 좁혔는지  ⮕ top_product_clicks, recent_price_std : 구매 신호  

 

 

그러나, (3) 원하는 상품을 찾았다면 지금 당장 구매하지 않는 이유는 뭔지 에 대한 이유는 수집된 변수 내에서 확인하기엔 부족한 감이 있었습니다. 이에 해당될 수 있는 변수로는, 해당 제품의 할인 정보, 쿠폰 클릭 여부, 배송 조건, 재고 조건 등 다양한 고려대상이 있겠지만 이러한 변수들을 실제로 획득할 수는 없었습니다. 

 

특히 Part2와 마찬가지로, 장기 상호작용 고객에게도 가격 할인율은 구매여부와 큰 상관성을 보이지 않았습니다. 특히, 동일 제품에 대해 약 0.5$ 정도 싼 제품을 view 했는데도 구매하지 않은 고객들이 많아, 데이터로 확인가능한 것보다 훨씬 더 구매에 다양하고 직접적인 구매 요인이 존재할 것으로 판단됩니다.

 

어쨋건 part2, part3 에서는 유의미한 구매 신호를 판별하고 이를 추적, 또는 구매확률이 높은 고객들을 선정해서 CRM 대상이 추정되었다면,  part4 에서는 그 중 가치있는 고객은 누구이고, 어떤 제품을 추가로 팔 수 있을지 '크로스셀링 전략'에 대해 다뤄볼까 합니다.