Este cuaderno visualiza los patrones que siguen la publicidad de Mercadona en Twitter
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"
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)
}
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
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)
)
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)
)
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)
)
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")
)
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")
)