[데이터분석] First Exploratory Analysis

Kaggle의 Instacart Market Bascket Analysis라는 대회(?)를 신청하였고, 이 곳에서 주는 데이터를 토대로 고객들의 다음 재구매 상품을 추정하고 추천해주는 시스템을 개발할 것이다.
(무려 1등시 12,000$…)

데이터를 토대로 알고리즘을 찾아보고 적절한 알고리즘을 적용하기 위해선 데이터를 알 필요가 있다. 그러기 위해 데이터 분석의 초기단계를 하는 것이다.
데이터 분석을 통해 어떤 데이터가 들어있으며 어떤 경향을 나타내는지 알아보자.

그런데 처음하는 데이터 분석이라 다른 사람이 해둔 것을 보기로 했다.

Kernel에 Philipp Spachtholz라는 분이 작성한 report를 참고하였다.


일단, 사용할 R 패키지들을 소개하겠다. 아래의 내용을 따라하려면 필요한 패키지이다.
* instal.packages(“name”)으로 설치 가능

data.table
dplyr
ggplot2
knitr
stringr
DT

위 패키지들로 부터 적절한 함수를 사용하여 아래의 그래프와 데이터들을 얻어내었다.

먼저, 주어진 csv 파일 데이터는 ‘aisles‘, ‘departments‘, ‘order_products__prior‘, ‘order_products__train‘, ‘orders‘, ‘products‘, ‘sample_submission‘ 로 7개가 주어진다.

sample_submission‘에서는 유효한 데이터를 얻을 수 없음으로 여기서는 사용하지 않는다.

그러면 나머지 데이터들의 형태를 보자.

데이터파악

제품 구분 [asiles]

aisles’는 각 aisle의 [ID]와 이름이 나와있다.
([aisle_id] / aisle)

[kable]aisles

제품 파트 구분 [departments]

departments‘도 마찬가지로 각 department의 [ID]와 이름이다.
([department_id] / department)

[kable]departments

제품 정보 [products]

products‘는 각 제품별 [ID], 이름, aisle의 ID, department의 ID로 구성되어 있다.
([product_id] / product_name / aisle_id / department_id)

[kable]products

주문 정보 [orders]

orders‘는 각 주문별 [ID]와 사용자 ID, 자료구분, 주문 개수, 요일, 시간, 재구매에 걸린 일수가 나온다.
([order_id] / user_id / eval_set / order_number / order_dow / order_hour_of_day / days_since_prior_order)

[kable]orders

주문과 제품 상세정보 [order_products__train & __prior]

order_products__train‘과 ‘order_products__prior‘은 같은 형태로 있지만 위 4개의 데이터와는 다르게 다른 행들과 개별적으로 구분되는 ID를 갖지는 않는다.
주문 ID와 상품 ID, 장바구니 추가순서, 재구매 여부가 나와있다.
(order_id / product_id / add_to_cart_order / reordered)

[kable]order_products

order_products__prior‘로 얻은 데이터들로 ‘order_products__train‘이 들어왔을 때 매 추천시스템을 구축하는 것이 목표이다.

*[ID]로 표현해둔 Head는 기본키가 되는 Head이다.
(기본키는 절대로 값이 겹치지 않고, Null이나 NA 값도 아니며 다른 행들과 구분가능한 열이다.)

이제 위 데이터들로 궁금한 것들을 그래프로 분석하여 알아보자.

그래프를 통한 분석

시간에 따른 구매도

언제 많이 구매하는지가 궁금하다.
구매할 경우 1, 그렇지 않으면 0으로 구매수량에는 상관없이 얼마나 order가 있는 보자.

orders’에서 order_dow는 요일별, order_hour_of_day는 시간별을 나타낸다.
두 Head를 histogram을 통해 그래프를 확인해보자.
(‘orders‘를 ggplot함수와 geom_histogram함수로 표현한 것이다.)

[histogram]order_dow[histogram]order_hour_of_day

위쪽이 요일별, 아래쪽이 시간별 히스토그램이다.

값이 클수록 막대가 높고, 막대가 높을수록 많이 구매하였다는 뜻이다.
order_dow는 0~6까지로 요일은 나타내었고,
order_hour_of_day는 0~23으로 시간을 나타내었다.

요일별(order_dow)로 볼 때는 0인 요일에 구매율이 최고로 높음을 알 수 있다.
그런데 요일별은 다른 요일들과 큰 변동은 보이지 않는다.

시간별(order_hour_of_day)로 볼 때는 8~18 일 때가 구매율이 최고로 높음을 알 수 있다.
이는 다른 시간과 구매도의 차이가 확연히 보임을 알 수 있다.

위 그래프로 보아 요일은 크게 영향이 없지만 시간에 따라선 구매도가 많이 차이난다고 추정해 볼 수 있다.

재구매일

이제 재구매일(days_since_prior_order)별로 보자.

[histogram]days_since_prior_order

위 그래프에서 보면 유독 7일과 30일이 높은 것을 알 수 있다.
즉, 매주나 매달 재구매하는 사람이 많다는 것이다.

주문별 구매수량

그렇다면 주문별 구매량을 ‘order_product__train‘과 ‘order_product__prior‘ 따라 그래프를 그려보자.

[histogram]order_product__train_n_items

[histogram]order_product__prior_n_items

위쪽이 order_product__train‘의 주문별 구매수량 그래프이고,
아래쪽이 order_product__prior‘의 주문별 구매수량 그래프이다.

두 그래프는 비슷한 양상을 하고 있으며 1회에 약 5개 구매가 가장 많음을 알 수 있다.

이 이후부터는 ‘order_product__train‘만 사용하여 분석하자.
order_product__prior‘은 데이터가 너무 많기 때문에 특징만 알아보기에는 너무 오래 걸리기 때문이다.
물론, 이후에 따로 ‘order_product__prior‘도 따로 분석이 필요하다.

베스트 셀러

먼저, 가장 잘 팔리는 10개 상품의 그래프를 보자.

[bar]order_product__train_top10_items.png

제일 잘 팔리는 상품은 Banana 였다.
우리에게 주어진 데이터로 보아 Banana는 재구매도 높을까?

재구매율

이제 전체의 구매율을 알아 보자.

[mutate]order_product__train_reordered.png

위 그래프를 보아 59%임을 알 수 있다.
생각보다 많은 비율이 재구매됨을 볼 수 있다.
이제 정말 Banana가 재구매율이 높을지 알아 보자.

주문별 구매수량

구매수 상위 10개 상품의 그래프와 아래의 재구매율 상위 10개 상품의 그래프를 비교해보자.

[bar]order_product__train_reoredred_top10.png

Banana는 재구매율이 6위이다. 구매수가 높아서 재구매수도 높지만 재구매율은 1위를 할정도로 높지 않음을 볼 수 있다.
1위는 의외로 베스트 셀러에서는 볼 수 없던 2% Lactose Free Milk 였다.
그렇다면 위 그래프로 보아 구매수가 높다해서 재구매율도 높은 것은 아님을 알 수 있다.

구매순서에 따른 재구매율

그렇면 사람들은 구매율이 높거나 재구매율이 높은 상품이 먼저 장바구니에 들어갈까?
구매시 첫 구매 상품 10개의 그래프를 보자.

[bar]order_product__train_first_item_top10

위 그래프를 보면 1등은 White Multifold Towels로 66%이다.
결국, 재구매에 구매순서는 의미가 없어 보일 수 있지만 5위에 재구매율이 높은 상품이 있다.
이는 수치적으로 상관관계가 있는지 증명이 필요하다.
하지만 지금은 필요치 않음으로 그냥 넘어가자.

재구매일에 따른 재구매율

이제는 재구매일(days_since_prior_order)에 따른 재구매율 그래프를 알아보자.

[bar]order_product__train_mean_reordered

30일이면 새 상품을 구매할 경우가 높음을 볼 수 있다.
그리고 0일 즉시 재구매하는 경우가 가장 높다.

구매수량에 따른 재구매율 다시 알아보기

다시 처음으로 돌아가 구매수량이 재구매에 어느 영향을 미치는지 자세히 알아 보자.

[point]order_product__train_proportion_reordered.png

구매수가 높을 수록 재구매율은 높으나 일정 이상으로는 큰 효과가 없어보인다.
즉, Banana가 아무리 구매도가 높아도 재구매율이 낮은 것은 이유는 여기에서 찾을 수 있다.

유기농과 비유기농에 따른 구매도 차이

그러면 유기농과 비유기농의 구매수는 어떨까?
다음 그래프로 알아보자.

[bar]order_product__train_organic_vs_not_organic

위 그래프로 보아 비유기농 상품이 구매수량이 높다.
그러면 유기농 상품은 인기 없는 걸까?

유기농과 비유기농의 재구매율

그렇다면 유기농과 비유기농의 재구매율로 알아보자.

[bar]order_product__train_reordering_organic_vs_not_organic

위 그래프로 구매수와는 반대로 유기농이 재구매율이 높음을 알 수 있다.
이는 반대로 비유기농이 인기가 없다고 해야할까?
아니면 위에 본 자료대로 너무 구매도가 높아서 재구매율이 낮게 나온 것일까?
이와 같은 궁금중은 기본이 끝나고 심층적 분석에서 수치적으로 확인해 보자.

이후로…

이로써, 간단히 데이터들의 형태와 경향을 알 수 있었다.

다음에는 treemap과 datatable을 통해 시각화를 통한 데이터 분석을 해볼 것이다.

이는 다음 글에서 계속하기로 하자.

출처 : https://www.kaggle.com/philippsp/first-exploratory-analysis

[데이터분석] First Exploratory Analysis”에 대한 1개의 생각

  1. 핑백: [데이터 분석] First Exploratory Analysis (2) | hjpco

댓글 남기기