Метрики вовлечения pt2
Код занятия на Python
https://colab.research.google.com/drive/13f1fpEbD_SBwkkW-VOZDvZewHevQABC3?usp=sharing
Разбор домашнего задания
level 2 (HNTR)
Необходимо подсчитать и нарисовать, сколько пользователей в день приходит в приложение, в том числе и с разбивкой по платформам. Датасет: https://gitlab.com/hse_mar/mar211f/-/raw/main/data/installs.csv
Решение:
# Подключаем необходимые пакеты
library(dplyr)
library(readr)
library(purrr)
library(plotly)
# Импорт данных
# installs <- read_csv("https://gitlab.com/hse_mar/mar211f/-/raw/main/data/installs.csv")
installs <- read_csv("./data/installs.csv")
# Считаем количество уникальных пользователей по дням и источникам трафика
installs_stat <- installs %>%
group_by(dt, platform) %>%
summarise(n_users = n_distinct(user_pseudo_id), .groups = "drop") %>%
arrange(dt)
# рисуем график
plot_ly(installs_stat, x = ~dt, y = ~n_users, color = ~platform,
type = 'scatter', mode = 'none', stackgroup = 'one') %>%
layout(
title = 'Установки приложения по дням',
xaxis = list(title = ''),
yaxis = list(title = '', rangemode = 'tozero')) %>%
config(displayModeBar = FALSE)level 4 (UV)
На основе данных по логинам нарисуйте area plot DAU проекта, в котором цветами выделите группы пользователей по количеству дней с момента инсталла:
группа 1: 0 дней с инсталла
группа 2: 1-7 дней с момента инсталла
группа 3: 8-28 дней с инсталла
группа 4: более 28 дней с инсталла
У вас должно получится что-то вроде слоеного пирога, где цветами выделены группы. Подумайте, есть ли необходимость рисовать этот график не в абсолютных числах (количество пользователей), а в долях каждой группы от DAU, в чем могут быть плюсы и минусы такого графика. Возможно, вам потребуется нарисовать графики разных типов, чтобы ответить на этот вопрос.
Попробуйте подумать, что говорит подобный график о продукте и его пользователях. Есть ли у него проблемные зоны, над которыми надо поработать или которые могут влиять на стратегию развития и/или оперирования продукта?
Решение:
# Импорт данных
# logins <- read_csv("https://gitlab.com/hse_mar/mar211f/-/raw/main/data/dau.csv")
logins <- read_csv("./data/logins.csv")## Rows: 5494174 Columns: 4
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (2): user_pseudo_id, platform
## date (2): install_dt, login_dt
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
# Считаем количество дней от инсталла
logins <- logins %>%
mutate(lifetime = as.numeric(login_dt - install_dt))
logins <- logins %>%
mutate(user_group = case_when(
lifetime == 0 ~ '0 days',
lifetime %in% seq(1, 7) ~ '1-7 days',
lifetime %in% seq(8, 28) ~ '8-28 days',
lifetime >= 29 ~ '29+ days',
))
# # Разбиваем на группы
# logins <- logins %>%
# mutate(lifetime_group = cut(
# lifetime,
# breaks = c(-Inf, -1, 0, 7, 28, Inf),
# ordered_result = TRUE
# ))
logins_stat <- logins %>%
group_by(login_dt, user_group) %>%
summarise(n_users = n_distinct(user_pseudo_id), .groups = "drop")
plot_ly(logins_stat, x = ~login_dt, y = ~n_users, color = ~user_group, type = 'scatter', mode = 'none', stackgroup = 'one') %>%
layout(
title='Структура DAU по времени жизни пользователей в приложении'
) %>%
config(displayModeBar = FALSE)level 5 (N)
Постройте графики DAU, MAU и их отношения для данных за июль. Проинтерпретируйте метрику DAU/MAU, что она говорит о проекте?
Решение. Строим график MAU.
dates <- logins %>%
filter(login_dt >= "2022-07-01") %>%
pull(login_dt) %>%
unique() %>%
sort()
# Считаем одновременно DAU и MAU
mau_stat <- map_df(dates, function(x) {
logins %>%
summarise(
dt = x,
dt_lb = x - 30,
metric_dau = n_distinct(user_pseudo_id[login_dt == x]),
metric_mau = n_distinct(user_pseudo_id[login_dt >= x - 30 & login_dt <= x])
)
})
# Считаем stickiness
mau_stat <- mau_stat %>%
mutate(stickiness = metric_dau / metric_mau)
# рисуем DAU и MAU
plot_ly(mau_stat, x = ~dt, y = ~metric_mau,
type = 'scatter', mode = 'lines', name = 'MAU') %>%
add_trace(y = ~metric_dau, name = 'DAU') %>%
layout(
title = 'DAU и MAU',
yaxis = list(rangemode = 'tozero')
) %>%
config(displayModeBar = FALSE)Расчет retention
Общая логика расчета: - считаем lifetime - считаем количество пользователей на каждый день от инсталла - считаем долю этих пользователей от всего пользователей когорты - ограничиваем на общий доступный лайфтайм - рисуем график - опционально – добавляем группировку
retention <- logins %>%
filter(install_dt >= "2022-06-01", install_dt < "2022-07-01")
# Ограничиваем минимальное и максимальное количество дней
retention <- retention %>%
filter(lifetime >= 0, lifetime <= 30)
# Считаем количество вернувшихся пользователей
retention_stat <- retention %>%
group_by(lifetime) %>%
summarise(returned = n_distinct(user_pseudo_id), .groups = "drop")
# Считаем, сколько всего пользователей установило в день 0
retention_stat <- retention_stat %>%
mutate(total_users = returned[lifetime == 0])
# Считаем retention
retention_stat <- retention_stat %>%
mutate(ret = returned / total_users)
# рисуем график
plot_ly(retention_stat, x = ~lifetime, y = ~ret,
type = 'scatter', mode = 'lines') %>%
layout(
title = 'Retention rate',
yaxis = list(rangemode = 'tozero')
) %>%
config(displayModeBar = FALSE)Домашнее задание
level 2 (HNTR)
Постройте график ретеншена для когорты пользователей, пришедшей в июне, с разбивкой по источникам привлечения (media_source). Для этого вам потребуются следующие датасеты:
level 3 (HMP)
Постройте линейный график retention 1 day (ret1) для всех дневных когорт. Т.е. по оси OX должна быть дата инсталла, по оси OY – значение ретеншена первого для пользователей, пришедших в этот день.
level 5 (N)
Постройте и сравните графики rolling retention и retention rate (возьмите данные за логины и инсталлы из практикума).
Для rolling retention необходимо:
- посчитать максимальный лайфтайм пользователя
- посчитать количество пользователей по лайфтайму
- cделать обратную кумулятивную сумму
- cумму поделить на количество установок (для lifetime == 0 значения количества инсталлов и обратная кумсумма должны совпадать)