본문 바로가기
프로젝트

[고객분석] 이커머스 데이터2 EDA

by kime2 2024. 3. 29.

고객행동을 분석하기 위해 섹션, 이벤트와 고객이 산 제품을 알 수 있는 데이터를 활용해 보았다

https://www.kaggle.com/datasets/mkechinov/ecommerce-behavior-data-from-multi-category-store

 

eCommerce behavior data from multi category store

This dataset contains 285 million users' events from eCommerce website

www.kaggle.com

 

데이터 특징

컬럼명 예시
event_time 2020-04-01 00:00:00 UTC
event_type view
product_id 1201465
category_id 2232732101407408685
category_code apparel.shoes.slipons
brand samsung
price 230.38
user_id 568984877
user_session e2456cef-2d4f-42b9-a53a-8893cb0c6851

 

데이터의 수가 66589267개로 코딩이 오래 걸린다 -> 클릭 하나하나 신중해야 함

널값이 8992487개가 있음 -> brand 컬럼

 

category_code 컬럼이 apparel.shoes.slipons또는 apparel.shoes으로 카테고리.서브카테고리.아이템 및  카테고리.서브카테고리으로 구분되어 있어 전처리 필요

이벤트 타입이 구분되어도 모두 구매를 한 고객이기 때문에 이벤트에 따라 어떠한 차이가 있는지 알기 어려움

 

-> 같은 user_id에 따른 이벤트, 섹션, product_id를 비교해봐야 함

-> 같은 구매건으로 섹션에 따른 시간에 따라 이벤트 내용이 순차적으로 나와있을 수 있기 때문

 

 

전처리

1. 분석을 원활하게 하기 위해서 널값제거(category_id, brand로 인해 1/8 제거)

2. category_id의 데이터를 category, sub-category, item으로 분류하고 item이 없는 경우 null값 처리

store_df[['category','sub-category','item']] = store_df['category_code'].str.split('.',n=2,expand = True)

 

문제 : category_code의 .의 개수가 다르다 -> category - subcategory - (item)

  • str.split() 함수: 문자열을 특정 구분자(delimiter)로 분할하는 함수
  • n=2 옵션: 최대 분할 횟수 -> 지정하지 않으면 길이가 달라서 오류 발생
  • expand=True 옵션: 분할된 문자열을 데이터프레임의 새로운 열로 확장 (False의 경우 리스트로 출력)

* 해당코드 50분 소요...

전저리 전 전처리 후

 

EDA

1. 고객별 EVENT 

유저의 행동 로그에 따라 상품을 VIEW하고 CHART, PURCHASE하기까지 과정을 할 수 있다

해당 데이터의 가장 큰 특징으로 구매고객과 비구매고객을 퍼널 분석 가능

 

2. 구매분석

print('총 고객수 : ',store_df2['user_id'].nunique())
print('총 구매 고객수 : ',store_df2[store_df2['event_type']=='purchase']['user_id'].nunique())
print('전환율: ', store_df2[store_df2['event_type']=='purchase']['user_id'].nunique()/store_df2['user_id'].nunique()*100)
print('총 카테고리 수 : ',store_df2['category'].nunique())
print('총 서브 카테고리 수 : ',store_df2['sub-category'].nunique())
print('총 아이템 수 : ',store_df2['item'].nunique())
print('브랜드 수 : ',store_df2['brand'].nunique())
 

총 고객수 : 3934973 

총 구매 고객수 : 425603 

전환율: 10.81590648779547 

총 카테고리 수 : 13 

총 서브 카테고리 수 : 62 

아이템 : 91 브랜드 : 4309

문제

1. 섹션관련

-  날짜가 바뀌어도 섹션아이디는 바뀌지 않음?

 - 섹션이 바뀌는 시점에 대한 기준 필요

 

3. 실제 브랜드와 제품에 대한 괴리

-예 삼성

방법 : 흐린눈…(브랜드수가 4000개라서 바꾸는게 쉽지는 않을 것 같은데..)

 

3. 조금만 복잡해도 20분 ~ 최대 50분 시간 소요…(groupby도 못할것 같음..)

-> 치명적... 해당데이터는 4월 한달로 4.5G가 되며, 이를 4~7개월 결합하여 시계열분석을 시도할 경우..불가

 

예상 분석방법

1. event_time과 category_code를 활용한 시간에 따른 구입추세 : 00시에 ~를 사는 경향이 있음

-> 월별로 구분된 파일이므로, 4개의 파일을 결합하여 월별로도 비교할 수 있음

-> 컬럼의 수가 너무 많아서 시간의 문제

 

2. event_time과 user_id를 활용한 리텐션 구하기

 

3. event_time과 user_id와 price를 활용한 RFM구하기

-> 실제 가입일을 알 수 없으므로 4개월중 첫번째 방문날짜를 구해서 가입날짜로 추청

 

(논의)4. Aha moment 구하기

핵심가치 찾기 : (먼저 기준을 세워, 예 - 1회 구매) 이탈한 고객과 핵심고객(예- 5회 이상 방문)과의 구매제품에 대한 차이 비교

-> 가정: 이커머스의 핵심 가치는 해당상품이므로, 이탈한 고객은 상품에 대해 불만족하고, 핵심고객은 구매한 제품에 대하 만족한 것

--> 즉, 이커머스의 액션 XX는 무엇을 구매했냐의 차이

---> 액션도출: 이탈한 고객의 제품군의 상품과 브랜드를 분석하여 개선하기

---> 추가논의 : 부활고객은 무엇을 샀을까?

결론

장점 단점
고유 고객ID에 대한 행동(event)분석이 가능하다
상품별로 구체적이 브랜드와 품목이 있어서 시계열과 함께 트렌드 분석이 가능하다 (공개데이터에는 상품명 또는 브랜드를 알기 어려움 ㅠ.ㅠ)
특히 분, 초 의 로그까지 확인이 가능하여 시간대별 구매패턴 분석 가능
데이터 양이 너무 많이 시간이 오래걸린다(노트불으로는 불가능 ㅜ.ㅜ)
브랜드 명이 구체적이나 실제 브랜드와 상품 품목이 다르다
리텐션 및 RFM을 위한 가입날짜를 현재 데이터의 최조 접속을로 가정해야 한다
고개의 특징을 알기 어렵다(성별, 지역 등)

 

고객에 대한 퍼널분석과 상품분석에 대한 장점이 있으나 분석시간이 너무 오래걸리고, 고객에 대한 데이터가 부족하여 고객 특징별 군집을 시도하기가 어려울 것 같다