드디어 두번째 프로젝트를 시작했다. 총 5개의 주제가 주어졌는데 그 중에서 가장 재미있어 보이는 주제로 선택했고, 주제는 바로바로 <Instacart Market Basket Analysis (고객의 물품 재구매 예측 여부 대회 데이터셋)>
https://www.kaggle.com/c/instacart-market-basket-analysis/data
Instacart Market Basket Analysis | Kaggle
www.kaggle.com
Kaggle에서 진행되었던 대회 중 하나이며, 내가 즐겨하는 Instagram 관련이라 선택하게 되었다. (요즘 많이 사용하는 마켓컬리와 관련 있기도 하고)
프로젝트 기간은 8/12 ~ 8/18 까지
EDA 진행 과정을 전반적으로 포스팅 할 예정. 화이팅 :)
일단 첫번째 단계! 제공된 데이터를 탐색해보도록 하자!
제공되는 데이터는 총 7개지만 내가 EDA에 필요한 데이터로 aisles.csv, departments.csv, order_products__prior.csv, orders.csv, products.csv 만 사용할 것이다.
< 변수 설명 >
1. aisles.csv
- aisle_id : 'aisle'에게 부여되는 식별 번호
- aisle : 상품의 상세 카테고리
2. departments.csv
- department_id : 'department'에게 부여되는 식별 번호
- department : 상품의 카테고리(전체)
3. order_products__prior.csv
- order_id : 주문번호
- product_id : 각각의 상품에 부여되는 식별 번호 ( 상품번호 )
- add_to_cart_order : 고객의 장바구니에 매겨져 있던 순서 번호
- reordered : 재구매 여부 ( yes : 1, no : 0 )
4. orders.csv
- order_id : 주문번호
- user_id : 고객번호
- eval_set : 고객 구분 정보 ( prior, train, test )
- order_number : 같은 고객의 몇번째 주문인가를 나타내는 숫자
- order_dow : day of week ; 주문한 요일 ( 0 : 일요일, 6 : 토요일 -> 임의로 정함 )
- order_hour_of_day : 주문한 시간 ( 24시간 중 )
- days_since_prior_order : 이전 주문과 현재 주문의 날짜 차이
5. products.csv
- product_id : 상품번호
- product_name : 상품명
- aisle_id : 'aisle'에게 부여되는 식별 번호
- department_id : 'department'에게 부여되는 식별 번호
각 데이터의 변수가 무엇인지 파악하였으므로 이제 본격적인 EDA를 진행하자!
일단, 필요한 라이브러리를 가져온다.
다음으론 필요한 데이터를 불러온다. (train은 가져왔으나 사용하지 않음 -> 메모리 낭비 주의!!)
상대 경로를 적어주었다. google colab으로 작업했기 때문에 마운트 한 드라이브 경로를 적어주면 됨.
이제 불러온 데이터들을 head( ) 함수로 확인한다.
다음 단계로 결측치가 있는지 없는지 확인하고, 만약 있다면 제거 또는 다른 값으로 대체해 넣어 주어야 한다.
+ 데이터 타입도 같이 확인. info( ) 함수 사용
aisles, departments, products 이 세 개의 데이터 프레임은 결측치가 존재하지 않는다는 것을 확인했다.
그러나 prior, orders 데이터 프레임은 결측치 유무를 확인할 수 없었다. 이럴 때에는 간단하게 info(null_counts=True)로 바꿔서 입력해주면 된다.
prior에는 결측치가 없다는 것을 확인했지만, orders 테이블의 days_since_prior_order 컬럼에서 결측치가 존재한다는 것을 발견했다.
isnull( ) 함수로 총 206209개의 결측치가 있다는 것을 알아냈고, 나는 이 결측치 값이 나중에 인사이트를 도출할때 필요할 가능성을 염두에 두고 따로 clear 변수에 저장했다.
다음 단계로는 의미있는 인사이트를 도출하는 과정이다. 이 단계는 분석가의 주관성이 많이 들어가야하는 부분이라고 생각하며, 그에 따라 의미있고 없고를 규정짓는 것은 스스로의 판단에 달려있기 때문에 내가 얻고자 하는 결론이 무엇인지, 데이터 간의 상관관계가 어떻게 이루어졌는지 등을 깊게 고민해야 한다.
내가 생각한 목적지는 '재구매를 많이하는 상품'이 무엇인가 찾아내는 것이었다.
그러기 위해서는 일단 재구매하는 사람들의 비율을 구할 필요가 있었다.
groupby를 사용하여 아래와 같이 구매와 재구매의 비율을 구했다.
groupby를 사용하지 않고 더 간단하게 파악하는 방법도 존재한다. describe( ) 함수를 사용하면 평균을 구할 수 있기 때문에 1에 가까울 수록 재구매의 비율이 더 많다는 뜻. (mean값만 구해도 됨)
다음으로 day of week 값을 이용하여 언제 주문량이 많은지 찾아보았다.
여기서 0은 일요일을 뜻하며, 차례대로 월, 화, 수, 목, 금, 토요일로 해석하여 주문량이 가장 많은 요일은 일요일, 그 다음으로 월요일인 것으로 나타났다. 하지만 여기선 0~6의 숫자가 정확하게 무슨 요일인지 명시되지 않았기 때문에 해석에 주의해야한다는 것을 명심하자!
이번엔 hour of day 값을 이용하여 하루 중 어느 시간대에 주문이 많은지 찾아보았다.
주로 오전 10시부터 오후 3시까지 주문량이 많았다. 다만 점심시간에는 약간 감소하는 굴곡을 보인다. 따라서 주문량, 재주문량을 높이기 위해서는 점심시간 이전 1~2시간과 점심시간 이후 1~2시간에 광고, 이벤트 등의 마케팅을 진행하는 것이 가장 효과적이다. 또한 대체적으로 오전보다 오후에 평균 구매량이 높기 때문에 소비자가 활동하는 시간대와 맞는 상품들을 추천하는 것을 권장한다.
주문이 활발한 시간대와 요일을 알아냈으니, 이제 어떤 제품군을 추천하는 것이 맞는 가에 대해서 구해보자.
아래와 같이 products와 aisle, department 테이블을 결합시켜 하나의 테이블로 만들었다.
하나로 합친 상품관련 데이터들을 재구매 관련 테이블인 prior과 join한다. merge( ) 함수를 사용.
이제 total_products라는 최종 테이블을 통해 어떤 제품을 추천해야 효과가 있을지 분석한다.
첫번째. 전체 카테고리별 주문량 상위 10개 상품
두번째. 세부 카테고리별 주문량 상위 10개 상품
세번째. 주문량 상위 10개 상품 이름
위 과정을 통해 소비자들은 신선제품 - 주로 과일류를 많이, 자주 주문하며, 유제품 군도 상당히 많이 산다는 것을 알 수 있다. ( 이유는 아마 유통기한이 짧고, 금방 상하기 때문이라고 예상됨. )
이번 EDA 프로젝트는 나에게 부족한 부분들을 알아가는 값진 시간이었다고 생각한다. 빅데이터를 다루기 위해서는 이것보다 훨씬 많은 변수들을 분석하고 이해해야 할텐데 아직 많이 부족하다고 느꼈고, 특히 어떤 인사이트를 도출하기 위해 어느 종류의 그래프(함수)를 사용해야하는지 아직 감이 잘 안잡힌다. (디자인적인 부분도 마찬가지) 이 부분을 좀 더 공부하고 보완해서 유의미한 정보를 도출하고, 효과적으로 전달할 수 있도록 노력해야겠다.
또 한가지 고쳐야 할 점이라면 관심 없는 분야에 대해 내가 대하는 태도 자체가 확연히 다르다는 것이다. 이번 프로젝트를 통해서 확실하게 느꼈는데 나의 호불호와 관계없이 데이터를 이성적으로 받아들이고 해결하는 성숙한 자세가 부족하다고 느꼈다. 이건 전적으로 나의 태도 문제이기 때문에 반드시 고쳐야 한다. 반드시!! (사람은 하고 싶은 것만 하면서 살 수는 없어 정신차리자!!)
'빅데이터' 카테고리의 다른 글
[Computer Vision] 01. OpenCV 정리 (0) | 2021.11.04 |
---|---|
[EDA] PIL(Python Imaging Library) pillow 정리 (0) | 2021.11.03 |
[EDA] matplotlib rcParams 정리 (0) | 2021.11.03 |
[k-Digital] Modeling Project - 완료! (1) | 2021.09.10 |
[k-Digital] Toy Project - web crawling (0) | 2021.08.04 |