Este cuaderno visualiza los patrones que siguen la publicidad de Mercadona en Twitter

Cargar librerĂ­as

if(!"tidyverse" %in% installed.packages()) {install.packages("tidyverse")}
if(!"scales" %in% installed.packages()) {install.packages("scales")}
if(!"ggtext" %in% installed.packages()) {install.packages("ggtext")}
if(!"mapSpain" %in% installed.packages()) {install.packages("mapSpain")}
if(!"sf" %in% installed.packages()) {install.packages("sf")}
if(!"ggthemes" %in% installed.packages()) {install.packages("ggthemes")}
library("tidyverse")
library("scales")
library("ggtext")          # Dar color a los textos de las leyendas
library("mapSpain")
library("sf")
library("ggthemes")    # Temas

locale(date_names = "es", date_format = "%AD", time_format = "%AT",
  decimal_mark = ",", grouping_mark = ".", tz = "Europe/Berlin",
  encoding = "UTF-8", asciify = FALSE)
## <locale>
## Numbers:  123.456,78
## Formats:  %AD / %AT
## Timezone: Europe/Berlin
## Encoding: UTF-8
## <date_names>
## Days:   domingo (dom.), lunes (lun.), martes (mar.), miércoles (mié.), jueves
##         (jue.), viernes (vie.), sĂ¡bado (sĂ¡b.)
## Months: enero (ene.), febrero (feb.), marzo (mar.), abril (abr.), mayo (may.),
##         junio (jun.), julio (jul.), agosto (ago.), septiembre (sept.),
##         octubre (oct.), noviembre (nov.), diciembre (dic.)
## AM/PM:  a. m./p. m.
Sys.setlocale(category = "LC_ALL", locale = "spanish")
## [1] "LC_COLLATE=Spanish_Spain.1252;LC_CTYPE=Spanish_Spain.1252;LC_MONETARY=Spanish_Spain.1252;LC_NUMERIC=C;LC_TIME=Spanish_Spain.1252"

Plantilla diseño

my_theme <- function(
  base_size = 11,
  base_color = "#5a5856",
  base_family = "sans"
  )
{
  # Establecemos la proporciĂ³n del tamaño de la letra de cada uno de los elementos
  template <- 
    theme_bw(base_size=base_size, base_family = base_family) +
    theme(
      panel.border = element_rect(colour = base_color),
      panel.grid.major = element_blank(),
      panel.grid.minor = element_blank(),
      plot.title = element_text(
        size = base_size+2,
        face = "bold",
        color = base_color,
        vjust = 1.25, 
        hjust = 0.5),
      plot.subtitle = element_text(size=base_size + 2, color = base_color, hjust = 0.5),
      plot.caption = element_text(hjust = 1, size=base_size - 1, color = base_color),
      legend.position ="top",
      legend.margin =  margin(0,0,0,0,unit="pt"),
      legend.text = element_text(size=base_size + 1),
      text = element_text(size=base_size, color = base_color),
      axis.title.x = element_text(
        size=base_size + 1,
        vjust=0,
        color = base_color,
        margin = unit(c(3, 0, 0, 0), "mm")
      ),
      axis.title.y = element_text(
        size=base_size + 1, 
        vjust=1.25,
        color = base_color,
        margin = unit(c(0, 3, 0, 0), "mm")
      ),
      axis.title.y.right=element_text(
        size=base_size + 1,
        color = base_color,
        margin = unit(c(0, 0, 0, 3), "mm")
      ),
      axis.text.x = element_text(size=base_size - 1, color = base_color),
      axis.text.y = element_text(size=base_size-1,color = base_color),
      strip.text = element_text(size=base_size + 2, color = base_color),
      strip.text.x = element_text(size=base_size + 1, color = base_color),
      strip.text.y = element_text(size=base_size + 1, color = base_color),
      strip.background = element_rect(color = NA, fill = NA)
    )
  return(template)
}

Leer y preparar datos

url_promocionados <-  "https://raw.githubusercontent.com/congosto/congosto.github.io/master/datos/mercadona.csv"
anuncios <- read_csv (url_promocionados ) %>%
  mutate(`Start date` = as.POSIXct(strptime(`Start date`,"%Y-%m-%dT%H:%M:%S"))) %>%
  mutate(`End Date` = as.POSIXct(strptime(`End Date`,"%Y-%m-%dT%H:%M:%S"))) %>%
  mutate(dias = round(as.numeric((`End Date` - `Start date`) / (3600*24)),0)) %>%
  mutate(ambito = ifelse (`Provincia` == "N/A" , "España", "Local")) %>%
  mutate(Impressions = as.numeric(Impressions))
  # trabajar con minĂºsculas

Anuncios globales vs.locales

color_ambito <- c("España" = "#fc020e", "Local" = "#05c3e8")
df <- anuncios %>%
  group_by(ambito) %>%
  summarise( n = n()) 

ggplot(data = df) +
  geom_col(
    aes(
      x = n, y = ambito,
      fill = ambito
    ),
    color = "white"
  ) +
  geom_text(
    aes(
      x = n, y = ambito,
      label = n
    ),
    size = 3.5,
    color = "#5a5856",
    position = position_stack(vjust = 0.5)
  ) +
  scale_y_discrete(expand =  c(0,0,0,0)) +
  scale_x_continuous(expand =  c(0,0,0,4)) +
  labs(
    title =
    "Anuncios 
      <span style='color:#fc020e'>España</span>
      vs.
      <span style='color:#05c3e8'>local</span>",
    x = "",
    y = "",
    color = ""
  ) +
  coord_fixed(4) +
  my_theme() +
  theme(
    legend.position = "None",
    axis.text.x=element_blank(),
    panel.border = element_blank(),
    panel.background = element_blank(),
    plot.title = element_markdown(size=12)
  )

DuraciĂ³n de los anuncios globales o locales

color_ambito <- c("España" = "#fc020e", "Local" = "#05c3e8")
df <- anuncios %>%
  group_by(dias,ambito) %>%
  summarise( n = n()) %>%
  arrange (desc(as.numeric(dias)))

values <- unique(df$dias)
df$dias <- factor(df$dias, levels = values)

ggplot(data = df) +
  geom_col(
    aes(
      x = n, y = dias,
      fill = ambito
    ),
    position = "dodge",
    color = "white"
  ) +
  geom_text(
    aes(
      x = n, y = dias,
      label = n
    ),
    size = 3,
    color = "#5a5856",
    position = position_stack(vjust = 0.5), vjust = 0.5
  ) +
  #scale_y_discrete(expand =  c(0,0,0,0)) +
  scale_x_continuous(expand =  c(0,0,0,4)) +
  labs(
    title =
    "DuraciĂ³n de los anuncios para
      <span style='color:#fc020e'>España</span>
      o para
      <span style='color:#05c3e8'>local</span>",
    x = "",
    y = "DuraciĂ³n en dĂ­as",
    color = ""
  ) +
  facet_wrap(~ambito) +
  my_theme() +
  theme(
    legend.position = "None",
    axis.text.x=element_blank(),
    panel.background = element_blank(),
    plot.title = element_markdown(size=12)
  )

Anuncios diarios globales o locales

color_ambito <- c("España" = "#fc020e", "Local" = "#05c3e8")
df <- anuncios %>%
  group_by(`Start date`,ambito) %>%
  summarise( n = n())

ggplot(data = df) +
  geom_col(
    aes(
      x = `Start date`, y = n,
      fill = ambito
    ),
    size = 2
  ) +
  scale_x_datetime(
      date_labels = "%b\n%Y",
      date_breaks = "1 month"
    ) +
  scale_y_continuous(expand =  c(0, 0,0.2,0)) +
  labs(
    title =
    "Anuncios por dĂ­a para
      <span style='color:#fc020e'>España</span>
      o para
      <span style='color:#05c3e8'>local</span>",
    x = "",
    y = "NĂºmero de anuncios",
    color = ""
  ) +
  facet_wrap(~ambito) +
  my_theme() +
  theme(
    legend.position = "None",
    plot.title = element_markdown(size=12)
  )

Impressions de los anuncios globales o locales

color_Impressions <- c("anuncios" = "#8b0000", "Impressions" = "#4682B4")
df <- anuncios %>%
  group_by(`Start date`,ambito) %>%
  summarise(
    n_impressions = sum(as.numeric(Impressions)),
    n_anuncios = n()
)
max_anuncios <- max(df$n_anuncios,na.rm = TRUE)
max_impressions <- max(df$n_impressions,na.rm = TRUE)
ajuste_escala <- max_impressions/max_anuncios
ggplot(data = df) +
  geom_col(
    aes(
      x = `Start date`, y = n_anuncios
    ),
    fill = "#4682B4",
    size = 2
  ) +
  geom_line(
    aes(
      x=`Start date`,
      y= n_impressions/ajuste_escala
    ),
    color = "#8b0000",
    size = 1.2
  )+
  scale_x_datetime(
      date_labels = "%b\n%Y",
      date_breaks = "1 month"
    ) +
  scale_y_continuous(
    labels = label_number_si(),
    expand= c(0, 0,0.2,0),
    sec.axis = sec_axis(trans=(~ . * ajuste_escala), name = "Impressions",
    labels = label_number_si()) 
  ) +
  labs(
    title =
    "<span style='color:#4682B4'>NĂºmero de anuncios</span>
     VS. 
     <span style='color:#8b0000'>Impresiones</span>
     para España o para local",
    x = "",
    y = "NĂºmero de anuncios",
    color = ""
  ) +
  facet_wrap(~ambito) +
  my_theme() +
  theme(
    legend.position = "None",
    plot.title = element_markdown(size=12),
    axis.title.y = element_text(color = "#4682B4", size = 14),
    axis.title.y.right = element_text(color = "#8b0000", size = 14),
    axis.text.y = element_text(color = "#4682B4"),
    axis.text.y.right = element_text(color = "#8b0000")
  )

Mapa de anuncios locales

df <- anuncios %>%
  group_by  (Provincia) %>%
    summarise(n = n())
mapSpain_prov <- esp_get_prov() 
map_provincias_anuncios <-left_join (mapSpain_prov,df, by = c("prov.shortname.es" = "Provincia" ))
Can <- esp_get_can_box()
ggplot(data = map_provincias_anuncios) + 
  geom_sf(
    aes(fill = n),
    color = "grey80"
  ) + 
  geom_sf(data = Can, color = "grey70") +
  geom_sf_label (
    aes(
      label = n,
      ),
      color = "#5a5856",
      show.legend = FALSE,
      stat = "sf_coordinates",
      size = 2,
      label.padding = unit(0.12, "lines"),
      label.size = 0,
    ) +
    scale_fill_gradient (
      low = "#1bcc63",high = "#10783a",
      aesthetics = "fill" ,
      guide = guide_legend()
    ) +
    labs(
      title = "NĂºmero de anuncios locales por provincia",
       x = "",
       y = "",
       fill = "N. anuncios",
     ) +
    guides(color = "none") +
    theme_void() +
    theme (
      legend.position = c(0.1, 0.6),
      title = element_text(color  = "grey50", size = 10),
      plot.subtitle = element_text(color  = "grey50", size = 8),
      legend.text =  element_text(color  = "grey50", size = 6),
      legend.key.height = unit(0.6, "cm")
     )