A análise de um funil de vendas é uma tarefa típica do marketing na Internet e, em particular, do comércio eletrônico. Com sua ajuda, você pode:
- Descubra quais das etapas da compra você está perdendo clientes em potencial.
- Simular o volume de entrada de receita adicional, no caso de expansão de cada etapa no caminho da compra.
- Avalie a qualidade do tráfego adquirido em várias plataformas de publicidade.
- Avalie a qualidade do processamento de aplicativos recebidos para cada um dos gerentes.
Neste artigo, falarei sobre como solicitar dados na linguagem R da API Yandex Metrics Logs, criar e visualizar um funil com base neles.
Uma das principais vantagens da linguagem R é a presença de um grande número de pacotes que expandem sua funcionalidade básica. Neste artigo, veremos os rym
, funneljoin
e ggplot2
.
Usando o rym
carregamos dados da API de logs, usamos o funneljoin
para criar um funil comportamental e usamos o ggplot2
visualizar o resultado.

Conteúdo
Solicitar dados das métricas Yandex da API de logs
Quem não sabe o que é a API de logs aqui é uma citação da ajuda oficial do Yandex.
A API de logs permite que você receba dados não agregados coletados pelo Yandex.Metrica. Essa API é destinada a usuários do serviço que desejam processar dados estatísticos de forma independente e usá-los para resolver problemas analíticos exclusivos.
Para trabalhar com a API Yandex.Metrica Logs no R, usaremos o pacote rym
.
Links úteis para o pacote rym rym
-R, que é uma interface para interagir com a API Yandex Metrica. Permite trabalhar com a API de gerenciamento , a API de relatórios , a API do Gore compatível com o Google Analytics v3 e a API de logs .
Instalação do pacote Rym
Para trabalhar com qualquer pacote no R, ele deve primeiro ser instalado e baixado. Instale um pacote uma vez usando o comando install.packages()
. É necessário conectar o pacote em cada nova sessão de trabalho em R usando a função library()
.
Para instalar e conectar o pacote rym
use o seguinte código:
install.packages("rym") library(rym)
Trabalhando com métricas Yandex da API de logs usando o pacote rym
Para criar funis comportamentais, precisamos fazer o download de uma tabela de todas as visitas feitas no seu site e preparar os dados para análises adicionais.
Autorização na API Yandex Metrics
O trabalho com a API começa com a autorização. No pacote rym
o processo de autorização é parcialmente automatizado e inicia quando qualquer uma de suas funções é chamada.
Na primeira vez em que você acessar a API, você será redirecionado ao navegador para confirmar a permissão para acessar suas métricas Yandex para o pacote rym
. Após a confirmação, você será redirecionado para a página onde um código de confirmação de autorização será gerado para você. Ele deve ser copiado e colado no console do R como uma resposta à solicitação "Enter authorize code:"
.
Em seguida, você pode salvar as credenciais em um arquivo local, respondendo y
ou yes
à solicitação "Do you want save API credential in local file ..."
. Nesse caso, nas próximas chamadas para a API, você não precisará se autenticar novamente pelo navegador, e as credenciais serão carregadas do arquivo local.
Solicitar dados da API Yandex Metrica
A primeira coisa que pedimos da API do Yandex Metrics é uma lista de contadores disponíveis e metas configuradas. Isso é feito usando as rym_get_counters()
e rym_get_goals()
.
# library(rym) # counters <- rym_get_counters(login = " ") # goals <- rym_get_goals("0000000", # login = " ")
Usando o exemplo de código acima, substitua " "
pelo seu nome de usuário Yandex, sob o qual as métricas de Yandex necessárias estão disponíveis. E "0000000"
para o número do contador que você precisa. Você pode ver os números dos contadores disponíveis na tabela de contadores carregados.
A tabela de contadores disponíveis - contadores tem o seguinte formato:
# 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
O campo id mostra os números de todos os contadores métricos Yandex disponíveis.
A tabela de objetivos é a seguinte:
# 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
I.e. no contador com o qual trabalho, as seguintes ações são configuradas:
- Ir para a cesta
- Ir para pagamento
- Página de agradecimento por encomendar
- Clique no botão do telefone
No futuro, para conversão de dados, usaremos os pacotes incluídos na biblioteca tidyr
: tidyr
, dplyr
. Portanto, antes de usar o exemplo de código a seguir, instale e conecte esses pacotes ou toda a biblioteca tidyverse
.
# install.packages("tidyverse") # library(tidyverse) install.packages(c("dplyr", "tidyr")) library(dplyr) library(tidyr)
A função rym_get_logs()
permite solicitar dados das métricas da API de logs de métricas do 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))
Os principais argumentos para a função rym_get_logs()
:
- número do contador do qual você solicita logs;
- date.from - data de início;
- date.to - data final;
- fields - uma lista dos campos que você deseja carregar;
- login - login Yandex sob o qual o contador especificado no contador está disponível.
Portanto, solicitamos dados de visita da API de logs que contém as seguintes colunas:
- ym: s: visitID - ID da visita
- ym: s: clientID - ID do usuário no site
- ym: s: date - Data da visita
- ym: s: goalsID - Identificador dos objetivos alcançados durante esta visita
- ym: s: lastTrafficSource - Fonte de tráfego
- ym: s: isNewUser - Primeira visita do visitante
Para obter uma lista completa dos campos disponíveis, consulte a Ajuda da API de logs.
Os dados recebidos são suficientes para criarmos um funil, com relação ao qual o trabalho com a API de logs é concluído, e passamos à próxima etapa - pós-processamento dos dados baixados.
Funil de construção funil
Uma parte significativa das informações fornecidas nesta seção é obtida no pacote README do funneljoin, disponível por referência .
funneljoin
objetivo funneljoin
é simplificar a análise de funil do comportamento do usuário. Por exemplo, sua tarefa é encontrar pessoas que visitaram seu site e depois se registraram e descobrir quanto tempo se passou entre a primeira visita e o registro. Ou você precisa encontrar usuários que visualizaram o cartão do produto e o adicionaram à cesta em dois dias. O pacote funneljoin
e a função after_join()
ajudam a resolver esses problemas.
Argumentos after_join()
:
- x - um conjunto de dados contendo informações sobre a conclusão do primeiro evento (no primeiro exemplo, visitando o site, na segunda visualização do cartão do produto).
- y - um conjunto de dados com informações sobre a conclusão do segundo evento (no primeiro exemplo de registro, no segundo, adicionando o produto à cesta).
- by_time - uma coluna contendo informações sobre a data em que os eventos ocorreram nas tabelas xey .
- by_user - uma coluna com identificadores de usuário nas tabelas xey .
- mode - o método usado para conectar: "interno", "completo", "anti", "semi", "direito", "esquerdo". Em vez disso, você também pode usar o
after_mode_join
(por exemplo, after_inner_join
vez de after_join (..., mode = "inner")
). - type - o tipo de sequência usada para definir pares de eventos, como "first-first", "last-first", "any-firststafter". Descrito com mais detalhes na seção "Tipos de funis".
- max_gap / min_gap (opcional) - filtre pela duração máxima e mínima do tempo entre o primeiro e o segundo evento.
- gap_col (opcional) - se deve retornar uma coluna .gap numérica com uma diferença de horário entre os eventos. O padrão é FALSE.
Instalando funneljoin
No momento da redação deste artigo, o pacote funneljoin
não funneljoin
publicado no CRAN, portanto você pode instalá-lo no GitHub. Para instalar pacotes do GitHub, você precisará de um pacote adicional - devtools
.
install.packages("devtools") devtools::install_github("robinsones/funneljoin")
Pós-processamento de dados recebidos da API de Logs
Para um estudo mais detalhado da construção funcional do funil, precisamos trazer os dados obtidos da API do Logs para o formato desejado. A maneira mais conveniente de manipular dados, como escrevi acima, é fornecida pelos dplyr
e dplyr
.
Para começar, faça o seguinte:
- Nesse caso, uma linha da tabela de logs contém informações sobre uma visita e a coluna ym.s.goalsID é uma matriz do formulário -
[0,1,0,...]
, que contém identificadores de objetivos alcançados durante essa visita. Para trazer a matriz para um formato adequado para trabalhos futuros, é necessário remover caracteres extras dela, no nosso caso, colchetes. - É necessário reformatar a tabela para que uma linha contenha informações sobre uma meta alcançada durante a visita. I.e. se três metas foram atingidas durante uma visita, essa visita será dividida em três linhas e cada linha, na coluna ym.s.goalsID, conterá o identificador de apenas uma meta.
- Anexe uma tabela com uma lista de objetivos à tabela de logs para entender exatamente quais objetivos foram alcançados durante cada visita.
- Renomeie a coluna de nome com os objetivos para eventos .
Todas as ações acima são implementadas usando o seguinte código:
Código de pós-processamento para dados recebidos da API de logs # 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
Uma pequena explicação do código. O operador %>%
é chamado de pipeline e torna o código mais legível e compacto. De fato, ele pega o resultado da execução de uma função e a passa como o primeiro argumento para a próxima função. Assim, é obtido um tipo de transportador, que permite não obstruir a RAM com variáveis supérfluas que armazenam resultados intermediários.
A função str_replace_all
remove colchetes na coluna ym.s.goalsID . str_split
divide os identificadores de destino da coluna ym.s.goalsID em valores separados e unnest
os em linhas separadas, duplicando os valores de todas as outras colunas.
Usando mutate
convertemos identificadores de destino para o tipo inteiro.
left_join
tabela de metas ao resultado, que armazena informações sobre as metas configuradas. Usando a coluna ym.s.goalsID da tabela atual e a coluna de ID da tabela de metas como chave.
Por fim, a função rename
renomeia a coluna de nome para eventos .
Agora a tabela logs_goals tem a aparência necessária para mais trabalhos.
Em seguida, crie três novas tabelas:
- first_visits - datas das primeiras sessões para todos os novos usuários
- carrinho - datas de adição de produtos ao carrinho
- pedidos - pedidos
Código de criação da tabela # 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 nova tabela é o resultado da filtragem da tabela principal logs_goals obtida na última etapa. A filtragem é realizada pela função de filter
.
Para criar funis, basta deixar informações sobre o ID do usuário e a data do evento, que são armazenadas nas colunas ym.s.clientID e ym.s.date , nas novas tabelas. As colunas desejadas foram selecionadas usando a função de select
.
Tipos de funil
O argumento type aceita qualquer combinação dos valores first
, last
, any
e lastbefore
com first
, last
, any
e firstafter
. A seguir, é apresentado um exemplo das combinações mais úteis que você pode usar:
first-first
: obtenha os primeiros eventos xey para cada usuário. Por exemplo, queremos obter a data da primeira visita e a data da primeira compra. Nesse caso, use o tipo de funil 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
Temos uma tabela na qual 1 linha contém dados sobre a data da primeira visita do usuário ao site e a data do primeiro pedido.
first-firstafter
: obtenha o x mais antigo, depois o primeiro y aconteceu após o primeiro x . Por exemplo, um usuário visitou seu site repetidamente e, durante as visitas, ele adicionou produtos à cesta, se você precisar obter a data de adição do primeiro produto à cesta e a data do pedido mais próximo , use o tipo de funil de first-firstafter
.
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
: primeiro x seguido por y antes do próximo x . Por exemplo, um usuário visitou seu site repetidamente, algumas das sessões terminaram com uma compra. Se você precisar obter a data da última sessão antes da compra e a data da compra que se seguiu, use o tipo de funil 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
Nesse caso, recebemos uma tabela na qual uma linha contém a data em que o último produto foi adicionado à cesta antes de cada pedido ser concluído e a data do próprio pedido.
any-firstafter
: obtém todos os x e o primeiro y depois dele. Por exemplo, um usuário visitou repetidamente seu site, durante cada visita ele adicionou vários produtos à cesta e fez pedidos periodicamente com todos os produtos adicionados. Se você precisar obter as datas de todas as adições à cesta e as datas de seus pedidos, use o tipo de funil a 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: obtém todos os x e todos os y próximos a cada x . Por exemplo, você deseja receber uma lista de todas as visitas ao site com todos os pedidos subsequentes feitos por cada usuário.
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
Etapas do funil
Os exemplos acima demonstram o trabalho com a função after_inner_join()
; é conveniente usá-la nos casos em que todos os eventos são separados por tabelas separadas; no nosso caso, de acordo com as tabelas first_visits , cart e orders .
Mas a API de logs fornece informações sobre todos os eventos em uma tabela e as funnel_start()
e funnel_step()
serão uma maneira mais conveniente de criar uma sequência de ações. funnel_start
ajuda a definir a primeira etapa do funil e leva cinco argumentos:
- tbl - tabela de eventos;
- moment_type - O primeiro evento no funil;
- moment - O nome da coluna que contém o nome do evento;
- tstamp - Nome da coluna com a data em que o evento ocorreu;
- usuário - O nome da coluna com identificadores de usuário.
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
retorna uma tabela com as colunas ym.s.clientI e ym.s.date_ ym.s.date_
(o nome da sua coluna com a data, _ e o nome do evento).
As etapas a seguir podem ser adicionadas usando a função funnel_step()
. No funnel_start
já especificamos os identificadores de todas as colunas necessárias, agora precisamos especificar qual evento será a próxima etapa no funil usando o argumento moment_type , e o tipo de conexão é o tipo (por exemplo, "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
Com funnel_step
você pode criar funis com qualquer número de etapas. Para criar um funil completo para cada usuário, no meu exemplo, você pode usar o seguinte código:
Código para criar um funil completo para cada usuário # # 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")
E agora a cereja no bolo é summarize_funnel()
. Uma função que permite exibir a porcentagem de usuários que passaram da etapa anterior para a próxima e a porcentagem de usuários que passaram da primeira etapa para cada uma subseqüente.
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 .
:
Conclusão
, , R :
- .;
- R RStudio;
rym
, funneljoin
ggplot2
;rym
rym_get_logs()
.;funneljoin
.ggplot2
.
, Logs API , : CRM, 1 . , : , -.