brunch

You can make anything
by writing

C.S.Lewis

by 최규민 Jun 27. 2017

Instacart data exploratory 1

첫번째  Week-Hour 중심으로 데이터 탐색해 보기

최근 Kaggle에 개인화 추천 분야의  competition이 등록되어 그 데이터를 탐색해 보았다.

참고로, 캐글의 competition은 회사에서 Live하게  해결할 문제이고

이를 풀기 위한 제공되는 데이터셋은

특별한 도메인 지식 없이 사용 가능하고

서버 1대에 적제 가능한 적절한 볼륨이고

적절히 잘 정제되어 있어  

아주 따끈따끈한  Live 한 데이터이다.

데이터 탐색적합한 아주 맛깔난 데이터 셋이다.


Instacart Market Basket Analysis  Competition은 Instacart(미국의 온라인 기반 신선 식품 배송 서비스)에서 Last Order의 Product를 예측하는 것이 문제이다.

요즘 관심 있어 하는 e-commerce 분야와 유사 하기에 탐색을 해 보았다. (시간 여력이 되면 competition에도 참가했으면 좋겠다.)


아래 분석의 전체 과정은 Jupyter Notebook으로 공개하였으니, 실제로 Python Notebook으로 데이터 분석 경험이 있다면 이 블로그보다 해당 Jupyter notebook의 소스를 보면서 차근차근 따라가면서 보길 권장합니다. 


이번 데이터 탐색은 1화, 2회로 나누어져 있다.


첫번째  Week Hour 중심으로 데이터 탐색해 보기

두번째 유사한 상품을 찾고, 군집화하고, 탐색해 보기


 Week Hour 중심으로 데이터 탐색해 보기


탐색할 Instacart Dataset의 상세 Spec은 아래의 링크를 참고하길 바라며~

데이터셋 다운로드 : https://www.kaggle.com/c/instacart-market-basket-analysis/data 

데이터셋 설명 :  https://gist.github.com/jeremystan/c3b39d947d9b88b3ccff3147dbcf6c6b


Instacart Dataset Summery

total user = 206.2K
total order = 3.2M (15.59 orders per a user )
total product =  49.7K
total ordered product  = 32.4M (652.91 orders per a product )

가장 큰 데이터가 Order의 Cart에 담긴 상품 정보인 order_product인데 3천만 row정도 된다. 이 정도 볼륨이 딱 탐색하기 적당한 듯하다. 너무 많으면 코딩을 하드 하게 해야 하고, 너무 적으면 결과의 신뢰성이 없고, 데이터셋의 볼륨은 맘에 쏙 든다.


이번 데이터 탐색의 주요 컨셉은 구매하는 상품이 시간과 요일에 특징점이 있는지를 중점적으로 보고자 한다.

주요 분석 항목은 아래와 같다.

Week-Hour 상품 구매 패턴 탐색

Week-Hour 인기 상품 트렌드

Week-Hour 재주문(reorder) 패턴 탐색

재주문(reorder) 기간, 상품 탐색


Weekly-Hour Analysis

우선 week-hour 형태를 한눈에 탐색하기에 가장 적합한 Heatmap 형태의 그래프로 표현하여 탐색을 시작해 보자


상품 구매(order)가 요일별/시간별(WeekHour) 어떠한 특징이 있을까?

Weekly-hour heatmap: Orders Heatmap

일요일/월요일 9H~16H 시간대에 order가 많은 특징이 있다. 왜 그런지 더 알아보자


Q1. Order 하는 고객이 많은 것일까? 고객당 Order 건수가 많은 것인가?

유니크 유저수를 기준으로 Week-Hour Heatmap을 그려 보면

Order기준과 유니크 유저수 기준의 Heatmap의 결과가 거의 유사하다. 즉 유저수가 많아서 해당 특징이 생긴듯하다.

이왕 본 김에 유저당 Order 건수 기준으로도 보자

특이하게 월요일 오전(8-10h)의 유저당 Order 건수가 높다...  왜 이런 확연한 특징이 있지?? 월요일 9시에 주 단위로 정기 구매 상품이 많은가?? 궁금하다. 촉이 온다!!! 무슨 상품을 구매하는지 보자!!

상호 비교를 하기 위해 요일별 9시에 가장 많이 빨리는 상품을 보자

그냥 뻘!!! 생각이었다. 그냥 사람들은 월요일 아침에 다른 날보다 바나나와 우유를 더 많이 먹는 것 같다. 아니면 롱테일 쪽 구매 상품에 특징이 있을까? 하는 의구심도 생기지만 귀찮아서 이쯤 하고 패스!!


위에 뽑아놓은 데이터가 있어서 상품 랭킹 트랜도 알아보자

가장 잘 팔리는 상품 20개를 시간대별로 추적해 보자

1~5 위까지는 거의 변함이 없고, 그 이후 변화가 좀 있는듯하다.

Working Hour(9H~17H)와 그 외 시간의 상품 구매 패턴이 확연히 달라지는 것을 볼 수 있다.

가장 잘 팔리는 상품 20개를 요일별로 추적해 보자

요일별도 상위 5개는 변동이 없고 , 그 이하 랭킹에서는 limes 이 주말에 더 많이 팔리는 편이고, organic blueberries가 주 후반부인 수목금에 많이 빨리는 특징이 있어 보인다.


Q2 Order Cart에 상품을 많이 넣는 week-hour는?

(한 번에 많이 구매하는 Week:Hour )

weekday-hour : Order 당 상품수

주말(토/일) 그리고 늦은 저녁(21~23)에 Cart에 상품을 많이 담아 Order 하는 패턴이 눈에 들어 온다.

시간적 여유가 쇼핑을 오래 하게 되고 Cart에 많이 담아 구매하는듯하다.

혹시 충동 구매가 많으려나? 아니면 1주일치의 살 물건을 한 번에 시기 때문인가?

다양한 가설이 생각나지만, 귀찮아서 또 패스~

week-hour별 평균 reorder(재주문)까지 걸리는 기간이 얼마인지 알아보자


얼마나 자주 주문하는가? (다시 주문하기까지 걸리는 평균 일수 )

(수치가 작을수록 자주 주문한다고 볼 수 있음)

주말과 새벽이 Reorder 기간(일)이 김

새벽의 주문 텀이 긴 이유는 새벽에 깨어 있을 확률이 낮아서 주문할 확률이 낮은 것이 아닌가? 하는 생각이 든다.

대략적으로 week-hour에 따른 구매 패턴을 알아보았다.


Reorder Analysis

이제 조금 주제를 변경하여 Reorder 중심으로 보자


@주문 순번(order number) : 시간 순서로 각각의 유저의 주문에 부여된 인덱스이다.  순번이 높을수록 주문을 많이 했다고 판단할 수 있다.
@재 주문까지 걸리는 시간(days since prior order) : 이전 주문 이후 현 주문까지 걸리는 날수. 처음 순번의 값은 0이다

Q3. 주문 순번이 커 질수록 reorder까지 걸리는 날수가 짧아 질까? Yes!!!

유저별 주문 순번과 다시 주문할 때까지 걸리는 날수와의 관계는(days_since_prior_order)?

녹색선을 보면 주문 횟수가 많아질수록 Reorder까지 걸리는 날수가 많이 짧아진다.

인과 관계는 반대일 수도 있겠다.  Reorder를 하는 기간이 짧아지니 당근 주문 횟수가 많아진다.  

어떻게 보면 당연한 결과 일수도 있겠다.


그럼 order number(주문 횟수)가 클수록  cart의 상품수가 작을까 생각해 봤지만

파랑선으로 해석해 보면 order의 수와 cart의 상품수는 상관이 없다.


Q4. Reorder 까지 걸리는 기간이 짧을수록 이전에 샀던 재구매 Product일까?

재구매 기간과 재구매 Product 비율( Reordered Product Rate )의 관계를 보자


평균 대비 확연한 차이는 아니 지만 재구매까지 걸리는 시간이 짧을수록 기존에 구매한 상품일 확률은 높다!


Q5. 주문 순번(Order Number)이 큰, 즉 많이 주문을 한 오더에는 재구매 상품이 많을까?

reordered product rate가 로그 형태로 Order number가 클수록 재구매 상품의 비율이 크게 증가한다.

40번 이상 주문한 사람의 주문 순번엔 는 재구매 상품이 80% 이상으로 높고, 85% 정도에서 재구매 상품 비율을 수렴한다.

Product를 예측하는 feature로 쓰기에 좋아 보임 ( 실제로는 적용될 커버리지가 낮겠지만 )

그럼 이제 특히 어떤 상품이 reorder 비율이 높은지 보자??


Q6) 어떤 상품이 Reorder 비율이 높을까?

1000개 이상 주문한 상품에서 재구매 비율이 높은 20개 상품은?

84구역(aisle)의 우유 제품이 많은 부분을 차지하고 83%의 높은 재구매 비율을 유지함

우유 이외는 바나나, 물 제품이 있음, 당연히 유저당 주문 수도 비례하여 높음


추가로, 구역(aisle) 별 재구매 상품 비율 상위 20, 하위 20 은?

재구매 비율이 높은 구역(aisle)은 유통기간이 짧은 우유, 물, 커피, 주스 등 신선 농산물 위주

재구매 비율이 낮은 구역(aisle)은 유통기간이 긴 제품 위주로 보인다.


 Q7) 주문이 많은 상품은 재구매율이 높다? ( 상관계수 측정 )

아마 당연히 그럴 것이다. 데이터로도 확인해 보자

product별 order count(주문수)와 reorder rate 상관계수를 그려보자, reorder_rate(0 ~ 1.), total_order(1~500000)의 데이터 단위가 너무 차이나 나기 상관 계수를 spearman으로 측정하였다.

예상대로 주문수와 재구매비율의 상관계수는 0.59로 높은 양적 상관관계가 나왔다.



우선 지금까지의 내용을 간단히 정리해 보자면

1. 일/월 9~16시에 구매가 가장 활발이 일어난다.

2. 월요일 9시에 특이하게 유저당 주문 비율이 높다!

3. 잘 팔리는 상품 상위 5개는 시간/날짜에 관계없이 잘 팔린다.

4. 상위 6~20개 상품은 주말-평일, work hour(9-18시) - 그 외 시간에 따라 구매 특징이 다르다.

5. 여유시간이 많은 주말, 늦은 저녁 시간에 한 번의 쇼핑에 많은 상품을 구매한다.

6. 재구매 상품의 비율을 평균 60%으로 높다.  

7. 주문을 많이 할수록, 자주 할수록 재구매 상품의 비율이 높다.

8. 유통기간이 짧은 신선 제품은 재구매 비율이 높고, 유통기간이 긴 가공식품의 재구매 비율이 낮다.


그런데 재구매 상품의 비율과 특징들을 보면서 드는 생각이, 예전 아프리카TV에서의 개인화 추천 개발할 때 생각이 났다.

아프리카TV의 개인화 추천 시스템을 만들 때 결정적으로 클릭률을 높게 만든 부분은 정말 단순하게도 자주 시청하는 BJ의 방송 추천하면 추천 클릭률이 정말 높게 나왔다. 여기도 비슷한 스멜이 풍긴다. 신선 식품의 재구매 상품 비율은 평균 60% 정도로 높고, 자주 주문할수록 재구매 상품 비율은 더 욱도 높다. 즉 자주 구매하는 사용자에게는 자주 구해하는 상품을 적절한 타이밍에 추천하면 클릭률이 높을 듯하다.


정리하면서

데이터 탐색은 항상 꼬리에 꼬리를 무는 질문에 스스로 답을 찾아가면서 해당 데이터의 도메인에 대하여 더 깊게 이해를 하게 되고 특징을  파악하게 되는듯하다.

이번 데이터 탐색은 week-hour heatmap으로 상품 구매수를 그려보면 어떤 특징이 있을까? 하는 질문에서 시작했다. 그리고 이 질문은 유저에 대하여 -> 인기 상품에 대하여 -> 재구매 상품 비율에 대하여 -> 재구매상품들에 대하여... 이렇게 생각이 연결되면서 Instacart의 고객들이 어떤 패턴으로 상품을 구매하게 되는지를 알게 되었다.

데이터 탐색은 지루하면서도 재미있다.


브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari