코호트분석은 특정기간 특정집단의 행동패턴을 관찰하고 분석하기 위해 주로 사용됩니다.
비즈니스 환경에서는 주로 고객들의 리텐션 지표를 알아보기 위해 사용되는데요.
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 |