# 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