비저블 과제로 앱로그 데이터를 사용하여 비즈니스 시나리오를 작성해보았다!
비즈니스 시나리오로 들어가기 앞서..
이 부분은 굉장히 편하게 일기 쓰듯이 기록했기에 시간이 없다면 건너뛰어도 좋다.
데이터 전처리를 왜 하게 되었는지, 어떤 영상에서 비즈니스 시나리오에 대한 영감을 얻었는지 기록했다.
아래의 더보기 버튼을 누르면 확인 가능하다.
1. 데이터 파악

생각보다 데이터 컬럼 수가 적었다 (사용자의 특성 데이터 혹은 방문 패턴에 대한 컬럼이 더 있었다면 다양한 분석을 해볼 수 있었을텐데..라는 아쉬움이 들었다.)
사용자의 패턴을 파악할 수 있는 컬럼이 사실상 Event Value의 mission 뿐이었는데 태블로에서 전처리하기가 매우 곤란했다!! ( 태블로의 분할 기능을 이용해 "selected_mission" key 뒤에 있는 value값들만 가져오려 했으나 key 순서가 통일이 되어있지 않았다. 예를 들어 어떤 행은 "user_id" key가 먼저 나온다던지..)
사실 태블로를 사용할 때 웬만해서는 태블로 내에서 모든걸 해결하는 것을 좋아하지만 Event Value가 때마침 딕셔너리 형태로 되어있기도 해서 아주 오랜만에 파이썬을 사용했다.
2. 게임 사용자들의 패턴 파악
사실 나는 게임을 전혀 하지 않는다. 그 흔한 메이플도 한번도 해보지 않았다!! 내가 기억하는 게임의 마지막은 야후의 아르피아와 슈게임이다..ㅎ
하지만 도메인 지식이 없는 분야라도 빠르게 데이터를 파악해야하는 것이 데이터 분석가의 역량이거늘~
그래서 게임 데이터에 관한 영상들을 많이 찾아보았는데 그 중 가장 인상깊었던 영상은 아래와 같다.
이 영상을 시청하면서 게임 이탈자들의 대부분은 게임 첫 실행 후 플레이 1일차 이내에 이탈하는 초반이탈자라는 사실을 알게되었다.
이에 영감을 얻어 비즈니스 시나리오를 구성해보았다. 그러면서 데이터 구조에서 또다른 문제가 생겼는데 바로 초반 이탈자의 행동 패턴 파악을 위해 각 유저가 첫번째 방문, 두번째 방문, 세번째 방문,...,마지막 방문까지 걸린 경과일을 계산해야한다는 것이었다.
이를 위해서는 아래와 같은 데이터 구조가 필요했다.

바로 User ID별로 Event Time을 라벨링하는 사진 속 "Event per User" 컬럼이 필요하다. 즉 태블로에서는 LOD식을 사용해야하는데 문제는 LOD식에서 Rank를 계산할 수 없다...
따라서 결론 = Mission을 따로 가져오기 위해서, user별 방문기록을 라벨링하기 위해서 파이썬을 사용하기로 했다.
Python을 사용한 데이터 전처리
1) 대한민국 데이터만 가져오기
import pandas as pd
df = pd.read_csv("appsflyer_sample.csv")
# 대한민국 데이터만 가져오기
df = df[df['Country Code'] == 82].reset_index()
2) Event Value 컬럼에서 "selected mission"만 가져오기
mission_list = []
for i in df['Event Value']:
dic = eval(i) # 문자열을 딕셔너리로 형변환
result = dic['selected_mission'] # key값이 slected_mission인 것의 value만 가져오기
mission_list.append(result)
df['Mission'] = mission_list
여기서 Event Value 컬럼이 string 타입이므로 eval함수를 통해 코드화 시켜 딕셔너리 형태로 바꿔주었다.
3) User ID별로 Event Time 순서 라벨링하기
# EventTime을 string에서 시간으로 변경하기
from datetime import datetime
print(type(df['EventTime'][0])) # string
EventTime_list = []
for i in df['EventTime']:
result = datetime.strptime(i, '%Y-%m-%d %H:%M:%S')
EventTime_list.append(result)
df['EventTime2'] = EventTime_list
df['Event per User'] = df.groupby('User ID')['EventTime2'].rank()
# 데이터 csv형태로 저장
df.to_csv('appsflyer_korea.csv')
여기서도 Event Time이 string 타입이라 시간비교가 불가능했다. 따라서 datetime으로 형변환을 시켜주었다.
비즈니스 시나리오
1. 문제 정의와 해결방안 탐구
게임 회사 A의 마케팅 부서는 다음과 같은 고민을 가지고 있다.
1. 사용자들의 행동 패턴을 분석하고 싶다
2. 사용자들의 접속 유지율과 신규 가입률을 파악하고 싶다
3. 이탈 유저와 활성 유저의 특성을 파악하고 싶다
>> 해결방안
이와 같은 사용자 세그먼트를 통해 행동 패턴을 명확히 파악하자!
2. 지표 설정
1) 이탈유저와 활성유저 구분
종료일자부터 N일 연속으로 미접속한 사용자를 이탈 유저라고 정의했다.
IF DATEDIFF('day', [c. Last Event per User], [p. 종료일자]) < [p. 이탈일 기준] THEN '활성' ELSE '이탈' END
2) 이탈유저와 활성유저 세분화하기
유저를 세분화하기 위해서 사용자가 며칠 이내에 이탈했는가?를 구분 기준으로 삼았다.
이를 위해 유저별 접속기간 = 마지막 접속일-첫 접속일을 계산했다.
유저별 접속기간 = DATEDIFF('day', [c. First Event per User], [c. Last Event per User])
IF [c. 활성/이탈_구분]='이탈' and [c. 유저별 접속기간] <= [p. 초반 이탈자 기준] THEN '초반이탈자'
ELSEIF [c. 활성/이탈_구분]='이탈' and [c. 유저별 접속기간] <= [p. 중반 이탈자 기준] THEN '중반이탈자'
ELSEIF [c. 활성/이탈_구분]='이탈' and [c. 유저별 접속기간] > [p. 중반 이탈자 기준] THEN '후반이탈자'
ELSEIF [c. 활성/이탈_구분]='활성' and [c. 유저별 접속기간] <= [p. 신규 가입 기준] THEN '신규가입자'
ELSEIF [c. 활성/이탈_구분]='활성' and [c. 유저별 접속기간] < [p. 슈퍼 유저 기준] THEN'일반유저'
ELSEIF [c. 활성/이탈_구분]='활성' and [c. 유저별 접속기간] >= [p. 슈퍼 유저 기준] THEN '슈퍼유저'
END
"p"로 시작하는 컬럼은 전부 매개변수를 의미한다. 즉 마케팅 부서의 직원이 기준일을 다르게 입력할 수 있도록 설정했다.
데이터는 2019년 9월~10월까지 두 달간의 데이터만 존재하기에 기준일을 타이트하게 잡았으나, 데이터가 더 오랜기간 적재된다면 혹은 시행하려는 마케팅 캠페인에 따라 사용자를 나누는 접속 기준일이 다르게 존재할 수 있기 때문이다.
3) 첫 접속 > 재접속
과제로 서연님께서 만들어주신 코호트 차트를 보며 가입 이후 1주일이 유저 리텐션의 핵심임을 알 수 있었다.
따라서 첫 접속 > 재접속까지 시간이 얼마나 흘렀고, 어떤 행동 패턴이 보였는지 파악하는 것이 필요하다고 생각했다.
[c. First Event per User] = { FIXED [User ID]:MIN([Event Time])}
[c. Second Event per User] = { FIXED [User ID] : MAX( IF [Event per User] = 2 THEN [Event Time] END)}
유저별 재방문일까지 경과한 일 = DATEDIFF('day',[c. First Event per User], [c. Second Event per User])
>> 유저가 첫방문일에 수행한 미션
[c. First Mission per User] = { FIXED [User ID] : MAX( IF [Event per User] = 1 THEN [Mission] END)}
>> 유저가 재방문일에 수행한 미션
[c. Second Mission per User] = { FIXED [User ID] : MAX( IF [Event per User] = 2 THEN [Mission] END)}
3. 대시보드 기획
왼쪽 부분은 대시보드 내에서 필터 역할을 한다. 어떤 유저 세그먼트를 선택하느냐에 따라 오른편에서 해당 사용자의 특성을 파악할 수 있도록 구현했다.
가장 먼저 시작일~종료일을 설정하면 해당 기간 내 사용자들만 확인할 수 있다.
그 다음, 이탈일을 설정한 후 초반 이탈자 기준일, 중반 이탈자 기준일, 신규 가입자 기준일, 슈퍼 유저 기준일을 사용자가 접속기간 그래프를 살펴본 후 정성적으로 파악하여 입력하도록 했다.
입력할 것이 많아 다소 복잡하거나 어렵게 느껴질 수 있기에 주석을 추가했다.
이탈/활성 > 초반 이탈자, 중반 이탈자..등등 계층적으로 사용자를 세분화했기에 선버스트 차트가 제격이라고 생각했다.
선버스트 차트의 세분화된 유저들을 클릭하면 해당 사용자의 행동을 파악할 수 있다.
일단 현재 어떤 고객군을 선택했는지 맨 위에 나타내었다.
그 후 여러 지표들과 코호트 차트를 통해 해당 고객군의 시간적 특성을 알 수 있다.
코호트 차트의 첫번째 행은 36주에 가입한 고객들이 시간이 경과하면서 얼마나 유지되고 있는지 보여준다.
즉 36주에 2329명이 첫방문을 했으며 그 중 다음주에도 방문한 고객은 1427명이라는 의미이다.
또, 첫번째 열을 통해 각 주마다 얼마나 많은 사람들이 새로 가입했는지를 알 수 있다.
안타깝게도 데이터상에서 신규가입자는 매주 엄청나게 줄고 있음을 확인할 수 있다.
이 부분은 고객군의 미션 수행 패턴을 확인할 수 있다.
먼저, 선택한 고객군이 어떠한 미션을 수행했는지 비율을 막대를 통해 나타내었다.
아래에는 생키차트를 통해 유저들이 첫 접속일에는 어떠한 미션을 수행했고 재접속일에는 어떠한 미션을 수행했는지 흐름을 파악할 수 있다.
(참고로 이 생키차트 제작에 대해 매우 할말이 많은데, 일단 유튜브에 많이 알려진 방식은 데이터를 유니온해서 구간을 만드는 방법이다. 그러나 이 방식은 멀쩡한 데이터의 행을 2배로 만들어버리기 때문에 다른 시트를 만들때 측정값들을 2로 나누어주어야 올바른 계산을 할 수 있으므로 골치가 아프다. 또한, 데이터가 2배로 늘어나기에 성능면에서도 문제가 생긴다. 따라서 데이터를 유니온하지 않고 생키차트를 만드는 방법을 찾았다!! 물론 내가 개발한 것은 아니고 아래의 링크를 참고하면 된다. 우여곡절 끝에 완성한 후에도 동작면에서도 문제가 생겨 따로 매개변수를 사용하기도 했다. 이번 생키차트 제작 방식은 추후에 따로 다시 포스팅하기로 마음 먹었다.)
https://queenofdata.net/2021/07/06/sankey-charts-in-tableau-without-data-prep/
Sankey charts in Tableau without data prep - QueenOfData
You want to build a Sankey chart in Tableau and have read through multiple how-to’s and looked at numerous templates,…
queenofdata.net
4. 인사이트 도출
✅ 첫 방문 이후 첫 주의 유저 리텐션이 핵심이다.
활성유저와 이탈유저 모두 가입 이후 1주가 경과했을 때 유지율이 급감하며, 1주차의 유저 리텐션(%)값이 끝까지 비슷하게 지속되는 것을 볼 수 있다. 특히, 활성유저의 첫주차의 리텐션은 대체로 50% 이상을 유지하는 반면, 이탈 유저들은 30%를 웃돌고 있다.
✅ 초반이탈자는 재방문시 커뮤니티 미션을 선호하지 않는다.
일단 모든 유저들은 daily > community > special 미션 순으로 많이 수행한다. (사실 이는 당연한 결과일 것이다. daily미션은 매일 나올 것이고 community미션과 special미션은 게임 내에서 자주 제공되지 않을테니..)
따라서 대부분 유저들은 첫접속일에도, 재접속일에도 daily 미션을 가장 많이 수행하며 special 미션을 수행하는 사람이 가장 적다.
그러나 초반이탈자들은 재접속시 community 미션을 수행한 사용자는 6.7% special 미션을 수행한 사용자는 2.9% 이다. 보통 커뮤니티 미션과 special 미션 수행 비율이 20% 가까이 차이나는 것을 생각하면 이는 매우 특별한 결과이다.
community 미션의 난이도, 보상, 재미 중 어떤 점이 문제일지는 현재의 데이터만을 가지고 알 수 없으나 community 미션이 초반이탈자들의 눈길을 사로잡지 못한다는 사실만은 분명하다.
완성된 대시보드는 아래의 퍼블릭 링크에서 확인 가능하다.
https://public.tableau.com/app/profile/arehoow/viz/_16482884134440/1?publish=yes
게임 사용자 관리 대시보드
게임 사용자 관리 대시보드
public.tableau.com
'Data' 카테고리의 다른 글
[업무자동화][python] 회사 엑셀 파일 가공하기 (feat. xlwings) (0) | 2024.08.11 |
---|---|
[python] 무신사 상품 리뷰 크롤링1. 상품 url/제목/가격 가져오기 (BeautifulSoup, 정규표현식) (383) | 2022.11.06 |
[Tableau] 쿠폰 성과 측정 대시보드 (753) | 2022.02.27 |
[Tableau] 반품 고객 관리 대시보드 (비저블 합격!) (386) | 2022.01.10 |
[Tableau] 와인회사의 RFM 타겟 마케팅 (357) | 2021.10.05 |