노력에는 지름길이 없으니까요

② 데이터 파악 (미완) 본문

내일배움캠프 일지/팀 프로젝트2

② 데이터 파악 (미완)

데건 2024. 9. 17. 15:00
728x90

데이터 구성

customers= pd.read_csv('dataset/customers.csv')
orders= pd.read_csv('dataset/orders.csv')
order_items= pd.read_csv('dataset/order_items.csv')
payments= pd.read_csv('dataset/payments.csv')
products= pd.read_csv('dataset/products.csv')

 

사용할 수 있는 데이터셋은 크게 다섯가지이다.

각 데이터셋의 컬럼 설명은 이하와 같다.

더보기
  • orders

order_id: 주문 ID

customer_id: 고객 ID

order_status: 주문 상태

order_purchase_timestamp: 주문 구매 시간

order_approved_at: 주문 승인 시간

order_delivered_timestamp: 주문 배송 완료 시간

order_estimated_delivery_date: 예상 배송 날짜

→ 시간 전처리 필요

  • order_items_df

order_id 주문id

order_item_id 주문상품id → 한 order_id 당 제품 단위

product_id 제품id

seller_id 판매자id

price (주문상품)가격

shipping_charges (주문상품)배송비

  • customers (고객)

제품이 배송되는 곳의 정보

customer_id: 고객 ID - cusomers(고객) 테이블의 기본키

customer_zip_code_prefix: 고객 우편 번호

customer_city: 고객 거주 도시

customer_state: 고객 거주 주

  • payments_df

order_id 주문id

payment_sequential 결제횟수(임시) → 모호함.

payment_type 결제방식

payment_installments 결제할부기간

payment_value 결제액

  • products (상품)

product_id: 상품 ID - products(상품) 테이블의 기본키

product_category_name: 상품이 속한 카테고리명

product_weight_g: 상품 무게 (g)

product_length_cm: 상품 길이 (cm)

product_height_cm: 상품 높이(cm)

product_width_cm: 상품 너비 (cm)

 

 

결측치 파악

결측치가 존재하는 데이터셋만을 게시한다.

 

날짜 관련 결측치가 상당하다.
카테고리명에 결측치가 있다. 분류에 조금 신경써야 할 듯 싶다.

 

 

 

전처리 리스트

파생변수 생성

product_length_cm: 상품 길이 (cm)
product_height_cm: 상품 높이(cm)
product_width_cm: 상품 너비 (cm)

 

우선 위의 컬럼을 활용하여 상품의 부피라는 파생변수를 생성했다.

 

 

  • id가 int형으로 되어있는 컬럼에 대해 str로 형 변환
    • 예) order_items_df['order_item_id'] = order_items_df['order_item_id'].astype(str)
  • order_status = 'canceled'일 때, order_approved_at 등이 null이 아닐 시 오히려 문제가 됨

 

 

 

 

 

데이터 EDA

Orders 데이터셋

 

시간과 관련된 컬럼이 많은 양을 차지했다.

 

정합성 판단을 위해 구매시간, 구매확정시간, 배달시간 간의 관계를 알아보았다.

 

이론적으로 구매 → 구매확정 → 배달의 순으로 주문이 진행될 것이기 때문에, 위 생성한 컬럼의 값이 너무 비정상적으로 크거나 음수가 나와서는 안 된다.

 

눈에 띄는 점은 아래와 같다.

두 컬럼의 개수가 일치하지 않음. 하나의 컬럼에 na값이 있을 확률이 크다.

 

 

 

Customer 데이터셋

customer_zip_code_prefix
: 고객 우편번호 접두사
customer_city
: 도시
customer_state
: 주

 

 

customer_city와 customer_state를 확인해본 결과, 본 데이터셋의 출처가 브라질임을 파악했다.

 

 

또한, 전체적으로 데이터가 굉장히 skewed되어 있음을 파악했다.

customer_city도 sao paulo (상 파울로) 데이터가 대부분이고, customer_state 역시 SP로 대부분 쏠려 있다.

레코드 수 순위를 살펴보면, 양이 많을수록 관광지이거나 브라질내에서 유명한 장소임을 파악하였고, 두 컬럼이 시사하는 정보가 유사함을 고려해 customer_state만을 분석에 활용하기로 결정했다.

 

 명목형 변수가 대부분이기 때문에 인코딩이 필요할 것이다.

 

브라질 도메인 지식의 조사 결과는 아래와 같다.

더보기
  1. 브라질은 기본적으로 넓은 영토의 국가로, 지역간의 경제적 차이가 지역별 물류센터수와 배송에 있어서 차이가 납니다.
  2. 지역별 경제적 차이
    1. → 남동부 : 브라질의 경제 중심지로, 가장 발전된 물류 인프라를 형성하고 있습니다. 이 지역에서는 빠르고 효율적인 배송을 위해서 이 지역에 물류센터를 집중적으로 배치하고 있습니다.
    2. → 북동부 : 남동부에 비해서 경제적으로 덜 발달되어 있으며 때문에 물류 인프라도 상대적으로 덜 발달되어 있습니다. 그 결과 배송시간이 길어질 수 있으며, 배송 비용이 증가할 가능성이 있습니다.
    3. → 북부, 중서부 : 인구의 수가 가장 적은 지역입니다. 많은 국토가 아마존 같이 숲을 이루고 있고 이 지역으로의 배송은 주로 항공이나 해송 운송에 의존을 하고 있습니다. 그 결과 배송의 시간이 기존 7일이 넘어가는 경우가 많으며 비용이 크게 증가할 수 있습니다.
  3. 배송 시간과 비용 대도시:
    1. 상파울루, 리우데자네이루와 같은 대도시에서는 다음날 또는 당일 배송이 가능한 서비스가 점점 늘어나고 있습니다.
    2. 외곽 지역: 대도시에서 멀리 떨어진 지역에서는 배송 시간이 7일 이상 걸릴 수 있으며, 배송비도 크게 증가합니다. 이는 특히 북부와 중서부 지역의 현상으로 볼 수 있고 일부 외진 지역에서는 배송이 불가능한 경우도 있습니다.
    3. → 배송 시간, 거리에 따라서 상대적으로 배송 비용이 높아질 수 있습니다.

 

 

할부기간(단기/장기 나누기)

median 값 기준으로 나누기

# 단기와 장기로 나누기
def classify_installments(installments, median):
    if installments <= median:
        return 'Short-Term'
    else:
        return 'Long-Term'

retail_df_merged['payment_installments_category'] = retail_df_merged['payment_installments'].apply(lambda x: classify_installments(x, payment_installments_median))

 

 

728x90
반응형