Comprender mejor el comportamiento de los usuarios, el rendimiento del sitio y las diferencias de la edición 2022 de Hot Sale contra las ediciones pasadas.
# Cargar las librerías necesarias
if (!require("pacman")) install.packages("pacman")
pacman::p_load(arrow,
correlationfunnel,
formattable,
ggplot2,
lubridate,
outliers,
plotly,
tidyverse)# Leer la data de la edición
date_hour <- read_csv("data/2-processed/hotsale_2022_edition_2022-05-01_2022-05-31.csv",
col_types = cols(dateHour = col_datetime(format = "%Y%m%d%H"))) %>%
rename(fechaHora = dateHour,
impresiones = productListViews,
clics = productListClicks) %>%
mutate(diaSemana = factor(wday(fechaHora, week_start = 1))) %>%
mutate(diaSemana = recode_factor(diaSemana,
`1` = "lunes",
`2` = "martes",
`3` = "miércoles",
`4` = "jueves",
`5` = "viernes",
`6` = "sábado",
`7` = "domingo",
.ordered = TRUE),
hora = format(fechaHora, "%H:00"))
# Leer la data de canales
channels <- read_csv("data/2-processed/hotsale_2022_channel_2022-05-01-2022-05-31.csv",
col_types = cols(...1 = col_skip(), `ga:productSku` = col_character(),
date = col_date(format = "%Y-%m-%d"))) %>%
rename_with(~str_replace(., "ga:", ""), everything()) %>%
select(fecha = date,
idPatrocinador = productSku,
patrocinador = productBrand,
canal = channelGrouping,
fuenteMedio = sourceMedium,
impresiones = productListViews,
clics = productListClicks)
# Leer la data de creativos
creative <- read_csv("data/2-processed/hotsale_2022_creative_2022-05-10-2022-05-31.csv",
col_types = cols(date = col_date(format = "%Y-%m-%d"))) %>%
rename_with(~str_replace(., "ga:", ""), everything()) %>%
select(fecha = date,
tipoCreativo = dimension10,
impresiones = productListViews,
clics = productListClicks) %>%
mutate(tipoCreativo = case_when(
tipoCreativo == "Sponsor" ~ "Logo",
tipoCreativo == "Banner" ~ "Cintillo",
TRUE ~ tipoCreativo
))
# Leer datos de las instastories
insta_stories <- read_csv("data/2-processed/hotsale_2022_creative_instaStories_2022-05-01_2022-05-31.csv",
col_types = cols(date = col_date(format = "%Y-%m-%d"))) %>%
rename(fecha = date,
patrocinador = productBrand,
tipoCreativo = dimension10,
seccion = productListName,
clics = productListClicks) %>%
mutate(impresiones = case_when(tipoCreativo == "InstaStories" ~ productDetailViews,
TRUE ~ productListViews)) %>%
select(-productListViews,
-productDetailViews) %>%
mutate(tipoCreativo = case_when(
tipoCreativo == "Sponsor" ~ "Logo",
tipoCreativo == "Banner" ~ "Cintillo",
TRUE ~ tipoCreativo
))
# Leer la data de menu
menu <- read_csv("data/2-processed/hotsale_2022_menu_2022-05-16-2022-05-31.csv",
col_types = cols(...1 = col_skip(), `ga:totalEvents` = col_integer(),
`ga:uniqueEvents` = col_integer(),
date = col_date(format = "%Y-%m-%d"))) %>%
rename_with(~str_replace(., "ga:", ""), everything()) %>%
select(fecha = date,
elemento = eventLabel,
clicsTotales = totalEvents,
clicsUnicos = uniqueEvents)
# Leer la data de ofertas hot
ofertas_hot <- read_csv("data/2-processed/hotsale_2022_ofertas-hot_2022-05-18-2022-05-31.csv",
col_types = cols(...1 = col_skip(), date = col_date(format = "%Y-%m-%d"))) %>%
rename_with(~str_replace(., "ga:", ""), everything()) %>%
mutate(pagePath = str_remove(pagePath, "/ofertas-hot")) %>%
select(fecha = date,
pagina = pagePath,
paginasVistas = pageviews,
paginasVistasUnicas = uniquePageviews)
# Leer la data de productos
products <- read_csv("data/2-processed/hotsale-2022-products.csv",
col_types = cols(productSku = col_character(),
date = col_date(format = "%Y-%m-%d"))) %>%
rename_with(~str_replace(., "ga:", ""), everything()) %>%
select(fecha = date,
idPatrocinador = productSku,
patrocinador = productBrand,
seccion = productListName,
nivelPatrocinio = dimension7,
impresiones = views,
clics)
# Leer la data de las búsquedas
searches <- read_csv("data/2-processed/hotsale_2022_searches_2022-05-16-2022-05-31.csv",
col_types = cols(...1 = col_skip(), date = col_date(format = "%Y-%m-%d"))) %>%
rename_with(~str_replace(., "ga:", ""), everything()) %>%
select(fecha = date,
busqueda = eventLabel,
totalBusquedas = totalEvents,
busquedasUnicas = uniqueEvents)
# Leer la data de las secciones
sections <- read_csv("data/2-processed/hotsale_2022_sections_2022-05-01-2022-05-31.csv",
col_types = cols(date = col_date(format = "%Y-%m-%d"),
`ga:pageviews` = col_integer(), `ga:uniquePageviews` = col_integer()))%>%
rename_with(~str_replace(., "ga:", ""), everything()) %>%
select(fecha = date,
seccion = cleanPage,
paginasVistas = pageviews,
paginasVistasUnicas = uniquePageviews)
# Leer la data de favoritos
wishlist <- read_csv("data/2-processed/hotsale_2022_wishlist_2022-05-04-2022-05-31.csv",
col_types = cols(date = col_date(format = "%Y-%m-%d"))) %>%
rename_with(~str_replace(., "ga:", ""), everything()) %>%
select(fecha = date,
totalFavoritos = totalEvents,
favoritosUnicos = uniqueEvents)
products %>%
group_by(fecha) %>%
summarise(impresiones = comma(sum(impresiones),
digits = 0),
clics = comma(sum(clics),
digits = 0)) %>%
plot_ly(x = ~fecha) %>%
add_trace(y = ~impresiones,
type = 'scatter',
mode = 'lines',
name = 'impresiones',
line = list(color = color_palette[2],
width = 2)) %>%
add_trace(y = ~clics,
type = 'scatter',
mode = 'lines',
name = 'clics',
line = list(color = color_palette[1],
width = 4)) %>%
layout(title = "Tendencia de las impresiones y clics por día<br><sub>Del 1 al 31 mayo del 2022</sub>",
xaxis = list(title = "",
showline = TRUE,
showgrid = FALSE,
showticklabels = TRUE,
linecolor = 'rgb(204, 204, 204)',
linewidth = 2,
autotick = FALSE,
ticks = 'outside',
tickcolor = 'rgb(204, 204, 204)',
tickwidth = 2,
ticklen = 5,
tickfont = list(family = 'PT Sans Narrow',
size = 12,
color = 'rgb(82, 82, 82)')),
yaxis = list(title = "",
type = "log",
showline = TRUE,
showgrid = TRUE,
showticklabels = TRUE,
linecolor = 'rgb(204, 204, 204)',
linewidth = 2,
autotick = FALSE,
ticks = 'outside',
tickcolor = 'rgb(204, 204, 204)',
tickwidth = 2,
ticklen = 5,
tickfont = list(family = 'PT Sans Narrow',
size = 12,
color = 'rgb(82, 82, 82)')),
margin = list(autoexpand = TRUE,
t = 100,
l = 50,
r = 200,
b = 100),
autosize = TRUE,
showlegend = TRUE,
annotations = list(
xref = 'paper',
yref = 'paper',
x = 0.73,
y = 0.5,
xanchor = 'right',
yanchor = 'middle',
text = 'Primer día del Hot Sale',
font = list(family = 'PT Sans Narrow',
size = 16,
color = 'rgba(160,160,160,1)'),
showarrow = TRUE)) %>%
layout(annotations = list(
xref = 'paper',
yref = 'paper',
x = 1,
y = 0.44,
xanchor = 'left',
yanchor = 'middle',
text = 'Último día del Hot Sale',
font = list(family = 'PT Sans Narrow',
size = 16,
color = 'rgba(160,160,160,1)'),
showarrow = TRUE))Se observa que del 1 al 17 de mayo hay un crecimiento exponencial en las impresiones y clics, que aumenta aun más a partir de esa fecha y hasta el 23, del 24 al 31 los clics se mantienen entre los 200K y los 400K, lo que refiere a un comportamiento más estable que en ediciones pasadas.
products %>%
group_by(fecha) %>%
summarise(CTR = sum(clics) / sum(impresiones)) %>%
plot_ly(x = ~fecha) %>%
add_trace(y = ~CTR,
type = 'scatter',
mode = 'lines',
name = 'CTR',
line = list(color = color_palette[1],
width = 4)) %>%
layout(title = "Tendencia del CTR por día<br><sub>Del 1 al 31 Mayo de 2022<sub>",
xaxis = list(title = "",
showline = TRUE,
showgrid = FALSE,
showticklabels = TRUE,
linecolor = 'rgb(204, 204, 204)',
linewidth = 2,
autotick = FALSE,
ticks = 'outside',
tickcolor = 'rgb(204, 204, 204)',
tickwidth = 2,
ticklen = 5,
tickfont = list(family = 'PT Sans Narrow',
size = 12,
color = 'rgb(82, 82, 82)')),
yaxis = list(title = "% CTR",
showline = TRUE,
showgrid = TRUE,
showticklabels = TRUE,
linecolor = 'rgb(204, 204, 204)',
linewidth = 2,
autotick = TRUE,
ticks = 'outside',
tickcolor = 'rgb(204, 204, 204)',
tickwidth = 2,
ticklen = 5,
tickformat = ".2%",
tickfont = list(family = 'PT Sans Narrow',
size = 12,
color = 'rgb(82, 82, 82)')),
margin = list(autoexpand = TRUE,
t = 100,
l = 10,
r = 110,
b = 100),
autosize = TRUE,
showlegend = FALSE,
annotations = list(
xref = 'paper',
yref = 'paper',
x = 0.73,
y = 0.16,
xanchor = 'right',
yanchor = 'middle',
text = 'Primer del Hot Sale',
font = list(family = 'PT Sans Narrow',
size = 16,
color = 'rgba(160,160,160,1)'),
showarrow = TRUE)) %>%
layout(annotations = list(
xref = 'paper',
yref = 'paper',
x = 1,
y = 0.10,
xanchor = 'left',
yanchor = 'middle',
text = 'Último del Hot Sale',
font = list(family = 'PT Sans Narrow',
size = 16,
color = 'rgba(160,160,160,1)'),
showarrow = TRUE))Por su parte el CTR alcanza un pico importante el miércoles 4 de mayo ya que durante todo ese periodo se realizaron pruebas en el sitio productivo para verificar la capa de datos. lo que disparo el CTR, ya durante el evento se observan 2 picos importantes que superan el 0.10% del CTR: el primer día del evento (lunes 23 de mayo) y el jueves 26, el peor rendimiento observado fue el último día del evento (el martes 31 de mayo) con 0.06% del CTR.
products %>%
filter(between(fecha,as.Date("2022-05-23"),
as.Date("2022-05-31"))) %>%
mutate(diaSemana = factor(wday(fecha, week_start = 1))) %>%
mutate(diaSemana = recode_factor(diaSemana,
`1` = "lunes",
`2` = "martes",
`3` = "miércoles",
`4` = "jueves",
`5` = "viernes",
`6` = "sábado",
`7` = "domingo",
.ordered = TRUE)) %>%
group_by(diaSemana) %>%
summarise(CTR = sum(clics) / sum(impresiones)) %>%
plot_ly(x = ~diaSemana, y = ~CTR, type = "bar", marker = list(color = color_palette[1])) %>%
layout(title = "CTR por día de la semana",
xaxis = list(title = "Día de la semana",
showline = TRUE,
showgrid = FALSE,
showticklabels = TRUE,
linecolor = 'rgb(204, 204, 204)',
linewidth = 2,
autotick = FALSE,
ticks = 'outside',
tickcolor = 'rgb(204, 204, 204)',
tickwidth = 2,
ticklen = 5,
tickfont = list(family = 'PT Sans Narrow',
size = 12,
color = 'rgb(82, 82, 82)')),
yaxis = list(title = "% CTR",
showline = TRUE,
showgrid = TRUE,
showticklabels = TRUE,
linecolor = 'rgb(204, 204, 204)',
linewidth = 2,
autotick = TRUE,
ticks = 'outside',
tickcolor = 'rgb(204, 204, 204)',
tickwidth = 2,
ticklen = 5,
tickformat = ".2%",
tickfont = list(family = 'PT Sans Narrow',
size = 12,
color = 'rgb(82, 82, 82)'))) Al agrupar por día de la semana podemos ver que el jueves tiene el mejor CTR mientras que los martes son los que tienen el peor desempeño.
date_hour %>%
plot_ly(x = ~diaSemana,
y = ~hora,
z = ~clics,
type = "heatmap",
colors = colorRamp(c("#ffffff", color_palette[1]))
) %>%
layout(title = "Mapa de calor de los clics por hora y día de la semana",
xaxis = list(title = "Día de la semana",
showline = TRUE,
showgrid = FALSE,
showticklabels = TRUE,
linecolor = 'rgb(204, 204, 204)',
linewidth = 2,
autotick = FALSE,
ticks = 'outside',
tickcolor = 'rgb(204, 204, 204)',
tickwidth = 2,
ticklen = 5,
tickfont = list(family = 'PT Sans Narrow',
size = 12,
color = 'rgb(82, 82, 82)')),
yaxis = list(title = "Hora",
showline = TRUE,
showgrid = TRUE,
showticklabels = TRUE,
linecolor = 'rgb(204, 204, 204)',
linewidth = 2,
autotick = TRUE,
ticks = 'outside',
tickcolor = 'rgb(204, 204, 204)',
tickwidth = 2,
ticklen = 5,
tickfont = list(family = 'PT Sans Narrow',
size = 12,
color = 'rgb(82, 82, 82)'))) date_hour %>%
mutate(CTR = percent(clics / impresiones)) %>%
plot_ly(x = ~diaSemana,
y = ~hora,
z = ~CTR,
type = "heatmap",
colors = colorRamp(c("#ffffff", color_palette[1]))
) %>%
layout(title = "Mapa de calor del CTR por hora y día de la semana",
xaxis = list(title = "Día de la semana",
showline = TRUE,
showgrid = FALSE,
showticklabels = TRUE,
linecolor = 'rgb(204, 204, 204)',
linewidth = 2,
autotick = FALSE,
ticks = 'outside',
tickcolor = 'rgb(204, 204, 204)',
tickwidth = 2,
ticklen = 5,
tickfont = list(family = 'PT Sans Narrow',
size = 12,
color = 'rgb(82, 82, 82)')),
yaxis = list(title = "Hora",
showline = TRUE,
showgrid = TRUE,
showticklabels = TRUE,
linecolor = 'rgb(204, 204, 204)',
linewidth = 2,
autotick = TRUE,
ticks = 'outside',
tickcolor = 'rgb(204, 204, 204)',
tickwidth = 2,
ticklen = 5,
tickfont = list(family = 'PT Sans Narrow',
size = 12,
color = 'rgb(82, 82, 82)'))) %>%
colorbar(tickformat = ".2%")
channels %>%
group_by(canal) %>%
summarise(impresiones = sum(impresiones),
clics = sum(clics),
CTR = percent(sum(clics) / sum(impresiones))) %>%
mutate(pct_impresiones = percent(impresiones / sum(impresiones))) %>%
select(canal,
pct_impresiones,
CTR) %>%
arrange(desc(pct_impresiones)) %>%
formattable(list(
pct_impresiones = color_bar(color = color_palette[2], fun = "proportion"),
CTR = color_bar(color = color_palette[1])))| canal | pct_impresiones | CTR |
|---|---|---|
| Paid Media | 87.31% | 0.07% |
| (Other) | 6.40% | 0.06% |
| Organic Search | 3.32% | 0.25% |
| Direct | 1.68% | 0.24% |
| Social | 0.49% | 0.18% |
| 0.32% | 0.32% | |
| Paid Search | 0.25% | 0.13% |
| Referral | 0.22% | 0.22% |
| Other Advertising | 0.00% | 0.05% |
| Display | 0.00% | 0.00% |
El trafico que llego por el canal Paid Media tuvo el
87% del total de las impresiones lo que lo hace el
canal preponderante en cantidad de impresiones, sin embargo
Email, Organic Search y
Direct fueron los canales con el mejor rendimiento ya que
su CTR se mantuvo por encima de la media.
channels %>%
group_by(fuenteMedio) %>%
summarise(impresiones = sum(impresiones),
clics = sum(clics),
CTR = percent(sum(clics) / sum(impresiones))) %>%
mutate(pct_impresiones = percent(impresiones / sum(impresiones))) %>%
select(fuenteMedio,
pct_impresiones,
CTR) %>%
arrange(desc(pct_impresiones)) %>%
head(30) %>%
formattable(list(
pct_impresiones = color_bar(color = color_palette[2], fun = "proportion"),
CTR = color_bar(color = color_palette[1])))| fuenteMedio | pct_impresiones | CTR |
|---|---|---|
| tiktok / cpc | 44.67% | 0.03% |
| google / cpc | 34.90% | 0.12% |
| google / paid | 5.16% | 0.04% |
| google / organic | 3.24% | 0.25% |
| taboola / cpc | 2.40% | 0.06% |
| facebook / cpc | 2.28% | 0.13% |
| (direct) / (none) | 1.68% | 0.24% |
| twitter / cpc | 1.08% | 0.01% |
| erre / soc | 0.96% | 0.17% |
| huawei / cpc | 0.68% | 0.01% |
| facebook / paid | 0.59% | 0.13% |
| tiktok / paid | 0.43% | 0.05% |
| bing / cpc | 0.37% | 0.23% |
| l.instagram.com / referral | 0.27% | 0.17% |
| emBlue / email | 0.23% | 0.29% |
| grupoimagen / cpc | 0.12% | 0.05% |
| l.facebook.com / referral | 0.09% | 0.19% |
| rtbhouse / retargeting | 0.09% | 0.14% |
| lm.facebook.com / referral | 0.06% | 0.19% |
| bing / organic | 0.06% | 0.37% |
| promodescuentos.com / referral | 0.04% | 0.18% |
| newsletter / email | 0.04% | 0.63% |
| link / link | 0.04% | 0.15% |
| televisa / cpc | 0.03% | 0.01% |
| tvazteca / cpc | 0.03% | 0.03% |
| instagram.com / referral | 0.03% | 0.15% |
| industry_event / email | 0.03% | 0.12% |
| m.facebook.com / referral | 0.02% | 0.20% |
| ml / soc | 0.02% | 0.15% |
| tvazteca / soc | 0.02% | 0.10% |
Al desagregar por Fuentes Medios descubrimos que
tiktok / cpc es responsable del 45% de las impresiones
totales, mientras que google / cpc le sigue con el 35% con
lo que suman el 80% del trafico total. Por otro lado la
relevancia del trafico traído por google / organic
y directo es muy superior.
El objetivo de los siguientes gráficos es poder comprobar que la distribución de los canales en los mejores patrocinadores (basado en los clics recibidos) dista mucho de la configuración de los canales de los patrocinadores que tuvieron un rendimiento inferior (a pesar de estar dentro del top 30 en impresiones).
Los siguientes patrocinadores tuvieron el mejor rendimiento en clics:
top_sponsors <- channels %>%
filter(between(fecha,as.Date("2022-05-23"), as.Date("2022-05-31"))) %>%
group_by(patrocinador) %>%
summarise(impresiones = sum(impresiones),
clics = sum(clics),
CTR = percent(sum(clics) / sum(impresiones))) %>%
arrange(desc(clics)) %>%
head(10)
worst_sponsors <- channels %>%
filter(between(fecha,as.Date("2022-05-23"), as.Date("2022-05-31"))) %>%
filter(!patrocinador %in% top_sponsors$patrocinador) %>%
group_by(patrocinador) %>%
summarise(impresiones = sum(impresiones),
clics = sum(clics),
CTR = percent(sum(clics) / sum(impresiones))) %>%
arrange(desc(impresiones)) %>%
head(30) %>%
arrange(CTR) %>%
head(10)
g <- channels %>%
filter(between(fecha,as.Date("2022-05-23"), as.Date("2022-05-31"))) %>%
filter(patrocinador %in% top_sponsors$patrocinador) %>%
group_by(patrocinador,
canal) %>%
summarise(impresiones = sum(impresiones),
clics = sum(clics),
CTR = percent(sum(clics) / sum(impresiones))) %>%
mutate(pct_impresiones = percent(impresiones / sum(impresiones)),
pct_clics = percent(clics / sum(clics))) %>%
arrange(desc(pct_impresiones)) %>%
ggplot(aes(x = pct_impresiones, y = pct_clics, size = CTR, color = canal)) +
geom_point(alpha = 0.6) +
scale_size(range = c(1, 10), name="%CTR") +
scale_x_log10(name = "% impresiones", labels = scales::percent) +
scale_y_log10(name = "% clics", labels = scales::percent) +
facet_wrap(vars(patrocinador), ncol = 2) +
theme(axis.title=element_text(size=10,face="bold")) +
theme_light()
ggplotly(g)Los siguientes patrocinadores tuvieron un rendimiento inferior a la media de su categoría con respecto a clics:
g <- channels %>%
filter(between(fecha,
as.Date("2022-05-23"),
as.Date("2022-05-31"))) %>%
filter(patrocinador %in% worst_sponsors$patrocinador) %>%
group_by(patrocinador,
canal) %>%
summarise(impresiones = sum(impresiones),
clics = sum(clics),
CTR = percent(sum(clics) / sum(impresiones))) %>%
mutate(pct_impresiones = percent(impresiones / sum(impresiones)),
pct_clics = percent(clics / sum(clics))) %>%
arrange(desc(pct_impresiones)) %>%
ggplot(aes(x = pct_impresiones, y = pct_clics, size = CTR, color = canal)) +
geom_point(alpha = 0.6) +
scale_size(range = c(1, 10), name="%CTR") +
scale_x_log10(name = "% impresiones", labels = scales::percent) +
scale_y_log10(name = "% clics", labels = scales::percent) +
facet_wrap(vars(patrocinador), ncol = 2) +
theme(axis.title=element_text(size=10,face="bold")) +
theme_light()
ggplotly(g)El eje horizontal representa el porcentaje de impresiones recibidas, el eje vertical el porcentaje de clics y el tamaño de la burbuja es el CTR.
channels %>%
filter(between(fecha,as.Date("2022-05-23"), as.Date("2022-05-31"))) %>%
group_by(fecha,
canal) %>%
summarise(impresiones = sum(impresiones)) %>%
mutate(canal = fct_rev(as_factor(tolower(fct_reorder(canal,
impresiones,
.fun = sum,
.desc = FALSE))))) %>%
mutate(pct_impresiones = percent(impresiones / sum(impresiones))) %>%
plot_ly(x = ~fecha,
y = ~pct_impresiones,
type = "bar",
name = ~canal,
color = ~canal,
colors = color_palette[3]) %>%
layout(title = "Distribución del % de impresiones por canal por día",
yaxis = list(title = "% de impresiones",
tickformat = ".0%"),
barmode = "stack",
font = list(family = "PT Sans Narrow'"),
legend = list(font = list(size = 9)))Durante los días del evento se observa que el % de participación de
paid media en las impresiones se mantuvo entre el
74% y el 79%, siendo el jueves 26 el día con la menor y el martes 31 el
de mayor participación.
channels %>%
filter(between(fecha,as.Date("2022-05-23"), as.Date("2022-05-31"))) %>%
group_by(fecha,
canal) %>%
summarise(clics = sum(clics)) %>%
mutate(canal = fct_rev(as_factor(tolower(fct_reorder(canal,
clics,
.fun = sum,
.desc = FALSE))))) %>%
mutate(pct_clics = percent(clics / sum(clics))) %>%
plot_ly(x = ~fecha,
y = ~pct_clics,
type = "bar",
name = ~canal,
color = ~canal,
colors = color_palette[3]) %>%
layout(title = "Distribución del % de clics por canal por día",
yaxis = list(title = "% de clics",
tickformat = ".0%"),
barmode = "stack",
font = list(family = "PT Sans Narrow'"))Respecto al % de clics vemos que paid media
mantiene entre el 68% y el 85% de participación, sin embargo
cede un porcentaje importante para los canales
organic search, directo y
(other), principalmente durante el primer y antepenúltimo
día del evento.
channels %>%
filter(between(fecha,as.Date("2022-05-23"), as.Date("2022-05-31"))) %>%
group_by(fecha,
canal) %>%
summarise(impresiones = sum(impresiones),
clics = sum(clics),
CTR = sum(clics) / sum(impresiones)) %>%
mutate(canal = fct_rev(as_factor(tolower(fct_reorder(canal,
clics,
.fun = sum,
.desc = FALSE))))) %>%
mutate(pct_CTR = percent(CTR / sum(CTR))) %>%
plot_ly(x = ~fecha,
y = ~pct_CTR,
type = "bar",
name = ~canal,
color = ~canal,
colors = color_palette[3]) %>%
layout(title = "Distribución del % del CTR por canal por día",
yaxis = list(title = "% del CTR",
tickformat = ".0%"),
barmode = "stack",
font = list(family = "PT Sans Narrow'"))En cuanto al % del CTR vemos un panorama totalmente distinto con
paid search con entre el 4% y el 9% de la participación,
mientras que email, organic search y
direct tienen la mayoría en prácticamente todos los días
del evento.
channels %>%
filter(between(fecha,as.Date("2022-05-23"),
as.Date("2022-05-31"))) %>%
group_by(fecha,
fuenteMedio) %>%
summarise(impresiones = sum(impresiones)) %>%
mutate(fuenteMedio = fct_lump_n(
fuenteMedio,
9,
w = impresiones,
other_level = "Others")) %>%
mutate(fuenteMedio = fct_rev(as_factor(tolower(fct_reorder(fuenteMedio,
impresiones,
.fun = sum,
.desc = FALSE))))) %>%
mutate(pct_impresiones = percent(impresiones / sum(impresiones))) %>%
plot_ly(x = ~fecha,
y = ~pct_impresiones,
type = "bar",
name = ~fuenteMedio,
color = ~fuenteMedio,
colors = color_palette[3]) %>%
layout(title = "Distribución del % de impresiones por fuente / medio por día",
yaxis = list(title = "% de impresiones",
tickformat = ".0%"),
barmode = "stack",
font = list(family = "PT Sans Narrow'"),
legend = list(font = list(size = 9)))Observamos que google cpc y ticktok tienen
la mayor cantidad de impresiones durante todo el evento, con
aproximadamente el 80% de la participación por día.
channels %>%
filter(between(fecha,as.Date("2022-05-23"),
as.Date("2022-05-31"))) %>%
group_by(fecha,
fuenteMedio) %>%
summarise(clics = sum(clics)) %>%
mutate(fuenteMedio = fct_lump_n(
fuenteMedio,
9,
w = clics,
other_level = "Others")) %>%
mutate(fuenteMedio = fct_rev(as_factor(tolower(fct_reorder(fuenteMedio,
clics,
.fun = sum,
.desc = FALSE))))) %>%
mutate(pct_clics = percent(clics / sum(clics))) %>%
plot_ly(x = ~fecha,
y = ~pct_clics,
type = "bar",
name = ~fuenteMedio,
color = ~fuenteMedio,
colors = color_palette[3]) %>%
layout(title = "Distribución del % de clics por fuente / medio por día",
yaxis = list(title = "% de clics",
tickformat = ".0%"),
barmode = "stack",
font = list(family = "PT Sans Narrow'"),
legend = list(font = list(size = 9)))Sin embargo en la cantidad de clics vemos claramente que
google cpc domina la participación, es interesante observar
que a partir del 26 de mayo el % de clics provenientes de
ticktok aumenta de forma considerable.
insta_stories %>%
filter(between(fecha,as.Date("2022-05-23"), as.Date("2022-05-31"))) %>%
group_by(tipoCreativo) %>%
summarise(impresiones = comma(sum(impresiones),0),
clics = comma(sum(clics),0),
CTR = percent(sum(clics) / sum(impresiones))) %>%
mutate(pct_impresiones = percent(impresiones / sum(impresiones))) %>%
arrange(desc(pct_impresiones)) %>%
formattable(list(
pct_impresiones = color_bar(color = color_palette[2], fun = "proportion"),
CTR = color_bar(color = color_palette[1])))| tipoCreativo | impresiones | clics | CTR | pct_impresiones |
|---|---|---|---|---|
| Logo | 2,883,875,944 | 1,997,674 | 0.07% | 90.00% |
| Producto | 263,167,698 | 582,848 | 0.22% | 8.21% |
| Cintillo | 56,356,642 | 312,419 | 0.55% | 1.76% |
| InstaStories | 864,149 | 20,922 | 2.42% | 0.03% |
El tipo de creativo que recibió mayor porcentaje de impresiones fueron los logos de los patrocinadores, sin embargo el tipo de creativo con mejor CTR fueron las insta stories y los cintillos.
insta_stories %>%
filter(between(fecha,as.Date("2022-05-23"),
as.Date("2022-05-31"))) %>%
group_by(fecha,
tipoCreativo) %>%
summarise(CTR = percent(sum(clics) / sum(impresiones)),
clics = sum(clics)) %>%
mutate(pct_clics = percent(clics / sum(clics))) %>%
plot_ly(x = ~fecha,
y = ~pct_clics,
type = "bar",
name = ~tipoCreativo,
color = ~tipoCreativo,
colors = color_palette[3]) %>%
layout(title = "Distribución del % clics por tipo de creativo por día",
yaxis = list(title = "% de clics",
tickformat = ".0%"), barmode = "stack",
font = list(family = "PT Sans Narrow'"))En la distribución por clic por tipo de creativo se aprecia claramente que los logos esta entre el 60% y 75% durante el evento, los productos y los cintillos incrementan su participación al final del evento.
insta_stories %>%
filter(between(fecha,as.Date("2022-05-23"), as.Date("2022-05-31"))) %>%
group_by(fecha,
tipoCreativo) %>%
summarise(CTR = percent(sum(clics) / sum(impresiones)),
impresiones = sum(impresiones)) %>%
mutate(pct_CTR = percent(CTR / sum(CTR))) %>%
plot_ly(x = ~fecha,
y = ~pct_CTR,
type = "bar",
name = ~tipoCreativo,
color = ~tipoCreativo,
colors = color_palette[3]) %>%
layout(title = "Distribución del CTR por tipo de creativo por día",
yaxis = list(title = "CTR",
tickformat = ".0%"),
barmode = "stack",
font = list(family = "PT Sans Narrow'"))Podemos observar que durante el evento las insta stories tienen un excelente CTR durante todo el evento pero sobre todo los primeros días.
insta_stories %>%
group_by(tipoCreativo,
seccion) %>%
summarise(clics = comma(sum(clics),0)) %>%
pivot_wider(names_from = tipoCreativo,
values_from = clics) %>%
mutate(pct_logo = percent(Logo / sum(Logo, na.rm = TRUE)),
pct_producto = percent(Producto / sum(Producto, na.rm = TRUE)),
pct_cintillo = percent(Cintillo / sum(Cintillo, na.rm = TRUE)),
pct_instaStories = percent(InstaStories / sum(InstaStories, na.rm = TRUE))) %>%
select(seccion,
contains("pct_")) %>%
arrange(desc(pct_instaStories)) %>%
formattable(list(
pct_logo = color_bar(color = color_palette[2]),
pct_producto = color_bar(color = color_palette[2]),
pct_cintillo = color_bar(color = color_palette[2]),
pct_instaStories = color_bar(color = color_palette[1])
))| seccion | pct_logo | pct_producto | pct_cintillo | pct_instaStories |
|---|---|---|---|---|
| Home | 75.89% | 11.12% | 62.01% | 86.11% |
| Electro y tecno | 9.23% | 9.68% | 27.64% | 5.59% |
| Ropa y Calzado | 4.37% | 1.08% | 2.55% | 3.19% |
| Viajes | 2.75% | 1.63% | 1.41% | 1.71% |
| Deportes | 1.33% | 0.71% | 1.80% | 1.60% |
| Muebles y Hogar | 1.91% | 0.65% | 1.34% | 0.73% |
| Belleza | 0.86% | 0.85% | 1.52% | 0.53% |
| Alimentos y Bebidas | 0.29% | 0.08% | 0.33% | 0.28% |
| Otros / Servicios | 0.11% | 0.02% | 0.06% | 0.10% |
| Automotriz | 0.58% | 0.24% | 0.31% | 0.09% |
| Mascotas | 0.15% | 0.10% | NA | 0.04% |
| Luxury | 0.10% | 0.04% | 0.06% | 0.01% |
| content | 0.00% | NA | 0.00% | 0.01% |
| B2B | 0.17% | NA | 0.00% | NA |
| Layer 2 | 0.00% | 0.00% | 0.00% | NA |
| Ofertas Flash | 0.06% | 1.00% | 0.94% | NA |
| Sponsor | 0.47% | 7.42% | 0.01% | NA |
| tipsempresas | 0.00% | NA | 0.00% | NA |
| TokenSigning | 0.00% | 0.00% | 0.00% | NA |
| favoritos | 0.06% | 0.05% | NA | NA |
| Índice | 0.74% | NA | NA | NA |
| kueskipay | 0.00% | NA | NA | NA |
| Mega Ofertas | 0.43% | 5.04% | NA | NA |
| Noticia | 0.01% | 0.03% | NA | NA |
| Noticias | 0.00% | NA | NA | NA |
| Ofertas Hot | 0.41% | 60.26% | NA | NA |
| preLanding | 0.00% | NA | NA | NA |
| Productos Hot | 0.08% | 0.00% | NA | NA |
| Registro | 0.00% | NA | NA | NA |
insta_stories %>%
filter(tipoCreativo == "InstaStories") %>%
group_by(patrocinador) %>%
summarise(impresiones = comma(sum(impresiones),0),
clics = comma(sum(clics),0),
CTR = percent(sum(clics) / sum(impresiones))) %>%
arrange(desc(impresiones)) %>%
head(50) %>%
arrange(desc(CTR)) %>%
head(10) %>%
formattable(list(
CTR = color_bar(color = color_palette[1])
))| patrocinador | impresiones | clics | CTR |
|---|---|---|---|
| Poco XIaomi MiStore | 41,412 | 6,684 | 16.14% |
| Puma | 11,421 | 1,343 | 11.76% |
| Autobuses ADO | 3,025 | 249 | 8.23% |
| Sportico | 34,638 | 2,575 | 7.43% |
| Eucerin | 22,786 | 1,471 | 6.46% |
| Xiaomi | 30,391 | 1,916 | 6.30% |
| La Europea | 41,298 | 2,517 | 6.09% |
| Super Colchones | 8,274 | 445 | 5.38% |
| American Eagle | 7,874 | 412 | 5.23% |
| Prissa | 44,192 | 2,303 | 5.21% |
insta_stories %>%
filter(tipoCreativo == "InstaStories") %>%
group_by(patrocinador) %>%
summarise(impresiones = comma(sum(impresiones),0),
clics = comma(sum(clics),0),
CTR = percent(sum(clics) / sum(impresiones))) %>%
arrange(desc(impresiones)) %>%
head(50) %>%
arrange(CTR) %>%
head(10) %>%
formattable(list(
CTR = color_bar(color = color_palette[1])
))| patrocinador | impresiones | clics | CTR |
|---|---|---|---|
| Sorteos Tec | 4,488 | 17 | 0.38% |
| Zettle | 13,431 | 81 | 0.60% |
| Pedidos.com | 11,776 | 77 | 0.65% |
| Cosmic Shop | 2,416 | 16 | 0.66% |
| Tienda Aeromexico | 2,094 | 15 | 0.72% |
| Sillas ADS | 2,647 | 20 | 0.76% |
| THE BAR | 7,322 | 59 | 0.81% |
| Enterogermina | 9,171 | 77 | 0.84% |
| Odetta.com | 43,440 | 366 | 0.84% |
| CV Directo | 44,513 | 403 | 0.91% |
menu %>%
filter(between(fecha,as.Date("2022-05-23"), as.Date("2022-05-31"))) %>%
mutate(elemento = fct_lump_n(
elemento,
20,
w = clicsTotales,
other_level = "Others")) %>%
group_by(elemento) %>%
summarise(clicsTotales = comma(sum(clicsTotales),0)) %>%
mutate(pct_clics = percent(clicsTotales / sum(clicsTotales))) %>%
arrange(desc(pct_clics)) %>%
formattable(list(pct_clics = color_bar(color = color_palette[1], fun = "proportion"),
clicsTotales = color_bar(color = color_palette[2])))| elemento | clicsTotales | pct_clics |
|---|---|---|
| Electro y tecno | 54,347 | 19.19% |
| Ropa y Calzado | 46,695 | 16.49% |
| Muebles y Hogar | 35,989 | 12.71% |
| Viajes | 29,053 | 10.26% |
| Automotriz | 17,745 | 6.27% |
| Mega Ofertas | 14,795 | 5.23% |
| Belleza | 14,452 | 5.10% |
| Ofertas Hot | 14,047 | 4.96% |
| Deportes | 11,877 | 4.19% |
| Ofertas Flash | 11,422 | 4.03% |
| Alimentos y Bebidas | 9,715 | 3.43% |
| Mascotas | 6,880 | 2.43% |
| Otros / Servicios | 5,487 | 1.94% |
| B2B / Servicios Financieros | 5,023 | 1.77% |
| Luxury | 4,282 | 1.51% |
| Preventa KueskiPay | 1,335 | 0.47% |
menu %>%
filter(between(fecha,as.Date("2022-05-23"), as.Date("2022-05-31"))) %>%
mutate(elemento = fct_lump_n(
elemento,
10,
w = clicsTotales,
other_level = "Others")) %>%
group_by(fecha,
elemento) %>%
summarise_if(is.numeric, sum) %>%
mutate(pct_clics = percent(clicsTotales / sum(clicsTotales))) %>%
plot_ly(x = ~fecha,
y = ~pct_clics,
type = "bar",
name = ~elemento,
color = ~elemento,
colors = color_palette[3]) %>%
layout(title = "Distribución de los clics totales por elemento del menú por día",
yaxis = list(title = "% de los clics totales",
tickformat = ".0%"), barmode = "stack",
font = list(family = "PT Sans Narrow'"))ofertas_hot %>%
filter(between(fecha,as.Date("2022-05-23"), as.Date("2022-05-31"))) %>%
mutate(pagina = fct_lump_n(
pagina,
20,
w = paginasVistas,
other_level = "Others")) %>%
group_by(pagina) %>%
summarise(paginasVistas = comma(sum(paginasVistas), 0),
paginasVistasUnicas = comma(sum(paginasVistasUnicas),0)) %>%
filter(!pagina == "Others") %>%
mutate(pct_paginasVistasUnicas = percent(paginasVistasUnicas / sum(paginasVistasUnicas))) %>%
arrange(desc(pct_paginasVistasUnicas)) %>%
formattable(list(pct_paginasVistasUnicas = color_bar(color = color_palette[1], fun = "proportion"),
paginasVistasUnicas = color_bar(color = color_palette[2])))| pagina | paginasVistas | paginasVistasUnicas | pct_paginasVistasUnicas |
|---|---|---|---|
| /busqueda- | 75,829 | 48,595 | 22.36% |
| /electro-y-tecno/computacion-computadoras-y-laptops | 31,925 | 23,128 | 10.64% |
| /electro-y-tecno/electro-y-tecno-electrodomesticos-linea-blanca | 22,493 | 19,993 | 9.20% |
| /electro-y-tecno | 21,173 | 17,726 | 8.16% |
| /electro-y-tecno/electro-y-tecno-celulares-y-telefonia | 19,279 | 16,585 | 7.63% |
| /viajes/vuelos-nacionales | 21,859 | 14,264 | 6.56% |
| /ropa-y-calzado/calzado-zapatos | 12,137 | 9,100 | 4.19% |
| /electro-y-tecno/electro-y-tecno-pantallas-y-televisores | 9,090 | 7,583 | 3.49% |
| /viajes | 8,511 | 7,227 | 3.33% |
| /ropa-y-calzado/calzado-tenis | 8,858 | 6,430 | 2.96% |
| /electro-y-tecno/electro-y-tecno-celulares-y-telefonia?page=2 | 6,463 | 5,804 | 2.67% |
| /muebles-y-hogar/muebles-y-hogar-linea-blanca | 6,477 | 5,383 | 2.48% |
| /viajes/viajes-hoteles | 5,977 | 4,870 | 2.24% |
| /ropa-y-calzado | 5,778 | 4,828 | 2.22% |
| /busqueda-Iphone/electro-y-tecno-celulares-y-telefonia | 5,696 | 4,818 | 2.22% |
| /muebles-y-hogar | 5,761 | 4,693 | 2.16% |
| /ropa-y-calzado/ropa-y-calzado-pantalones-y-denim | 5,065 | 4,371 | 2.01% |
| /deportes/deportes-calzado-deportivo | 5,304 | 4,343 | 2.00% |
| /electro-y-tecno/electro-y-tecno-electrodomesticos-linea-blanca?page=2 | 4,500 | 4,024 | 1.85% |
| /busqueda-Alexa | 4,158 | 3,558 | 1.64% |
ofertas_hot %>%
filter(between(fecha,as.Date("2022-05-23"), as.Date("2022-05-31"))) %>%
filter(grepl("busqueda", pagina, ignore.case = TRUE)) %>%
mutate(pagina = fct_lump_n(
pagina,
10,
w = paginasVistas,
other_level = "Others")) %>%
group_by(pagina) %>%
summarise(paginasVistasUnicas = comma(sum(paginasVistasUnicas),0)) %>%
filter(!pagina == "Others") %>%
mutate(pct_paginasVistasUnicas = percent(paginasVistasUnicas / sum(paginasVistasUnicas))) %>%
arrange(desc(pct_paginasVistasUnicas)) %>%
formattable(list(pct_paginasVistasUnicas = color_bar(color = color_palette[1], fun = "proportion"),
paginasVistasUnicas = color_bar(color = color_palette[2])))| pagina | paginasVistasUnicas | pct_paginasVistasUnicas |
|---|---|---|
| /busqueda- | 48,595 | 62.54% |
| /busqueda-Iphone/electro-y-tecno-celulares-y-telefonia | 4,818 | 6.20% |
| /busqueda-Apple | 3,634 | 4.68% |
| /busqueda-Alexa | 3,558 | 4.58% |
| /busqueda-iPhone | 3,218 | 4.14% |
| /busqueda-Iphone | 3,060 | 3.94% |
| /busqueda-Xbox | 2,961 | 3.81% |
| /busqueda-Nike | 2,890 | 3.72% |
| /busqueda-Laptop/electro-y-tecno-computacion | 2,553 | 3.29% |
| /busqueda-Refrigerador | 2,412 | 3.10% |
products %>%
mutate(patrocinador = fct_lump_n(
patrocinador,
10,
w = impresiones,
other_level = "others")) %>%
group_by(patrocinador) %>%
summarise_if(is.numeric, sum) %>%
filter(!patrocinador == "others") %>%
arrange(desc(impresiones)) %>%
mutate(patrocinador = fct_rev(as_factor(tolower(fct_reorder(patrocinador,
impresiones,
.fun = sum,
.desc = FALSE))))) %>%
plot_ly(x = ~clics,
y = ~patrocinador,
type = "bar",
orientation = "h",
name = "clics",
marker = list(color = color_palette[2])) %>%
add_trace(x = ~impresiones,
name = "impresiones",
marker = list(color = color_palette[1])) %>%
layout(title = "Top 10 patrocinadores <br><sub>Ordenado por cantidad de impresiones</sub>",
margin = list(autoexpand = TRUE,
t = 100,
l = 200,
r = 150,
b = 100),
yaxis = list(title = 'Patrocinador',
automargin = TRUE),
xaxis = list(title = "",
type = "log"),
barmode = 'group')products %>%
filter(between(fecha,
as.Date("2022-05-23"),
as.Date("2022-05-31"))) %>%
mutate(patrocinador = fct_lump_n(
patrocinador,
10,
w = impresiones,
other_level = "others")) %>%
filter(!patrocinador == "others") %>%
group_by(fecha,
patrocinador) %>%
summarise_if(is.numeric, sum) %>%
mutate(pct_impresiones = percent(impresiones / sum(impresiones))) %>%
plot_ly(x = ~fecha,
y = ~pct_impresiones,
type = "bar",
name = ~patrocinador,
color = ~patrocinador,
colors = color_palette[3]) %>%
layout(title = "Distribución de las impresiones por patrocinador por día",
yaxis = list(title = "impresiones",
tickformat = ".0%"),
barmode = "stack",
font = list(family = "PT Sans Narrow'"))products %>%
filter(between(fecha,as.Date("2022-05-23"), as.Date("2022-05-31"))) %>%
mutate(patrocinador = fct_lump_n(
patrocinador,
10,
w = clics,
other_level = "others")) %>%
filter(!patrocinador == "others") %>%
group_by(fecha,
patrocinador) %>%
summarise_if(is.numeric, sum) %>%
mutate(pct_clics = percent(clics / sum(clics))) %>%
plot_ly(x = ~fecha,
y = ~pct_clics,
type = "bar",
name = ~patrocinador,
color = ~patrocinador,
colors = color_palette[3]) %>%
layout(title = "Distribución de los clics por patrocinador por día",
yaxis = list(title = "clics",
tickformat = ".0%"),
barmode = "stack",
font = list(family = "PT Sans Narrow'"))sponsor_level_ex <- c("indice-de-marcas",
"oferta-hot",
"favoritos",
"oferta-hot-preventa")
products %>%
filter(between(fecha,
as.Date("2022-05-23"),
as.Date("2022-05-31"))) %>%
filter(!nivelPatrocinio %in% sponsor_level_ex & !grepl(pattern = "marcas.*|cat-.*",
x = nivelPatrocinio,
ignore.case = TRUE)) %>%
group_by(nivelPatrocinio) %>%
summarise(n_patrocinadores = n_distinct(patrocinador)) %>%
arrange(desc(n_patrocinadores)) %>%
head(10) %>%
formattable(list(n_patrocinadores = color_bar(color = color_palette[1],
fun = "proportion")))| nivelPatrocinio | n_patrocinadores |
|---|---|
| insta-story-rotativo | 95 |
| plata-rotativo | 95 |
| bronce-rotativo | 90 |
| sponsor-y-apoyos | 89 |
| oro-rotativo | 58 |
| megaofertas | 51 |
| oferta-hot-destacado-categorias-top | 51 |
| mega-ofertas | 46 |
| oferta-hot-destacado-home | 45 |
| platino-rotativo | 40 |
products %>%
filter(between(fecha,as.Date("2022-05-23"), as.Date("2022-05-31"))) %>%
mutate(seccion = fct_lump_n(
seccion,
10,
w = clics,
other_level = "others")) %>%
filter(!seccion == "others") %>%
group_by(fecha,
seccion) %>%
summarise_if(is.numeric, sum) %>%
mutate(pct_clics = percent(clics / sum(clics))) %>% mutate() %>%
plot_ly(x = ~fecha,
y = ~pct_clics,
type = "bar",
name = ~seccion,
color = ~seccion,
colors = color_palette[3]) %>%
layout(title = "Distribución de los clics por seccion por día",
yaxis = list(title = "clics",
tickformat = ".0%"),
barmode = "stack",
font = list(family = "PT Sans Narrow'"))products %>%
filter(between(fecha,
as.Date("2022-05-23"),
as.Date("2022-05-31"))) %>%
group_by(seccion) %>%
summarise(n_patrocinadores = n_distinct(patrocinador)) %>%
arrange(desc(n_patrocinadores)) %>%
head(10) %>%
formattable(list(n_patrocinadores = color_bar(color = color_palette[1],
fun = "proportion")))| seccion | n_patrocinadores |
|---|---|
| Índice | 906 |
| Ofertas Hot | 615 |
| Home | 609 |
| favoritos | 510 |
| Sponsor | 309 |
| Ropa y Calzado | 160 |
| Muebles y Hogar | 139 |
| Electro y tecno | 134 |
| Mega Ofertas | 131 |
| Otros / Servicios | 113 |
products %>%
filter(between(fecha,as.Date("2022-05-23"), as.Date("2022-05-31"))) %>%
mutate(nivelPatrocinio = fct_lump_n(
nivelPatrocinio,
10,
w = impresiones,
other_level = "others")) %>%
filter(!nivelPatrocinio == "others") %>%
group_by(fecha,
nivelPatrocinio) %>%
summarise_if(is.numeric, sum) %>%
mutate(pct_impresiones = impresiones/ sum(impresiones)) %>%
plot_ly(x = ~fecha,
y = ~pct_impresiones,
type = "bar",
name = ~nivelPatrocinio,
color = ~nivelPatrocinio,
colors = color_palette[3]) %>%
layout(title = "Distribución de las impresiones por nivel de patrocinio por día",
yaxis = list(title = "impresiones",
tickformat = ".0%"),
barmode = "stack",
font = list(family = "PT Sans Narrow'"))products %>%
filter(between(fecha,as.Date("2022-05-23"), as.Date("2022-05-31"))) %>%
mutate(nivelPatrocinio = fct_lump_n(
nivelPatrocinio,
10,
w = clics,
other_level = "others")) %>%
filter(!nivelPatrocinio == "others") %>%
group_by(fecha,
nivelPatrocinio) %>%
summarise_if(is.numeric, sum) %>%
mutate(pct_clics = clics / sum(clics)) %>%
plot_ly(x = ~fecha,
y = ~pct_clics,
type = "bar",
name = ~nivelPatrocinio,
color = ~nivelPatrocinio,
colors = color_palette[3]) %>%
layout(title = "Distribución de los clics por nivel de patrocinio por día",
yaxis = list(title = "clics",
tickformat = ".0%"),
barmode = "stack",
font = list(family = "PT Sans Narrow'"))products %>%
filter(between(fecha,as.Date("2022-05-23"), as.Date("2022-05-31"))) %>%
mutate(nivelPatrocinio = fct_lump_n(
nivelPatrocinio,
10,
w = impresiones,
other_level = "others")) %>%
filter(!nivelPatrocinio == "others") %>%
group_by(fecha,
nivelPatrocinio) %>%
summarise(impresiones = sum(impresiones),
clics = sum(clics),
CTR = sum(clics) / sum(impresiones)) %>%
mutate(pct_CRT = CTR / sum(CTR)) %>%
plot_ly(x = ~fecha,
y = ~pct_CRT,
type = "bar",
name = ~nivelPatrocinio,
color = ~nivelPatrocinio,
colors = color_palette[3]) %>%
layout(title = "Distribución del CTR por nivel de patrocinio por día",
yaxis = list(title = "CTR",
tickformat = ".0%"),
barmode = "stack",
font = list(family = "PT Sans Narrow'"))products %>%
filter(grepl("tipsempresas",
seccion,
ignore.case = TRUE)) %>%
group_by(fecha) %>%
summarise(impresiones = sum(impresiones),
clics = sum(clics)) %>%
plot_ly(x = ~fecha) %>%
add_trace(y = ~clics,
type = 'scatter',
mode = 'lines',
name = 'clics',
line = list(color = color_palette[2],
width = 2)) %>%
add_trace(y = ~impresiones,
type = 'scatter',
mode = 'lines',
name = 'impresiones',
line = list(color = color_palette[1],
width = 4)) %>%
layout(title = "Landing tips - Tendencia por día",
xaxis = list(title = "",
showline = TRUE,
showgrid = FALSE,
showticklabels = TRUE,
linecolor = 'rgb(204, 204, 204)',
linewidth = 2,
autotick = FALSE,
ticks = 'outside',
tickcolor = 'rgb(204, 204, 204)',
tickwidth = 2,
ticklen = 5,
tickfont = list(family = 'PT Sans Narrow',
size = 12,
color = 'rgb(82, 82, 82)')),
yaxis = list(title = "",
type = "log"),
margin = list(autoexpand = TRUE,
t = 100,
l = 50,
r = 200,
b = 100),
autosize = TRUE,
showlegend = TRUE,
annotations = list(
xref = 'paper',
yref = 'paper',
x = 0.73,
y = 0.9,
xanchor = 'right',
yanchor = 'middle',
text = 'Primer del Hot Sale',
font = list(family = 'PT Sans Narrow',
size = 16,
color = 'rgba(160,160,160,1)'),
showarrow = TRUE)) %>%
layout(annotations = list(
xref = 'paper',
yref = 'paper',
x = 1,
y = 0.6,
xanchor = 'left',
yanchor = 'middle',
text = 'Último del Hot Sale',
font = list(family = 'PT Sans Narrow',
size = 16,
color = 'rgba(160,160,160,1)'),
showarrow = TRUE))products %>%
filter(grepl("tipsempresas",
seccion,
ignore.case = TRUE)) %>%
mutate(patrocinador = fct_lump_n(
patrocinador,
10,
w = impresiones,
other_level = "Others")) %>%
group_by(patrocinador) %>%
summarise_if(is.numeric, sum) %>%
mutate(patrocinador = as_factor(tolower(fct_reorder(patrocinador,
impresiones,
.fun = sum,
.desc = TRUE)))) %>%
filter(!patrocinador == "others") %>%
plot_ly(x = ~clics,
y = ~patrocinador,
type = "bar",
orientation = "h",
name = "clics",
marker = list(color = color_palette[2])) %>%
add_trace(x = ~impresiones,
name = "impresiones",
marker = list(color = color_palette[1])) %>%
layout(title = "Landings tips - Top 10 patrocinadores <br><sub>Ordenado por cantidad de impresiones</sub>",
margin = list(autoexpand = TRUE,
t = 100,
l = 200,
r = 150,
b = 100),
yaxis = list(title = 'Patrocinador',
automargin = TRUE),
xaxis = list(title = "",
type = "log"),
barmode = 'group')