본문 바로가기

마케팅

코호트 분석 입문(Cohort analysis in R)

반응형

코호트분석은 특정기간 특정집단의 행동패턴을 관찰하고 분석하기 위해 주로 사용됩니다.

비즈니스 환경에서는 주로 고객들의 리텐션 지표를 알아보기 위해 사용되는데요.

R에서 코호트 분석을 어떻게 사용해볼 수 있는지 알아보겠습니다.

저 같은 경우 인프런의 '그로스해킹 - 데이터와 실험을 통해 성장하는 서비스를 만드는 방법'의 수업자료를 사용했습니다.

 

데이터의 구조는 아래 표와 같이 생겼습니다. 제가 가진 데이터의 양은 10471개의 관측치를 보여주고 있습니다.

유저ID(PK) 가입일 마지막 로그인
1 YYYY-MM-DD YYYY-MM-DD
2 YYYY-MM-DD YYYY-MM-DD
3 YYYY-MM-DD YYYY-MM-DD
4 YYYY-MM-DD YYYY-MM-DD

위 3개의 컬럼을 가진 데이터를 통해 사용자의 리텐션을 알아볼 수 있습니다.

 

다른 정의가 있지않는 한 일반적으로 리텐션은 달별로 계산을 하는 것이 무난합니다.

여기에서는 Rolling Retention을 알아보겠습니다.
Rolling Retention이란 특정시점을 기준으로 N일 후에 얼마나 고객이 남아있는지 알아볼 수 있는 지표입니다.
이번 글에서는 지표에 관한 설명보다는 R로 어떻게 구현하는지에 대해 집중하겠습니다.

 

아래와 같이 df의 구조를 살펴보면

str(df)

아래와 같이 user_id, sign_up, last_login 3개의 변수로 이루어진 데이터인 것을 확인할 수 있습니다.

Classes ‘tbl_df’, ‘tbl’ and 'data.frame': 10471 obs. of 3 variables:

$ user_id : num 1 2 3 4 5 6 7 8 9 10 ...

$ sign_up : POSIXct, format: "2019-01-01" "2019-01-01" "2019-01-01" "2019-01-01" ...

$ last_login: POSIXct, format: "2019-06-03" "2019-11-02" "2019-01-23" "2019-04-19" ...

 

이 중에서 아래와 같이 가입일과 마지막 로그인의 데이터 형태를 Date로 바꾼 뒤,

month함수를 이용해 YYYY-MM-DD 중 월 데이터만 가져와

sign_month와 last_month라는 새로운 variable로 저장합니다.

df$sign_up<- as.Date(df$sign_up)
df$last_login <- as.Date(df$last_login)
df$sign_month <- month(df$sign_up)
df$last_month <- month(df$last_login)

 

 

이후 dcast함수를 이용해 데이터의 형태를 변환합니다.

 

df2 <- dcast(df, sign_month~last_month, value.var = "user_id", length, margins=TRUE)

dcast함수는 reshape2라이브러리의 함수로
dcast(df, 행으로 지정할 variable~ 열로 지정할 variable, 값이 될 variable, length)로 지정합니다.

함수에 대한 자세한 설명은 생략하겠습니다.

 

 

이렇게 df2로 바꾼 데이터의 형태를 살펴보면

아래와 같은 모양을 확인 할 수 있습니다.

아래의 표는 가입월에 따른 서비스이탈 고객수를 월별로 집계한 것입니다.

데이터 형태에 대해 조금 설명을 덧붙이자면, 1월(row)가입자 중 1월(variable)이 마지막 사용이었던 09명, 2월(variable)이 마지막 사용이었던 유저 수는 21명, 3월은 46명으로 해석하면 됩니다.

그렇다면 같은 방식으로 7월에 가입하고 7월에 마지막으로 사용한 유저의 수는 74명인 것입니다.

 sign_month   1   2   3   4   5   6   7   8   9  10  11   12 (all)
1           1 109  21  46  28  42  19  24  20  18  22  20   59   428
2           2   0  94  34  25  37  22  34  34  25  31  34  111   481
3           3   0   0  86  27  35  37  26  41  42  43  37  171   545
4           4   0   0   0  84  34  22  36  35  29  43  34  184   501
5           5   0   0   0   0  74  37  29  27  33  47  45  238   530
6           6   0   0   0   0   0  84  29  31  29  27  39  291   530
7           7   0   0   0   0   0   0  74  32  26  31  24  308   495
8           8   0   0   0   0   0   0   0  77  37  41  31  348   534
9           9   0   0   0   0   0   0   0   0  81  44  34  473   632
10         10   0   0   0   0   0   0   0   0   0  45  50  642   737
11         11   0   0   0   0   0   0   0   0   0   0 152 2122  2274
12         12   0   0   0   0   0   0   0   0   0   0   0 2784  2784
13      (all) 109 115 166 164 222 221 252 297 320 374 500 7731 10471

이 데이터를 바로 활용하기에는 어렵습니다.

왜냐하면 몇 명이나 서비스를 이용하고 있는지를 알고 싶기 때문입니다.

따라서 월별 가입자의 수에서 서비스 이탈 고객의 수를 전부 빼주어야합니다.
이 작업은 아래와 같이 수행했습니다.

 

df2 <- df2[-13,]
df2 <- df2[,-1]
for(i in 1:11){
  for(j in 11:i){
    df2[i,j] <- as.numeric(df2[i,j]) + as.numeric(df2[i,j+1])
    }
}

 

그러면 아래와 같이 변환된 데이터를 확인할 수 있습니다.
시간이 지남에 따라 남아있는 유저의 수가 감소하는 추세를 보입니다.

     1   2   3   4   5   6   7   8   9  10   11   12 (all)
1  428 319 298 252 224 182 163 139 119 101   79   59   428
2    0 481 387 353 328 291 269 235 201 176  145  111   481
3    0   0 545 459 432 397 360 334 293 251  208  171   545
4    0   0   0 501 417 383 361 325 290 261  218  184   501
5    0   0   0   0 530 456 419 390 363 330  283  238   530
6    0   0   0   0   0 530 446 417 386 357  330  291   530
7    0   0   0   0   0   0 495 421 389 363  332  308   495
8    0   0   0   0   0   0   0 534 457 420  379  348   534
9    0   0   0   0   0   0   0   0 632 551  507  473   632
10   0   0   0   0   0   0   0   0   0 737  692  642   737
11   0   0   0   0   0   0   0   0   0   0 2274 2122  2274
12   0   0   0   0   0   0   0   0   0   0    0 2784  2784

 

아래와 같이 데이터를 백분율로 변환해서 총 가입자 중 몇퍼센트가 남아있는지를 히트맵을 통해 알아보겠습니다.

df3<- df2[,c(1:12)]
total <- df2[,13]


for(i in 1:12){
  df3[i,] <-df3[i,]/total[i]
}

 

히트맵을 통해 아래와 같은 그림을 얻을 수 있습니다.


pheatmap(df3, cluster_rows = F, cluster_cols = F, display_numbers = T, fontsize = 14,
         color = colorRampPalette(c('white','#C0392B'))(50))

 

시간이 지남에 따라 색이 옅어지면서 리텐션이 감소하는 것을 확인할 수 있습니다.
볼만 한 것 중 하나는 10월 가입자의 12월 리텐션율(2달 후)이 87%로 다른 코호트의 2달 후 리텐션율보다

최대 10%p넘게 크다는 점입니다.

이런 방식을 통해 고객들의 리텐션을 분석해 볼 수 있습니다.

 

지금까지 R을 통해 어떻게 코호트를 분석할 수 있는지 알아보았습니다. '

감사합니다.

반응형

'마케팅' 카테고리의 다른 글

Revenue 쪼개보기 in R  (0) 2021.02.08
[AARRR] Activation  (0) 2021.01.13
[AARRR] Acquisition  (0) 2021.01.12
[AARRR] AARRR 개요  (0) 2021.01.11
[AARRR] Referal 지표  (0) 2021.01.04