Introducción
Sobre el caso:
La empresa “QWERTY” es una comercializadora de todo tipo de artículos ubicada en Guatemala. El negocio ha ido creciendo sin embargo en el último año se ha estancado sin poder incrementar sus utilidades. El dueño desconoce el motivo por el cual la empresa dejó de crecer y es por eso que ha decidido contratar tus servicios para realizar un análisis de las ventas del 2015 y 2016. Utilizar la base de datos entregada por el departamento de sistemas para realizar los estudios correspondientes. Una vez realizado el análisis, exponer los hallazgos y proponer una estrategia comercial para incrementar las ventas internacionales.
sobre las bases de datos.
Se proporcionan 3 data frames.
El primero contiene información sobre la clave de departamento y el nombre del departamento El segundo contiene la clave de empleado, su nombre y apellido El tercero contiene la información de ventas. Fecha de la venta, número de vendedor, una columna en blanco (que se elimina en el código), una columna para el nombre completo del vendedor, el número de cliente, tipo, clave de departamento, nombre de departamento, clave de familia, familia, las ventas netas en Quetzales y el costo por venta.
Sobre la metodología.
Limpieza y manupilación de datos
Al ubicar columnas vacías y filas sin entradas primero se deberán filtrar para no tomar en cuenta estos entradas vacías en el análisis. Después se tienen que calcular los campos en celdas vacías, como el nombre completo de vendedor. Se tienen que hacer joints para completar columnas como el nombre del departamento o la clave de departamento. Se genera un EDA que proporciona un overview de los datos a alto nivel par poder empezar el análisis.
Metodología utilizada
Para realizar el análisis de los datos proporcionados, se siguieron los siguientes pasos:
- Limpieza de Datos:
- Eliminación de duplicados y manejo de valores faltantes.
- Conversión de formatos de fecha y tipos de datos.
- Análisis Exploratorio de Datos (EDA):
- Estadísticas descriptivas para entender la distribución de ventas, costos y rentabilidad.
- Visualización de tendencias temporales y patrones por vendedor, cliente, departamento y familia de productos.
- Segmentación:
- Análisis detallado por segmento (vendedores, clientes, productos) para identificar áreas de oportunidad específicas.
- Herramientas Utilizadas:
- R para análisis de datos y visualización.
- RMarkdown para la creación de este reporte.
Manipulación de datos
Importar librerias y cargar bases de datos
# Cargar librerías necesarias
if (!require("readxl")) install.packages("readxl")
if (!require("dplyr")) install.packages("dplyr")
if (!require("ggplot2")) install.packages("ggplot2")
if (!require("scales")) install.packages("scales")
if (!require("writexl")) install.packages("writexl")
if (!require("lubridate")) install.packages("lubridate")
if (!require("plotly")) install.packages("plotly")
if (!require("knitr")) install.packages("knitr")
if (!require("prettydoc")) install.packages("prettydoc")
if (!require("kableExtra")) install.packages("kableExtra")
if (!require("tidyverse")) install.packages("tidyverse")
library(prettydoc)
library(readxl)
library(dplyr)
library(ggplot2)
library(scales)
library(writexl)
library(lubridate)
library(plotly)
library(knitr)
library(kableExtra)
library(tidyverse)
# Establecer el nombre del archivo de entrada para todos los códigos
file_name <- "BC_LCG.xlsx"
# Cargar las hojas del archivo de Excel para cada código
key_depto <- read_excel(file_name, sheet = "KEY_DEPTO")
key_vendedor <- read_excel(file_name, sheet = "KEY_VENDEDOR")
bd <- read_excel(file_name, sheet = "BD")Información de las librerias utilizadas
- prettydoc: Esta librería se utiliza para crear documentos en R Markdown con temas estéticamente agradables y modernos, facilitando la personalización del diseño y la presentación.
- readxl: Se utiliza para leer datos de archivos de Excel (.xls y .xlsx) en R, permitiendo la importación directa de datos tabulares desde hojas de cálculo.
- dplyr: Proporciona una gramática consistente para la manipulación de datos en R, facilitando operaciones como filtrado, selección, agrupamiento y resumen de datos tabulares.
- ggplot2: Es una librería para crear gráficos elegantes y sofisticados en R, basada en la “gramática de gráficos”, que permite construir visualizaciones complejas de manera intuitiva.
- scales: Proporciona funciones para dar formato a números y etiquetas de ejes en gráficos, facilitando la presentación clara y legible de datos en visualizaciones.
- writexl: Se utiliza para escribir datos en archivos de Excel (.xlsx) desde R, permitiendo la exportación de tablas y datos procesados a hojas de cálculo.
- lubridate: Facilita la manipulación de fechas y horas en R, ofreciendo herramientas para la extracción de componentes de fecha, cálculos de diferencia entre fechas y otras operaciones temporales.
- plotly: Permite la creación de gráficos interactivos en R, ofreciendo visualizaciones dinámicas y personalizables que pueden integrarse en documentos y aplicaciones web.
- knitr: Es una herramienta para la generación dinámica de reportes en R Markdown, que permite la incorporación de código R junto con texto narrativo y visualizaciones.
- kableExtra: Extiende la funcionalidad de
knitr::kablepara la creación de tablas en R Markdown, añadiendo opciones de formato avanzado y estilos personalizables. - tidyverse: Es un conjunto de paquetes de R
diseñados para la ciencia de datos. Incluye librerías como
dplyr,ggplot2,tidyr,readr,purrrytibble, que trabajan juntas para simplificar y mejorar la manipulación y visualización de datos.
Limpieza de datos
# Eliminar filas en la tabla BD donde 'Costo' es NA
bd <- bd %>% filter(!is.na(Costo))
# Eliminar las columnas vacías con títulos "Columna#"
bd <- bd %>%
select(-matches("^Columna\\d+$")) # Elimina las columnas que coinciden con el patrón "Columna#" donde "#" es un número
# Convertir las columnas Ventas Netas (Q) y Costo de Quetzales a USD
bd <- bd %>%
mutate(
`Ventas Netas (USD)` = `Ventas Netas (Q)` / 7.5,
`Costo (USD)` = Costo / 7.5
)Asignar valores faltantes (Nombre de vendedores y Departamento)
# Crear diccionarios para las claves de departamentos y vendedores
depto_dict <- setNames(key_depto$Departamento, key_depto$`Departamento - Clave`)
depto_dict_reverse <- setNames(key_depto$`Departamento - Clave`, key_depto$Departamento)
vendedor_dict <- setNames(paste(key_vendedor$Nombre, key_vendedor$Apellido), key_vendedor$`No. Vendedor`)
# Rellenar la columna 'Nom_Completo_Vendedor'
bd$Nom_Completo_Vendedor <- vendedor_dict[as.character(bd$`Número de Vendedor`)]
# Completar las columnas 'Departamento - Clave' y 'Departamento' de manera coordinada
bd <- bd %>%
rowwise() %>%
mutate(
`Departamento - Clave` = ifelse(is.na(`Departamento - Clave`) & !is.na(`Departamento`),
depto_dict_reverse[as.character(`Departamento`)],
`Departamento - Clave`),
`Departamento` = ifelse(is.na(`Departamento`) & !is.na(`Departamento - Clave`),
depto_dict[as.character(`Departamento - Clave`)],
`Departamento`)
) %>%
ungroup()
# Mostrar los primeros 5 registros de la base de datos
kable(head(bd), caption = "Primeros 5 registros") %>%
kable_styling(full_width = FALSE)| Fecha | Número de Vendedor | Nom_Completo_Vendedor | Número de cliente | Tipo | Departamento - Clave | Departamento | Familia - Clave | Familia | Ventas Netas (Q) | Costo | Ventas Netas (USD) | Costo (USD) |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2015-01-01 | 7 | Carlos Vela | 66 | Real | 0021 | Pinturas | 328 | TRATAMIENTO DE CONCRETO | 31740.12 | 22046.54 | 4232.01600 | 2939.5387 |
| 2015-01-01 | 5 | Gonzalo Aguilar | 45 | Real | 0021 | Pinturas | 370 | PINTURAS DECORATIVAS | 2377.30 | 1761.35 | 316.97333 | 234.8467 |
| 2015-01-01 | 8 | Ernesto Pineda | 75 | Real | 0021 | Pinturas | 371 | BARNICES ARQUITECTÓNICOS | 20422.48 | 13189.05 | 2722.99733 | 1758.5400 |
| 2015-01-01 | 6 | Paulina Casanova | 57 | Real | 0021 | Pinturas | 372 | PINTURA AUTOMOTRIZ | 719.80 | 668.40 | 95.97333 | 89.1200 |
| 2015-01-01 | 7 | Carlos Vela | 62 | Real | 0021 | Pinturas | 376 | TINTES PARA MADERA | 15589.78 | 10835.03 | 2078.63733 | 1444.6707 |
| 2015-01-01 | 2 | Michelle Perez | 20 | Real | 0021 | Pinturas | 751 | BROCHAS, RODILLOS Y BANDEJAS | 216456.68 | 116269.21 | 28860.89067 | 15502.5613 |
Crear dos columnas calculadas para % de rentabilidad y utilidad bruta
# Calcular el porcentaje de rentabilidad y agregarla como una nueva columna a la base de datos
bd <- bd %>%
mutate(
Rentabilidad = (`Ventas Netas (USD)` - `Costo (USD)`) / `Costo (USD)` * 100
)
# Calcular la utilidad y agregarla como una nueva columna a la base de datos
bd <- bd %>%
mutate(
utilidad = (`Ventas Netas (USD)` - `Costo (USD)`)
)
# Mostrar los primeros 5 registros de la base de datos
kable(head(bd), caption = "Primeros 5 registros con rentabilidad y utilidad") %>%
kable_styling(full_width = FALSE)| Fecha | Número de Vendedor | Nom_Completo_Vendedor | Número de cliente | Tipo | Departamento - Clave | Departamento | Familia - Clave | Familia | Ventas Netas (Q) | Costo | Ventas Netas (USD) | Costo (USD) | Rentabilidad | utilidad |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2015-01-01 | 7 | Carlos Vela | 66 | Real | 0021 | Pinturas | 328 | TRATAMIENTO DE CONCRETO | 31740.12 | 22046.54 | 4232.01600 | 2939.5387 | 43.968713 | 1292.477333 |
| 2015-01-01 | 5 | Gonzalo Aguilar | 45 | Real | 0021 | Pinturas | 370 | PINTURAS DECORATIVAS | 2377.30 | 1761.35 | 316.97333 | 234.8467 | 34.970335 | 82.126667 |
| 2015-01-01 | 8 | Ernesto Pineda | 75 | Real | 0021 | Pinturas | 371 | BARNICES ARQUITECTÓNICOS | 20422.48 | 13189.05 | 2722.99733 | 1758.5400 | 54.844208 | 964.457333 |
| 2015-01-01 | 6 | Paulina Casanova | 57 | Real | 0021 | Pinturas | 372 | PINTURA AUTOMOTRIZ | 719.80 | 668.40 | 95.97333 | 89.1200 | 7.690006 | 6.853333 |
| 2015-01-01 | 7 | Carlos Vela | 62 | Real | 0021 | Pinturas | 376 | TINTES PARA MADERA | 15589.78 | 10835.03 | 2078.63733 | 1444.6707 | 43.883127 | 633.966667 |
| 2015-01-01 | 2 | Michelle Perez | 20 | Real | 0021 | Pinturas | 751 | BROCHAS, RODILLOS Y BANDEJAS | 216456.68 | 116269.21 | 28860.89067 | 15502.5613 | 86.168531 | 13358.329333 |
Analisis inicial
Estadísticas básicas
# Resumen básico de estadísticas descriptivas para las variables numéricas
summary_stats <- summary(bd[, c("Ventas Netas (Q)", "Costo", "Ventas Netas (USD)", "Costo (USD)")])
kable(summary_stats, caption = "Resumen de estadísticas descriptivas para variables numéricas") %>%
kable_styling(full_width = FALSE)| Ventas Netas (Q) | Costo | Ventas Netas (USD) | Costo (USD) | |
|---|---|---|---|---|
| Min. : -437 | Min. :-5145860 | Min. : -58.3 | Min. :-686115 | |
| 1st Qu.: 19321 | 1st Qu.: 11081 | 1st Qu.: 2576.2 | 1st Qu.: 1477 | |
| Median : 92753 | Median : 52227 | Median : 12367.1 | Median : 6964 | |
| Mean : 238182 | Mean : 136819 | Mean : 31757.6 | Mean : 18242 | |
| 3rd Qu.: 275888 | 3rd Qu.: 153648 | 3rd Qu.: 36785.1 | 3rd Qu.: 20486 | |
| Max. :7119698 | Max. : 3914946 | Max. :949293.1 | Max. : 521993 |
# Conteo de observaciones por tipo de venta
vendedor_count <- table(bd$Nom_Completo_Vendedor)
vendedor_count <- sort(vendedor_count, decreasing = TRUE)
kable(vendedor_count, caption = "Conteo de observaciones por tipo de vendedor") %>%
kable_styling(full_width = FALSE)| Var1 | Freq |
|---|---|
| Juan Garza | 3951 |
| Ernesto Pineda | 756 |
| Sofia Gonzalez | 524 |
| Pedro Arroyo | 515 |
| Gonzalo Aguilar | 504 |
| Carlos Vela | 433 |
| Paulina Casanova | 380 |
| Michelle Perez | 329 |
# Conteo de observaciones por departamento
depto_count <- table(bd$`Departamento`)
depto_count <- sort(depto_count, decreasing = TRUE)
kable(depto_count, caption = "Conteo de observaciones por departamento") %>%
kable_styling(full_width = FALSE)| Var1 | Freq |
|---|---|
| Bebes | 640 |
| Juguetes | 561 |
| Pinturas | 358 |
| Out Door Living | 346 |
| Cocina | 344 |
| Ferretería | 339 |
| Artículos Navideños | 321 |
| Eléctricos | 314 |
| Herramientas | 312 |
| Electrodomésticos | 310 |
| Organización | 297 |
| Plomería | 293 |
| Niños | 283 |
| Decoracion | 245 |
| Automotriz | 244 |
| Materiales de Construcción | 206 |
| Mascotas | 202 |
| Jardinería | 190 |
| Limpieza | 183 |
| Lámparas | 175 |
| Mesa | 174 |
| Baños | 129 |
| Electronica | 125 |
| Seguridad | 114 |
| Muebles de Interior | 112 |
| Artículos Impulso | 95 |
| Guatemala nuestra | 95 |
| Muebles de Exterior | 95 |
| Blancos | 74 |
| Alfombras | 72 |
| Cortinaje | 72 |
| Librería | 72 |
Analítica de datos
Pareto ABC por departamentos
Pregunta 1 y 2:
¿Cuál es el monto de ventas y cantidad de departamentos por cada clasificación (A, B y C)?
# Sumar las ventas netas por departamento
ventas_por_departamento <- bd %>%
group_by(`Departamento`) %>%
summarize(Ventas_Netas_USD = sum(`Ventas Netas (USD)`))
# Calcular el total de ventas
total_ventas <- sum(ventas_por_departamento$Ventas_Netas_USD)
# Crear una tabla que muestre el porcentaje de ventas por departamento
ventas_por_departamento <- ventas_por_departamento %>%
mutate(
Percentage = (Ventas_Netas_USD / total_ventas) * 100
)
# Ordenar los departamentos de mayor a menor
ventas_por_departamento <- ventas_por_departamento %>%
arrange(desc(Ventas_Netas_USD))
# Agregar una columna de porcentaje acumulado
ventas_por_departamento <- ventas_por_departamento %>%
mutate(
Porcentaje_Acumulado = cumsum(Percentage)
)
# Asignar categorías ABC
ventas_por_departamento <- ventas_por_departamento %>%
mutate(
Categoria = case_when(
Porcentaje_Acumulado <= 80 ~ "A",
Porcentaje_Acumulado <= 95 ~ "B",
TRUE ~ "C"
)
)
# Crear la tabla de ventas por zona
ventas_por_zona <- ventas_por_departamento %>%
group_by(Categoria) %>%
summarize(
Ventas_Netas_USD = sum(Ventas_Netas_USD),
Cantidad_Departamentos = n()
)
# Formatear la tabla utilizando kable
kable(ventas_por_zona,
caption = "Pareto ABC de Ventas por Departamento",
col.names = c("Clasificación", "Ventas Netas (USD)", "Cantidad de Departamentos"),
align = c("c", "r", "r"))%>%
kable_styling(full_width = FALSE)| Clasificación | Ventas Netas (USD) | Cantidad de Departamentos |
|---|---|---|
| A | 184530955 | 18 |
| B | 35356587 | 7 |
| C | 14864808 | 7 |
Diagrama de Pareto:
# Crear un diccionario para asignar colores a cada zona
colores_zona <- c("A" = "#69b3a2", "B" = "#145C9E", "C" = "#79C7C5")
# Crear el gráfico de Pareto con colores por zona
ggplot(ventas_por_departamento, aes(x = reorder(`Departamento`, -Ventas_Netas_USD), y = Ventas_Netas_USD, fill = Categoria)) +
geom_bar(stat = "identity") +
geom_line(aes(y = Porcentaje_Acumulado * max(ventas_por_departamento$Ventas_Netas_USD) / 100), color = "#e06666", size = 1.5, group = 1) +
geom_point(aes(y = Porcentaje_Acumulado * max(ventas_por_departamento$Ventas_Netas_USD) / 100), color = "#e06666", size = 3) +
scale_y_continuous(labels = label_number_si(unit = "M", accuracy = 0.1), sec.axis = sec_axis(~ . * 100 / max(ventas_por_departamento$Ventas_Netas_USD), name = "Porcentaje acumulado (%)")) +
labs(x = "Departamento", y = "Ventas Netas (USD)", title = "Pareto ABC de Ventas Netas por departamento",
subtitle = "Categorización de departamentos por contribución a las ventas",
caption = "Fuente: Datos de archivo.xlsx") +
scale_fill_manual(values = colores_zona) + # Asignar colores a las zonas
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1),
legend.position = "none")Pareto ABC por clientes
Pregunta 3 y 4:
3.-Realizar un ABC de clientes e identificar cuáles son los 5 clientes que más compran
# Sumar las ventas netas por Cliente
ventas_por_cliente <- bd %>%
group_by(`Número de cliente`) %>%
summarize(Ventas_Netas_USD = sum(`Ventas Netas (USD)`))
# Calcular el total de ventas
total_ventas_clientes <- sum(ventas_por_cliente$Ventas_Netas_USD)
# Crear una tabla que muestre el porcentaje de ventas por cliente
ventas_por_cliente <- ventas_por_cliente %>%
mutate(
Porcentaje_del_total = (Ventas_Netas_USD / total_ventas_clientes) * 100
)
# Ordenar los clientes de mayor a menor
ventas_por_cliente <- ventas_por_cliente %>%
arrange(desc(Ventas_Netas_USD))
# Mostrar los primeros 5 registros de la base de datos
kable(head(ventas_por_cliente), caption = "Principales 5 clientes")%>% # Mostrar los primeros 5 registros
kable_styling(full_width = FALSE)| Número de cliente | Ventas_Netas_USD | Porcentaje_del_total |
|---|---|---|
| 47 | 20530094 | 8.745427 |
| 14 | 19963858 | 8.504221 |
| 59 | 19198607 | 8.178239 |
| 68 | 18611336 | 7.928072 |
| 74 | 16949300 | 7.220077 |
| 71 | 2889475 | 1.230861 |
4.-Identificar cuál es el vendedor que le vende a la mayoría de los clientes
# Calcular las ventas por vendedor y cliente
ventas_por_vendedor <- bd %>%
group_by(`Nom_Completo_Vendedor`, `Número de cliente`) %>%
summarize(Ventas_Netas_USD = sum(`Ventas Netas (USD)`)) %>%
group_by(`Nom_Completo_Vendedor`) %>%
summarize(Total_Ventas = sum(Ventas_Netas_USD),
Cantidad_Clientes = n()) %>%
arrange(desc(Cantidad_Clientes)) %>%
top_n(3)
# Crear la tabla con kable
tabla_top_vendedores <- kable(ventas_por_vendedor, format = "html", caption = "Top 3 Vendedores por Cantidad de Clientes y Ventas") %>%
kable_styling(full_width = FALSE)
# Mostrar la tabla
tabla_top_vendedores| Nom_Completo_Vendedor | Total_Ventas | Cantidad_Clientes |
|---|---|---|
| Juan Garza | 126053856 | 87 |
| Ernesto Pineda | 27277862 | 16 |
| Pedro Arroyo | 13928986 | 10 |
| Sofia Gonzalez | 15238779 | 10 |
Diagrama de Pareto:
# Crear un diccionario para asignar colores a cada zona
colores_zona <- c("A" = "#69b3a2", "B" = "#145C9E", "C" = "#79C7C5")
# Crear el gráfico de Pareto con colores por zona
ggplot(ventas_por_cliente, aes(x = reorder(`Número de cliente`, -Ventas_Netas_USD), y = Ventas_Netas_USD, fill = Categoria_cliente)) +
geom_bar(stat = "identity") +
geom_line(aes(y = Porcentaje_Acumulado_cliente * max(ventas_por_cliente$Ventas_Netas_USD) / 100), color = "#e06666", size = 1.5, group = 1) +
geom_point(aes(y = Porcentaje_Acumulado_cliente * max(ventas_por_cliente$Ventas_Netas_USD) / 100), color = "#e06666", size = 3) +
scale_y_continuous(labels = label_number_si(unit = "M", accuracy = 0.1), sec.axis = sec_axis(~ . * 100 / max(ventas_por_cliente$Ventas_Netas_USD), name = "Porcentaje acumulado (%)")) +
labs(x = "Número de cliente", y = "Ventas Netas (USD)", title = "Pareto ABC de Ventas Netas",
subtitle = "Categorización de clientes por contribución a las ventas",
caption = "Fuente: Datos de archivo.xlsx") +
scale_fill_manual(values = colores_zona) + # Asignar colores a las zonas
theme_minimal() +
theme(axis.text.x = element_text(angle = 90, hjust = 1),
legend.position = "none")Análisis de tendencia de ventas y utilidad.
Gráficas de tendencia de ventas mensual para 2015
# Filtrar los datos para el año 2015
bd_2015 <- bd %>%
filter(year(Fecha) == 2015) %>%
mutate(Mes = month(Fecha, label = TRUE, abbr = TRUE, locale = "en_US"))
# Calcular las ventas mensuales para 2015
ventas_mensuales_2015 <- bd_2015 %>%
group_by(Mes) %>%
summarize(Ventas_Netas_USD = sum(`Ventas Netas (USD)`))
# Asignar colores a los trimestres
ventas_mensuales_2015 <- ventas_mensuales_2015 %>%
mutate(Trimestre = case_when(
Mes %in% c("Jan", "Feb", "Mar") ~ "Q1",
Mes %in% c("Apr", "May", "Jun") ~ "Q2",
Mes %in% c("Jul", "Aug", "Sep") ~ "Q3",
Mes %in% c("Oct", "Nov", "Dec") ~ "Q4"
))
# Definir colores para los trimestres
colores_trimestre <- c("Q1" = "#1f77b4", "Q2" = "#ff7f0e", "Q3" = "#2ca02c", "Q4" = "#d62728")
# Crear la gráfica con línea de tendencia
ggplot(ventas_mensuales_2015, aes(x = Mes, y = Ventas_Netas_USD)) +
geom_bar(aes(fill = Trimestre), stat = "identity", width = 0.7) +
geom_smooth(aes(group = 1), method = "lm", se = FALSE, color = "#9467bd", size = 1.5, linetype = "dashed") +
scale_y_continuous(labels = scales::label_number_si(unit = "M", accuracy = 0.1)) +
scale_fill_manual(values = colores_trimestre) +
labs(
title = "Ventas Mensuales de 2015",
subtitle = "Con línea de tendencia",
x = "Mes",
y = "Ventas Netas (USD)",
fill = "Trimestre"
) +
theme_minimal() +
theme(
plot.title = element_text(hjust = 0.5, size = 20),
plot.subtitle = element_text(hjust = 0.5, size = 15),
axis.text.x = element_text(angle = 45, hjust = 1)
)Gráficas de tendencia de ventas mensual para 2016
# Filtrar los datos para el año 2016
bd_2016 <- bd %>%
filter(year(Fecha) == 2016) %>%
mutate(Mes = month(Fecha, label = TRUE, abbr = TRUE, locale = "en_US"))
# Calcular las ventas mensuales para 2016
ventas_mensuales_2016 <- bd_2016 %>%
group_by(Mes) %>%
summarize(Ventas_Netas_USD = sum(`Ventas Netas (USD)`))
# Asignar colores a los trimestres
ventas_mensuales_2016 <- ventas_mensuales_2016 %>%
mutate(Trimestre = case_when(
Mes %in% c("Jan", "Feb", "Mar") ~ "Q1",
Mes %in% c("Apr", "May", "Jun") ~ "Q2",
Mes %in% c("Jul", "Aug", "Sep") ~ "Q3",
Mes %in% c("Oct", "Nov", "Dec") ~ "Q4"
))
# Definir colores para los trimestres
colores_trimestre <- c("Q1" = "#1f77b4", "Q2" = "#ff7f0e", "Q3" = "#2ca02c", "Q4" = "#d62728")
# Crear la gráfica con línea de tendencia
ggplot(ventas_mensuales_2016, aes(x = Mes, y = Ventas_Netas_USD)) +
geom_bar(aes(fill = Trimestre), stat = "identity", width = 0.7) +
geom_smooth(aes(group = 1), method = "lm", se = FALSE, color = "#9467bd", size = 1.5, linetype = "dashed") +
scale_y_continuous(labels = scales::label_number_si(unit = "M", accuracy = 0.1)) +
scale_fill_manual(values = colores_trimestre) +
labs(
title = "Ventas Mensuales de 2016",
subtitle = "Con línea de tendencia",
x = "Mes",
y = "Ventas Netas (USD)",
fill = "Trimestre"
) +
theme_minimal() +
theme(
plot.title = element_text(hjust = 0.5, size = 20),
plot.subtitle = element_text(hjust = 0.5, size = 15),
axis.text.x = element_text(angle = 45, hjust = 1)
)Gráfica de tendencia de ventas mensual para ambos años
# Filtrar y preparar los datos para los años 2015 y 2016
bd_2015 <- bd %>%
filter(year(Fecha) == 2015) %>%
mutate(
Mes = month(Fecha, label = TRUE, abbr = TRUE, locale = "en_US"),
Año = "2015"
)
bd_2016 <- bd %>%
filter(year(Fecha) == 2016) %>%
mutate(
Mes = month(Fecha, label = TRUE, abbr = TRUE, locale = "en_US"),
Año = "2016"
)
# Combinar los datos de ambos años
bd_combined <- bind_rows(bd_2015, bd_2016)
# Calcular las ventas mensuales para ambos años
ventas_mensuales <- bd_combined %>%
group_by(Año, Mes) %>%
summarize(Ventas_Netas_USD = sum(`Ventas Netas (USD)`))
# Asignar colores a los trimestres
ventas_mensuales <- ventas_mensuales %>%
mutate(Trimestre = case_when(
Mes %in% c("Jan", "Feb", "Mar") ~ "Q1",
Mes %in% c("Apr", "May", "Jun") ~ "Q2",
Mes %in% c("Jul", "Aug", "Sep") ~ "Q3",
Mes %in% c("Oct", "Nov", "Dec") ~ "Q4"
))
# Definir colores para los trimestres
colores_trimestre <- c("Q1" = "#1f77b4", "Q2" = "#ff7f0e", "Q3" = "#2ca02c", "Q4" = "#d62728")
# Crear la gráfica con las tres líneas de tendencia
ggplot(ventas_mensuales, aes(x = interaction(Año, Mes, sep = "-"), y = Ventas_Netas_USD)) +
geom_bar(aes(fill = Trimestre), stat = "identity", width = 0.7) +
geom_smooth(aes(group = Año, color = Año), method = "lm", se = FALSE, size = 1.5, linetype = "dashed") +
geom_smooth(aes(group = 1), method = "lm", se = FALSE, color = "black", size = 1.5, linetype = "solid") +
scale_y_continuous(labels = scales::label_number_si(unit = "M", accuracy = 0.1)) +
scale_fill_manual(values = colores_trimestre) +
labs(
title = "Ventas Mensuales de 2015 y 2016",
subtitle = "Con líneas de tendencia",
x = "Mes y Año",
y = "Ventas Netas (USD)",
fill = "Trimestre",
color = "Líneas de Tendencia"
) +
theme_minimal() +
theme(
plot.title = element_text(hjust = 0.5, size = 20),
plot.subtitle = element_text(hjust = 0.5, size = 15),
axis.text.x = element_text(angle = 45, hjust = 1)
)Análisis de crecimiento mensual y anual
# Filtrar y preparar los datos para los años 2015 y 2016
bd_2015 <- bd %>%
filter(year(Fecha) == 2015) %>%
mutate(Mes = month(Fecha, label = TRUE, abbr = TRUE, locale = "en_US"))
bd_2016 <- bd %>%
filter(year(Fecha) == 2016) %>%
mutate(Mes = month(Fecha, label = TRUE, abbr = TRUE, locale = "en_US"))
# Calcular las ventas mensuales para 2015
ventas_mensuales_2015 <- bd_2015 %>%
group_by(Mes) %>%
summarize(Ventas_Netas_USD = sum(`Ventas Netas (USD)`))
# Calcular el crecimiento mensual para 2015
ventas_mensuales_2015 <- ventas_mensuales_2015 %>%
mutate(Crecimiento_Mensual = (Ventas_Netas_USD / lag(Ventas_Netas_USD, default = first(Ventas_Netas_USD)) - 1) * 100)
# Calcular las ventas mensuales para 2016
ventas_mensuales_2016 <- bd_2016 %>%
group_by(Mes) %>%
summarize(Ventas_Netas_USD = sum(`Ventas Netas (USD)`))
# Calcular el crecimiento mensual para 2016
ventas_mensuales_2016 <- ventas_mensuales_2016 %>%
mutate(Crecimiento_Mensual = (Ventas_Netas_USD / lag(Ventas_Netas_USD, default = first(Ventas_Netas_USD)) - 1) * 100)
# Combinar los resultados de ambos años en una sola tabla
crecimiento_mensual <- bind_rows(
ventas_mensuales_2015 %>% mutate(Año = "2015"),
ventas_mensuales_2016 %>% mutate(Año = "2016")
)
# Corregir el crecimiento mensual para enero de 2016
crecimiento_mensual$Crecimiento_Mensual[crecimiento_mensual$Mes == "Jan" & crecimiento_mensual$Año == "2016"] <- NA
# Crear la tabla del crecimiento mensual
tabla_crecimiento_mensual <- crecimiento_mensual %>%
select(Año, Mes, Ventas_Netas_USD, Crecimiento_Mensual) %>%
arrange(Año, Mes) %>%
kable(caption = "Crecimiento Mensual de Ventas", format = "html", digits = 2) %>%
kable_styling(full_width = FALSE, bootstrap_options = c("striped", "hover"))
# Calcular las ventas anuales para 2015 y 2016
ventas_anuales <- bd %>%
mutate(Año = year(Fecha)) %>%
group_by(Año) %>%
summarize(Ventas_Netas_USD = sum(`Ventas Netas (USD)`))
# Calcular el crecimiento anual de 2015 a 2016
crecimiento_anual <- ventas_anuales %>%
mutate(Crecimiento_Anual = (Ventas_Netas_USD / lag(Ventas_Netas_USD, default = first(Ventas_Netas_USD)) - 1) * 100)
# Crear la tabla del crecimiento anual
tabla_crecimiento_anual <- crecimiento_anual %>%
kable(caption = "Crecimiento Anual de Ventas", format = "html", digits = 2) %>%
kable_styling(full_width = FALSE, bootstrap_options = c("striped", "hover"))
# Graficar el crecimiento mensual
ggplot(crecimiento_mensual, aes(x = Mes, y = Crecimiento_Mensual, color = Año, group = Año)) +
geom_line(size = 1.5) +
labs(
title = "Crecimiento Mensual de Ventas",
x = "Mes",
y = "% Crecimiento Mensual",
color = "Año"
) +
theme_minimal() +
theme(
plot.title = element_text(hjust = 0.5, size = 20),
axis.text.x = element_text(angle = 45, hjust = 1)
)| Año | Mes | Ventas_Netas_USD | Crecimiento_Mensual |
|---|---|---|---|
| 2015 | Jan | 7913549 | 0.00 |
| 2015 | Feb | 7084396 | -10.48 |
| 2015 | Mar | 10168852 | 43.54 |
| 2015 | Apr | 7634222 | -24.93 |
| 2015 | May | 8364326 | 9.56 |
| 2015 | Jun | 8756596 | 4.69 |
| 2015 | Jul | 9042700 | 3.27 |
| 2015 | Aug | 8193746 | -9.39 |
| 2015 | Sep | 9760198 | 19.12 |
| 2015 | Oct | 8124340 | -16.76 |
| 2015 | Nov | 13316292 | 63.91 |
| 2015 | Dec | 23388851 | 75.64 |
| 2016 | Jan | 8012247 | NA |
| 2016 | Feb | 8788090 | 9.68 |
| 2016 | Mar | 10050385 | 14.36 |
| 2016 | Apr | 7981498 | -20.59 |
| 2016 | May | 8498493 | 6.48 |
| 2016 | Jun | 11029844 | 29.79 |
| 2016 | Jul | 9923371 | -10.03 |
| 2016 | Aug | 8452978 | -14.82 |
| 2016 | Sep | 10290803 | 21.74 |
| 2016 | Oct | 8611301 | -16.32 |
| 2016 | Nov | 16960601 | 96.96 |
| 2016 | Dec | 4404673 | -74.03 |
| Año | Ventas_Netas_USD | Crecimiento_Anual |
|---|---|---|
| 2015 | 121748066 | 0.00 |
| 2016 | 113004284 | -7.18 |
Comportamiento de utilidad en el tiempo
# Calcular la utilidad diaria para 2015 y 2016
bd <- bd %>%
mutate(Anio = year(Fecha), Dia_Anual = yday(Fecha))
utilidad_diaria <- bd %>%
group_by(Anio, Dia_Anual) %>%
summarize(Utilidad = sum(`Ventas Netas (USD)` - `Costo (USD)`)) %>%
ungroup()
# Convertir los días del año a fechas reales para el eje X
utilidad_diaria <- utilidad_diaria %>%
mutate(Fecha = as.Date(Dia_Anual, origin = paste0(Anio - 1, "-12-31")))
# Gráfica de rentabilidad diaria para 2015 y 2016
ggplot(utilidad_diaria, aes(x = Fecha, y = Utilidad / 1e6, color = as.factor(Anio))) +
geom_line(size = 1) +
scale_color_manual(values = c("2015" = "#1f77b4", "2016" = "#ff7f0e")) +
scale_y_continuous(labels = scales::label_number_si(prefix = "$", unit = "M", accuracy = 0.1)) +
scale_x_date(date_labels = "%b %d", date_breaks = "1 month") +
labs(
title = "Utilidad bruta Diaria - 2015 vs 2016",
x = "Fecha",
y = "Utilidad (Millones de USD)",
color = "Año"
) +
theme_minimal() +
theme(
plot.title = element_text(hjust = 0.5, size = 20),
axis.text.x = element_text(angle = 45, hjust = 1)
)Análisis de rentabilidad del portafolio
Análisis de rentabilidad por mes
# Filtrar y preparar los datos para los años 2015 y 2016
bd_2015 <- bd %>%
filter(year(Fecha) == 2015) %>%
mutate(Mes = month(Fecha, label = TRUE, abbr = TRUE, locale = "en_US"))
bd_2016 <- bd %>%
filter(year(Fecha) == 2016) %>%
mutate(Mes = month(Fecha, label = TRUE, abbr = TRUE, locale = "en_US"))
# Calcular la rentabilidad mensual para 2015
rentabilidad_mensual_2015 <- bd_2015 %>%
group_by(Mes) %>%
summarize(Rentabilidad = sum(`Ventas Netas (USD)` - `Costo (USD)`) / sum(`Costo (USD)`) * 100)
# Calcular la rentabilidad mensual para 2016
rentabilidad_mensual_2016 <- bd_2016 %>%
group_by(Mes) %>%
summarize(Rentabilidad = sum(`Ventas Netas (USD)` - `Costo (USD)`) / sum(`Costo (USD)`) * 100)
# Combinar los resultados de ambos años en una sola tabla
rentabilidad_mensual <- rentabilidad_mensual_2015 %>%
rename(Rentabilidad_2015 = Rentabilidad) %>%
full_join(rentabilidad_mensual_2016 %>% rename(Rentabilidad_2016 = Rentabilidad), by = "Mes") %>%
arrange(match(Mes, month.name))
# Crear la tabla de rentabilidad mensual
tabla_rentabilidad_mensual <- rentabilidad_mensual %>%
kable(caption = "Rentabilidad Mensual de 2015 y 2016", format = "html", digits = 2, col.names = c("Mes", "Rentabilidad 2015 (%)", "Rentabilidad 2016 (%)")) %>%
kable_styling(full_width = FALSE, bootstrap_options = c("striped", "hover"))
# Mostrar la tabla
tabla_rentabilidad_mensual| Mes | Rentabilidad 2015 (%) | Rentabilidad 2016 (%) |
|---|---|---|
| May | 66.24 | 63.25 |
| Jan | 71.09 | 75.95 |
| Feb | 75.89 | 76.43 |
| Mar | 71.33 | 76.93 |
| Apr | 70.93 | 77.09 |
| Jun | 71.66 | 65.68 |
| Jul | 72.09 | 93.52 |
| Aug | 73.57 | 69.75 |
| Sep | 75.84 | 77.28 |
| Oct | 85.45 | 80.75 |
| Nov | 74.92 | 74.71 |
| Dec | 70.52 | 79.40 |
Análisis de rentabilidad por trimestre
# Filtrar y preparar los datos para los años 2015 y 2016
bd_2015 <- bd %>%
filter(year(Fecha) == 2015) %>%
mutate(Trimestre = quarter(Fecha, with_year = FALSE))
bd_2016 <- bd %>%
filter(year(Fecha) == 2016) %>%
mutate(Trimestre = quarter(Fecha, with_year = FALSE))
# Calcular la rentabilidad por trimestre para 2015
rentabilidad_trimestre_2015 <- bd_2015 %>%
group_by(Trimestre) %>%
summarize(Rentabilidad = sum(`Ventas Netas (USD)` - `Costo (USD)`) / sum(`Costo (USD)`) * 100)
# Calcular la rentabilidad por trimestre para 2016
rentabilidad_trimestre_2016 <- bd_2016 %>%
group_by(Trimestre) %>%
summarize(Rentabilidad = sum(`Ventas Netas (USD)` - `Costo (USD)`) / sum(`Costo (USD)`) * 100)
# Combinar los resultados de ambos años en una sola tabla
rentabilidad_trimestre <- rentabilidad_trimestre_2015 %>%
rename(Rentabilidad_2015 = Rentabilidad) %>%
full_join(rentabilidad_trimestre_2016 %>% rename(Rentabilidad_2016 = Rentabilidad), by = "Trimestre")
# Crear la tabla de rentabilidad por trimestre
tabla_rentabilidad_trimestre <- rentabilidad_trimestre %>%
kable(caption = "Rentabilidad por Trimestre de 2015 y 2016", format = "html", digits = 2, col.names = c("Trimestre", "Rentabilidad 2015 (%)", "Rentabilidad 2016 (%)")) %>%
kable_styling(full_width = FALSE, bootstrap_options = c("striped", "hover"))
# Mostrar la tabla
tabla_rentabilidad_trimestre| Trimestre | Rentabilidad 2015 (%) | Rentabilidad 2016 (%) |
|---|---|---|
| 1 | 72.51 | 76.47 |
| 2 | 69.57 | 68.05 |
| 3 | 73.88 | 80.15 |
| 4 | 74.37 | 77.09 |
Análisis de rentabilidad por departamento
# Filtrar y preparar los datos para los años 2015 y 2016
bd_2015 <- bd %>%
filter(year(Fecha) == 2015)
bd_2016 <- bd %>%
filter(year(Fecha) == 2016)
# Calcular la rentabilidad por departamento para 2015
rentabilidad_departamento_2015 <- bd_2015 %>%
group_by(`Departamento`) %>%
summarize(Rentabilidad = sum(`Ventas Netas (USD)` - `Costo (USD)`) / sum(`Costo (USD)`) * 100)
# Calcular la rentabilidad por departamento para 2016
rentabilidad_departamento_2016 <- bd_2016 %>%
group_by(`Departamento`) %>%
summarize(Rentabilidad = sum(`Ventas Netas (USD)` - `Costo (USD)`) / sum(`Costo (USD)`) * 100)
# Combinar los resultados de ambos años en una sola tabla
rentabilidad_departamento <- rentabilidad_departamento_2015 %>%
rename(Rentabilidad_2015 = Rentabilidad) %>%
full_join(rentabilidad_departamento_2016 %>% rename(Rentabilidad_2016 = Rentabilidad), by = "Departamento")
# Crear la tabla de rentabilidad por departamento
tabla_rentabilidad_departamento <- rentabilidad_departamento %>%
kable(caption = "Rentabilidad por Departamento de 2015 y 2016", format = "html", digits = 2, col.names = c("Departamento", "Rentabilidad 2015 (%)", "Rentabilidad 2016 (%)")) %>%
kable_styling(full_width = FALSE, bootstrap_options = c("striped", "hover"))
# Mostrar la tabla
tabla_rentabilidad_departamento| Departamento | Rentabilidad 2015 (%) | Rentabilidad 2016 (%) |
|---|---|---|
| Alfombras | 100.86 | 108.98 |
| Artículos Impulso | 60.19 | 68.35 |
| Artículos Navideños | 86.48 | 143.29 |
| Automotriz | 62.18 | 61.16 |
| Baños | 92.66 | 93.40 |
| Bebes | 59.96 | 72.39 |
| Blancos | 76.72 | 80.47 |
| Cocina | 84.89 | 87.80 |
| Cortinaje | 150.90 | 150.99 |
| Decoracion | 89.47 | 90.65 |
| Electrodomésticos | 61.63 | 61.04 |
| Electronica | 29.46 | 23.28 |
| Eléctricos | 76.91 | 83.15 |
| Ferretería | 101.21 | 98.84 |
| Guatemala nuestra | 41.00 | 40.91 |
| Herramientas | 63.17 | 63.46 |
| Jardinería | 78.57 | 75.72 |
| Juguetes | 67.15 | 65.17 |
| Librería | 45.96 | 48.54 |
| Limpieza | 46.83 | 45.21 |
| Lámparas | 106.04 | 107.38 |
| Mascotas | 62.29 | 58.16 |
| Materiales de Construcción | 25.67 | 77.08 |
| Mesa | 92.17 | 93.83 |
| Muebles de Exterior | 75.03 | 78.24 |
| Muebles de Interior | 69.91 | 77.15 |
| Niños | 90.79 | 84.78 |
| Organización | 88.56 | 83.59 |
| Out Door Living | 86.10 | 70.90 |
| Pinturas | 51.91 | 52.64 |
| Plomería | 67.88 | 71.04 |
| Seguridad | 71.88 | 66.81 |
Análisis de rentabilidad por clientes
# Filtrar y preparar los datos para los años 2015 y 2016
bd_2015 <- bd %>%
filter(year(Fecha) == 2015)
bd_2016 <- bd %>%
filter(year(Fecha) == 2016)
# Calcular la rentabilidad por número de cliente para 2015
rentabilidad_cliente_2015 <- bd_2015 %>%
group_by(`Número de cliente`) %>%
summarize(Rentabilidad = sum(`Ventas Netas (USD)` - `Costo (USD)`) / sum(`Costo (USD)`) * 100)
# Calcular la rentabilidad por número de cliente para 2016
rentabilidad_cliente_2016 <- bd_2016 %>%
group_by(`Número de cliente`) %>%
summarize(Rentabilidad = sum(`Ventas Netas (USD)` - `Costo (USD)`) / sum(`Costo (USD)`) * 100)
# Combinar los resultados de ambos años en una sola tabla
rentabilidad_cliente <- rentabilidad_cliente_2015 %>%
rename(Rentabilidad_2015 = Rentabilidad) %>%
full_join(rentabilidad_cliente_2016 %>% rename(Rentabilidad_2016 = Rentabilidad), by = "Número de cliente")
# Crear la tabla de rentabilidad por número de cliente
tabla_rentabilidad_cliente <- rentabilidad_cliente %>%
kable(caption = "Rentabilidad por Cliente de 2015 y 2016", format = "html", digits = 2, col.names = c("Número de Cliente", "Rentabilidad 2015 (%)", "Rentabilidad 2016 (%)")) %>%
kable_styling(full_width = FALSE, bootstrap_options = c("striped", "hover"))
# Mostrar la tabla
tabla_rentabilidad_cliente| Número de Cliente | Rentabilidad 2015 (%) | Rentabilidad 2016 (%) |
|---|---|---|
| 1 | 70.50 | 79.53 |
| 2 | 50.16 | 88.02 |
| 3 | 64.54 | 75.91 |
| 4 | 64.34 | 84.89 |
| 5 | 66.45 | 82.75 |
| 6 | 81.39 | 60.03 |
| 7 | 68.20 | 70.55 |
| 8 | 67.68 | 60.53 |
| 9 | 67.07 | 71.93 |
| 10 | 68.20 | 71.33 |
| 11 | 64.89 | 79.29 |
| 12 | 73.67 | 57.26 |
| 13 | 79.39 | 70.70 |
| 14 | 68.69 | 96.76 |
| 15 | 65.99 | 78.90 |
| 16 | 54.23 | 91.82 |
| 17 | 74.29 | 85.60 |
| 18 | 60.00 | 60.64 |
| 19 | 56.59 | 77.34 |
| 20 | 43.72 | 108.74 |
| 21 | 67.38 | 67.53 |
| 22 | 73.91 | 74.69 |
| 23 | 82.93 | 56.07 |
| 24 | 81.52 | 47.56 |
| 25 | 72.13 | 82.55 |
| 26 | 78.68 | 72.95 |
| 27 | 70.26 | 77.80 |
| 28 | 79.59 | 82.77 |
| 29 | 80.90 | 81.35 |
| 30 | 62.38 | 76.09 |
| 31 | 90.79 | 88.28 |
| 32 | 70.47 | 75.27 |
| 33 | 69.49 | 81.54 |
| 34 | 81.10 | 68.92 |
| 35 | 64.17 | 84.85 |
| 36 | 68.09 | 83.24 |
| 37 | 79.52 | 89.08 |
| 38 | 86.53 | 60.97 |
| 39 | 72.58 | 76.43 |
| 40 | 55.85 | 82.02 |
| 41 | 77.53 | 97.91 |
| 42 | 62.75 | 79.48 |
| 43 | 94.57 | 52.35 |
| 44 | 87.87 | 77.91 |
| 45 | 72.51 | 57.40 |
| 46 | 80.49 | 82.84 |
| 47 | 69.87 | 66.11 |
| 48 | 70.82 | 67.07 |
| 49 | 94.04 | 90.92 |
| 50 | 75.10 | 78.77 |
| 51 | 47.21 | 64.74 |
| 52 | 80.06 | 82.38 |
| 53 | 85.83 | 61.60 |
| 54 | 96.31 | 60.19 |
| 55 | 80.99 | 56.90 |
| 56 | 70.29 | 72.44 |
| 57 | 95.62 | 76.93 |
| 58 | 82.24 | 86.00 |
| 59 | 76.15 | 76.84 |
| 60 | 70.58 | 87.19 |
| 61 | 69.63 | 73.01 |
| 62 | 78.49 | 83.90 |
| 63 | 65.92 | 80.50 |
| 64 | 68.07 | 70.79 |
| 65 | 74.79 | 90.94 |
| 66 | 90.04 | 64.45 |
| 67 | 67.60 | 56.58 |
| 68 | 78.90 | 77.73 |
| 69 | 84.97 | 60.63 |
| 70 | 69.59 | 94.61 |
| 71 | 75.77 | 76.92 |
| 72 | 79.05 | 82.12 |
| 73 | 62.48 | 70.36 |
| 74 | 71.42 | 74.20 |
| 75 | 89.92 | 82.37 |
| 76 | 86.64 | 76.63 |
| 77 | 72.08 | 66.74 |
| 78 | 58.88 | 62.61 |
| 79 | 75.86 | 75.99 |
| 80 | 79.89 | 69.01 |
| 81 | 64.70 | 64.80 |
| 82 | 90.66 | 76.64 |
| 83 | 86.50 | 89.62 |
| 84 | 71.96 | 77.39 |
| 85 | 64.25 | 60.01 |
| 86 | 81.30 | 71.20 |
| 87 | 69.88 | 68.78 |
Análisis de rentabilidad por vendedor
# Filtrar y preparar los datos para los años 2015 y 2016
bd_2015 <- bd %>%
filter(year(Fecha) == 2015)
bd_2016 <- bd %>%
filter(year(Fecha) == 2016)
# Calcular la rentabilidad por número de vendedor para 2015
rentabilidad_vendedor_2015 <- bd_2015 %>%
group_by(`Nom_Completo_Vendedor`) %>%
summarize(Rentabilidad = sum(`Ventas Netas (USD)` - `Costo (USD)`) / sum(`Costo (USD)`) * 100)
# Calcular la rentabilidad por número de vendedor para 2016
rentabilidad_vendedor_2016 <- bd_2016 %>%
group_by(`Nom_Completo_Vendedor`) %>%
summarize(Rentabilidad = sum(`Ventas Netas (USD)` - `Costo (USD)`) / sum(`Costo (USD)`) * 100)
# Combinar los resultados de ambos años en una sola tabla
rentabilidad_vendedor <- rentabilidad_vendedor_2015 %>%
rename(Rentabilidad_2015 = Rentabilidad) %>%
full_join(rentabilidad_vendedor_2016 %>% rename(Rentabilidad_2016 = Rentabilidad), by = "Nom_Completo_Vendedor")
# Crear la tabla de rentabilidad por número de vendedor
tabla_rentabilidad_vendedor <- rentabilidad_vendedor %>%
kable(caption = "Rentabilidad por Vendedor de 2015 y 2016", format = "html", digits = 2, col.names = c("Vendedor", "Rentabilidad 2015 (%)", "Rentabilidad 2016 (%)")) %>%
kable_styling(full_width = FALSE, bootstrap_options = c("striped", "hover"))
# Mostrar la tabla
tabla_rentabilidad_vendedor| Vendedor | Rentabilidad 2015 (%) | Rentabilidad 2016 (%) |
|---|---|---|
| Carlos Vela | 75.20 | 76.25 |
| Ernesto Pineda | 74.90 | 72.35 |
| Gonzalo Aguilar | 77.05 | 73.82 |
| Juan Garza | 71.69 | 76.91 |
| Michelle Perez | 60.53 | 72.96 |
| Paulina Casanova | 76.20 | 69.69 |
| Pedro Arroyo | 74.89 | 78.73 |
| Sofia Gonzalez | 75.63 | 72.01 |
Hoja de respuestas
Pareto ABC por departamentos
1.- ¿Cuál es el monto de ventas por cada clasificación ( A, B y C) ?
Respuesta:
| Clasificación | Ventas Netas (USD) |
|---|---|
| A | 184530955 |
| B | 35356587 |
| C | 14864808 |
2.- Calcular el número de departamentos por cada clasificación (A, B y C).
Respuesta:
| Clasificación | Cantidad de Departamentos |
|---|---|
| A | 18 |
| B | 7 |
| C | 7 |
Pareto ABC por clientes
3.- Realizar un ABC de clientes e identificar cuáles son los 5 clientes que más compran.
Respuesta:
| Número de cliente | Ventas_Netas_USD | Percentage | Porcentaje_Acumulado_cliente | Categoria_cliente |
|---|---|---|---|---|
| 47 | 20530094 | 8.745427 | 8.745427 | A |
| 14 | 19963858 | 8.504221 | 17.249647 | A |
| 59 | 19198607 | 8.178239 | 25.427886 | A |
| 68 | 18611336 | 7.928072 | 33.355959 | A |
| 74 | 16949300 | 7.220077 | 40.576035 | A |
| 71 | 2889475 | 1.230861 | 41.806896 | A |
4.- Identificar cuál es el vendedor que le vende a la mayoría de los clientes
Respuesta:
| Nom_Completo_Vendedor | Total_Ventas | Cantidad_Clientes |
|---|---|---|
| Juan Garza | 126053856 | 87 |
| Ernesto Pineda | 27277862 | 16 |
| Pedro Arroyo | 13928986 | 10 |
| Sofia Gonzalez | 15238779 | 10 |
Análisis de tendencia de ventas
5.- ¿Cuál es el mes con mas ventas para el año 2015 y 2016?
Respuesta:
| Mes | Ventas_Netas_USD | Crecimiento_Mensual |
|---|---|---|
| Dec | 23388851 | 75.64087 |
| Mes | Ventas_Netas_USD | Crecimiento_Mensual |
|---|---|---|
| Nov | 16960601 | 96.95748 |
6.- ¿Cuál es el mes con menos ventas para el año 2015 y 2016?
Respuesta:
| Mes | Ventas_Netas_USD | Crecimiento_Mensual |
|---|---|---|
| Feb | 7084396 | -10.47764 |
| Mes | Ventas_Netas_USD | Crecimiento_Mensual |
|---|---|---|
| Dec | 4404673 | -74.02997 |
7.- ¿Cuál es el porcentaje de crecimiento en ventas anual?
Respuesta:
| Año | Ventas_Netas_USD | Crecimiento_Anual |
|---|---|---|
| 2015 | 121748066 | 0.00 |
| 2016 | 113004284 | -7.18 |
Análisis de rentabilidad de portafolio
8.- ¿Cuál fue la rentabilidad del mes de septiembre del 2016?
Respuesta:
| Mes | Rentabilidad 2015 (%) | Rentabilidad 2016 (%) |
|---|---|---|
| May | 66.24 | 63.25 |
| Jan | 71.09 | 75.95 |
| Feb | 75.89 | 76.43 |
| Mar | 71.33 | 76.93 |
| Apr | 70.93 | 77.09 |
| Jun | 71.66 | 65.68 |
| Jul | 72.09 | 93.52 |
| Aug | 73.57 | 69.75 |
| Sep | 75.84 | 77.28 |
| Oct | 85.45 | 80.75 |
| Nov | 74.92 | 74.71 |
| Dec | 70.52 | 79.40 |
9.- ¿Cuáles fue el trimestre con la rentabilidad más baja?
Respuesta:
| Trimestre | Rentabilidad 2015 (%) | Rentabilidad 2016 (%) |
|---|---|---|
| 1 | 72.51 | 76.47 |
| 2 | 69.57 | 68.05 |
| 3 | 73.88 | 80.15 |
| 4 | 74.37 | 77.09 |
10.- ¿Cuál fue mi cliente menos rentable y en qué año?
Respuesta:
| Número de cliente | Año | Rentabilidad |
|---|---|---|
| 20 | 2015 | 43.72 |
Reporte
Áreas de oportunidad
A partir del análisis de los datos de ventas de 2015 y 2016, se identificaron las siguientes áreas de oportunidad:
1. Desempeño de Vendedores:
- Algunos vendedores muestran consistentemente bajo rendimiento en términos de ventas netas y rentabilidad.
2. Clientes:
- Se observó una disminución en las compras de algunos clientes clave en 2016.
- Identificación de clientes menos rentables que requieren estrategias específicas de manejo.
3. Productos:
- Ciertas familias de productos presentan baja rentabilidad, lo que sugiere la necesidad de revisar el portafolio de productos.
4. Tendencias Temporales:
- La estacionalidad de las ventas sugiere oportunidades para campañas de marketing dirigidas en períodos específicos del año.
Soluciones propuestas
1. Mejora del Desempeño de Vendedores:
- Implementar programas de capacitación para vendedores con bajo rendimiento.
- Introducir incentivos basados en el rendimiento promedio para motivar a los vendedores.
2. Fidelización de Clientes:
- Desarrollar programas de fidelización para retener a los clientes más rentables.
- Realizar encuestas para entender las necesidades de los clientes que han reducido sus compras.
3. Optimización del Portafolio de Productos:
- Revisar el catálogo de productos y considerar la eliminación de productos con baja rentabilidad.
- Introducir nuevos productos basados en las tendencias del mercado y las necesidades de los clientes.
4. Campañas de Marketing Dirigidas:
- Planificar campañas de marketing estacionales basadas en las tendencias de ventas.
- Utilizar datos de ventas históricos para predecir y prepararse para períodos de alta demanda.
Políticas, procesos y procedimientos
1. Políticas de Ventas y Marketing:
- Introducción de una política de incentivos para vendedores basada en objetivos de rendimiento.
- Política de descuentos y promociones estacionales para aumentar las ventas durante períodos clave.
2. Procesos Operativos:
- Optimización de la gestión de inventarios para reducir costos y mejorar la disponibilidad de productos.
- Mejora de los procesos logísticos para asegurar entregas más rápidas y eficientes.
3. Procedimientos Estándares:
- Establecer procedimientos estándar para la formación y evaluación de vendedores.
- Implementar un procedimiento de revisión trimestral del portafolio de productos.
Plan de trabajo
1. Cronograma de Implementación:
- Mes 1-2: Evaluación y capacitación de vendedores.
- Mes 1-2: Revisión y optimización del portafolio de productos.
- Mes 4-6: Lanzamiento de campañas de marketing estacionales.
2. Asignación de Responsabilidades:
- Equipo de Ventas: Implementar programas de capacitación y motivación.
- Equipo de Marketing: Planificar y ejecutar campañas de marketing.
- Equipo de Operaciones: Optimizar procesos de inventario y logística.
3. Recursos Necesarios:
- Humanos: Contratación de un especialista en retail y un especialista en marketing digital.
- Tecnológicos: Implementación de un nuevo sistema de gestión de inventarios.
- Financieros: Presupuesto para campañas de marketing y programas de incentivos.
Sistema de trabajo
1. Monitoreo y Evaluación:
- Establecer reuniones mensuales de seguimiento para revisar el progreso y ajustar las estrategias según sea necesario.
- Utilizar herramientas de análisis de datos para monitorear las métricas clave en tiempo real.Recomendado Azure, Power apps, SQL, Salesforce
2. Indicadores Clave de Rendimiento (KPIs):
- Ventas Netas: Monitorear el incremento en ventas netas mensualmente.
- Rentabilidad: Medir la mejora en la rentabilidad por vendedor y por producto.
- Fidelización de Clientes: Seguimiento de la tasa de retención de clientes.
- Eficiencia Operativa: Reducción en los tiempos de entrega y costos de inventario.