Milky's note

가상 쇼핑몰 고객 주문데이터 3. 고객 이탈률 퍼널 분석 본문

데이터 분석/데이터분석 연습

가상 쇼핑몰 고객 주문데이터 3. 고객 이탈률 퍼널 분석

밀뿌 2022. 5. 28. 01:09

고객 이탈 페이지 퍼널분석

  • 로그데이터로 고객 이탈 페이지 확인하기
    • 고객 이탈 페이지를 알면 해당 페이지를 분석하여 고객을 최종 단계로 더 많이 유도 가능
    • 대부분의 경우 다음 스텝으로 넘어갈때의 장벽이(신용카드 입력, 정보 입력 등등) 높은 경우가 해당 됨

 

 

퍼널 스텝 dataframe 생성

  • 스텝 순서(ordering) 등을 명시하기 위해 사용
  • 퍼널 스텝의 가독성을 높이기 위하여 데이터 프레임을 생성
funnel_dict = {'/product_list':1, '/product_detail': 2, '/cart':3, '/order_complete':4}
funnel_step = pd.DataFrame.from_dict(funnel_dict, orient='index', columns=['step_no'])
funnel_step

 

session, url 로 grouping

  • user_id가 아닌 session을 기준으로 삼는 이유는 동일한 유저가 다른 세션으로 접속한 경우도 다른 경우로 간주해야 하기 때문
  • session_id와 url로 그루핑하여 가장 시간대가 빠른 해당 이벤트에 대해 추출
grouped = logs.groupby(['session_id', 'url']).min()['datetime']
grouped = pd.merge(grouped, funnel_step, left_on='url', right_index=True)
# merge에 how를 안 써주면 디폴트로 inner join이 된다.
# 그리고 왼쪽, 오른쪽의 조인할 같은 컬럼을 써주어야한다. (여기에서는 오른쪽이 index값이라서 저렇게 argument 표시)

grouped.head()

 

퍼널 테이블 생성

  • 각 퍼널의 스텝이 순서대로 columns으로 오도록 변경
funnel = grouped.reset_index()
# 각  사용자가 스텝별로 몇 시에 머물렀는지 확인하기 위하여 pivot table 생성
funnel = funnel.pivot(index='session_id', columns='step_no', values='datetime')
funnel.columns = funnel_step.index
funnel.head()

 

퍼널 카운트 계산

  • 각 퍼널 스텝별 카운트 계산
step_values = [funnel[index].notnull().sum() for index in funnel_step.index]
step_values
[419, 351, 261, 84]

 

이 스텝별 카운트를 사용해서 각 퍼널의 비율을 나타내준다.

 

퍼널 그래프 그리기

  • 각 퍼널 스텝, 값을 이용한 퍼널 그래프 그리기

밑에서 import하는 plotly는 매우 쉽고 예쁘고 반응적인 그래프를 그릴 수 있는 라이브러리이다.

그리는 방법은 두 가지로 나뉘는데

  1. Express를 통해서 그리는 방법 (px)
  2. Graph_object를 통해서 그리는 방법 (go)

go는 figure내에 필요한 data와 layout등을 설정해주는 방식이다.

이 방법이 px에 비해 조금 더 번거롭거나 귀찮을 수 있지만 원하는 방식으로 상세하게 커스텀이 가능하다.

코드 맨 마지막에 fig.show(renderer="svg")로 한 이유는 웹에서 Plotly가 현재 iframe을 지원하지 않아서 다음을 추가해주어야한다.

 

 

import plotly.express as px

fig=px.funnel(
    y=funnel_step.index,
    x=step_values
)
  
fig.show(renderer="svg")

import plotly.graph_objs as go

fig=go.Figure(go.Funnel(
    y=funnel_step.index,
    x=step_values,
    textposition = "inside",
    textinfo = "value+percent initial",
    opacity = 0.65, 
    marker = {"color": ["deepskyblue", "lightsalmon", "teal", "silver"],
    "line": {"width": [4, 2, 2, 3, 1], "color": ["wheat", "wheat", "wheat", "blue"]}},
    connector = {"line": {"color": "royalblue", "dash": "dot", "width": 3}}
))
  
fig.show(renderer="svg")

 

다음은 입체적이지 않은 기존에 많이 본 퍼널 그래프를 그려보자.

두 개의 방식이 비슷하지만 argument가 조금씩 다르므로 주의해서 그려야한다.

import plotly.express as px

fig=px.funnel_area(
    names = funnel_step.index,
    values = step_values
)
  
fig.show(renderer="svg")

import plotly.graph_objs as go

fig=go.Figure(go.Funnelarea(
    text = funnel_step.index,
    values = step_values,
    opacity = 0.65, 
    marker = {"colors": ["deepskyblue", "lightsalmon", "teal", "silver"],
    "line": {"width": [4, 2, 2, 3, 1], "color": ["wheat", "wheat", "wheat", "blue"]}}
))
  
fig.show(renderer="svg")

 

그래프를 보면 카트에 넣는 것까지는 이탈률이 높지가 않은데 주문 완료에서 많은 이탈을 보이고 있다.

이런 경우에 혹시 구매 프로세스가 길거나 어렵진 않은지 등을 확인해봐야한다.

퍼널 분석도 완료하였다 !!

 

자세한 소스는 역시 git에 업로드하였다.

 

GitHub - busyppp/Study

Contribute to busyppp/Study development by creating an account on GitHub.

github.com

 

Comments