Construindo funis comportamentais na linguagem R, com base nos dados obtidos da API Yandex.Metrica Logs

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.


imagem


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 .



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:


  1. 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.
  2. É 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.
  3. Anexe uma tabela com uma lista de objetivos à tabela de logs para entender exatamente quais objetivos foram alcançados durante cada visita.
  4. 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') 

:


Visualização de funil


.


  1. my_funnel .
  2. ggplot — , , , X moment_type .
  3. geom_bar — — , aes .
  4. scale_fill_manual — , , .
  5. geom_text — , % .
  6. coord_flip — , .
  7. theme — : , .. .
  8. 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) 

:
Funil do canal


?


  1. first_visits ym.s.lastTrafficSource firstSource .
  2. left_join ym.s.clientID . firstSource .
  3. lapply ad, organic direct. bind_rows .
  4. facet_grid(. ~ firstSource) , firstSource .

PS


. PS , R. R4marketing , R .


:


  • ;
  • ;
  • ;
  • R.

Conclusão


, , R :


  1. .;
  2. R RStudio;
  3. rym , funneljoin ggplot2 ;
  4. rym rym_get_logs() .;
  5. funneljoin .
  6. ggplot2 .

, Logs API , : CRM, 1 . , : , -.

Source: https://habr.com/ru/post/pt462279/


All Articles