El análisis de un embudo de ventas es una tarea típica para el marketing en Internet y, en particular, el comercio electrónico. Con su ayuda puedes:
- Descubra cuáles de los pasos para la compra está perdiendo clientes potenciales.
- Para simular el volumen de entrada de ingresos adicionales, en el caso de la expansión de cada paso en el camino de compra.
- Evaluar la calidad del tráfico comprado en varias plataformas publicitarias.
- Evaluar la calidad del procesamiento de las solicitudes entrantes para cada uno de los gerentes.
En este artículo, hablaré sobre cómo solicitar datos de la API de Yandex Metrics Logs en el lenguaje R, crear y visualizar un embudo basado en ellos.
Una de las principales ventajas del lenguaje R es la presencia de una gran cantidad de paquetes que amplían su funcionalidad básica. En este artículo, veremos los rym
, funneljoin
y ggplot2
.
Usando rym
datos de la API de Logs, usamos funneljoin
para construir un embudo de comportamiento y usamos ggplot2
visualizar el resultado.

Contenido
Solicitar datos de métricas de Yandex de API de registros
Quien no sabe qué es la API de registros aquí es una cita de la ayuda oficial de Yandex.
La API de registros le permite recibir datos no agregados recopilados por Yandex.Metrica. Esta API está destinada a usuarios del servicio que desean procesar de forma independiente datos estadísticos y utilizarlos para resolver problemas analíticos únicos.
Para trabajar con la API Yandex.Metrica Logs en R, utilizaremos el paquete rym
.
Enlaces útiles al paquete rym rym
: paquete R que es una interfaz para interactuar con la API Yandex Metrica. Le permite trabajar con la API de administración , la API de informes , la API de Gore compatible con Google Analytics v3 y la API de registros .
Instalación del paquete de rym
Para trabajar con cualquier paquete en R, primero debe instalarse y descargarse. Instale un paquete una vez usando el comando install.packages()
. Es necesario conectar el paquete en cada nueva sesión de trabajo en R usando la función library()
.
Para instalar y conectar el paquete rym
use el siguiente código:
install.packages("rym") library(rym)
Trabajando con Logs API Yandex Metrics usando el paquete rym
Para crear embudos de comportamiento, necesitamos descargar una tabla de todas las visitas realizadas en su sitio y preparar los datos para un análisis posterior.
Autorización en Yandex Metrics API
El trabajo con la API comienza con la autorización. En el paquete rym
el proceso de autorización está parcialmente automatizado y comienza cuando se llama a cualquiera de sus funciones.
La primera vez que acceda a la API, será redirigido al navegador para confirmar el permiso para acceder a sus métricas de Yandex para el paquete rym
. Después de la confirmación, será redirigido a la página donde se generará un código de confirmación de autorización para usted. Debe copiarse y pegarse en la consola R como respuesta a la solicitud "Enter authorize code:"
.
A continuación, puede guardar las credenciales en un archivo local respondiendo yes
o yes
a la solicitud "Do you want save API credential in local file ..."
. En este caso, en las próximas llamadas a la API, no necesitará volver a autenticarse a través del navegador, y las credenciales se cargarán desde el archivo local.
Solicitar datos de Yandex Metrica API
Lo primero que le pedimos a Yandex Metrics API es una lista de contadores disponibles y objetivos configurados. Esto se hace usando las rym_get_counters()
y rym_get_goals()
.
# library(rym) # counters <- rym_get_counters(login = " ") # goals <- rym_get_goals("0000000", # login = " ")
Usando el ejemplo de código anterior, reemplace " "
con su nombre de usuario Yandex, bajo el cual están disponibles las métricas de Yandex que necesita. Y "0000000"
al número del contador que necesita. Puede ver los números de los contadores disponibles en la tabla de contadores cargados.
La tabla de contadores disponibles - contadores tiene la siguiente forma:
# A tibble: 2 x 9 id status owner_login name code_status site permission type gdpr_agreement_accepted <int> <fct> <fct> <fct> <fct> <fct> <fct> <fct> <int> 1 11111111 Active site.ru1 Aerosus CS_NOT_FOUND site.ru edit simple 0 2 00000000 Active site.ru Aerosus RU CS_OK site.ru edit simple 1
El campo id muestra los números de todos los contadores métricos Yandex disponibles.
La tabla de objetivos es la siguiente:
# A tibble: 4 x 5 id name type is_retargeting conditions <int> <fct> <fct> <int> <fct> 1 47873638 url 0 type:contain, url:site.ru/checkout/cart/ 2 47873764 url 0 type:contain, url:site.ru/onestepcheckout/ 3 47874133 url 0 type:contain, url:/checkout/onepage/success 4 50646283 action 0 type:exact, url:click_phone
Es decir en el mostrador con el que trabajo, se configuran las siguientes acciones:
- Ir a la canasta
- Ir al pago
- Página de agradecimiento por ordenar
- Haga clic en el botón del teléfono.
En el futuro, para la conversión de datos, utilizaremos los paquetes incluidos en la biblioteca tidyr
: tidyr
, dplyr
. Por lo tanto, antes de usar el siguiente ejemplo de código, instale y conecte estos paquetes, o la biblioteca tidyverse
completa.
# install.packages("tidyverse") # library(tidyverse) install.packages(c("dplyr", "tidyr")) library(dplyr) library(tidyr)
La función rym_get_logs()
permite solicitar datos de las métricas API de registros de métricas de Yandex.
# logs <- rym_get_logs(counter = "0000000", date.from = "2019-04-01", date.to = "2019-06-30", fields = "ym:s:visitID, ym:s:clientID, ym:s:date, ym:s:goalsID, ym:s:lastTrafficSource, ym:s:isNewUser", login = " ") %>% mutate(ym.s.date = as.Date(ym.s.date), ym.s.clientID = as.character(ym.s.clientID))
Los principales argumentos de la función rym_get_logs()
:
- contador: número de contador desde el que solicita registros;
- date.from - fecha de inicio;
- date.to - fecha final;
- campos: una lista de campos que desea cargar;
- login: inicio de sesión de Yandex bajo el cual está disponible el contador especificado en el contador .
Por lo tanto, solicitamos datos de visita de la API de registros que contiene las siguientes columnas:
- ym: s: visitID - ID de visita
- ym: s: clientID - ID de usuario en el sitio
- ym: s: fecha - Fecha de visita
- ym: s: goalsID: identificador de los objetivos alcanzados durante esta visita
- ym: s: lastTrafficSource - Fuente de tráfico
- ym: s: isNewUser - Primera visita del visitante
Para obtener una lista completa de los campos disponibles, consulte la Ayuda de API de registros.
Los datos recibidos son suficientes para que podamos construir un embudo, en relación con el cual se termina el trabajo con la API de registros, y pasamos al siguiente paso: el procesamiento posterior de los datos descargados.
Funnel building funneljoin package
Una parte importante de la información proporcionada en esta sección se obtiene del paquete README de funneljoin, disponible como referencia .
funneljoin
objetivo funneljoin
es simplificar el análisis de embudo del comportamiento del usuario. Por ejemplo, su tarea es encontrar personas que visitaron su sitio y luego se registraron, y averiguar cuánto tiempo ha pasado entre la primera visita y el registro. O necesita encontrar usuarios que vieron la tarjeta del producto y la agregaron a la cesta en dos días. El paquete funneljoin
y la función after_join()
ayudan a resolver estos problemas.
Argumentos after_join()
:
- x: un conjunto de datos que contiene información sobre la finalización del primer evento (en el primer ejemplo, visitar el sitio, en el segundo ver la tarjeta del producto).
- y - un conjunto de datos con información sobre la finalización del segundo evento (en el primer ejemplo de registro, en el segundo, agregando el producto a la cesta).
- by_time: una columna que contiene información sobre la fecha en que ocurrieron los eventos en las tablas x e y .
- by_user: una columna con identificadores de usuario en las tablas x e y .
- modo: el método utilizado para conectarse: "interno", "completo", "anti", "semi", "derecho", "izquierdo". En su lugar, también puede usar
after_mode_join
(por ejemplo, after_inner_join
lugar de after_join (..., mode = "inner")
). - tipo: el tipo de secuencia utilizada para definir pares de eventos, como "primero-primero", "último-primero", "cualquier-primero". Descrito con más detalle en la sección "Tipos de embudos".
- max_gap / min_gap (opcional): filtra por la duración máxima y mínima del tiempo entre el primer y el segundo evento.
- gap_col (opcional): si se devuelve una columna numérica .gap con una diferencia horaria entre eventos. El valor predeterminado es FALSO.
Instalar funneljoin
Al momento de escribir esto, el paquete funneljoin
no funneljoin
publicado en CRAN, por lo que puede instalarlo desde GitHub. Para instalar paquetes desde GitHub, necesitará un paquete adicional: devtools
.
install.packages("devtools") devtools::install_github("robinsones/funneljoin")
Datos posteriores al procesamiento recibidos de la API de registros
Para un estudio más detallado de la construcción funcional del embudo, necesitamos llevar los datos obtenidos de la API de registros al formulario deseado. La forma más conveniente de manipular datos, como escribí anteriormente, es proporcionada por los dplyr
tidyr
y dplyr
.
Para comenzar, haga lo siguiente:
- En este caso, una fila de la tabla de registros contiene información sobre una visita, y la columna ym.s.goalsID es una matriz de la forma -
[0,1,0,...]
, que contiene identificadores de los objetivos alcanzados durante esta visita. Para llevar la matriz a una forma adecuada para el trabajo posterior, es necesario eliminar caracteres adicionales, en nuestro caso corchetes. - Es necesario volver a formatear la tabla para que una línea contenga información sobre un objetivo logrado durante la visita. Es decir si se lograron tres objetivos durante una visita, esta visita se dividirá en tres filas, y cada fila, en la columna ym.s.goalsID, contendrá el identificador de un solo objetivo.
- Adjunte una tabla con una lista de objetivos a la tabla de registro para comprender exactamente qué objetivos se alcanzaron durante cada visita.
- Cambie el nombre de la columna de nombre con nombres de objetivos a eventos .
Todas las acciones anteriores se implementan utilizando el siguiente código:
Código de postproceso para los datos recibidos de la API de registros # logs_goals <- logs %>% mutate(ym.s.goalsID = str_replace_all(ym.s.goalsID, # "\\[|\\]", "") %>% str_split(",")) %>% # unnest(cols = c(ym.s.goalsID)) %>% mutate(ym.s.goalsID = as.integer(ym.s.goalsID)) %>% # id left_join(goals, by = c("ym.s.goalsID" = "id")) %>% # rename(events = name) # events
Una pequeña explicación del código. El operador %>%
se denomina canalización y hace que el código sea más legible y compacto. De hecho, toma el resultado de ejecutar una función y la pasa como primer argumento a la siguiente función. Por lo tanto, se obtiene un tipo de transportador que le permite no obstruir la RAM con variables superfluas que almacenan resultados intermedios.
La función str_replace_all
elimina los corchetes en la columna ym.s.goalsID . str_split
divide los identificadores de destino de la columna ym.s.goalsID en valores separados, y unnest
divide en filas separadas, duplicando los valores de todas las demás columnas.
Usando mutate
lanzamos identificadores de destino al tipo entero.
left_join
tabla de objetivos al resultado, que almacena información sobre los objetivos configurados. Usando la columna ym.s.goalsID de la tabla actual y la columna de identificación de la tabla de objetivos como la clave.
Finalmente, la función de rename
cambia el nombre de la columna de nombre a eventos .
Ahora la tabla logs_goals tiene la apariencia necesaria para seguir trabajando.
A continuación, cree tres tablas nuevas:
- first_visits: fechas de las primeras sesiones para todos los nuevos usuarios
- carro - fechas de agregar productos a la cesta
- pedidos - pedidos
Código de creación de tabla # first_visits <- logs_goals %>% filter(ym.s.isNewUser == 1 ) %>% # select(ym.s.clientID, # clientID ym.s.date) # date # cart <- logs_goals %>% filter(events == " ") %>% select(ym.s.clientID, ym.s.date) # orders <- logs_goals %>% filter(events == " ") %>% select(ym.s.clientID, ym.s.date)
Cada nueva tabla es el resultado de filtrar la tabla principal logs_goals obtenida en el último paso. El filtrado se realiza mediante la función de filter
.
Para crear embudos, es suficiente que dejemos información sobre el ID de usuario y la fecha del evento, que se almacenan en las columnas ym.s.clientID y ym.s.date , en las nuevas tablas. Las columnas deseadas se seleccionaron utilizando la función de select
.
Tipos de embudo
El argumento type acepta cualquier combinación de los lastbefore
first
, last
, any
y firstafter
con first
, last
, any
y firstafter
. El siguiente es un ejemplo de las combinaciones más útiles que puede usar:
first-first
: obtenga los primeros eventos x e y para cada usuario. Por ejemplo, queremos obtener la fecha de la primera visita y la fecha de la primera compra, en cuyo caso use el tipo de embudo first-first
.
# first-first first_visits %>% after_inner_join(orders, by_user = "ym.s.clientID", by_time = "ym.s.date", type = "first-first")
# A tibble: 42 x 3 ym.s.clientID ym.s.date.x ym.s.date.y <chr> <date> <date> 1 1552251706539589249 2019-04-18 2019-05-15 2 1554193975665391000 2019-04-02 2019-04-15 3 1554317571426012455 2019-04-03 2019-04-04 4 15544716161033564779 2019-04-05 2019-04-08 5 1554648729526295287 2019-04-07 2019-04-11 6 1554722099539384487 2019-04-08 2019-04-17 7 1554723388680198551 2019-04-08 2019-04-08 8 15547828551024398507 2019-04-09 2019-05-13 9 1554866701619747784 2019-04-10 2019-04-10 10 1554914125524519624 2019-04-10 2019-04-10 # ... with 32 more rows
Obtuvimos una tabla en la que 1 línea contiene datos sobre la fecha de la primera visita del usuario al sitio y la fecha de su primer pedido.
first-firstafter
: obtenga la primera x , luego la primera y sucedió después de la primera x . Por ejemplo, un usuario ha visitado repetidamente su sitio y, durante el transcurso de las visitas, agregó productos a la cesta, si necesita obtener la fecha de agregar el primer producto a la cesta, y la fecha del pedido más cercano , use el first-firstafter
tipo de embudo.
cart %>% after_inner_join(orders, by_user = "ym.s.clientID", by_time = "ym.s.date", type = "first-firstafter")
# A tibble: 49 x 3 ym.s.clientID ym.s.date.x ym.s.date.y <chr> <date> <date> 1 1551433754595068897 2019-04-02 2019-04-05 2 1552251706539589249 2019-05-15 2019-05-15 3 1552997205196001429 2019-05-23 2019-05-23 4 1553261825377658768 2019-04-11 2019-04-11 5 1553541720631103579 2019-04-04 2019-04-05 6 1553761108775329787 2019-04-16 2019-04-16 7 1553828761648236553 2019-04-03 2019-04-03 8 1554193975665391000 2019-04-13 2019-04-15 9 1554317571426012455 2019-04-04 2019-04-04 10 15544716161033564779 2019-04-08 2019-04-08 # ... with 39 more rows
lastbefore-firstafter
: primero x seguido de y antes del siguiente x . Por ejemplo, un usuario ha visitado repetidamente su sitio, algunas de las sesiones finalizaron con una compra. Si necesita obtener la fecha de la última sesión antes de comprar, y la fecha de compra que siguió, use el tipo de embudo lastbefore-firstafter
.
first_visits %>% after_inner_join(orders, by_user = "ym.s.clientID", by_time = "ym.s.date", type = "lastbefore-firstafter")
# A tibble: 50 x 3 ym.s.clientID ym.s.date.x ym.s.date.y <chr> <date> <date> 1 1551433754595068897 2019-04-05 2019-04-05 2 1552251706539589249 2019-05-15 2019-05-15 3 1552251706539589249 2019-05-16 2019-05-16 4 1552997205196001429 2019-05-23 2019-05-23 5 1553261825377658768 2019-04-11 2019-04-11 6 1553541720631103579 2019-04-05 2019-04-05 7 1553761108775329787 2019-04-16 2019-04-16 8 1553828761648236553 2019-04-03 2019-04-03 9 1554193975665391000 2019-04-15 2019-04-15 10 1554317571426012455 2019-04-04 2019-04-04 # ... with 40 more rows
En este caso, recibimos una tabla en la que una línea contiene la fecha en que se agregó el último producto a la cesta antes de completar cada pedido, y la fecha del pedido en sí.
any-firstafter
: obtenga todas las xy la primera y después. Por ejemplo, un usuario ha visitado repetidamente su sitio, durante cada visita agregó varios productos a la cesta y realizó pedidos periódicamente con todos los productos agregados. Si necesita obtener las fechas de todas las adiciones de productos a la cesta y las fechas de pedido, utilice el tipo de embudo en any-firstafter
.
cart %>% after_inner_join(orders, by_user = "ym.s.clientID", by_time = "ym.s.date", type = "any-firstafter")
# A tibble: 239 x 3 ym.s.clientID ym.s.date.x ym.s.date.y <chr> <date> <date> 1 1551433754595068897 2019-04-02 2019-04-05 2 1551433754595068897 2019-04-02 2019-04-05 3 1551433754595068897 2019-04-03 2019-04-05 4 1551433754595068897 2019-04-03 2019-04-05 5 1551433754595068897 2019-04-03 2019-04-05 6 1551433754595068897 2019-04-05 2019-04-05 7 1551433754595068897 2019-04-05 2019-04-05 8 1551433754595068897 2019-04-05 2019-04-05 9 1551433754595068897 2019-04-05 2019-04-05 10 1551433754595068897 2019-04-05 2019-04-05 # ... with 229 more rows
- any-any: obtenga todas las x y todas y junto a cada x . Por ejemplo, desea recibir una lista de todas las visitas al sitio con todos los pedidos posteriores realizados por cada usuario.
first_visits %>% after_inner_join(orders, by_user = "ym.s.clientID", by_time = "ym.s.date", type = "any-any")
# A tibble: 122 x 3 ym.s.clientID ym.s.date.x ym.s.date.y <chr> <date> <date> 1 1552251706539589249 2019-04-18 2019-05-15 2 1552251706539589249 2019-04-18 2019-05-15 3 1552251706539589249 2019-04-18 2019-05-15 4 1552251706539589249 2019-04-18 2019-05-16 5 1554193975665391000 2019-04-02 2019-04-15 6 1554193975665391000 2019-04-02 2019-04-25 7 1554317571426012455 2019-04-03 2019-04-04 8 15544716161033564779 2019-04-05 2019-04-08 9 1554648729526295287 2019-04-07 2019-04-11 10 1554722099539384487 2019-04-08 2019-04-17 # ... with 112 more rows
Pasos de embudo
Los ejemplos anteriores demuestran que funciona con la función after_inner_join()
, es conveniente usarla en los casos en que tiene todos los eventos separados por tablas separadas, en nuestro caso de acuerdo con las tablas first_visits , cart y orders .
Pero la API de registros le brinda información sobre todos los eventos en una tabla, y las funnel_start()
y funnel_step()
serán una forma más conveniente de crear una secuencia de acciones. funnel_start
ayuda a establecer el primer paso del embudo y toma cinco argumentos:
- tbl: tabla de eventos;
- moment_type: el primer evento en el embudo;
- moment: el nombre de la columna que contiene el nombre del evento;
- tstamp: nombre de la columna con la fecha en que ocurrió el evento;
- usuario: el nombre de la columna con identificadores de usuario.
logs_goals %>% select(events, ym.s.clientID, ym.s.date) %>% funnel_start(moment_type = " ", moment = "events", tstamp = "ym.s.date", user = "ym.s.clientID")
# A tibble: 52 x 2 ym.s.clientID `ym.s.date_ ` <chr> <date> 1 1556018960123772801 2019-04-24 2 1561216372134023321 2019-06-22 3 1556955573636389438 2019-05-04 4 1559220890220134879 2019-05-30 5 1553261825377658768 2019-04-11 6 1561823182372545402 2019-06-29 7 1556047887455246275 2019-04-23 8 1554722099539384487 2019-04-17 9 1555420652241964245 2019-04-17 10 1553541720631103579 2019-04-05 # ... with 42 more rows
funnel_start
devuelve una tabla con ym.s.clientI y ym.s.date_ column ym.s.date_
(el nombre de su columna con la fecha, _ y el nombre del evento).
Los siguientes pasos se pueden agregar utilizando la función funnel_step()
. En funnel_start
ya especificamos los identificadores de todas las columnas requeridas, ahora necesitamos especificar qué evento será el siguiente paso en el embudo usando el argumento moment_type , y el tipo de conexión es type (por ejemplo, "first-first"
, "first-any"
).
logs_goals %>% select(events, ym.s.clientID, ym.s.date) %>% funnel_start(moment_type = " ", moment = "events", tstamp = "ym.s.date", user = "ym.s.clientID") %>% funnel_step(moment_type = " ", type = "first-last")
# A tibble: 319 x 3 ym.s.clientID `ym.s.date_ ` `ym.s.date_ ` <chr> <date> <date> 1 1550828847886891355 2019-04-01 NA 2 1551901759770098825 2019-04-01 NA 3 1553595703262002507 2019-04-01 NA 4 1553856088331234886 2019-04-01 NA 5 1554044683888242311 2019-04-01 NA 6 1554095525459102609 2019-04-01 NA 7 1554100987632346537 2019-04-01 NA 8 1551433754595068897 2019-04-02 2019-04-05 9 1553627918798485452 2019-04-02 NA 10 155418104743178061 2019-04-02 NA # ... with 309 more rows
Con funnel_step
puede crear embudos con cualquier cantidad de pasos. Para crear un embudo completo para cada usuario, en mi ejemplo, puede usar el siguiente código:
Código para construir un embudo completo para cada usuario # # events - " " logs_goals <- logs_goals %>% filter(ym.s.isNewUser == 1 ) %>% mutate(events = " ") %>% bind_rows(logs_goals) # logs_goals %>% select(events, ym.s.clientID, ym.s.date) %>% funnel_start(moment_type = " ", moment = "events", tstamp = "ym.s.date", user = "ym.s.clientID") %>% funnel_step(moment_type = " ", type = "first-last") %>% funnel_step(moment_type = " ", type = "first-last") %>% funnel_step(moment_type = " ", type = "first-last")
Y ahora la guinda del pastel es summarize_funnel()
. Una función que le permite mostrar el porcentaje de usuarios que cambiaron del paso anterior al siguiente, y el porcentaje de usuarios que pasaron del primer paso a cada uno posterior.
my_funnel <- logs_goals %>% select(events, ym.s.clientID, ym.s.date) %>% funnel_start(moment_type = " ", moment = "events", tstamp = "ym.s.date", user = "ym.s.clientID") %>% funnel_steps(moment_type = c(" ", " ", " "), type = "first-last") %>% summarize_funnel()
# A tibble: 4 x 4 moment_type nb_step pct_cumulative pct_step <fct> <dbl> <dbl> <dbl> 1 18637 1 NA 2 1589 0.0853 0.0853 3 689 0.0494 0.579 4 34 0.0370 0.749
nb_step
— , , pct_cumulative
— , pct_step
— .
my_funnel , ggplot2
.
ggplot2
— R, . , , .
ggplot2
, 2005 . , photoshop, , .
# install.packages("ggplot2") library(ggplot2) my_funnel %>% mutate(padding = (sum(my_funnel$nb_step) - nb_step) / 2) %>% gather(key = "variable", value = "val", -moment_type) %>% filter(variable %in% c("nb_step", "padding")) %>% arrange(desc(variable)) %>% mutate(moment_type = factor(moment_type, levels = c(" ", " ", " ", " "))) %>% ggplot( aes(x = moment_type) ) + geom_bar(aes(y = val, fill = variable), stat='identity', position='stack') + scale_fill_manual(values = c('coral', NA) ) + geom_text(data = my_funnel, aes(y = sum(my_funnel$nb_step) / 2, label = paste(round(round(pct_cumulative * 100,2)), '%')), colour='tomato4', fontface = "bold") + coord_flip() + theme(legend.position = 'none') + labs(x='moment', y='volume')
:

.
- my_funnel .
ggplot
— , , , X moment_type .geom_bar
— — , aes
.scale_fill_manual
— , , .geom_text
— , % .coord_flip
— , .theme
— : , .. .labs
— .
, , , , .
lapply
, R. , , bind_rows
.
# first_visits <- rename(first_visits, firstSource = ym.s.lastTrafficSource) # logs_goals <- select(first_visits, ym.s.clientID, firstSource) %>% left_join(logs_goals, ., by = "ym.s.clientID") # my_multi_funnel <- lapply(c("ad", "organic", "direct"), function(source) { logs_goals %>% filter(firstSource == source) %>% select(events, ym.s.clientID, ym.s.date) %>% funnel_start(moment_type = " ", moment = "events", tstamp = "ym.s.date", user = "ym.s.clientID") %>% funnel_steps(moment_type = c(" ", " ", " "), type = "first-last") %>% summarize_funnel() %>% mutate(firstSource = source) }) %>% bind_rows() #
# A tibble: 12 x 5 moment_type nb_step pct_cumulative pct_step firstSource <fct> <int> <dbl> <dbl> <chr> 1 14392 1 NA ad 2 154 0.0107 0.0107 ad 3 63 0.00438 0.409 ad 4 14 0.000973 0.222 ad 5 3372 1 NA organic 6 68 0.0202 0.0202 organic 7 37 0.0110 0.544 organic 8 13 0.00386 0.351 organic 9 607 1 NA direct 10 49 0.0807 0.0807 direct 11 21 0.0346 0.429 direct 12 8 0.0132 0.381 direct
my_multi_funnel , .
# my_multi_funnel %>% mutate(padding = ( 1 - pct_cumulative) / 2 ) %>% gather(key = "variable", value = "val", -moment_type, -firstSource) %>% filter(variable %in% c("pct_cumulative", "padding")) %>% arrange(desc(variable)) %>% mutate(moment_type = factor(moment_type, levels = c(" ", " ", " ", " ")), variable = factor(variable, levels = c("pct_cumulative", "padding"))) %>% ggplot( aes(x = moment_type) ) + geom_bar(aes(y = val, fill = variable), stat='identity', position='stack') + scale_fill_manual(values = c('coral', NA) ) + geom_text(data = my_multi_funnel_df, aes(y = 1 / 2, label =paste(round(round(pct_cumulative * 100, 2)), '%')), colour='tomato4', fontface = "bold") + coord_flip() + theme(legend.position = 'none') + labs(x='moment', y='volume') + facet_grid(. ~ firstSource)
:

?
first_visits
ym.s.lastTrafficSource
firstSource
.left_join
ym.s.clientID . firstSource
.lapply
ad, organic direct. bind_rows
.facet_grid(. ~ firstSource)
, firstSource
.
PS
. PS , R. R4marketing , R .
:
Conclusión
, , R :
- .;
- R RStudio;
rym
, funneljoin
ggplot2
;rym
rym_get_logs()
.;funneljoin
.ggplot2
.
, Logs API , : CRM, 1 . , : , -.