Introdução

Diversos indicadores e pesquisas mostram a baixa performance financeira dos brasileiros. Muitos não conseguem chegar ao fim do mês com dinheiro sobrando e pouquíssimos conseguem arcar com algum imprevisto. Pensando nisso, foi desenvolvido o Julius, um aplicativo para gestão financeira pessoal. O Julius surgiu para ajudar as pessoas a aumentarem seu bem-estar financeiro. Para isso ocorrer, é essencial o engajamento do usuário, entretanto, a baixa retenção mostra que o aplicativo está deixando a desejar nesse aspecto.

Uma técnica para aumentar a motivação e o engajamento dos usuários tem chamado a atenção, sendo aplicada a uma ampla variedade de produtos e serviços. Essa técnica é a gamificação, que consiste em aplicar elementos de jogos em contextos não relacionados a jogos. Neste artigo será avaliado o desempenho de uma versão gamificada do Julius utilizando os dados de retenção fornecidos pelo Google Analytics.

Geração dos dados

Os dados de retenção do Google Analytics foram coletados dos usuários que baixaram o aplicativo do dia 15/08/2021 até o dia 30/08/2021, nesse período houve um total de 198 downloads. Além disso, também foram coletados os dados de retenção dos usuários que haviam baixado a versão não-gamificada, do dia 15/07/2021 até o dia 30/07/2021, totalizando 200 downloads. Após algumas transformações, os dados ficaram com a seguinte estrutura:

glimpse(dados)
## Rows: 224
## Columns: 4
## $ date      <date> 2021-07-15, 2021-07-16, 2021-07-17, 2021-07-18, 2021-07-19,…
## $ game      <lgl> FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALS…
## $ s         <dbl> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, …
## $ retention <dbl> 0.133, 0.214, 0.400, 0.133, 0.154, 0.182, 0.333, 0.250, 0.14…

Análise exploratória

A distribuição da retenção nas duas versões é muito semelhante, ambas apresentam o formato de cauda longa à direita. Na versão gamificada, 90% das retenções possuem valor abaixo de 19%, enquanto que na versão não-gamificada os valores são abaixo de 20%.

dados %>% 
  mutate(
    game = ifelse(game, "Gamificada", "Não-gamificada")
  ) %>% 
  ggplot(aes(x = retention, color = game, fill = game)) +
  geom_density(alpha = 0.3) +
  geom_rug() +
  labs(y = "Densidade", x = "Retenção", color = "Versão", fill = "Versão", title = "Distribuição da rentenção")

A visualização a seguir aprensenta as médias de retenção em cada versão ao longo de 7 dias. No primeiro dia após o download, em média, 17% dos usuários da versão gamificada acessaram o aplicavo, enquanto que, na versão não-gamificada, 21% acessaram.

dados_sumario <- dados %>% 
  group_by(game, s) %>% 
  summarise(
    retention_s = mean(retention),
    .groups = "drop")
dados_sumario %>% 
  mutate(
    label = paste0(round(retention_s * 100), "%"),
    game = ifelse(game, "Gamificada", "Não-gamificada")
  ) %>% 
  ggplot(aes(x = s, y = fct_reorder(game, desc(game)))) +
  geom_raster(aes(fill = retention_s)) +
  geom_text(aes(label = label), color = "white") +
  scale_fill_gradient(low = "deepskyblue", high = "darkblue") + 
  labs(y = "Versão", x = "Dia após o download", title = "Médias de retenção ao longo dos 7 dias após o download") +
  scale_x_continuous(breaks = seq(1, 7)) +
  theme(legend.position = "none")

Resultado

Para avaliar se a gamificação causou um efeito relevante, foi calculada a diferença das médias de retenção da versão gamificada e da não-gamificada ao longo dos 7 dias de uso. A Figura 15 apresenta a estimativa de intervalo de confiança de 95% obtida a partir de 4000 bootstraps não-paramétricos. Foi considerado que o efeito não é relevante se a diferença absoluta das médias de retenção for abaixo de 5% (linhas azuis na figura). Essa análise mostra que não é plausível que a gamificação tenha causado um efeito relevante na primeira semana de uso do aplicativo, já que seu efeito máximo plausível é de 1,8% (IC = [-0,026, 0,018]).

s <- function(d, i) {
    agrupado <- d %>%
      slice(i) %>%
      group_by(game) %>%
      summarise(
        media = mean(retention),
        .groups = "drop"
      )
    a = agrupado %>% filter(game) %>% pull(media)
    b = agrupado %>% filter(!game) %>% pull(media)
    a - b
}

get_ci <- function(d) {
    booted <- boot(data = d,
               statistic = s,
               R = 4000)
    tidy(booted,
      conf.level = .95,
      conf.method = "basic",
      conf.int = TRUE)
}
estimado <- get_ci(dados)

estimado %>% 
  mutate(
         conf.low = conf.low*100,
         conf.high = conf.high*100, 
         statistic = statistic*100,
         label = paste0("IC = [", format(round(conf.low, 1), nsmall = 1), "%, ", format(round(conf.high, 1), nsmall = 1), "%]")) %>% 
  ggplot(aes(
            ymin = conf.low,
            y = statistic,
            ymax = conf.high,
            x = ""
        )) +
        geom_linerange() +
        geom_point(color = "red", size = 3) +
        scale_y_continuous(limits = c(-10, 10)) +
        geom_hline(yintercept = c(5, -5), color = "lightblue") +
        geom_text(aes(label = label), vjust = 2.3, size=2.8) +
        coord_flip() +
        labs(y = "Diferença das médias em %", x = "", title = "Intervalo de confiança do desempenho da retenção")