세조목

실전 프로젝트 7일차(24.03.06) 본문

데이터 분석 공부/프로젝트

실전 프로젝트 7일차(24.03.06)

세조목 2024. 3. 6. 22:20

실전 프로젝트 7일차입니다.

금일은 팀원들과 함께

(고급)-1, 2, 그리고 (지옥) 난이도 문제를 풀었습니다.

 

(고급)-1의 경우 구매 시각 이전에 event가 발생했는지 여부를 확인해야했습니다.

태블로 내에서 해당 작업을 수행하는 것에 어려움을 느껴 파이썬에서 전처리를 진행했는데요,

1. event 테이블
df = pd.read_csv('N:/개인/데이터 분석/내배캠/4. 실전 프로젝트/events.csv')

# product_id 추출
event = df[df['uri'].str.contains('product/')]
event_2 = event.uri.str.split('/')
event_2 = event_2.str.get(2)

event['uri_num'] = event_2

event_df = event[['id', 'user_id', 'uri_num', 'created_at']]

# user_id와 product_id를 기준으로 최소 created_at 구하기
event_fin = pd.DataFrame(event_df.groupby(['user_id', 'uri_num'])['created_at'].min()).reset_index()

# data type 변경
event_fin['created_at'] = pd.to_datetime(event_fin['created_at'])
event_fin['uri_num'] = pd.to_numeric(event_fin['uri_num'])

2. order 테이블
order = pd.read_csv('N:/개인/데이터 분석/내배캠/4. 실전 프로젝트/order_items.csv')

order2 = order[['id', 'user_id', 'product_id', 'created_at']]

# data type 변경
order2['created_at'] = pd.to_datetime(order2['created_at'])

# user_id, product_id 기준 최소 created_at 구하기
order_fin = pd.DataFrame(order2.groupby(['user_id', 'product_id'])['created_at'].min()).reset_index()

3. merge
# event, order_item table merge
fin_data = pd.merge(event_fin, order_fin, how='outer', left_on=['user_id','uri_num'], right_on = ['user_id', 'product_id'])

# 컬럼 처리
fin_data.drop('uri_num', axis=1, inplace=True)
fin_data.rename(columns = {'created_at_x' : 'event_created_at', 'created_at_y' : 'order_created_at'}, inplace=True)
fin_data = fin_data[['user_id', 'product_id', 'event_created_at', 'order_created_at']]

# event, order 테이블 시간 비교
fin_data[fin_data['event_created_at'] > fin_data['order_created_at']]

이렇게 코드를 작성하여 비교했을때 결과값은 아래와 같았습니다.

event가 발생한 시각이 구매가 발생한 시간보다 큰 경우가 없었다는 의미입니다.

그런데 저희가 다른 팀으로부터 들은바로는 이상치가 1개 정도는 있다라고 들어서

코드를 처음부터 다시 확인해보면서 data type도 변경해보고 정렬도 점검해봤지만

문제점을 찾을수는 없었습니다.

그래서 일단 (고급)-1의 경우 내일 튜터님께 조언을 구해볼 예정입니다.

 

다음으로 (고급)-2는 session 시간이 30분을 넘어선 경우가 차지하는 비중을 확인하는 문제로

결과값은 아래와 같았습니다.

1이 의미하는 바가 session 시간이 30분을 넘어선 경우입니다.

이 문제의 경우 전처리는 앞선 (고급)-1과 마찬가지로 파이썬에서 진행하고,

시각화는 태블로에서 진행했습니다.

태블로에서 시각화를 진행할때 아래와같은 별도의 산식을 작성할 필요가 있었는데

{ FIXED [Session Id (Session Id Boolean.Csv)] : MAX(IF [Boolean Time Diff 30] THEN 1 ELSE 0 END) }

Boolean Tiem Diff 30(참과 거짓으로 이루어져 있음 / 참=session 시간이 30분을 넘어가는 경우)이 참이면 1을,

그렇지 않으면 0을 부여해서 MAX값을 구하는데 이 때 기준은 Sesssion_ID가 됩니다.

실제 파이썬 작업 결과를 확인하면 아래와같이 하나의 session_id에 참과 거짓값이 혼재되어있는 것을 확인할 수 있습니다.

만약 이 상태로 시각화를 진행하면 전체 고유값의 개수는 3개, 참에 해당하는 고유 session_id의 개수는 2개,

거짓에 해당하는 고유 session_id의 개수는 3개로 비율을 구할수가 없게됩니다.

참에 해당하는 고유 session_id의 개수는 거짓에 해당하는 고유 session_id의 개수를 구할때 빼주어야하기때문에

그 값을 계산하고자 MAX(IF [Boolean Tiem Diff 30] THEN 1 ELSE 0 END)

을 쓰게 된 것입니다.

 

계산식은 그렇게 작성하고 마크 카드에 컬럼들은 아래와 같이 넣어주면

 

처음 확인했던 모양의 파이차트가 나오게 됩니다.

 * '각도' 마크에 들어있는 컬럼은 Session_id임

 

(고급)-2에서 바로 이어지는 문제가 (지옥) 난이도 문제인데요,

 

(지옥) 난이도에서 요구하는건 session 간격이 30분이 넘어가는 경우는 어떤 경우인지를

event_type을 중심으로 파악하는 문제입니다.

이 문제도 전처리할 것들이 많다보니 전처리는 파이썬에서, 시각화는 태블로에서 진행했습니다.

(코드 업데이트 예정)

시각화한 결과값은 위와 같았습니다.

event_type 中 purchase가 차지하는 비중이 100%였는데요,

왜 purchase가 차지하는 비중이 100%인지를 확인하기위해서는

고객의 구매 flow 전체를 살펴볼 필요가 있었습니다.

금일은 해당 데이터를 전체적으로 한 번 훑어보는 정도에서 마쳤고,

각자 가설들을 생각해본 후 내일 회의때 마저 이야기를 진행하기로 했습니다.