ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • <TIL> 2024-03-05
    내일배움캠프(데이터 분석 부트캠프 1기)/TIL & WIL 2024. 3. 5. 22:09
    • 오늘 진행한 일 
      • 팀 프로젝트 데이터 전처리
      • 팀 프로젝트 문제 해결
      • SQL 코딩 테스트

     

    https://jinhyunbae.tistory.com/172

     

    <TIL> 2024-03-04

    오늘 진행한 일 팀 프로젝트 데이터 전처리 팀 프로젝트 문제 해결 오늘 한 일은 지난 주 목요일에서 이어진다. https://jinhyunbae.tistory.com/170 2024-02-29 오늘 진행한 일 SQL 코딩 테스트 팀 프로젝트 발

    jinhyunbae.tistory.com

     

    events 데이터의 정합성을 검증

     

    1. 하나의 세션 안에 두 유저가 있는지 여부

    2. 한 유저가 두 도시에서 접속한 경우

    3. 유저 ID가 없는 경우(Null)

    4. Event가 발생하지 않았는데 구매 이력이 존재하는 경우

    5. 30분 이상 지속되는 이상 세션의 존재 여부

     

    이를 위해서 파이썬으로 EDA를 했으며 Event 미발생 구매를 보기 위해 

    order_items 데이터와 merge하기 위해서 전처리를 진행하였다. 


    import pandas as pd
    import numpy as np
    import seaborn as sns
    import matplotlib.pyplot as plt
    
    events = pd.read_csv('./data/events.csv')

    4. Event가 발생하지 않았는데 구매 이력이 존재하는 경우

    order_items에서 유저가 구매한 상품 정보 중 event가 발생하지 않은 유저/상품 쌍이 존재하는지

    둘을 merge하여 집계하고 비율을 알아보려했다. 

     

    merge를 위해서는 product_id에 대한 정보가 필요했는데 원본 데이터에서 product_id가 

    event_type이 product인 uri의 맨 뒤에 있다는 것을 확인하였다. 

    events_uri = events[['session_id', 'uri']].loc[events['event_type']=='product']
    events_uri


    그래서 이 부분을 str.split을 통해서 추출해냈고 중복을 제거하였다. 

    event_uri_split = events_uri['uri'].str.split('/')
    events_uri = events_uri.assign(product_id=event_uri_split.str.get(2))
    session_product = events_uri.drop('uri', axis=1)
    
    session_product[session_product.duplicated(['session_id', 'product_id'])]
    session_product_drp_dup = session_product.drop_duplicates()


    중복을 제거한 뒤 events 중 user_id가 null이 아닌 데이터와 inner join으로 merge해주었다. 

    events_user_notna = events.loc[~pd.isna(events['user_id'])]
    events_products = events_user_notna.merge(session_product_drp_dup, how ='inner', on='session_id')

     

    그리고 order_items와 events를 merge를 하는데 유저가 구매한 상품 정보 중

    event가 발생하지 않은 유저/상품 쌍이 존재하는지 알아내려고 order_items를 기준으로 left outer join 했다. 

    order_items = pd.read_csv('./data/order_items.csv')
    order_items = order_items.drop(['id', 'inventory_item_id'], axis=1)
    order_items['created_at'] = pd.to_datetime(order_items['created_at'], utc=True)
    events_orderitems = pd.merge(order_items, events_products, how='left', on=['user_id', 'product_id', 'created_at'])

    여기서 문제가 하나 발생하였는데 그것은 merge를 했더니 데이터 row 수가 조금 늘어났다는 것이다. 

    그래서 merge의 기준이 되었던 user_id, product_id, created_at이 모두 동일한 row가 있는지 검증하였다. 

    events_orderitems_dup = events_orderitems[events_orderitems.duplicated(['user_id', 'product_id', 'created_at'])]
    
    temp_df = pd.DataFrame(columns=events_orderitems.columns)
    
    for i in range(len(events_orderitems_dup)) :
        df = pd.DataFrame(events_orderitems[(events_orderitems['order_id']==events_orderitems['order_id'][events_orderitems_dup.index[i]])&
                                            (events_orderitems['user_id']==events_orderitems['user_id'][events_orderitems_dup.index[i]])&
                                            (events_orderitems['product_id']==events_orderitems['product_id'][events_orderitems_dup.index[i]])&
                                            (events_orderitems['created_at']==events_orderitems['created_at'][events_orderitems_dup.index[i]])
                                           ])
        temp_df = pd.concat([temp_df, df], axis=0)
        
    temp_df

     

    검증 결과 다른 중복이 없는 데이터는 전부 event_type이 purchase인 데이터가 조인 되었는데 

    중복 데이터의 경우 purchase인 데이터 외에 event_type이 cart인 데이터가 붙어있는 것을 확인할 수 있었다.

     

    그리고 이 데이터의 개수가 110개(220/2)로 늘어난 Row의 숫자와 정확하게 일치하였다. 

     

    dup_idx = temp_df[temp_df['uri']=='/cart'].index
    events_orderitems_drp_dup = events_orderitems.drop(dup_idx)
    events_orderitems_drp_dup

     

    그래서 cart uri를 가진 데이터를 삭제하였고 해당 데이터 중 session_id가 null값인 데이터의 개수를 드디어 알 수 있었다. 

    session_id가 null인 데이터 즉 event 없이 구매만 일어난 데이터의 비율을 알 수 있게 된 것이다. 

    null_session_orderitems = events_orderitems_drp_dup[pd.isna(events_orderitems_drp_dup['session_id'])]
    null_session_orderitems

    오늘은 Merge 문제를 해결하느라 대부분의 시간을 소요했다. 

     

    내일은 이 부분을 tableau로 시각화하고 마지막 부분인 30분 이상 지속되는 세션에 대해서

    python으로 파볼 예정이다. 

    '내일배움캠프(데이터 분석 부트캠프 1기) > TIL & WIL' 카테고리의 다른 글

    <WIL> 2024년 3월 첫째 주 회고  (1) 2024.03.08
    <TIL> 2024-03-08  (0) 2024.03.08
    <TIL> 2024-03-04  (2) 2024.03.04
    <WIL> 2024년 2월 마지막 주 회고  (0) 2024.02.29
    <TIL> 2024-02-29  (0) 2024.02.29
Designed by Tistory.