일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 프로젝트
- 히트맵
- 팀프로젝트
- pandas
- 시각화
- streamlit
- 데이터분석
- SQL
- 크롤링
- 전처리
- 프롬프트 엔지니어링
- cross join
- lambda
- jd
- GA4
- 서브쿼리
- 기초프로젝트
- data analyst
- Chat GPT
- 최종 프로젝트
- da
- 태블로
- 클러스터링
- 군집화
- Python
- 기초통계
- If
- 머신러닝
- 데이터 분석
- SQLD
- Today
- Total
세조목
실전 프로젝트 7일차(24.03.06) 본문
실전 프로젝트 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 전체를 살펴볼 필요가 있었습니다.
금일은 해당 데이터를 전체적으로 한 번 훑어보는 정도에서 마쳤고,
각자 가설들을 생각해본 후 내일 회의때 마저 이야기를 진행하기로 했습니다.
'데이터 분석 공부 > 프로젝트' 카테고리의 다른 글
실전 프로젝트(9일차~12일차) (0) | 2024.03.11 |
---|---|
실전 프로젝트 8일차(24.03.07) (1) | 2024.03.07 |
실전 프로젝트 6일차(24.03.05) (0) | 2024.03.05 |
실전 프로젝트 4~5일차(24.03.03~04) (0) | 2024.03.04 |
실전 프로젝트 3일차(24.03.02) (0) | 2024.03.02 |