Um dos meus desafios essa semana foi analisar todas as 265 campanhas de e-mail enviadas pelo meu projeto de futebol (Guru do Cartola) em 2018 e 2019.
Os meus principais objetivos com essa análise eram:
Saber quais e-mails geraram mais vendas.
Quais são os assuntos dos e-mails com as maiores taxas de abertura?
Além de responder essas duas perguntas, fiz outras análises também.
Porém, o foco desse post será na manipulação dos dados.
A tarefa de manipular os dados e deixá-los no formato adequado para a análise é uma das atividades que mais toma o tempo de um Cientista de Dados em um projeto.
Saber as principais funções de manipulação de dados irá te dar muita liberdade para trabalhar.
Então, vou detalhar sobre cada função que utilizei nesse desafio.
grepl
para buscar palavrasUm dos meus objetivos era categorizar os e-mails de forma bem simples.
Foram enviados vários tipos de e-mails:
A forma mais fácil que encontrei de categorizar as campanhas de e-mail foi analisando o link contido em cada mensagem.
Por exemplo, se o link direcionava o usuário para o Youtube, eu sei que o e-mail tinha um Conteúdo Gratuito.
Caso o link direcionasse o usuário para a página de vendas ou para o site da operadora de pagamentos, então era um e-mail que continha uma oferta de venda.
Como transformei cada link de vendas utilizado nos e-mails em uma categoria:
head(links)
# A plataforma de vendas chama Hotmart e os links diretos para ela
# contém as expressões "hotmart" ou "hotm.art".
# As expressões "timeguru" e "time-guru" são exclusivas das
# páginas de vendas do meu site.
links$categoria<-ifelse(grepl(paste(c("hotmart","hotm.art","timeguru","time-guru"),collapse="|"),links$categoria),"venda","")
A função grepl
busca por um termo dentro de um vetor de dados. Caso o termo seja encontrado em determinado elemento, o resultado será TRUE
, caso contrário será FALSE
.
Na função apresentada, foi necessário expandir os critérios da busca, pois a busca seria atendida para qualquer uma das 4 expressões.
Para isso, o padrão definido para a busca usou o operador OU.
paste(c("hotmart","hotm.art","timeguru","time-guru"),collapse="|")
## [1] "hotmart|hotm.art|timeguru|time-guru"
Além disso, a função grepl
foi abrangida pela função ifelse
. Então, quando a função grepl
retornar TRUE
, será atribuída a categoria venda para links$categoria
.
Caso a função grepl
retorne FALSE
, nada será atribuído para links$categoria
.
gsub
para substituir textosFoi necessário retirar uma expressão dos meus dados.
Para isso, busquei pelo trecho do texto que deveria ser retirado e substituí esse trecho por nada/vazio.
A função gsub
está estruturada da seguinte forma:
O primeiro argumento é a expressão que será substituída.
O segundo argumento é a expressão que irá substituir.
O terceiro argumento é o vetor onde ocorrerá a substituição.
head(lists)
## # A tibble: 6 x 3
## id name custom_fields
## <dbl> <chr> <chr>
## 1 6 lista teste <NA>
## 2 60 bolao <NA>
## 3 62 espera13 <NA>
## 4 65 espera14 <NA>
## 5 67 times_errados_teste Nomedotime:Text
## 6 68 times_errados Nomedotime:Text
# Irei substituir o texto ":Text" por "".
lists$custom_fields <- gsub(":Text","",lists$custom_fields)
head(lists)
## # A tibble: 6 x 3
## id name custom_fields
## <dbl> <chr> <chr>
## 1 6 lista teste <NA>
## 2 60 bolao <NA>
## 3 62 espera13 <NA>
## 4 65 espera14 <NA>
## 5 67 times_errados_teste Nomedotime
## 6 68 times_errados Nomedotime
Originalmente, os meus dados estão no formato de DATA E HORA. Porém, desejo trabalhar somente com a data.
head(hotmart$data)
## [1] "2019-12-20 15:55:36 UTC" "2019-12-06 22:17:27 UTC"
## [3] "2019-12-06 00:52:02 UTC" "2019-12-05 23:53:49 UTC"
## [5] "2019-12-05 23:50:49 UTC" "2019-12-05 23:45:06 UTC"
Portanto, irei usar a função as.Date
e informar no parâmetro “format” qual o formato de data que desejo visualizar meus dados.
A data já está no padrão do R, que é Ano (com 4 algarismos), depois mês e depois o dia.
hotmart$sent<-as.Date(hotmart$data,format="%Y/%m/%d")
head(hotmart$sent)
## [1] "2019-12-20" "2019-12-06" "2019-12-06" "2019-12-05" "2019-12-05"
## [6] "2019-12-05"
A data no novo formato foi atribuída para a coluna sent.
Cada linha da tabela hotmart representa uma transação feita pelo cliente. Porém, para essa análise precisamos saber o faturamento por dia.
Para isso, iremos somar todas as vendas considerando cada dia como um grupo.
Ou seja, vamos somar o total vendido para cada dia.
O primeiro passo é agrupar os dados por dia (variável sent). E depois vamos criar a coluna total_dia
, que será a soma da variável preco
para cada dia.
library(dplyr)
head(hotmart[,c("sent","preco")])
## # A tibble: 6 x 2
## sent preco
## <date> <dbl>
## 1 2019-12-20 76
## 2 2019-12-06 76
## 3 2019-12-06 76
## 4 2019-12-05 76
## 5 2019-12-05 76
## 6 2019-12-05 76
hotmart %<>%
group_by(sent) %>%
summarise(total_dia = sum(preco)) %>%
ungroup()
Tenho uma tabela com todas as informações sobre as minhas campanhas de e-mail marketing e outra tabela com os valores faturados em cada dia.
Então, quero adicionar o valor faturado em cada dia na tabela que contém informações sobre as campanhas.
Para juntar duas tabelas é necessário que se tenha pelo menos uma variável chave, essa variável é responsável por fazer uma ligação entre os dados das duas tabelas.
No caso, a variável que será utilizada para juntar as duas tabelas é a variável que representa a DATA, seja do envio da campanha ou das vendas.
A função join
irá juntar as tabelas:
campaigns<-plyr::join(campaigns,hotmart,by="sent") #sent é a variável de data
Repare que a variável chave deve ter o mesmo nome nas duas tabelas.
Achei importante analisar o impacto da quantidade recente de e-mails enviados tem nas vendas e na abertura de e-mails.
Para isso, calculei o número de e-mails enviados nos 7 dias anteriores.
Para fazer o cálculo, usei a biblioteca library(data.table)
e o primeiro passo foi transformar o meu data frame para o formato adequado.
Depois, para cada linha da minha tabela, eu filtro os dados que estão no intervalo dos 7 dias anteriores e conto quantos registros são.
library(data.table)
campaigns <- as.data.table(campaigns)
campaigns<-campaigns[, qnt_campanhas7D := campaigns[campaigns[, .(sent, dm7 = sent - 7)], on = .(sent >= dm7, sent < sent),
.N, by = .EACHI]$N][]
head(campaigns[,c("campaign_id","sent","qnt_campanhas7D")])
## campaign_id sent qnt_campanhas7D
## 1: 5 2018-04-02 0
## 2: 6 2018-04-02 0
## 3: 9 2018-04-02 0
## 4: 10 2018-04-02 0
## 5: 13 2018-04-03 4
## 6: 14 2018-04-03 4
Essas foram algumas funções que utilizei em minha manipulação de dados.
É claro que existem várias outras funções que atenderão necessidades diferentes.
De qualquer forma, esse tema é extremamente importante na carreira do Cientista de Dados e, justamente por isso, dediquei um capítulo inteiro do livro O seu primeiro passo para ser um Cientista de Dados para a manipulação de dados.
Nesse capítulo eu falo sobre a manipulação de dados usando a biblioteca dplyr
.
O capítulo seguinte do e-book trata sobre manipulação de Hora e Data.
Para acessar o e-book gratuitamente, basta clicar aqui
Faça parte do nosso grupo exclusivo e receba as novidades mais interessantes sobre Data Sciente e R em primeira mão.