두 번째 유사한 상품을 찾고, 군집화하고, 탐색해 보기
Instacart 데이터 분석 두 번째 이야기이다.
유사한 상품을 찾고, 군집화하고, 탐색해 보기
이번에는 Instacart의 Product를
word2vec으로 Vector화하고
유사한 상품을 한번 찾아보고,
Kmeans로 군집화하고,
각 군집을 요일과 시간을 기준으로
데이터를 탐색해 보고자 한다.
먼저 Instacart의 데이터셋이나 관련 배경 내용은 "Part 1 Week Hour 중심으로 데이터 탐색해 보기 "을 참고해 보길 바랍니다.
상품 간의 유사도 측정을 위해 Word2Vec을 이용하여 Product2Vec을 만든다.
Product2vec을 만드는 상세한 방법은 저의 예전 글인 Word2Vec 그리고 추천 시스템의 Item2Vec 를 참고하길 바라며, 간단한 내용만을 기술하겠다.
아래와 같은 Spec으로 word2vec을 이용하여 product의 Vector 값을 생성한다.
1. word2vec의 word = product_id로 대치한다.
2. word2vec의 scentence = order의 cart의 Product id 리스트이다.
예 sentence = [product_id1, product_id2,... ]
3. 200번 이상 order가 있는 상품만 학습한다.
4. word2vec의 window는 6으로 한다.
5. product를 100차원의 Vector로 학습이다.
(상세한 실제 코드는 전체 과정이 기술된 Jupyter Notebook을 참고하세요)
그럼 product2vec으로 유사한 상품을 몇개만 찾아보자
banana(24852)와 가장 유사한 상품은
과일과 바나나로 비슷한 상품이 잘 나오는 듯하다.
Organic Whole Milk(27845)와 가장 유사한 상품은?
다양한 우유 그리고 유사한 상품이 잘 나온다.
Drinking Water(27845)와 가장 유사한 상품은?
Margarine? 뭔가 조금 안 맞는 상품도 있어 보인다.
그래도 얼추 Product2Vec이 잘 학습되 보인다.(잘 되었을 것으로 믿자)
Kmean로 학습된 Product Vector로 500 clusters 를 생성하였다.
잘 군집 화가 되었는지 샘플로 군집화된 Product 을 보자
0번 클러스터의 Product ( 10개 )
Aisle:1 / Mediterranean Orzo Salad
Aisle:1 / Lentil Salad
Aisle:1 / Tuscan Kale & Quinoa Salad
Aisle:1 / Mini Falafel With Tahini Sauce
Aisle:1 / BBQ Chopped Salad
Aisle:30 / Burrito Grand
Aisle:1 / Santa Fe Fiesta Salad
Aisle:13 / Enchilada Wrap
Aisle:13 / Breakfast Burrito With Potatoes Jack & Cheddar Cheese & Meatless Chorizo
Aisle:1 / Garden Minestrone Soup
* 해당 Product의 구글 이미지 검색 결과
샐러드와 캐밥 종류가 잘 모여 있는 것 같아 보인다.
1번, 13번 구역의 상품 위주로 모여 있는 듯하다.
100번 클러스터의 Product ( 10개 )
Aisle:21 / Cheddar Cheese Alternative
Aisle:86 / Vegan Egg
Aisle:42 / Alfredo Cheezy Mac
Aisle:21 / Dairy-Free Cheddar Style Wedges
Aisle:21 / Irresistible Dairy Free Slices Provolone Style Cheese Alternative
Aisle:21 / Vegan Chao Creamy Original Cheese Slices
Aisle:42 / Dairy Free Gluten Free Mushroom & Roasted Garlic Pizza
Aisle:21 / Cheese Alternative, American Style, Slices
Aisle:21 / Chao, Vegan, Tomato Cayenne, Slices
Aisle:21 / Classic Blend Vegan Shreds Cheese
*Product 이름 구글 이미지 검색 결과
치즈 위주의 유사한 상품끼리 잘 묶여 있는 듯 보인다.
21번, 43번 구역의 상품들이 군집화 되었다.
200번 클러스터의 Product ( 10개 )
Aisle:69 / Ramen, Vegan, Miso
Aisle:69 / Vegan Hot & Sour Noodle Soup
Aisle:69 / Vegan Big Cup Pad Thai Noodle Soup
Aisle:76 / Bombay Potatoes Vegetarian
Aisle:76 / Indian Cuisine Bengal Lentils
Aisle:69 / Vegan Black Bean & Lime Soup
Aisle:69 / Sesame Chicken Flavor Asian Soup
Aisle:76 / Spinach Dal Indian Cuisine
Aisle:76 / Channa Masala Indian Cuisine
Aisle:66 / Asian Vegetable Ramen
*Product 이름 구글 이미지 검색 결과
아시안 라면과 카레 등의 유사한 상품이 군집화 되었다.
69번, 76번 구역의 상품들 까지 군집화가 되었다.
우선 결과를 주관적으로 샘플링해서 보긴 했지만
뭔가 군집화가 잘된듯하다.!!
그럼 이렇게 군집화된 500개의 클러스터에 대하여 시간과 요일에 관한 특징이 있는지 탐색해 보자
우선 각 클러스터를 쉽게 이해할 수 있게 대표할 수 있는 단어를 추출하고, 클러스터링 구매 시간 그래프를 그려보자.
클러스터별 대표 단어는 단순하게 클러스터 내 상품명 단어에서 빈도수가 가장 많은 단어를 대표 단어로 하자
이렇게 하여 전체 500개 클러스터 중 50개만 샘플링하여 그려보면!
각 클러스터 단위로 트렌드가 보인다. 즉 유사한 상품별로 시간별 구매 상향이 비슷해 보인다.
시간대로 클러스터로 구분된 구매 성향을 보면
오전 시간에는 yogurt, milk Tea, cheese, granola 등 가벼운 식품 위주의 구매 성향이 눈에 띈다.
오후 시간에는 ice cream, chocolate, pasta, cheese, beef 등 저녁이나 고연량(?) 음식이 눈에 띈다.
전체 500개의 클러스터 중 아래와 같이 샘플링하여 보자
일요일 -> 30 클러스터,
월요일 -> 20 클러스터 ,
목요일->2 클러스터,
금요일 -> 5 클러스터
일요일에 가장 많이 팔린 클러스터들의 요일별 이용 구매 패턴이다.
가장 많이 구매하는 요일이고 다양한 상품을 많이 구매한다.
월요일 가장 많이 팔린 클러스터들의 요일별 이용 구매 패턴이다.
cereal, nut, yogurt, coffee 등 오전에 팔리는 제품과 비슷한 성향이 있다.
목요일에 가장 많이 팔린 클러스터들의 요일별 이용 구매 패턴이다.
2개의 클러스터만 해당하지만, 특징이 명확하다.
Only 맛있는 맥주!!! 그 외에는 없다.
금요일에 가장 많이 팔린 클러스터들의 요일별 이용 구매 패턴이다.
Wine, pinot, vodka, resema imported 등 술과 저녁 만찬에 관련된 패턴이 두드러 진다.
위의 탐색 내용을 정리해 보면
word2vec을 이용한 상품 벡트화와 클러스터링이 적절히 성능이 나오는듯하다. (실무에 적용하려면 난관이 있겠지만)
비슷한 상품끼리는 유사한 구매 시간과 요일이 유사한 패턴을 유지한다.
목요일에는 맥주 클러스터의 판매가 눈에 띈다.
금요일에는 와인/위스키 등의 클러스터의 판매가 눈에 띈다.
그래서도 대부분은 일요일/월요일에 구매한다.
정리하면서
데이터를 탐색하면 그냥 기본적으로 word2vec으로 item을 벡터화해보고 클러스터링해 보는 습관이 생긴듯하다. 그냥 편하기도 하고 뭔가 재미난 결과가 나오지 않을까 하는 기대를 갖기 때문이 싶다. 아주 awesome 결과를 아니지만 그래도 Instacart의 상품을 이해하는데 많은 도움이 된 듯하다.....