Analysis Report/그로스 해킹

A/B Test

Data Jun 2022. 10. 19. 17:12

혹시 AARRR에 대해서 아시나요. 저는 마케팅 분석, 그래스 해킹에 관심이 있어 요즘 많이 찾아보고 있습니다.

간단하게 설명 드리기 전  일단 퍼널 분석과 전환을 알아야 합니다. 여기서 전환은 마케팅 목적으로 고객에게 기대되는 일련의 행동을 뜻하는데 많은 기업에서 전환의 기준을 '구매'로 설정하지만, 전환은 기업의 목표나 특성에 따라 회원가입, 구독 신청 등으로 설정될 수 있습니다. 퍼널 분석은 잠재 고객의 유입부터 전환에 이르기까지 고객의 여정을 분석하는 모델입니다. 모든 서비스와 비즈니스는 다음 단계로 넘어갈수록 이용자 수가 줄어듭니다. 처음 유입된 고객중에서 일부만이 서비스에 관심을 갖고, 관심을 가지는 고객중 일부만이 실제 구매까지 하게 되는 것이죠. 이렇게 단계가 넘어갈수록 이용자가 줄어드는 모양이 깔대기와 유사하여 퍼널이라는 이름이 붙여졌다고 합니다.  퍼널 분석은 서비스에 유입된 사용자가 전환에 이르기까지 여정을 분석하는 모델로, 고객의 여정을 파악하고 대응하기 위해 널리 사용되고 있습니다. 다양한 퍼널 분석 중, 디지털 마케팅과 온라인 마케팅에서 자주 사용되는 것 바로 AARRR분석입니다.  Acquisition(획득), Activation(활성화), Retention(유지), Referral(추천),  Revenue(수익)의 앞 글자를 따서 붙여진 이름으로, 추상적인 고객 여정을 다섯 단계로 구분한 것입니다. AARRR은 서비스의 현주소를 파악하고 부족한 단계에 집중하는 전략을 세우는 데에 유용합니다. 뚜렷하게 단계를 구분함으로써, 성장을 위해서 단계마다 어떤 조치를 취해야 하는지, 어떻게 하면 단계 사이에서 발생하는 고객 이탈을 방지하고 성장에 기여할 수 있는지 생각할 수 있도록 도와주기 때문입니다.  이번 보고서는 여기서 Retention(유지)에 관한 분석을 해보겠습니다.  Retention(유지)는 열심히 고객을 획득하고 핵심 가치를 전달해도 유저가 제품이나 서비스를 방문하고 이탈한다면 기업은 오래 유지되기 어렵습니다. 유저가 재방문하지 않는다면 유저가 창출하는 가치가 적을 수 밖에 없고, 획득 과정은 밑빠진 독에 물 붓기가 되겠죠. 그렇기에 유저의 재방문이 중요한 것이며, 그 단계를 바로 리텐션이라고 합니다. 리텐션이란 고객을 유지한다는 의미로 계속해서 제품이나 서비스를 이용하는 것을 뜻합니다. 활성화와 마찬가지로 리텐션 역시 기업의 업종과 상황에 따라 기준이 달라질 수 있습니다. 대표적인 지표로는 리텐션율, 이탈률이 있습니다. 이번 보고서는 모바엘 게임의 고객 로그 데이터를 분석해서 고객 유지율을 높여려고 합니다.

 

 

변수

  • userid:개별 유저들을 구분하는 식별 변호입니다.
  • version:유저들이 실험군 대조군 중 어디에 속했는지 알 수 있습니다.(gate_30,gate_40)
  • sum_gamerounds:설치 후 14일 유저가 플레이한 라운드 수입니다.
  • retention_2:유저가 설치 후 2일 이내에 다시 돌아왔는지 여부입니다.
  • retention_7:유저가 설치 후 7일 이내에 다시 돌아왔는지 여부입니다.

가설 설정

요즘  고객의 유지율이 낮아지고 있습니다. 그래서 원인이 특정 스테이지 Lock에 있다고 가정했습니다.   Cookie_Cats 게임에서는 특정 스테이지가 되면 스테이지가 Lock 되게 합니다. Area Locked일 경우 Keys를 구하기 위한 특별한 게임을 해서 키 3개를 구하거나 페이스북 친구에게 요청해하거나 유로 아이템을 구매하여 열 수 있습니다. Lock을 몇 번째 스테이지에서 할 때 이용자가 retention이 가장 좋을지 의사결정을 해야 합니다. 

 

Game_rounds

import matplotlib.pyplot as plt
df['sum_gamerounds'].plot(figsize=(12,7))
plt.title('The number of players that played 0-99 game rounds during two week')
plt.ylabel('Number of players')
plt.xlabel('Game rounds')

 

 

Game rounds

 

 

게임 라운드를 시각화한 것인데 게임 앱을 다운로드  후 게임을 하지 않은 인원도 상당 수로 보이며 최대 99라운드,  최빈 라운드는 20번 이하 구간인 것으로 확인됩니다.

 

Version

sns.kdeplot(df[df['version']=='gate_30']['sum_gamerounds'], shade=True, label='gate_30')
sns.kdeplot(df[df['version']=='gate_40']['sum_gamerounds'], shade=True, label='gate_40')
plt.gcf().set_size_inches(25, 3)
plt.legend()
plt.xlim(-100, 100)
plt.show()

Version--게임횟수 그래프

 

gate_30은 30라운드 때 Lock을 한 Version이며 gate_40은  40라운드 때 Lock을 한 버전입니다. gate_30, gate_40 그래프상으로는 크게 차이가 있는지 확인이 가능하지 않습니다. 그래프는 Version을 구분하여 게임 횟수에 대한 그래프입니다.

 

   1. version별 게임횟수 평균 비교

df[df['version']=='gate_30']['sum_gamerounds'].mean(), df[df['version']=='gate_40']['sum_gamerounds'].mean()
 

Gate30 버전의 평균: 51.342110561757536

Gate40 버전의 평균: 51.29877552814966

2주  데이터를 version을 기준으로 평균 게임 횟수를 확인했을 때 큰 차이가 없는 것으로 확인됐습니다. 하지만 이러한 평균 결과가 표본 데이터 결과에만 해당되는지, 모집단에서도 결과가 적용되는지 알 수 없습니다.

 
 

  2. version 리텐션율 비교

df[df['version']=='gate_30']['retention_7'].value_counts()
df[df['version']=='gate_40']['retention_7'].value_counts()

 

Gate30일 때 7일 이내 다시 돌아온 사용자는 19%이며 Gate40일 때 7일 이내 다시 돌아온 사용자는 17%입니다.

Gate30일 때와 40일 때 평균 차이가 과연 차이가 난다고 말할 수 있을까요??? 또한 차이가 난다고 하더라도 과연 모집단에도 이런한 결과가 반영되는지 궁금합니다.

 

  3. 부트스트랩

boot_1d=[]
for x in range(1000):
    boot_mean=df.sample(frac=0.8,replace=True).groupby('version')['retention_7'].mean()
    boot_d.append(boot_mean)

boot_1d=pd.DataFrame(boot_1d)
boot_1d.plot(kind='density')
plt.xlabel('retention_7')
plt.title('gate_30_retention1 VS gate_40_retention_7')
 
 

부트스트랩

 

모집단에서 반영될지  부트스트랩을 통해 복원추출해서 버전을 기준으로 리텐션율 평균값을 알아보겠습니다. 그래프를 통해 알 수 있듯이 차이가 있는 것을 확인했습니다. 1000번을 복원 추출했기 때문에 어느 정도 신뢰성이 있는 것으로 판단합니다.

 
boot_7d=[]
for x in range(1000):
    boot_mean=df.sample(frac=1,replace=True).groupby('version')['retention_7'].mean()
    boot_7d.append(boot_mean)
boot_7d=pd.DataFrame(boot_7d)
boot_7d['diff']=(boot_7d.gate_30-boot_7d.gate_40)/boot_7d.gate_40*100
ax=boot_7d['diff'].plot(kind='density')
ax.set_title('% difference in 7-day retention the two AB-groups')

버전 기준 평균 차이

 

평균 차이가 있을 확률이 99.7%인 것을 확인했으며 부트스트랩 결과 Gate 40일 때 보다 Gate 30일 때 7일 이내 리텐션율이 더 높다는 강력한 증거가 있음을 나타냅니다. 결론은 리텐션을 늘리기 위해서 Gate 30에서 40으로 이동해서는 안 된다는 결론입니다.

 

t_test

from scipy import stats
tstat, pvalue = stats.bartlett(df[df['version'] == 'gate_30']['sum_gamerounds'], df[df['version'] == 'gate_40']['sum_gamerounds'])
print("P-value:", round(pvalue,3))
 

P-value: 0.011

t_test를 위해서는 등분산성 검정을 해보겠습니다. 만약 P-values < 0.05 분산이 동일한 것이며 이 조건을 만족하지 않는다면 분산이 동일하지 않다는 것입니다. 결론은 분산이 동일하지 않은 것으로 나오네요.

 
 
tstat, pvalue = stats.ttest_ind(df[df.version == 'gate_30'].sum_gamerounds, df[df.version == 'gate_40'].sum_gamerounds, equal_var=False)
print("P-value:", round(pvalue,3))

 

귀무가설:  Gate 30과 Gate 40의 평균 차이는 없다. 

대립가설: Gate 30과 Gate40의 평균 차이가 있다.

P-value: 0.949 

0.05보다 상당히 큰 값을 가집니다. 결론적으로 버전 기준으로 게임 플레이 횟수는 차이가 없는 것으로 확인됐습니다.

 

 

Chi2 Test

범주형, 명목형 변수의 자료 분석에 이용되며 관찰 빈도와 기대빈도에 대해서 비교합니다. 리텐션율 같은 경우 명목형 변수이기 때문에 카이제곱 검정을 해야 합니다.

 

도수 분포표                                           Yes                                                    No

gate_30 8501 36198
gate_40 8279 37210
chi2, p_value, df, _ = stats.chi2_contingency(df_pivot_2)

print("P-value:",p_value)

귀무가설: 리텐션 반응률 차이가 없다.

대립가설: 리텐션 반응률 차이가 있다.

P-value: 0.00063

P-value 0.005보다 낮기 때문에 대립가설이 채택됩니다. 결론은 버전 기준으로 차이가 있다는 것이며 Gate 30이 리텐션율을 유지하거나 올리는데 더 효율적인 것이 통계적으로 증명됐습니다.

 

 

 

 

 

 

 

 

 

 

 

'Analysis Report > 그로스 해킹' 카테고리의 다른 글

아이리스 데이터를 이용한 군집화 분석  (0) 2022.10.25
타겟 마케팅  (1) 2022.10.21
광고 매출 분석  (0) 2022.10.19
이커머스 데이터 활용 지표 개발  (0) 2022.10.18
고객 구매 여정 분석  (0) 2022.10.17