Метрики вовлечения pt2

Запись занятия

Разбор домашнего задания

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)
plot_ly(logins_stat, x = ~login_dt, y = ~n_users, color = ~user_group, type = 'scatter', mode = 'lines') %>%
  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)
# рисуем stickiness
plot_ly(mau_stat, x = ~dt, y = ~stickiness, type = 'scatter', mode = 'lines') %>%
  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 1 (IATYTD)

Внимательно разберите решения заданий (материалы конспекта).

level 2 (HNTR)

Постройте график ретеншена для когорты пользователей, пришедшей в июне, с разбивкой по источникам привлечения (media_source). Для этого вам потребуются следующие датасеты:

level 3 (HMP)

Постройте линейный график retention 1 day (ret1) для всех дневных когорт. Т.е. по оси OX должна быть дата инсталла, по оси OY – значение ретеншена первого для пользователей, пришедших в этот день.

level 4 (UV)

Добавьте на этот график группировку по источникам трафика (media_source).

level 5 (N)

Постройте и сравните графики rolling retention и retention rate (возьмите данные за логины и инсталлы из практикума).

Для rolling retention необходимо:

  • посчитать максимальный лайфтайм пользователя
  • посчитать количество пользователей по лайфтайму
  • cделать обратную кумулятивную сумму
  • cумму поделить на количество установок (для lifetime == 0 значения количества инсталлов и обратная кумсумма должны совпадать)