본문 바로가기
Data Projects/ecommerce 로그 데이터 분석 프로젝트

[ecommerce 웹 로그 분석] 2. 데이터 분석 & 시각화 (1)

by 천뿌니 2022. 6. 23.
728x90

이번 프로젝트는 kaggle에서 제공하는 데이터셋인 eCommerce 웹 로그 데이터 분석 프로젝트이다.

1. 데이터 전처리

2. 데이터 분석 & 시각화

3. 데이터 모델링

해당 파일은 데이터 분석 & 시각화 과정이다.

이 과정에서는 총 4가지의 분석을 진행할 예정이다.

  1. 일별 활성 사용자 수 분석
  2. 사이트 체류 시간 분석
  3. Funnel 분석
  4. RFM 분석

해당 파일은 1,2,3번을 진행하고, RFM 분석은 별도의 파일에 정리할 예정이다.

 


데이터 load & import

데이터 전처리를 끝낸 refined_2019_Oct.csv 데이터를 사용한다.

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from datetime import datetime, timedelta

%matplotlib inline

ecommerce_df = pd.read_csv("refined_2019_Oct.csv", index_col = 0)

 


일별 활성 사용자(Active User) 수 분석

활성 사용자 수는 방문수, 방문자 수의 개념과는 달리 '정해진 기간 동안 접속한 사용자의 수'이다.

방문자의 수를 구할때 세션을 사용하지만, 실제 웹에 방문한 사용자 수는 이와 다르다.
예를 들어 아래와 같이 사용자가 한 사이트에 3번 방문했으면, 방문수는 3회지만 일일 활성 사용자수는 1명인 것이다.

 

이런 활성 사용자는 DAU, WAU, MAU 등의 종류가 있다.

전처리 과정에서 UTC time을 KST time으로 변환하고, 기존 문자열 데이터 타입을 datetime으로 바꿨기 때문에 일자별 데이터를 쉽게 추출 가능하다.

세션이 아닌 활성 사용자 수이니깐 중복을 제거하고, 일자별로 user_id를 그룹화하면 DAU를 구할 수 있다.
day_df = ecommerce_df[['kst_day', 'user_id']]

day_result = day_df.drop_duplicates()
group_day = day_result.groupby(['kst_day']).size()
group_day

해당 결과를 통해 10월 중 DAU가 가장 많은 날은 10월 15일임을 확인할 수 있다. 추후에 많이 사용하는 데이터이기 때문에 저장한다.

ecommerce_15_df = ecommerce_df[ecommerce_df['kst_day'] == 15]

 


사이트 체류 시간 분석

사이트 체류 시간은 말 그대로 사용자가 해당 사이트에 접속하여 머무른 시간이다.
사이트 체류 시간 계산은 첫 번째 페이지뷰가 발생한 이후 마지막 페이지뷰가 발생한 시점까지의 시간차를 구하여 해당 방문자의 체류시간으로 한다

위의 사이트 체류 시간의 개념을 적용하여 데이터셋을 이용하여 실제 사용자들의 사이트 체류 시간을 구해보자.

사용자들의 페이지 접속 시간을 확인하기 위해 세션 ID를 기준으로 한다.
사용자의 경우 동일한 ID여도 세션이 다르면은 다른 경우로 간주해야 한다.
왜냐하면 세션은 일정 시간 동안 같은 사용자(정확하게는 브라우저)로 부터 들어오는 일련의 요구를 하나의 상태로 보기 때문에 세션이 달라졌다면은 다른 시간대에 접속한 것으로 보는 것이 맞기 때문이다.
전체 데이터에서 DAU가 가장 많은 날인 10월 15일 데이터를 추출해서 사용할 것이다.

그다음 세션을 기준으로 user_id를 그룹핑하고, 동일한 세션에 대해 가장 마지막 시간대와 가장 최근 시간대를 만들어서 하나의 데이터프레임으로 저장한다.

max_session = ecommerce_15_df.groupby(['user_session', 'user_id'])['kst_time'].max()
min_session = ecommerce_15_df.groupby(['user_session', 'user_id'])['kst_time'].min()
max_session_df = pd.DataFrame(max_session)
max_session_df.rename(columns={"kst_time" : "max_session_time"}, inplace=True)
max_session_df

max_session_time

min_session_df = pd.DataFrame(min_session)
min_session_df.rename(columns={"kst_time" : "min_session_time"}, inplace=True)
min_session_df

min_session_time

두 개의 데이터프레임을 연결하고, max_session_time에서 min_session_time을 뺀 값을 세션 별 사이트 체류 시간인 session_time으로 정한다.

result_df = pd.concat([max_session_df, min_session_df], axis = 1)
result_df['session_time'] = result_df['max_session_time'] - result_df['min_session_time']
result_df

최대 세션 시간이랑 최대 세션 시간을 알아보기 위해 session_time을 기준으로 정렬한다.

result_df.sort_values(by=['session_time'], axis = 0, ascending = False, inplace = True)
result_df

사용자 세션 시간이 최대 23시간인 사용자도 있었고, 0초(0초 이하라고 판단)인 사용자도 존재한다.

 


Funnel 분석

funnel은 깔때기라는 뜻으로 funnel 분석은 깔때기의 원리와 같다.
깔때기가 필터링될수록 걸러지듯이 funnel 분석도 스탭에 따라 고객에 대한 분석이 가능하다.

funnel 분석은 단계에 따라 고객의 이탈률을 확인하여 그에 대한 조치를 가능하도록 도와주는 분석 방법이다.

eCommerce 데이터를 이용하여 view -> cart -> purchase로 이어지는 funnel 수치를 계산하기 위해 사이트 체류 시간 분석에 사용한 10월 15일 데이터를 사용할 것이다.

funnel 분석에 필요한 칼럼들을 새로운 데이터프레임에 저장한다.
그리고 이 데이터프레임에서 user_session과 event_type을 가지고 시간을 기준으로 그룹핑을 진행한다.
최소 접속 시간을 기준으로 하기 위해 min() 사용한다.

ecommerce_15_need_df = ecommerce_15_df[['kst_time', 'event_type', 'user_session']].copy()
min_groupped = ecommerce_15_need_df.groupby(['user_session', 'event_type'])['kst_time'].min()

funnel 스탭을 위한 새로운 데이터프레임을 만든다. (view -> cart -> purchase)

min_groupped을 데이터프레임화하고 funnel_steps와 event_type을 기준으로 merge 진행한다.

groupped = pd.DataFrame(min_groupped).merge(funnel_steps, left_on = 'event_type', right_index = True)
groupped

피벗 테이블 이용하여 세션 id 별 단계의 진행 여부를 확인한다.
columns이 숫자가 아닌 단계에 맞는 텍스트로 변경한다.

funnel_result = groupped.reset_index().pivot(index='user_session', columns='steps', values='kst_time')
funnel_result.columns = funnel_steps.index
funnel_result

마지막으로 단계별로 카운트하여 funnel 수치를 구한다.

위 결과를 보면 view에서 cart로 이어지는 구간에는 user가 많이 감소하지만, cart에서 purchase까지는 어느 정도 잘 이어지는 것을 확인할 수 있다.

funnel 시각화

import plotly.express as px
data = dict(
    number=[240333, 26589, 17141],
    stage=["view", "cart", "purchase"])
fig = px.funnel(data, x='number', y='stage')
fig.show()

 

마무리

이번 포스팅에서 eCommerce 웹 로그 데이터 분석과 시각화(1)에 대해 알아봤습니다.

다음 포스팅은 RFM 분석을 통해 어떤 마케팅 전략까지 이어지는 확인 해보겠습니다.

해당 프로젝트는 아래 github에 상세히 정리가 되어 있어서 많은 관심 부탁드립니다. 개인으로 진행한 프로젝트라 정확하지 않을 수 있는 점 양해 부탁드립니다.

 

https://github.com/JunSeokCheon/eCommerce_weblog_analysis

 

GitHub - JunSeokCheon/eCommerce_weblog_analysis

Contribute to JunSeokCheon/eCommerce_weblog_analysis development by creating an account on GitHub.

github.com

 

댓글