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.
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…
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")
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")