html_document: toc: TRUE toc_float: TRUE code_download: TRUE theme:
cosmo
# Instalar paquetes y llamar librerÃas
# install.packages("readxl") # Leer documentos de excel
library(readxl)
# install.packages("tidyverse") # Manipulación de datos
library(tidyverse)
# install.packages("ggplot2") # Generar gráficos presentables
library(ggplot2)
# install.packages("forecast") # Generar series de tiempo y pronósticos
library(forecast)
# file.choose()
df <- read_excel("/Users/danielsalinas/Desktop/Datos Arca Continental Original.xlsx")
str(df)
## tibble [466,509 × 25] (S3: tbl_df/tbl/data.frame)
## $ ID : num [1:466509] 1 2 3 4 5 6 7 8 9 10 ...
## $ Año : num [1:466509] 2016 2016 2016 2016 2016 ...
## $ Territorio : chr [1:466509] "Guadalajara" "Guadalajara" "Guadalajara" "Guadalajara" ...
## $ Sub Territorio : chr [1:466509] "Belenes" "Belenes" "Belenes" "Belenes" ...
## $ CEDI : chr [1:466509] "Suc. Belenes" "Suc. Belenes" "Suc. Belenes" "Suc. Belenes" ...
## $ Cliente : chr [1:466509] "77737" "77737" "77737" "77737" ...
## $ Nombre : chr [1:466509] "ABARR" "ABARR" "ABARR" "ABARR" ...
## $ Tamaño Cte Industria: chr [1:466509] "Extra Grande" "Extra Grande" "Extra Grande" "Extra Grande" ...
## $ Segmento Det : chr [1:466509] "Agua Mineral" "Agua Purificada" "Agua Purificada" "Agua Saborizada" ...
## $ Marca : chr [1:466509] "Topo Chico A.M." "Ciel Agua Purificada" "Ciel Agua Purificada" "Ciel Exprim" ...
## $ Presentacion : chr [1:466509] "600 ml NR" "1 Ltro. N.R." "1.5 Lts. NR" "600 ml NR" ...
## $ Tamaño : chr [1:466509] "Individual" "Individual" "Individual" "Individual" ...
## $ Retornable_NR : chr [1:466509] "No Retornable" "No Retornable" "No Retornable" "No Retornable" ...
## $ Enero : num [1:466509] NA NA NA NA NA NA 1 NA 3 NA ...
## $ Febrero : num [1:466509] NA 2 NA NA NA NA NA 1 3 NA ...
## $ Marzo : num [1:466509] NA 8 3 NA NA 1 NA NA 4 NA ...
## $ Abril : num [1:466509] NA 4 6 NA NA NA NA 1 4 NA ...
## $ Mayo : num [1:466509] NA 4 3 NA NA NA 0 NA 4 NA ...
## $ Junio : num [1:466509] NA 2 3 NA NA NA NA 1 4 0 ...
## $ Julio : num [1:466509] NA 2 3 NA NA NA 0 NA 4 NA ...
## $ Agosto : num [1:466509] NA 2 3 NA NA NA NA 1 7 NA ...
## $ Septiembre : num [1:466509] NA 2 3 NA NA NA NA 1 4 NA ...
## $ Octubre : num [1:466509] NA 2 3 NA NA NA 0 NA 3 NA ...
## $ Noviembre : num [1:466509] NA 4 3 NA 0 NA NA NA 1 NA ...
## $ Diciembre : num [1:466509] 1 2 3 1 NA NA NA NA 3 NA ...
# ¿Cuántos NAs tengo en la base de datos?
sum(is.na(df))
## [1] 3148501
# ¿Cuántos NAs tengo por variable?
sapply(df, function(x) sum(is.na(x)))
## ID Año Territorio
## 0 0 0
## Sub Territorio CEDI Cliente
## 0 0 0
## Nombre Tamaño Cte Industria Segmento Det
## 0 0 0
## Marca Presentacion Tamaño
## 0 0 0
## Retornable_NR Enero Febrero
## 0 233480 231213
## Marzo Abril Mayo
## 227420 224057 216910
## Junio Julio Agosto
## 215753 223411 220242
## Septiembre Octubre Noviembre
## 337314 338386 338460
## Diciembre
## 341855
# Opción 1. Eliminar NAs
# df1 <- na.omit(df)
# Opción 2. Reemplazar NAs con CEROS
df1 <- df
df1[is.na(df1)] <- 0
sum(is.na(df1))
## [1] 0
# Opción 3. Reemplazar NAs con PROMEDIO
# df1 <- df
# df1$Enero[is.na(df1$Enero)] <- mean(df1$Enero, na.rm=TRUE)
boxplot(df1$Enero)
# Eliminar renglón de los totales
df1 <- df1[df1$Enero <6000, ]
boxplot(df1$Enero)
# Adecuar nombres con gsub
names(df1) <- gsub(" ", "_", names(df1))
# Muestra las ventas de Enero a Junio por CEDI:
df2 <- select(df1,c(CEDI,Enero:Junio))
# Muestra los movimientos por Cedi y tamaño de tienda grande:
df3 <- df1 %>% filter(Tamaño_Cte_Industria == "Grande")
# Ordena la base de datos por Cedi, por marca y por presentación:
df4 <- df1 %>% arrange(CEDI, Marca, Presentacion)
# Agrega un campo calculado con las ventas del primer semestre y muestra las ventas del primer semestre por marca:
df5 <- df1 %>%
mutate(Ventas_Sem1 = Enero + Febrero + Marzo + Abril + Mayo + Junio)
ventas_sem1_por_marca <- df5 %>%
group_by(Marca) %>%
summarise(Ventas_Sem1=sum(Ventas_Sem1))
# Obtén la media de las ventas del primer semestre agrupado por marca, presentación y tamaño.
df6 <- df5 %>%
group_by(Marca, Presentacion, Tamaño) %>%
summarise(Ventas_Sem1=mean(Ventas_Sem1))
## `summarise()` has grouped output by 'Marca', 'Presentacion'. You can override
## using the `.groups` argument.
# Calcular medidas de tendencia central
summary(df1)
## ID Año Territorio Sub_Territorio
## Min. : 1 Min. :2016 Length:466508 Length:466508
## 1st Qu.:116628 1st Qu.:2017 Class :character Class :character
## Median :233256 Median :2018 Mode :character Mode :character
## Mean :233255 Mean :2018
## 3rd Qu.:349882 3rd Qu.:2019
## Max. :466509 Max. :2019
## CEDI Cliente Nombre Tamaño_Cte_Industria
## Length:466508 Length:466508 Length:466508 Length:466508
## Class :character Class :character Class :character Class :character
## Mode :character Mode :character Mode :character Mode :character
##
##
##
## Segmento_Det Marca Presentacion Tamaño
## Length:466508 Length:466508 Length:466508 Length:466508
## Class :character Class :character Class :character Class :character
## Mode :character Mode :character Mode :character Mode :character
##
##
##
## Retornable_NR Enero Febrero Marzo
## Length:466508 Min. : -19.000 Min. : -11.000 Min. : -32.000
## Class :character 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
## Mode :character Median : 0.000 Median : 0.000 Median : 0.000
## Mean : 4.951 Mean : 4.829 Mean : 5.729
## 3rd Qu.: 2.000 3rd Qu.: 2.000 3rd Qu.: 3.000
## Max. :5333.000 Max. :4995.000 Max. :5636.000
## Abril Mayo Junio Julio
## Min. : -70.000 Min. :-106.00 Min. :-211.000 Min. : -60.000
## 1st Qu.: 0.000 1st Qu.: 0.00 1st Qu.: 0.000 1st Qu.: 0.000
## Median : 0.000 Median : 0.00 Median : 0.000 Median : 0.000
## Mean : 5.992 Mean : 6.73 Mean : 6.464 Mean : 6.033
## 3rd Qu.: 3.000 3rd Qu.: 3.00 3rd Qu.: 3.000 3rd Qu.: 3.000
## Max. :6164.000 Max. :6759.00 Max. :6033.000 Max. :6735.000
## Agosto Septiembre Octubre Noviembre
## Min. :-211.000 Min. :-527.000 Min. : -38.000 Min. : -25.00
## 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.00
## Median : 0.000 Median : 0.000 Median : 0.000 Median : 0.00
## Mean : 6.235 Mean : 3.625 Mean : 3.674 Mean : 3.57
## 3rd Qu.: 3.000 3rd Qu.: 1.000 3rd Qu.: 1.000 3rd Qu.: 1.00
## Max. :6065.000 Max. :6509.000 Max. :6326.000 Max. :5319.00
## Diciembre
## Min. : -28.000
## 1st Qu.: 0.000
## Median : 0.000
## Mean : 3.858
## 3rd Qu.: 0.000
## Max. :6182.000
# Colapsar meses en una columna
df7 <- gather(df1, Mes, Ventas, Enero:Diciembre)
df7
## # A tibble: 5,598,096 × 15
## ID Año Territorio Sub_Territorio CEDI Cliente Nombre
## <dbl> <dbl> <chr> <chr> <chr> <chr> <chr>
## 1 1 2016 Guadalajara Belenes Suc. Belenes 77737 ABARR
## 2 2 2016 Guadalajara Belenes Suc. Belenes 77737 ABARR
## 3 3 2016 Guadalajara Belenes Suc. Belenes 77737 ABARR
## 4 4 2016 Guadalajara Belenes Suc. Belenes 77737 ABARR
## 5 5 2016 Guadalajara Belenes Suc. Belenes 77737 ABARR
## 6 6 2016 Guadalajara Belenes Suc. Belenes 77737 ABARR
## 7 7 2016 Guadalajara Belenes Suc. Belenes 77737 ABARR
## 8 8 2016 Guadalajara Belenes Suc. Belenes 77737 ABARR
## 9 9 2016 Guadalajara Belenes Suc. Belenes 77737 ABARR
## 10 10 2016 Guadalajara Belenes Suc. Belenes 77737 ABARR
## # ℹ 5,598,086 more rows
## # ℹ 8 more variables: Tamaño_Cte_Industria <chr>, Segmento_Det <chr>,
## # Marca <chr>, Presentacion <chr>, Tamaño <chr>, Retornable_NR <chr>,
## # Mes <chr>, Ventas <dbl>
# Ventas por tipo de envase
df7 <- df5 %>% group_by(Retornable_NR) %>% summarise((Ventas_Sem1=sum(Ventas_Sem1)))
# Ventas de tamaño tipo familiar
df8<- df5 %>% filter(Tamaño== "Familiar")
# Ventas por presentación
df9<- select(df5,c(Presentacion,Ventas_Sem1))
# Ventas segundo semestre
df10 <- df5 %>% mutate(Ventas_Sem2 = Julio + Agosto + Septiembre + Octubre + Noviembre + Diciembre)
# Ventas segundo semestre
Ventas_Sem2_por_marca <- df10 %>% group_by(Marca) %>% summarise(Ventas_Sem2=sum(Ventas_Sem2))
# Ventas por presentación y tipo de envase
df11 <- df10 %>% arrange (CEDI, Presentacion, Retornable_NR)
# Agregar una columna con el Número de Mes
meses <- c("Enero"="01", "Febrero"="02","Marzo"="03", "Abril"="04", "Mayo"="05", "Junio"="06", "Julio"="07", "Agosto"="08", "Septiembre"="09", "Octubre"="10", "Noviembre"="11", "Diciembre"="12")
#df7$Mes <- meses[df7$Mes]
# Graficar el total de ventas por mes y año
#ventas_totales <- df7 %>%
#group_by(Año,Mes) %>%
#summarise(Ventas_Totales = sum(Ventas)) %>%
# arrange(Mes)
#ggplot(ventas_totales, aes(x=Mes, y=Ventas_Totales,group=Año, color= as.factor(Año))) +
#geom_line() +
# geom_point() +
#labs(x="Mes",y="Ventas Totales(Qty)", color = "Año")
# Tarea Colaborativa 3
# Elaborar Regresión Lineal
#ventas_4567 <- df7 %>%
#filter(Cliente == "4567") %>%
#group_by(Año) %>%
#summarise(Ventas_Totales = sum(Ventas)) %>%
#filter(Ventas_Totales != 0)
# ventas_4567$Secuencia <- 1:nrow(ventas_4567)
#ggplot(ventas_4567, aes(x=Año, y=Ventas_Totales)) +
# geom_point() +
#labs(x="Año",y="Ventas Totales(Qty)", title= "Ventas Totales del Cliente 4567")
#regresion <- lm(Ventas_Totales ~ Año, data=ventas_4567)
#summary(regresion)
# Ecuación
# y = 48918677 - 24174 * Año
# R cuadrada ajustada
# 77%
#datos <- data.frame(Año=2020:2025)
#prediccion <- predict(regresion,datos)
#prediccion
#ventas_4567$Tipo_de_Dato <- "Datos Reales"
#datos$Ventas_Totales <- prediccion
#datos$Tipo_de_Dato <- "Predicción"
#datos_combinados <- rbind(ventas_4567,datos)
#ggplot(datos_combinados, aes(x=Año, y=Ventas_Totales, color=Tipo_de_Dato)) +
#geom_point() +
#labs(x="Año",y="Ventas Totales(Qty)", title= "Pronóstico a 5 años de Ventas del Cliente 4567")
#ventas_mensuales_4567 <- df7 %>%
# filter(Cliente == "4567") %>%
#group_by(Año, Mes) %>%
# summarise(Ventas_Totales = sum(Ventas)) %>%
#filter(Ventas_Totales != 0)
# Confirmar que los datos que queremos modelar esten ordenados cronológicamente.
# Función de Serie de Tiempo MENSUAL, que inicia en Enero 2017
#ts <- ts(data=ventas_mensuales_4567$Ventas_Totales, start = c(2017,1), frequency = 12)
# Función de Serie de Tiempo MENSUAL, que inicia en Abril 2017
# ts <- ts(data=ventas_mensuales_4567$Ventas_Totales, start = c(2017,4), frequency = 12)
# Función de Serie de Tiempo TRIMESTRAL, que inicia en Enero 2017
# ts <- ts(data=ventas_mensuales_4567$Ventas_Totales, start = c(2017,1), frequency = 4)
# Función de Serie de Tiempo TRIMESTRAL, que inicia en Octubre 2017 (Q4)
# ts <- ts(data=ventas_mensuales_4567$Ventas_Totales, start = c(2017,4), frequency = 4)
# Función de Serie de Tiempo ANUAL, que inicia en 2017
# ts <- ts(data=ventas_mensuales_4567$Ventas_Totales, start = 2017, frequency = 1)
# Crear Modelo ARIMA
# Modelo Autorregresivo Integrado de Promedio Movil.
#arima <- auto.arima(ts, D=1) # D=1 por la temporalidad
#arima
#summary(arima)
# Generar el pronóstico de ventas
#pronostico <- forecast(arima, level=95, h=36)
#pronostico
#plot(pronostico, main="Ventas Mensuales y Pronóstico a 3 Años del Cliente 4567", xlab="Año", ylab="Ventas (Qty)")
#ventas_totales_seg <- df7 %>%
#filter(Segmento_Det == "Agua Purificada" | Segmento_Det == "Isotónicos Regular" | Segmento_Det == "Colas Regular" ) %>%
#filter(Año == 2018) %>%
#group_by(Segmento_Det,Mes) %>%
#summarise(Ventas_Totales = sum(Ventas)) %>%
#arrange(Mes)
#ggplot(ventas_totales_seg, aes(x=Mes, y=Ventas_Totales,group=Segmento_Det, color= as.factor(Segmento_Det))) +
#geom_line() +
#geom_point() +
#labs(x="Mes",y="Ventas Totales(Qty)", title= "Ventas Totales por Segmento", color = "Segmento")
[] (/Users/danielsalinas/Desktop/Screen Shot 2024-03-22 at 18.18.51.png)
Respuesta: En general las ventas aumentaron en 2019, pero cada segmento se comportó diferente. El incremento de ventas se puede lograr gracias a mejores campañas de mercadotecnia y lanzamiento de nuevos productos.En 2018 la venta de Coca-Cola entre Febrero y Diciembre aumentó en 100,000 unidades, mientras que las aguas isotónicas no tuvieron cambios.
#ventas_totales_tam_cliente <- df7 %>%
#filter(Año == 2019) %>%
#group_by(Tamaño_Cte_Industria,Mes) %>%
#summarise(Ventas_Totales = sum(Ventas)) %>%
#arrange(Mes) %>%
#filter(Ventas_Totales != 0)
#ggplot(ventas_totales_tam_cliente, aes(x=Mes, y=Ventas_Totales,group=Tamaño_Cte_Industria, color= as.factor(Tamaño_Cte_Industria))) +
#geom_line() +
#geom_point() +
#labs(x="Mes",y="Ventas Totales(Qty)", title= "Ventas Totales por Tamaño de Cliente", color = "Tamaño de Cliente")
Respuesta: El incremento de ventas es similar independientemente
de los tamaños de los clientes. Como todos los negocios están abiertos
los mismos dÃas, y están ubicados en la misma ciudad (Guadalajara), los
factores externos de las ventas efectan casi igual a todos. El mes de
mayo de 2019 fue el de mayor ventas en todos los tamaños de cliente, y
el primer bimestre fue el más bajo también para todos los tamaños de
cliente.
#ventas_totales_marca <- df7 %>%
# filter(Año == 2019) %>%
#filter(Marca == c("Coca-Cola", "Valle Frut", "Ciel Agua Purificada","Coca-Cola Light")) %>%
#group_by(Marca,Mes) %>%
#summarise(Ventas_Totales = sum(Ventas)) %>%
#arrange(Mes) %>%
#filter(Ventas_Totales != 0)
#ggplot(ventas_totales_marca, aes(x=Mes, y=Ventas_Totales,group=Marca, color= as.factor(Marca))) +
#geom_line() +
#geom_point() +
#labs(x="Mes",y="Ventas Totales(Qty)", title= "Ventas Totales por Marca", color = "Marca")
Respuesta: El comportamiento de ventas es similar entre las
marcas a través de los meses, pero hay marcas que venden mucho más que
otras. Los meses de más ventas de bebidas son los meses en que la
temperatura es mayor, y las marcas más conocidas son las que tiene en
mente el consumidor. El mes de mayo 2019 es para todas las marcas el de
mayores ventas, pero la marca Coca-Cola es la que vende más que
todas.
#ventas_totales_envase <- df7 %>%
#filter(Retornable_NR=="Retornable") %>%
#filter(Año == c(2017,2018,2019)) %>%
#group_by(Año,Mes) %>%
#summarise(Ventas_Totales = sum(Ventas)) %>%
#arrange(Mes) %>%
#filter(Ventas_Totales != 0)
#ggplot(ventas_totales_envase, aes(x=Mes, y=Ventas_Totales,group=Año, color= as.factor(Año))) +
#geom_line() +
#geom_point() +
#labs(x="Mes",y="Ventas Totales(Qty)", title= "Ventas Totales de Envases Retornables", color = "Año")
Respuesta: La venta de productos en envase retornable aumentó en
los últimos dos años. Las campañas de conciencia ambiental han vuelto
populares las opciones menos dañinas al ecosistema. De 2017 a 2018 hubo
un ligero incremento en las ventas de envase retornable, y entre 2018 y
2019 el aumento fue muy notorio.
Notas: Hay otros factores a considerar como que en 2019 hay más tiendas con el proyecto Siglo XXI, o que las tiendas en general venden más productos (tanto retornables como no retornables).
#ventas_totales_seg <- df7 %>%
# filter(Segmento_Det == "Agua Purificada" | Segmento_Det == "Isotónicos Regular" | Segmento_Det == "Colas Regular" ) %>%
# filter(Año == 2018) %>%
#group_by(Segmento_Det,Mes) %>%
#summarise(Ventas_Totales = sum(Ventas)) %>%
#arrange(Mes)
#ggplot(ventas_totales_seg, aes(x=Mes, y=Ventas_Totales,group=Segmento_Det, color= as.factor(Segmento_Det))) +
# geom_line() +
#geom_point() +
#labs(x="Mes",y="Ventas Totales(Qty)", title= "Ventas Totales por Segmento", color = "Segmento")
Respuesta: Las ventas de Agua Purificada no ha aumentado en
relación a Refrescos o Bebidas Isotónicas. La persepción que el agua no
tiene valor agregado en la preparación y el azúcar en la receta hacen de
los refrescos la opción preferida de los consumidores mexicanos. En 2018
las ventas totales de Agua Purificada no superaron las 50,000 unidades,
mientras que la Coca-Cola vendió en su mes más alto 450,000 (8 veces más
que el agua).
#ventas_totales_ayr <- df7 %>%
#filter(Segmento_Det == c("Agua Purificada", "Colas Regular")) %>%
#group_by(Segmento_Det, Año) %>%
#summarise(Ventas_Totales = sum(Ventas))
#ggplot(ventas_totales_ayr, aes(x=Año, y=Ventas_Totales,group=Segmento_Det, color= as.factor(Segmento_Det))) +
#geom_line() +
#geom_point() +
#labs(x="Año",y="Ventas Totales(Qty)", title= "Ventas Totales por Segmento", color = "Segmento")
Respuesta: La venta de agua y refrescos se incrementa en los
mismos meses, y a través de los años, pero no se puede concluir que un
incremento cause el otro. Los meses calurosos y el crecimiento de la
población hace que las ventas se incrementen en las bebidas, sean agua o
refresco. En la gráfica obtenida se observa un incremento año con año en
la venta de agua y también de refrescos.
#ventas_coca_vidrio <- df7 %>%
# filter(Marca == "Coca-Cola" & Presentacion == "500 ml NR Vidrio") %>%
#group_by(Año,Mes) %>%
#summarise(Ventas_Totales = sum(Ventas)) %>%
#filter(Ventas_Totales != 0)
# Confirmar que los datos que queremos modelar esten ordenados cronológicamente.
# Función de Serie de Tiempo MENSUAL, que inicia en Enero 2017
#ts <- ts(data=ventas_coca_vidrio$Ventas_Totales, start = c(2016,1), frequency = 12)
# Crear Modelo ARIMA
# Modelo Autorregresivo Integrado de Promedio Movil.
#arima <- auto.arima(ts, D=1) # D=1 por la temporalidad
#arima
#summary(arima)
# Generar el pronóstico de ventas
#pronostico <- forecast(arima, level=95, h=16)
#pronostico
#plot(pronostico, main="Ventas Mensuales y Pronóstico para 2020 de Coca-Cola 500 ml NR Vidrio", xlab="Año", ylab="Ventas (Qty)")
Respuesta: Las ventas esperadas de Coca-Cola de 500 ml NR Vidrio
para 2020 oscilan mensualmente entre 45,000 y 65,000 unidades, con una
confiabilidad del 95%.