# Cargar librerías necesarias (asegúrate de haberlas instalado previamente en la consola)
library(readxl)
library(dplyr)
library(lubridate)
# Ruta al archivo: ajústala si lo mueves de lugar.
ruta_archivo <- "C:/Users/usuario/OneDrive/Desktop/Juan/Logos y Textos/Excel Ventas y ComprasMP.xlsx"
# Verificar existencia
if (!file.exists(ruta_archivo)) {
stop("No se encontró el archivo en la ruta: ", ruta_archivo)
}
# Listar hojas disponibles para diagnóstico
hojas <- excel_sheets(ruta_archivo)
cat("Hojas detectadas:\n")
## Hojas detectadas:
print(hojas)
## [1] "ComprasMP" "Ventas"
# Leer ambas hojas con tipos (basado en encabezados actuales)
ventas <- read_excel(
path = ruta_archivo,
sheet = "Ventas",
col_types = c(
"text", # Codigo
"text", # Codigo Producto
"text", # Cliente
"date", # Fecha
"text", # Producto
"text", # Comercial
"numeric", # Cantidad
"numeric", # Precio Compra
"numeric", # Precio Venta
"numeric", # Total Venta
"numeric", # Comision vendedor
"text", # Cliente Nombre
"text", # Comercial Nombre
"numeric", # % Comision vendedor
"text" # Ventas
)
)
compras_mp <- read_excel(
path = ruta_archivo,
sheet = "ComprasMP",
col_types = c(
"text", # Codigo
"date", # Fecha
"text", # CosProv
"text", # Proveedor
"text", # Codigoprod
"text", # ComprasMateP
"numeric", # Cantidad
"numeric", # Precio Compra
"numeric", # Total Compras
"text" # CodFactProv
)
)
# Normalizar nombres para evitar espacios
ventas <- ventas %>% rename_with(~ gsub(" ", "_", .x))
compras_mp <- compras_mp %>% rename_with(~ gsub(" ", "_", .x))
# Asegurar tipo de fecha (por si acaso)
ventas <- ventas %>% mutate(Fecha = as.Date(Fecha))
compras_mp <- compras_mp %>% mutate(Fecha = as.Date(Fecha))
# Filtrar filas con datos esenciales presentes
ventas <- ventas %>% filter(!is.na(Producto), !is.na(Cantidad), !is.na(Total_Venta))
compras_mp <- compras_mp %>% filter(!is.na(Codigoprod), !is.na(Cantidad), !is.na(Total_Compras))
# Vista rápida de tamaño
cat("Ventas:", nrow(ventas), "filas. ComprasMP:", nrow(compras_mp), "filas.\n")
## Ventas: 1479 filas. ComprasMP: 416 filas.
top_n <- 10 # número de top que se mostrarán
# Productos más vendidos (por cantidad)
productos_mas_vendidos <- ventas %>%
group_by(Producto) %>%
summarise(
Total_Cantidad = sum(Cantidad, na.rm = TRUE),
Veces_Vendido = n(),
.groups = "drop"
) %>%
arrange(desc(Total_Cantidad)) %>%
slice_head(n = top_n)
# Productos que más ingresos generaron
productos_mas_rentables <- ventas %>%
group_by(Producto) %>%
summarise(
Ingreso_Total = sum(Total_Venta, na.rm = TRUE),
Cantidad_Total = sum(Cantidad, na.rm = TRUE),
Precio_Promedio_Venta = if_else(Cantidad_Total > 0, Ingreso_Total / Cantidad_Total, NA_real_),
.groups = "drop"
) %>%
arrange(desc(Ingreso_Total)) %>%
slice_head(n = top_n)
# Clientes más frecuentes
clientes_frecuentes <- ventas %>%
group_by(Cliente) %>%
summarise(
Numero_Transacciones = n(),
Total_Vendido = sum(Total_Venta, na.rm = TRUE),
Promedio_por_Compra = if_else(Numero_Transacciones > 0, Total_Vendido / Numero_Transacciones, NA_real_),
.groups = "drop"
) %>%
arrange(desc(Numero_Transacciones)) %>%
slice_head(n = top_n)
# Clientes más valiosos (por ingreso)
clientes_mas_valiosos <- ventas %>%
group_by(Cliente) %>%
summarise(
Total_Vendido = sum(Total_Venta, na.rm = TRUE),
Numero_Transacciones = n(),
.groups = "drop"
) %>%
arrange(desc(Total_Vendido)) %>%
slice_head(n = top_n)
library(knitr)
cat("Productos más vendidos (cantidad):\n")
## Productos más vendidos (cantidad):
kable(productos_mas_vendidos, digits = 2)
Producto | Total_Cantidad | Veces_Vendido |
---|---|---|
L - Etiq Maca / Pcte 115GR / 4x1 | 250500 | 12 |
ETIQUETAS PROPALCOTE - MACAMANI | 96971 | 7 |
CUCURUCHOS BOND 60GR | 72000 | 3 |
L - Etiq Maca /Adhe Cte/ Med Corte / 4x0 | 54000 | 8 |
ETIQUETAS ADHESIVAS - MACAMANI | 43000 | 4 |
STICKERS | 41252 | 14 |
L - Stickers LFB - Adh cte-7x4cm-barniz bte-4x0 (4m) | 40000 | 9 |
INDIVIDUALES | 29000 | 4 |
Volantes | 28955 | 23 |
DI - Stickers TT - 10x15cm - 1 color Ref. Estiba y averias (Quala) | 23000 | 3 |
cat("\nProductos más rentables (ingresos):\n")
##
## Productos más rentables (ingresos):
kable(productos_mas_rentables %>% select(-Cantidad_Total), digits = 2)
Producto | Ingreso_Total | Precio_Promedio_Venta |
---|---|---|
MATERIAL POP | 27264170 | 9251.50 |
DETALLE | 21444099 | 649821.18 |
D- Vinilo adhe-30x30cm-Ref. PGIRS- azul y verde ( promo) | 16930000 | 3386.00 |
P - Kit (Cuaderno- bond 75grx80) (Cart-1 tinta-Lapicero 1 marca - lápiz y borr)(Bolsa Kamb-1 tinta) Ref. Encuentros interg | 16584635 | 15645.88 |
L- Talon Periód- num (21x28 )O y1C 1x0 - Manifiesto Recol RH - PROMO | 15945600 | 5280.00 |
L- Talon AFORO - Periód - num-(21x13) O y 1C- 1x0 (PROMO) | 15488500 | 4736.54 |
AFORO - PROMO | 14946300 | 5640.11 |
VINILOS | 14050947 | 11055.03 |
TALONARIOS | 10500686 | 8046.50 |
PLEGABLES | 7778999 | 1364.50 |
cat("\nClientes más frecuentes:\n")
##
## Clientes más frecuentes:
kable(clientes_frecuentes, digits = 2)
Cliente | Numero_Transacciones | Total_Vendido | Promedio_por_Compra |
---|---|---|---|
1-002 | 196 | 105044175 | 535939.7 |
1-003 | 129 | 56117850 | 435022.1 |
1-005 | 77 | 14409532 | 187136.8 |
1-023 | 61 | 14244575 | 233517.6 |
1-001 | 51 | 14719140 | 288610.6 |
1-118 | 51 | 20702826 | 405937.8 |
1-044 | 46 | 14297800 | 310821.7 |
1-007 | 44 | 9403220 | 213709.5 |
1-010 | 44 | 6096494 | 138556.7 |
1-006 | 42 | 4710300 | 112150.0 |
cat("\nClientes más valiosos:\n")
##
## Clientes más valiosos:
kable(clientes_mas_valiosos, digits = 2)
Cliente | Total_Vendido | Numero_Transacciones |
---|---|---|
1-002 | 105044175 | 196 |
1-003 | 56117850 | 129 |
1-118 | 20702826 | 51 |
1-081 | 19913814 | 4 |
1-043 | 18451752 | 40 |
1-016 | 17603270 | 37 |
1-001 | 14719140 | 51 |
1-005 | 14409532 | 77 |
1-044 | 14297800 | 46 |
1-023 | 14244575 | 61 |
# a) Top productos por cantidad
p1 <- ggplot(productos_mas_vendidos, aes(x = reorder(Producto, Total_Cantidad), y = Total_Cantidad)) +
geom_col() +
coord_flip() +
labs(
title = paste0("Top ", top_n, " productos más vendidos (cantidad)"),
x = "Producto",
y = "Cantidad total"
) +
theme_minimal() +
scale_x_discrete(labels = function(x) str_wrap(x, width = 25))
# b) Top productos por ingreso
p2 <- ggplot(productos_mas_rentables, aes(x = reorder(Producto, Ingreso_Total), y = Ingreso_Total)) +
geom_col() +
coord_flip() +
scale_y_continuous(labels = dollar_format(prefix = "$", big.mark = ",")) +
labs(
title = paste0("Top ", top_n, " productos por ingreso"),
x = "Producto",
y = "Ingreso total"
) +
theme_minimal() +
scale_x_discrete(labels = function(x) str_wrap(x, width = 25))
# c) Clientes más frecuentes
p3 <- ggplot(clientes_frecuentes, aes(x = reorder(Cliente, Numero_Transacciones), y = Numero_Transacciones)) +
geom_col() +
coord_flip() +
labs(
title = paste0("Top ", top_n, " clientes más frecuentes"),
x = "Cliente",
y = "Número de transacciones"
) +
theme_minimal() +
scale_x_discrete(labels = function(x) str_wrap(x, width = 20))
# d) Clientes más valiosos
p4 <- ggplot(clientes_mas_valiosos, aes(x = reorder(Cliente, Total_Vendido), y = Total_Vendido)) +
geom_col() +
coord_flip() +
scale_y_continuous(labels = dollar_format(prefix = "$", big.mark = ",")) +
labs(
title = paste0("Top ", top_n, " clientes por ingreso generado"),
x = "Cliente",
y = "Ingreso total"
) +
theme_minimal() +
scale_x_discrete(labels = function(x) str_wrap(x, width = 20))
# Imprimir
print(p1)
print(p2)
print(p3)
print(p4)
Productos mas vendidos Aqui se pueden envidenciar los 10
productos mas vendidos por cantidad, en este caso el producto mas
vendido es “L - Etiq Maca / Pcte 115GR / 4x1” con unas 250,500 unidades
vendidas, pero se vendio 12 veces, por lo que se puede decir que fue el
pedido de un cliente particular. Hay una gran diferencia del top 2 de
productos vendidos, las “Etiquetas Propalcote” que se vendieron 96,971
unidades, y fue vendido 7 veces. Se puede sacar como conclusion que hubo
un cliente que pidio las “L - Etiq Maca / Pcte 115GR / 4x1” de forma
explicita y las pedia. Tambien cabe resaltar que en la lista de
productos no habia un producto con ese nombre y especificaciones, se
asume que es un cliente que realizo el pedido de forma especifica.
Productos por Ingreso Aqui se puede ver que los productos que mas ingresos generan son completamente diferentes a los productos que mas se venden, en este caso el producto que mas genera ganancias es el Material Pop que genera un ingreso total de 27.264.170, y se vendieron unas 2,947 unidades
Clientes mas frecuentes Aqui podemos encontrar el top 10 clientes mas frecuentes que tiene la empresa,lo podriamos calificar como fidelidad de los clientes, pasare a explicar los 3 primeros codigos a que clientes se refiere (Estos codigos los establecio la empresa misma para cada cliente) 1-002: PROMOCALI S.A. E.S.P. 1-003: PROMOVALLE S.A. E.S.P. 1-005: SEGURIDAD SHATTER LTDA.
Mejores Clientes por Ingreso En cuestion de los ingresos generados por los clientes, podemos ver que el primer y segundo lugar son iguales a los clientes mas frecuentes, se recomienda mantener un alto nivel de servicio y prioridad para estos clientes.
# Materias primas más compradas (volumen) usando Código de producto
materias_mas_compradas <- compras_mp %>%
group_by(Codigoprod) %>%
summarise(
Cantidad_Total = sum(Cantidad, na.rm = TRUE),
Gasto_Total = sum(Total_Compras, na.rm = TRUE),
.groups = "drop"
) %>%
mutate(Precio_Promedio_Compra = if_else(Cantidad_Total > 0, Gasto_Total / Cantidad_Total, NA_real_)) %>%
arrange(desc(Cantidad_Total)) %>%
slice_head(n = top_n)
# Materias con mayor gasto acumulado (por código)
materias_mayor_gasto <- compras_mp %>%
group_by(Codigoprod) %>%
summarise(
Gasto_Total = sum(Total_Compras, na.rm = TRUE),
.groups = "drop"
) %>%
arrange(desc(Gasto_Total)) %>%
slice_head(n = top_n)
# Materias más costosas por unidad (precio promedio) por código
materias_precio <- compras_mp %>%
group_by(Codigoprod) %>%
summarise(
Cantidad_Total = sum(Cantidad, na.rm = TRUE),
Gasto_Total = sum(Total_Compras, na.rm = TRUE),
.groups = "drop"
) %>%
mutate(Precio_Promedio = if_else(Cantidad_Total > 0, Gasto_Total / Cantidad_Total, NA_real_)) %>%
arrange(desc(Precio_Promedio)) %>%
slice_head(n = top_n)
cat("Materias primas más compradas (por Código de producto):\n")
## Materias primas más compradas (por Código de producto):
kable(materias_mas_compradas, digits = 2)
Codigoprod | Cantidad_Total | Gasto_Total | Precio_Promedio_Compra |
---|---|---|---|
3-442 | 50000 | 111344.6 | 2.23 |
3-085 | 20000 | 764800.0 | 38.24 |
3-379 | 10000 | 76500.0 | 7.65 |
3-015 | 9000 | 1419000.0 | 157.67 |
3-003 | 6553 | 2249449.0 | 343.27 |
3-025 | 2690 | 872445.6 | 324.33 |
3-049 | 2290 | 1550613.1 | 677.12 |
3-014 | 2245 | 647865.0 | 288.58 |
3-070 | 1673 | 427884.0 | 255.76 |
3-011 | 1668 | 2149716.0 | 1288.80 |
cat("\nMaterias con mayor gasto acumulado (por Código):\n")
##
## Materias con mayor gasto acumulado (por Código):
kable(materias_mayor_gasto, digits = 2)
Codigoprod | Gasto_Total |
---|---|
3-376 | 10840336 |
3-172 | 3997204 |
3-003 | 2249449 |
3-011 | 2149716 |
3-113 | 1669355 |
3-049 | 1550613 |
3-015 | 1419000 |
3-115 | 1288306 |
3-101 | 1194067 |
3-339 | 953016 |
cat("\nMaterias más costosas por unidad (por Código):\n")
##
## Materias más costosas por unidad (por Código):
kable(materias_precio %>% select(-Cantidad_Total, -Gasto_Total), digits = 2)
Codigoprod | Precio_Promedio |
---|---|
3-376 | 10840336.0 |
3-172 | 666200.7 |
3-113 | 417338.9 |
3-339 | 317672.0 |
3-378 | 226891.0 |
3-108 | 200637.7 |
3-457 | 187144.5 |
3-392 | 156079.0 |
3-393 | 155155.0 |
3-101 | 132674.1 |
# a) Volumen comprado por código
q1 <- ggplot(materias_mas_compradas, aes(x = reorder(Codigoprod, Cantidad_Total), y = Cantidad_Total)) +
geom_col() +
coord_flip() +
labs(
title = paste0("Top ", top_n, " códigos más comprados (cantidad)"),
x = "Código de producto",
y = "Cantidad total"
) +
theme_minimal() +
scale_x_discrete(labels = function(x) str_wrap(x, width = 25))
# b) Mayor gasto acumulado por código
q2 <- ggplot(materias_mayor_gasto, aes(x = reorder(Codigoprod, Gasto_Total), y = Gasto_Total)) +
geom_col() +
coord_flip() +
scale_y_continuous(labels = dollar_format(prefix = "$", big.mark = ",")) +
labs(
title = paste0("Top ", top_n, " códigos con mayor gasto acumulado"),
x = "Código de producto",
y = "Gasto total"
) +
theme_minimal() +
scale_x_discrete(labels = function(x) str_wrap(x, width = 25))
# c) Precio promedio de compra por código
q3 <- ggplot(materias_precio, aes(x = reorder(Codigoprod, Precio_Promedio), y = Precio_Promedio)) +
geom_col() +
coord_flip() +
scale_y_continuous(labels = dollar_format(prefix = "$", big.mark = ",")) +
labs(
title = paste0("Top ", top_n, " códigos más costosos por unidad"),
x = "Código de producto",
y = "Precio promedio"
) +
theme_minimal() +
scale_x_discrete(labels = function(x) str_wrap(x, width = 25))
print(q1)
print(q2)
print(q3)
Materiales mas comprados En este caso hay un claro indicio de cual es el material mas comprado, por ende se infiere el mas necesario para los procesos. Pasare a decir cuales son los 3 primeros materiales segun el codigo que tienen. 3-442: ETIQUETA TT 32X15 3-085: ETIQUETAS TT 100x150mm 3-379: ETIQUETAS TT 60X30 Debido a que los 3 productos son etiquetas, algo que puede ir en cada producto, pasaremos a nombrar los siguientes 3 productos de la lista. Cabe resaltar que las etiquetas vienen todas del mismo proveedor, por ende se asume una relacion cercana que se recomienda mantener. 3-015:periodico 48,8g 70x100 3-003:QUIMICO ORIGINAL BLANCO 3-025:QUIMICO FINAL VERDE.
Materias Primas con mayor gasto acumulado En este caso, las materias primas que mas gasto acumulado tienen, es decir que de todo lo que se ha comprado en lo que se tiene registro, estas son las que mas le cuestan a la empresa (Sin tener en cuenta su uso) 3-376: PCX 150 2023 GRIS - Con unos gastos de 10.840.336 en total 3-172:COMPRAS FALABELLA - Con unos gastos de 3.997.204, aunque estos son unos gastos de oficina 3-003:QUIMICO ORIGINAL BLANCO - Con unos gastos de 2.249.449 3-011: ADHESIVO CORRIENTE L90-P3H - Con unos gastos de 2.149.716
Materias Primas con mayor costo unitario En este caso el que mas cuesta de forma individual es la materia prima PCX 150, se recomienda verificar esta materia prima, hay una gran diferencia en los gastos, en lo que respecta a esta materia prima.Precio promedio de 10,840,336.0
3-172: COMPRAS FALABELLA - Nuevamente aparece, tambien como el segundo gasto de mayor valor unitario, cabe aclarar que es un gasto de oficina. Precio promedio de 666,200.7 3-113: MERCANCIA MARPICO - Con un precio promedio de 417,338.9 Los materiales que siguen tienen proveniencia de gastos de oficina. Hasta el codigo: 3-392: PCTE ESMALTADO C2S 150G 60X90 - Que tiene un precio promedio de 156079.0