Análisis de embudo de conversión

Tipos de entrevistas


¿Cómo se se comportan los usuarios según el tipo de entrevista que se le hace?

# Abro las librerías

library(DescTools)
library(dplyr)
library(plotly)
library(DT)
library(tidyverse)
library(StatMeasures)

options(scipen = 999)

# Levanto los datos 

applicants_tabla <- readRDS("D:/Documentos/Trabajo/Proyecto/Sprint_1/applicants_anon_tabla.rds")
log_events_tabla <- readRDS("D:/Documentos/Trabajo/Proyecto/Sprint_1/log_events_tabla.rds")


# Levanto los datos 

log_events <- readRDS("D:/Documentos/Trabajo/Proyecto/Sprint_1/log_events_clean.rds")

log_events %>%
  arrange(event_id) -> log_events

# Armo la tabla para analizar los distintos "Primeros eventos" 

log_events %>% 
  group_by(Primer_event) %>%
  summarise(Cantidad_Usuarios = length(unique(applicant_id))) -> primeros_eventos

Tipos de entrevistas



A contnuación se presentan la distribución de los usuarios según los distintos tipos de entrevistas detectados.

# Armo tabla cruzada para detectar el tipo de entrevistas existentes 

log_events %>% 
  filter(Primer_event == "Applicant_created",
         nro_evento<=23 | is.na(nro_evento),
         !event %in% c("personal_info_saved",
                       "video_muted: false",
                       "video_muted: true",
                       "success_end",
                       "video_playing",
                       "video_finished"),
         duplicated(paste(applicant_id,events_cat_1)) == FALSE) %>% 
  filter(Tipo_Entrevista %in% c('2_welcome','2_welcome-img','3_welcome','3_welcome-img',
                                '4_WP4','5_WP5')) %>%
  group_by(Tipo_Entrevista) %>%
  summarise(test_id = paste0(unique(test_id),collapse = "_"),
            welcome_view = paste0(unique(welcome_view),collapse = "_"),
            Cant_Usuarios = length(unique(applicant_id)),
            Cant_Terminan = length(unique(applicant_id[is.na(tiempo_finalizaron_entrevista)==FALSE])),
            Tiempo_Prom_Segundos = mean(tiempo_finalizaron_entrevista,na.rm = TRUE),
            Cant_Eventos = n()) %>%
  mutate(Cant_Eventos_Prom = Cant_Eventos / Cant_Usuarios,
         Pct_Usuarios = Cant_Usuarios / sum(Cant_Usuarios),
         Pct_Eventos = Cant_Eventos / sum(Cant_Eventos),
         Tasa_Terminan = Cant_Terminan/Cant_Usuarios)-> tipos_entrevistas

tipos_entrevistas %>%
  select(test_id,
         welcome_view,
         Cant_Usuarios,
         Pct_Usuarios) %>%
  datatable(rownames = FALSE,
            options = list(paging=FALSE,
                           searching=FALSE)) %>%
  formatRound(c("Cant_Usuarios"),
              0) %>%
  formatPercentage(c("Pct_Usuarios"),
                   2) %>%
  formatStyle(c("Pct_Usuarios"), 
              background = styleColorBar(c(0,max(tipos_entrevistas$Pct_Usuarios)), 
                                         'lightblue'),
              backgroundSize = '100% 100%', 
              backgroundRepeat = 'no-repeat')

¿Cuántos usuarios terminan las entrevistas y en cuánto tiempo?

En la siguiente tabla se puede apreciar que las entrevistas cuyo “welcome_view” es “welcome-img” cuantan con mayor tasa de usuarios que terminan la entrevista completa.

Además, analizando el tiempo promedio en días en que tardan en finalizar la entrevista, puede verse una disminución de la demora en terminar las entrevistas en los “test_id” = 3.

A contnuación se presentan la distribución de los usuarios según los distintos tipos de entrevistas detectados.

# Defino los cortes que van a hacer que cambie de color
brks <- quantile(c(tipos_entrevistas$Tiempo_Prom_Segundos), 
                 probs = seq(0, 1, .05), na.rm = TRUE)

# Defino los colores que voy a usar
colfunc <- colorRampPalette(c("#63be7b","#ffdb81","#f8696b"))
clrs <- colfunc(length(brks) + 1)

tipos_entrevistas %>%
  select(test_id,
         welcome_view,
         Cant_Usuarios,
         Cant_Terminan,
         Tasa_Terminan,
         Tiempo_Prom_Segundos) %>%
  datatable(rownames = FALSE,
            options = list(paging=FALSE,
                           searching=FALSE)) %>%
  formatRound(c("Cant_Usuarios",
                "Cant_Terminan",
                "Tiempo_Prom_Segundos"),
              0) %>%
  formatPercentage(c("Tasa_Terminan"),
                   2) %>%
  formatStyle(c("Tasa_Terminan"), 
              background = styleColorBar(c(0,max(tipos_entrevistas$Tasa_Terminan)), 
                                         '#D98FF3'),
              backgroundSize = '100% 100%', 
              backgroundRepeat = 'no-repeat',
              fontWeight = "bold") %>% 
  formatStyle(c("Tiempo_Prom_Segundos"), 
              backgroundColor = styleInterval(brks, clrs))


Distribución de usuarios según el tipo de entrevista realizada y el tiempo en finalizar el proceso

El objetivo de este apartado es estudiar la distribución de usuarios según el tipo de entrevista realizada y el tiempo transcurrido hasta finalizarla (en caso de hacerlo).

# Analisis sobre entrevistas terminadas

log_events %>% 
  filter(Tipo_Entrevista %in% c('2_welcome','2_welcome-img','3_welcome','3_welcome-img',
                                '4_WP4','5_WP5')) %>% 
  filter(Primer_event == "Applicant_created",
         nro_evento<=23 | is.na(nro_evento),
         !event %in% c("personal_info_saved",
                       "video_muted: false",
                       "video_muted: true",
                       "success_end",
                       "video_playing",
                       "video_finished"),
         duplicated(paste(applicant_id,events_cat_1)) == FALSE) %>%
  mutate(Fin_Orden = case_when(Tiempo_Fin_Entrevista == "Menos_1dia" ~ 1,
                               Tiempo_Fin_Entrevista == "Menos_3dias" ~ 2,
                               Tiempo_Fin_Entrevista == "Menos_7dias" ~ 3,
                               Tiempo_Fin_Entrevista == "Mas_7dias" ~ 4,
                               TRUE ~ 5)) %>%
  group_by(Fin_Orden,Tipo_Entrevista) %>% 
  summarise(Tiempo_Fin_Entrevista = paste0(unique(Tiempo_Fin_Entrevista),collapse = "_"),
            Cantidad = length(unique(applicant_id)),
            Pct = length(unique(applicant_id))) %>%
  group_by(Tipo_Entrevista) %>%
  mutate(Pct = Pct / sum(Pct),
         Cantidad_Ac = cumsum(Cantidad),
         Pct_Ac = Cantidad_Ac/sum(Cantidad)) -> entrevistas_terminadas


# Grafico de distribucion por tipo de entrevista y cant de dias hasta terminar

entrevistas_terminadas %>% 
  mutate(Tiempo_Fin_Entrevista = factor(Tiempo_Fin_Entrevista,
                                        levels = c("No_Terminaron","Mas_7dias","Menos_7dias","Menos_3dias","Menos_1dia"))) %>%
  plot_ly(x = ~Tipo_Entrevista, 
          y = ~Pct, 
          color = ~Tiempo_Fin_Entrevista,
          type = "bar") %>% 
  layout(title = "Distribución de entrevistas según tipo y tiempo hasta terminar",
         yaxis = list(title = "Porcentaje"), 
         xaxis = list(title = "Tipo de Entrevista"),
         barmode = "stack")


¿Cómo se acumulan los usuarios cuanto más tardan en completar las entrevistas?

En este gráfico se puede apreciar que los usuarios que cuya entrevista realizada fue del tipo “welcome_view” = “welcome-img”, además de ser los que cuentan con mayor tasa de entrevistas terminadas, también son los que las hacen más rápido.

entrevistas_terminadas %>% 
  mutate(Tiempo_Fin_Entrevista = factor(Tiempo_Fin_Entrevista,
                                        levels =
                                          c("Menos_1dia","Menos_3dias","Menos_7dias","Mas_7dias","No_Terminaron"))) %>%
  plot_ly(x = ~Tiempo_Fin_Entrevista, 
          y = ~Pct_Ac, 
          color = ~Tipo_Entrevista,
          type = "scatter",
          mode = "lines+markers") %>% 
  layout(title = "Acumulación de entrevistas",
         yaxis = list(title = "Porcentaje"), 
         xaxis = list(title = "Tiempo para terminar la entrevista"))


¿Cómo distribuyen los usuarios?

entrevistas_terminadas[,2:4] %>% 
  spread(Tiempo_Fin_Entrevista, Cantidad)->entrevistas_terminadas_1

entrevistas_terminadas_1[is.na(entrevistas_terminadas_1)] <- 0

brks <- quantile(entrevistas_terminadas_1[,2:ncol(entrevistas_terminadas_1)], 
                 probs = seq(0, 1, .05), na.rm = TRUE)
clrs <- round(seq(255, 40, length.out = length(brks) + 1), 0) %>%
  {paste0("rgb(255,", ., ",", ., ")")}


entrevistas_terminadas_1 %>%
  select(Menos_1dia,
         Menos_3dias,
         Menos_7dias,
         Mas_7dias,
         No_Terminaron) %>%
  datatable(rownames = FALSE,
            options = list(paging=FALSE,
                           searching=FALSE)) %>%
  formatStyle(names(entrevistas_terminadas_1)[2:ncol(entrevistas_terminadas_1)], 
              backgroundColor = styleInterval(brks, clrs)) %>% 
  formatRound(names(entrevistas_terminadas_1)[2:ncol(entrevistas_terminadas_1)],0)

Embudo de conversión


¿Cómo van cayendo los usuarios en las distintas etapas de cada tipo de entrevista?

log_events %>% 
  filter(Tipo_Entrevista %in% c('2_welcome','2_welcome-img','3_welcome','3_welcome-img',
                                '4_WP4','5_WP5')) %>% 
  mutate(events_cat_1 = case_when(test_id ==2 & 
                                    events_cat_1 == "Psicometrico_Phrasing_22" ~ "Psicometrico_Phrasing_AnteUlt",
                                  test_id ==2 & 
                                    events_cat_1 == "Psicometrico_current_22" ~ "Psicometrico_current_AnteUlt",
                                  test_id ==2 & 
                                    events_cat_1 == "Psicometrico_Phrasing_23" ~ "Psicometrico_Phrasing_Ult",
                                  test_id ==2 & 
                                    events_cat_1 == "Psicometrico_current_23" ~ "Psicometrico_current_Ult",
                                  test_id ==3 & 
                                    events_cat_1 == "Psicometrico_Phrasing_20" ~ "Psicometrico_Phrasing_AnteUlt",
                                  test_id ==3 & 
                                    events_cat_1 == "Psicometrico_current_20" ~ "Psicometrico_current_AnteUlt",
                                  test_id ==3 & 
                                    events_cat_1 == "Psicometrico_Phrasing_21" ~ "Psicometrico_Phrasing_Ult",
                                  test_id ==3 & 
                                    events_cat_1 == "Psicometrico_current_21" ~ "Psicometrico_current_Ult",
                                  TRUE ~ events_cat_1)) %>%
  filter(Primer_event == "Applicant_created",
         events_cat_1 %in% c("Applicant_created",
                                    "field set: 1",
                                    "field set: 8",
                                    "Psicometrico_Phrasing_1",
                                    "Psicometrico_Phrasing_AnteUlt",
                                    "Psicometrico_Phrasing_Ult"),
         duplicated(paste(applicant_id,events_cat_1)) == FALSE)  %>%
  group_by(applicant_id,events_cat_1) %>%
  mutate(dif_seg = ifelse(is.na(dif_seg),0,dif_seg),
         Supera = ifelse(dif_seg>60*60*24*7,1,0),
         Supera_ac = cumsum(Supera)) %>% 
  filter(Supera_ac==0,
         Primer_event == "Applicant_created") %>%
  ungroup() %>%
  mutate(events_cat_ord = factor(events_cat_1, 
                                 levels= c("Applicant_created",
                                    "field set: 1",
                                    "field set: 8",
                                    "Psicometrico_Phrasing_1",
                                    "Psicometrico_Phrasing_Ult"))) %>%
  group_by(events_cat_ord,Tipo_Entrevista) %>%
  summarise(Evento = paste(unique(events_cat_ord),collapse = "_"),
            Cant_Usuarios = length(unique(applicant_id)),
            #Tiempo_Prom = mean(dif_seg,na.rm = TRUE),
            #Tiempo_Minimo = min(dif_seg,na.rm = TRUE),
            Tiempo_Mediano = median(dif_seg,na.rm = TRUE),
            Tiempo_Maximo = max(dif_seg,na.rm = TRUE))-> resumen_01


resumen_01 %>% 
  group_by(Tipo_Entrevista) %>%
  do(p=plot_ly(.,
               x = ~Cant_Usuarios,
               y = ~events_cat_ord,
               type = "funnel",
               textinfo = "value+percent initial",
               textposition = "inside",
               split = ~Tipo_Entrevista)) %>%
  subplot(nrows = 3, 
          shareX = TRUE, 
          shareY = TRUE)