1. Feature 생성
기존 Feature 3개(user_id, product_id, reordered)에 더해 총 20개의 Feature를 새로 만든 후 해당 Feature들을 활용하여 재구매 예측 모델을 만들어 보았습니다.
- uxp_times_bought : user_id 와 product_id를 기준으로 사용자가 해당 제품을 몇 번 주문했는지 나타냅니다.
- uxp_reorder_ratio : 사용자가 특정 제품을 처음 구매한 이후 해당 제품을 얼마나 자주 재구매 했는지 계산한 비율입니다.
- uxp_last_five : 최근 5회 주문에서 사용자별 특정 제품의 구매 횟수입니다.
- uxp_ratio_last_five : 최근 5회 주문 중 제품 구매 비율(uxp_ratio_last_five)을 계산하여 해당 제품의 최근 주문에서의 중요성을 나타냅니다.
- u_num_of_orders : 각 user_id에 대해 order_number의 최대값을 구하여 사용자별 총 주문 횟수를 계산합니다.
- u_avg_prd : user_id와 order_id별로 각 주문에 포함된 제품 수를 구한 후 사용자별 평균 주문 제품 수입니다.
- dow_u_most_order : 각 user_id별로 가장 많이 주문한 요일입니다.
- hod_u_most_orders : 각 user_id별로 가장 많이 주문한 시간대입니다.
- u_reorder_ratio : 각 user_id별로 재주문된 비율입니다.
- p_num_of_times : 각 product_id별로 총 구매된 횟수입니다.
- p_reorder_ratio : 각 product_id별로 재주문된 비율입니다.
- p_avg_cart_position : 각 product_id별로 장바구니에 추가된 평균 위치입니다.
- uxp_times_ratio : 사용자가 마지막 5회 구매에서 특정 상품을 얼마나 자주 구매했는지를 나타내는 비율입니다.
- log_u_num_of_orders : 사용자의 총 주문 수에 대한 로그 변환 값입니다.
- order_time_combined : 사용자가 가장 많이 주문한 요일과 시간대를 합친 값입니다.
- reorder_diff : 사용자의 재구매 비율과 상품의 재구매 비율 차이를 나타냅니다.
- uxp_time_to_last_ratio : 사용자가 특정 상품을 구매한 횟수와 최근 5회 구매에서 해당 상품을 구매한 횟수의 비율입니다.
위의 Feature들을 기존의 데이터에서 추가로 만들어 주었고 그 후 해당 Feature들을 사용하여 재구매 예측을 해볼 것입니다.
2. Machine Learning 적용
우선 저희는 처음에 DecisionTree를 적용하였습니다. 적용 해 본결과 max_depth가 10일 때 accuracy가 0.9정도로 꽤나 높은 점수를 얻을 수 있었습니다. 하지만 F1-Score를 확인 해본 결과 0.25로 값이 출력되었습니다.
그래서 원인을 확인 해본 결과 데이터 불균형으로 인해 F1-Score가 낮게 나온 것으로 추측하였습니다.
데이터 불균형 : 확인 하는 reordered의 값에서 0이 너무 많은 경우를 말합니다.(0: 약 700만 개, 1: 약 80만 개)
그리고 두번째 LightGBM을 통해 모델링 해본 결과 accuracy(정확도)는 0.87이 나왔으나, 이 또한 F1-Score가 0.43으로 조금 더 나아지긴하였으나, 그래도 똑같이 데이터 불균형이 보였습니다.
그래서 데이터 불균형 해소를 위해 SMOTE 오버 샘플링을 적용하여 1과 0의 개수를 똑같게 만들어 주고 LightGbm을 다시 적용해준 결과 F1-Score는 0.92까지 올라 갔으며, Accuracy 또한 0.92까지 올라가는 좋은 결과를 얻을 수 있었습니다.
즉, 분류 모델링을 할 때 데이터의 균형이 중요하단 것을 깨달을 수 있었으며 F1-Score에 대해 좀 더 확실하게 알 수 있었습니다.
그리고 다른 모델 기법인 CatBoost와 XGBoost 두 개의 모델을 사용해본 결과 LightGBM 결과와 큰 변화는 없으며 0.01정도의 차이만 보여줬습니다.
그래서 3개의 머신러닝 기법 중 제일 좋은 성능을 가지는 모델은 확인 할 수 없었고 모두 비슷한 결과를 띈다는 것을 확인 하는 것으로 마무리 하였습니다.
3. 아쉬운 점
1. 고객 별 구매 날짜가 정확히 표시 되었다면 좀 더 날짜에 맞춰서 어떤 제품이 필요할 지도 분석해보는 방법 또한 해볼 수 있었는데 없어서 아쉬웠습니다.
2. 가격 또한 설정 되어 있었더라면 좀 더 세부적으로 고객을 분류해볼 수도 있지 않았을 거란 생각 또한 해보았습니다.
3. 각각의 컬럼들을 이용하여 더욱 세부적으로 확인 해보고 싶었으나, 실력과 도메인 지식의 부족으로 좋은 아이디어나 생각이 떠오르지 못하여 아쉬웠습니다.
4. 데이터를 가지고 분석하기 전에 분석할 내용에 대한 기준을 명확하게 세우고 그 기준을 통해 계획을 짜서 하는 것이 중요하다 느꼈습니다. 왜냐하면 이번 프로젝트를 하면서 계획 없이 해당 데이터를 무작정 분석부터 시작한 결과 분석 내용이 일관성이 없고 얕게만 분석하여서 의미 있는 분석 결과를 내놓지 못한 상황도 있었기 때문입니다.
이렇게 프로젝트를 해보면서 여러 문제를 마주하고 해당 문제를 해결하기 위해 조사하고 공부해보니 확실히 프로젝트 전과 후의 데이터 분석 또는 머신러닝의 대한 이해도는 높아진 것 같습니다.
그리고 커뮤니케이션이 왜 중요한지도 알 수 있었습니다.
이상으로 Instacart 재구매 예측 프로젝트를 마치겠습니다.
데이터 출처 : https://www.kaggle.com/datasets/psparks/instacart-market-basket-analysis
'Project > Machine Learning' 카테고리의 다른 글
Project - Instacart 데이터 물품 재구매 예측하기(RFM) (0) | 2024.11.19 |
---|---|
Project - Instacart 데이터 물품 재구매 예측하기 (0) | 2024.11.18 |
[Zero-base] 최동원 선수 연봉 예측하기 - 보충 (1) | 2024.10.29 |
[Zero-base] 최동원 선수 연봉 예측하기 - 3 (1) | 2024.10.21 |
[Zero-base] 최동원 선수 연봉 예측하기 - 2 (0) | 2024.10.21 |