이번 포스팅은 지난 포스팅에 이어 게임 데이터 분석에 필요한 KPI를 추가적으로 정리했다. 금일 작성된 포스팅은 데이터 분석을 넘어 마케팅 전략에서도 활용할 수 있는 지표들이다.
1. 수익성 지표
- 클릭률(CTR / Click Through Rate) : 클릭률은 광고가 노출된 횟수 대비 클릭된 횟수의 비율이다. 광고의 클릭 수를 노출 수로 나누어 백분률로 표시한 값을 의미한다.
- CPI(Cost Per Install) : 광고를 통해 앱 혹은 서비스를 설치한 유저당 광고주가 지불하는 비용을 나타낸다. 광고 집행이후 얼마나 많은 사람들이 서비스를 다운로드 했는지 CPI로 환산하여 광고 효율을 측정할 수 있다.
- 노출 수(Impression) : 노출 수는 광고가 유저에게 보여지는 횟수를 의미한다. 앱 내에서 광고가 노출될 때마다 계산되며, 클릭 수와는 다른 개념이다. 광고 노출은 광고가 얼마나 클릭되는지에 따라 결정되는 것이 아니라, eCPM에 의해 측정되는 1,000회 광고 노출 때마다 비용을 지불한다.
- eCPM(effective Cost Per Mille) : 광고주가 광고를 1,000번 노출시킬 때 지불하는 평균 비용을 나타내며, 이는 광고주가 자신의 광고 예산을 얼마나 효과적으로 사용하고 있는지를 평가하는 데 사용된다.
- eCPM = (총 수익 / 총 노출 수) * 1,000
- 도달률(Reach) : 도달률은 특정 광고 캠페인 중 최소 1회 이상 노출된 타겟 유저의 비율을 의미한다.
- 필레이트(Fill Rate) : 필레이트는 광고 요청 대비 실제 노출한 광고 비율을 의미한다. 총 광고 노출수에서 총 광고 요청 수를 나눈 값으로, 100%에 가까울 수록 광고 노출이 잘되었다고 해석된다.
- 참여율(Engagement Rate) : 참여율은 광고를 본 유저 중 실제로 광고를 클릭하거나, 특정 행동을 취한 유저의 비율을 의미한다. 참여 유저 / 활성 유저(AU)로 구할 수 있다.
- 전환율(CVR / Conversion Rate) : 전환율은 광고를 통해 유입된 유저가 광고주가 원하는 특정 작업을 한 유저의 비율로, 광고 성과를 파악하는 대표적인 지표이다.
- 1,000회 노출당 설치 수(IPM / Installs Per Mille) : IPM은 1,000회 광고 노출마다 서비스 설치 수를 추적하는 데 사용되는 지표이다. 앱에서 신규 유저를 유입하는 것을 목표로 하는 유저 유입 전략의 일부로 종종 사용된다.
- 광고 비용 대비 수익률(ROAS / Return On Ad Spend) : 기간 내 매출액/광고 비용을 나타내는 지표로 광고나 마케팅 지출의 효율성과 성과를 측정할 때 사용한다. 유저 잔존율 및 광고 수익과 같은 다른 앱 지표와 일치하는 ROAS는 광고 실적이 양호함을 나타낸다.
- 투자 대비 수익률(ROI / Return On Investment) : ROI는 투자한 자본에 대한 수익률을 의미한다. 이는 특정 투자가 얼마나 효과적으로 수익을 창출했는지를 측정하는 지표로, 투자로 인한 이익을 투자 내용으로 나눈 값으로 계산된다.
2. 분석 도구
- 코호트 분석(Cohert Analysis) : 코호트 분석은 사용자들을 특정 기준에 따라 그룹(코호트)로 나눈 후, 각 그룹의 행동 패턴을 분석하는 방법이다. 예를 들어, 특정 시기에 서비스를 시작한 사용자 그룹, 특정 광고를 통해 유입된 사용자 그룹 등을 분석할 수 있다. 이를 통해 서비스의 변화가 사용자 행동에 어떤 영향을 미치는지, 특정 그룹의 이탈율이 높은 이유는 무엇인지를 파악할 수 있다.
분석 기법은 이론만 나열하기보다, 직접 Python을 사용했다. 데이터는 예전 RFM 분석에서 사용했던 톤쇼우 리뷰 데이터를 가져왔다.
import pandas as pd
import numpy as np
data = pd.read_csv('톤쇼우_rfm.csv', encoding='cp949')
data = data.drop(['product'], axis=1) # 상품명 제거
data['date'] = pd.to_datetime(data['date'])
data['Ordermonth'] = data['date'].dt.to_period('M')
data.set_index('user_id', inplace=True)
data['CohortMonth'] = data.groupby(level=0)['date'].min().dt.to_period('M')
data.reset_index(inplace=True)
data['CohortIndex'] = (data['Ordermonth'] - data['CohortMonth']).apply(lambda x:x.n + 1)
cohert_data = data.groupby(['CohortMonth','CohortIndex'])['user_id'].apply(pd.Series.nunique).reset_index()
cohert_count = cohert_data.pivot_table(index = 'CohortMonth',
columns = 'CohortIndex', values = 'user_id')
print(cohert_count)
- 데이터를 Load하고, date column의 형식을 날짜 형식으로 변환 후 별도의 column에 월 정보를 저장한다.
- 사용자 id를 index로 설정하고, 각 사용자의 첫 주문 월을 CohortMonth로 정의한다.
- index를 재설정하고, 각 주문의 CohortIndex를 계산한다. CohortIndex는 해당 주문이 첫 주문으로부터 얼마나 지났는지를 나타낸다.
- 마지막으로, 각 CohortMonth와 CohortIndex에 따른 UU(Unique User)를 계산하고 이를 pivot_table 함수를 사용해 표 형태로 변환한다. 해당 표는 각 Cohort에 따른 사용자의 유지율을 확인할 수 있다.
코호트 분석은 사용자 그룹을 특정 기간에 따라 분류하여 그룹의 활동을 분석한다. Python 분석 결과로, 다음과 같은 테이블을 확인했다.
| CohortIndex | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| CohortMonth | |||||||
| 2020-02 | 1 | NaN | NaN | NaN | NaN | NaN | NaN |
| 2020-03 | 2 | NaN | NaN | NaN | NaN | NaN | NaN |
| 2020-04 | 2 | NaN | NaN | NaN | NaN | NaN | NaN |
| 2020-05 | 4 | NaN | NaN | NaN | NaN | NaN | NaN |
| 2020-06 | 4 | NaN | NaN | NaN | NaN | NaN | NaN |
| 2020-07 | 4 | 1 | 1 | 1 | 1 | NaN | 1 |
이 표에서는 CohortMonth와 CohortIndex가 주요 축이다. CohortMonth는 사용자 그룹이 처음 활동을 시작한 월을 나타낸다. 예를 들어, 2020년 2월에 처음 활동을 시작한 사용자 그룹은 '2020-02' 코스트이다. CohortIndex는 사용자 그룹의 생명주기를 나타낸다. '1'은 코호트의 첫 달을 나타내며, '2'는 두 번째 달과 같은 방식으로 계속된다.
표의 각 셀은 해당 월에 해당 코호트의 사용자 수를 나타낸다. 예를 들어, '2020-07' 코호트는 첫 달에 4명의 사용자가 활동을 시작했다. CohortIndex 2는 해당 코호트의 사용자 중 8월에도 활동을 계속한 사용자 수를 나타낸다. 여기서는 1명이다. 즉, 4명 중 1명이 8월에도 활동을 이어갔다는 의미로, 30Days retention이 25%라고 해석할 수 있다. 각 코호트의 사용자 유지율을 확인하면 서비스의 유저 이탈률을 파악하거나, 특정 코호트에서 사용자 유지율이 높은 이유를 분석할 수 있다.
- 퍼널 분석(Funnel Analysis) : 퍼널 분석은 사용자가 서비스에서 목표로 하는 행동(구매, 가입 등)을 이루기까지의 과정을 단계별로 나누고, 각 단계에서 사용자가 어떻게 행동하는지를 분석하는 방법을 말한다. '퍼널'이란 단계를 거칠수록 점점 줄어드는 형태를 뜻하며, 이를 통해 사용자가 이탈하는 단계와 그 이유, 개선할 수 있는 부분들 파악할 수 있다.
예를 들어, 온라인 게임에서 사용자의 구매 경로를 분석한다고 가정해보자. 이때 퍼널의 각 단계는 아래와 같다.
- 게임 설치 : 1,000명
- 게임 시작 : 900명
- 레벨 10 달성 : 700명
- 유료 상점 방문 : 500명
- 아이템 구매 결정 (결제 페이지로 이동) : 300명
- 아이템 구매 완료 : 150명

게임을 설치한 유저 중 PR은 15%이며, 게임 설치부터 아이템 구매까지의 퍼널을 분석해서 PR 및 단계별 Churn Rate를 분석할 수 있다.
- A/B Test : A/B Test는 2가지 이상의 선택지를 동일한 환경에서 동시에 시험하여, 어떤 선택지가 더 나은 결과를 가져오는지를 확인하는 실험 방법이다. 예를 들어, 게임 내 아이템 상점의 디자인 A와 B를 무작위로 절반의 사용자에게 각각 보여주고, 어떤 디자인이 더 많은 아이템 구매로 이어지는지를 확인해볼 수 있다. 이를 통해 UX를 개선하고, 서비스의 효율을 높일 수 있다.
- 카이제곱 검정(Chi-Square Test) : 카이제곱 검정은 관찰된 빈도가 기대되는 빈도와 통계적으로 다른지를 검정하는 비모수적 방법이다. 특히, 범주형 데이터에 대한 두 변수 간의 독립성을 검정하는 데 주로 사용된다. 예를 들어, 성별과 흡연 여부가 독립적인지를 검증하는 데 카이제곱 검정을 사용할 수 있다. 만약 검정 결과 p-value가 0.05 이하로 나온다면, 성별과 흡연 여부는 독립적이지 않다는 증거를 제공하며, 이는 두 변수 사이에 어떤 관계가 있음을 의미한다. 또한, 관찰된 샘플 분포가 특정 이론적 분포를 따르는지를 검증하는 적합도 검정(Goodness of Fit)에도 사용된다.
우리는 A/B 테스트의 결과를 통계적으로 검증하기 위해 가설 검정을 사용할 수 있다. 위의 경우, 우리의 귀무 가설은 "디자인 A와 B간의 구매율에 차이가 없다" 이며, 대립 가설은 "디자인 A와 B 간의 구매율에 차이가 있다" 이다. Python으로 카이제곱 검정을 실시하여 p-value를 확인해보자. 이 때, p-value가 0.05미만이면 우리는 귀무 가설을 기각하고 대립 가설을 채택할 수 있다.
import pandas as pd
from scipy.stats import chi2_contingency
# 가상의 사용자 데이터 생성
data = {
'user_id': range(1, 2001),
'design': ['A' if i < 1000 else 'B' for i in range(2000)],
'store_visit': 1,
'item_purchase': [1 if i < 500 else 0 for i in range(1000)] + [1 if i >= 1400 else 0 for i in range(1000, 2000)]
}
df = pd.DataFrame(data)
# 디자인별 구매자와 비구매자 수 계산
purchase_counts = df.groupby('design')['item_purchase'].value_counts().unstack()
# 카이제곱 검정 수행
chi2, p, dof, expected = chi2_contingency(purchase_counts)
print(f'p-value: {p}')
p-value는 8.598267663723586e-06으로, 대립 가설을 채택한다. 즉, 디자인 A와 B 간의 구매율에는 통계적으로 유의미한 차이가 있다고 할 수 있다.
'데이터 분석 > 게임 사용자 분석' 카테고리의 다른 글
| [게임] 유저 KPI (0) | 2023.12.25 |
|---|---|
| [게임] NEXON Open API - 메이플스토리 (0) | 2023.12.21 |
| [게임] 10월 유저 성장분석 - 던파 (0) | 2023.10.29 |
| [게임] 경매장 시세 분석 - 던파 (0) | 2023.10.20 |
| [게임] 유저 성장분석 - 던파 (0) | 2023.10.14 |