# CASO PRÁCTICO: PASTELERÍA LETY - Estadística descriptiva
if (!require(readxl)) install.packages("readxl")
## Loading required package: readxl
library(readxl)
datos <- as.data.frame(read_excel("BASE DE DATOS pasteleria.xlsx", sheet = "Datos"))
# Ordenar los días de lunes a domingo
dias <- unique(datos$Dia_Semana)
datos$Dia_Semana <- factor(datos$Dia_Semana,
levels = sapply(c("Lu","Ma","Mi","Ju","Vi","S","Do"), function(p) grep(paste0("^", p), dias, value = TRUE)[1]))
moda <- function(x) names(which(table(x) == max(table(x))))
frecuencias <- function(x) {
fi <- table(x)
data.frame(fi = as.vector(fi), fr = round(as.vector(prop.table(fi)), 4),
Fi = cumsum(as.vector(fi)), Fr = round(cumsum(as.vector(prop.table(fi))), 4),
row.names = names(fi))
}
agrupados <- function(x) {
h <- hist(x, breaks = "Sturges", right = FALSE, plot = FALSE)
n <- length(x)
data.frame(Clase = paste0("[", head(h$breaks, -1), " - ", h$breaks[-1], ")"),
Marca = h$mids, fi = h$counts, fr = round(h$counts / n, 4),
Fi = cumsum(h$counts), Fr = round(cumsum(h$counts) / n, 4))
}
medidas <- function(x) {
cat("Media:", round(mean(x), 2), "| Mediana:", median(x), "| Moda:", moda(x), "\n")
cat("Rango:", max(x) - min(x), "| Varianza:", round(var(x), 2),
"| Desv. estándar:", round(sd(x), 2), "\n")
cat("Cuartiles:\n"); print(quantile(x, c(0.25, 0.5, 0.75)))
cat("Deciles:\n"); print(quantile(x, seq(0.1, 0.9, 0.1)))
}
for (v in c("Producto", "Canal_Venta", "Tipo_Cliente", "Dia_Semana", "Satisfaccion")) {
cat("\n=====", v, "=====\n")
print(frecuencias(datos[[v]]))
cat("Moda:", moda(datos[[v]]), "\n")
barplot(table(datos[[v]]), col = "#C9748F", main = paste("Pedidos por", v), ylab = "Frecuencia")
}
##
## ===== Producto =====
## fi fr Fi Fr
## Cupcakes 27 0.1800 27 0.1800
## Galletas 26 0.1733 53 0.3533
## Gelatina 13 0.0867 66 0.4400
## Pan dulce 21 0.1400 87 0.5800
## Pastel 41 0.2733 128 0.8533
## Pay 22 0.1467 150 1.0000
## Moda: Pastel

##
## ===== Canal_Venta =====
## fi fr Fi Fr
## App de entrega 17 0.1133 17 0.1133
## Mostrador 62 0.4133 79 0.5267
## Redes sociales 32 0.2133 111 0.7400
## WhatsApp 39 0.2600 150 1.0000
## Moda: Mostrador

##
## ===== Tipo_Cliente =====
## fi fr Fi Fr
## Frecuente 94 0.6267 94 0.6267
## Nuevo 56 0.3733 150 1.0000
## Moda: Frecuente

##
## ===== Dia_Semana =====
## fi fr Fi Fr
## Lunes 11 0.0733 11 0.0733
## Martes 11 0.0733 22 0.1467
## Miércoles 17 0.1133 39 0.2600
## Jueves 13 0.0867 52 0.3467
## Viernes 26 0.1733 78 0.5200
## Sábado 34 0.2267 112 0.7467
## Domingo 38 0.2533 150 1.0000
## Moda: Domingo

##
## ===== Satisfaccion =====
## fi fr Fi Fr
## 1 3 0.0200 3 0.0200
## 2 8 0.0533 11 0.0733
## 3 12 0.0800 23 0.1533
## 4 65 0.4333 88 0.5867
## 5 62 0.4133 150 1.0000
## Moda: 4

pie(table(datos$Producto), col = hcl.colors(6, "Burg"), main = "Distribución por producto")

pie(table(datos$Canal_Venta), col = hcl.colors(4, "Burg"), main = "Distribución por canal")

# Satisfacción es ordinal (1 a 5): mediana, cuartiles y deciles
medidas(datos$Satisfaccion)
## Media: 4.17 | Mediana: 4 | Moda: 4
## Rango: 4 | Varianza: 0.86 | Desv. estándar: 0.93
## Cuartiles:
## 25% 50% 75%
## 4 4 5
## Deciles:
## 10% 20% 30% 40% 50% 60% 70% 80% 90%
## 3 4 4 4 4 5 5 5 5
for (v in c("Monto_Venta", "Tiempo_Preparacion", "Cantidad_Piezas")) {
x <- datos[[v]]
cat("\n=====", v, "=====\n")
medidas(x)
cat("Tabla de datos agrupados (Sturges):\n")
tabla <- agrupados(x)
print(tabla)
hist(x, breaks = "Sturges", right = FALSE, col = "#E8B4C3", main = paste("Histograma de", v), xlab = v)
lines(tabla$Marca, tabla$fi, type = "b", pch = 19) # polígono de frecuencias
w <- diff(tabla$Marca[1:2]) # amplitud de clase
plot(c(tabla$Marca[1] - w / 2, tabla$Marca + w / 2), c(0, tabla$Fr), type = "b", pch = 19,
main = paste("Ojiva de", v), xlab = v, ylab = "Frecuencia relativa acumulada")
boxplot(x, horizontal = TRUE, col = "#F4D9A6", main = paste("Diagrama de caja de", v))
}
##
## ===== Monto_Venta =====
## Media: 508.43 | Mediana: 435 | Moda: 320
## Rango: 1590 | Varianza: 81579.24 | Desv. estándar: 285.62
## Cuartiles:
## 25% 50% 75%
## 315 435 630
## Deciles:
## 10% 20% 30% 40% 50% 60% 70% 80% 90%
## 242.5 299.0 320.0 388.0 435.0 519.0 596.5 688.0 800.0
## Tabla de datos agrupados (Sturges):
## Clase Marca fi fr Fi Fr
## 1 [0 - 200) 100 12 0.0800 12 0.0800
## 2 [200 - 400) 300 51 0.3400 63 0.4200
## 3 [400 - 600) 500 42 0.2800 105 0.7000
## 4 [600 - 800) 700 29 0.1933 134 0.8933
## 5 [800 - 1000) 900 7 0.0467 141 0.9400
## 6 [1000 - 1200) 1100 4 0.0267 145 0.9667
## 7 [1200 - 1400) 1300 1 0.0067 146 0.9733
## 8 [1400 - 1600) 1500 3 0.0200 149 0.9933
## 9 [1600 - 1800) 1700 1 0.0067 150 1.0000



##
## ===== Tiempo_Preparacion =====
## Media: 96.6 | Mediana: 79 | Moda: 92
## Rango: 217 | Varianza: 3538.62 | Desv. estándar: 59.49
## Cuartiles:
## 25% 50% 75%
## 52 79 135
## Deciles:
## 10% 20% 30% 40% 50% 60% 70% 80% 90%
## 35.9 46.8 62.7 69.0 79.0 86.8 99.3 150.6 196.5
## Tabla de datos agrupados (Sturges):
## Clase Marca fi fr Fi Fr
## 1 [20 - 40) 30 21 0.1400 21 0.1400
## 2 [40 - 60) 50 22 0.1467 43 0.2867
## 3 [60 - 80) 70 34 0.2267 77 0.5133
## 4 [80 - 100) 90 28 0.1867 105 0.7000
## 5 [100 - 120) 110 4 0.0267 109 0.7267
## 6 [120 - 140) 130 5 0.0333 114 0.7600
## 7 [140 - 160) 150 8 0.0533 122 0.8133
## 8 [160 - 180) 170 8 0.0533 130 0.8667
## 9 [180 - 200) 190 5 0.0333 135 0.9000
## 10 [200 - 220) 210 6 0.0400 141 0.9400
## 11 [220 - 240) 230 9 0.0600 150 1.0000



##
## ===== Cantidad_Piezas =====
## Media: 11.39 | Mediana: 7 | Moda: 1
## Rango: 45 | Varianza: 149.15 | Desv. estándar: 12.21
## Cuartiles:
## 25% 50% 75%
## 1 7 18
## Deciles:
## 10% 20% 30% 40% 50% 60% 70% 80% 90%
## 1.0 1.0 1.0 2.0 7.0 12.0 17.0 20.0 30.1
## Tabla de datos agrupados (Sturges):
## Clase Marca fi fr Fi Fr
## 1 [0 - 5) 2.5 68 0.4533 68 0.4533
## 2 [5 - 10) 7.5 15 0.1000 83 0.5533
## 3 [10 - 15) 12.5 16 0.1067 99 0.6600
## 4 [15 - 20) 17.5 18 0.1200 117 0.7800
## 5 [20 - 25) 22.5 13 0.0867 130 0.8667
## 6 [25 - 30) 27.5 4 0.0267 134 0.8933
## 7 [30 - 35) 32.5 5 0.0333 139 0.9267
## 8 [35 - 40) 37.5 2 0.0133 141 0.9400
## 9 [40 - 45) 42.5 8 0.0533 149 0.9933
## 10 [45 - 50) 47.5 1 0.0067 150 1.0000



boxplot(Monto_Venta ~ Producto, data = datos, col = "#C9748F", main = "Monto de venta por producto")

print(table(datos$Producto, datos$Canal_Venta))
##
## App de entrega Mostrador Redes sociales WhatsApp
## Cupcakes 4 11 7 5
## Galletas 3 17 4 2
## Gelatina 1 6 2 4
## Pan dulce 4 7 5 5
## Pastel 2 10 11 18
## Pay 3 11 3 5
print(aggregate(cbind(Monto_Venta, Tiempo_Preparacion) ~ Producto, data = datos, FUN = mean))
## Producto Monto_Venta Tiempo_Preparacion
## 1 Cupcakes 577.5926 82.66667
## 2 Galletas 496.1538 65.00000
## 3 Gelatina 260.0000 34.38462
## 4 Pan dulce 268.8095 39.14286
## 5 Pastel 762.1951 183.09756
## 6 Pay 340.6818 81.45455
print(aggregate(Satisfaccion ~ Tipo_Cliente, data = datos, FUN = mean))
## Tipo_Cliente Satisfaccion
## 1 Frecuente 4.276596
## 2 Nuevo 3.982143
# ============================================================
# INTERPRETACIÓN DE RESULTADOS Y CONCLUSIONES
# ============================================================
# PRODUCTO: El pastel es la moda (27.3% de los pedidos) y genera
# cerca del 41% de las ventas, ya que su ticket promedio (~$762)
# es el más alto. La gelatina es el producto menos pedido (8.7%).
#
# CANAL DE VENTA: El mostrador es el canal más usado (41.3%), pero
# WhatsApp (26%) concentra la mayoría de los pedidos de pastel y
# tiene los pedidos de mayor valor. La app de entrega solo aporta
# el 11.3% de los pedidos.
#
# TIPO DE CLIENTE: El 62.7% de los pedidos son de clientes
# frecuentes, lo que muestra una clientela leal.
#
# DÍA DE LA SEMANA: La moda es el domingo (25.3%). De viernes a
# domingo se concentra el 65.3% de los pedidos, mientras que de
# lunes a jueves la demanda es mucho menor.
#
# SATISFACCIÓN: La moda y la mediana son 4 (Satisfecho). El 84.7%
# de los clientes califica con 4 o 5. Los clientes nuevos califican
# un poco más bajo (3.98) que los frecuentes (4.28).
#
# MONTO DE VENTA: Media = $508.43, mediana = $435 y moda = $320.
# Como la media es mayor que la mediana, la distribución tiene
# sesgo a la derecha: la mitad central de los pedidos está entre
# $315 (Q1) y $630 (Q3), pero algunos pedidos grandes suben el
# promedio. El rango es de $1,590 y la desviación estándar de
# $285.62, lo que indica mucha variación. Según los deciles, el 10%
# de los pedidos más caros supera los $800.
#
# TIEMPO DE PREPARACIÓN: Media = 96.6 min y mediana = 79 min. La
# mitad de los pedidos se prepara en menos de 79 minutos, pero a
# partir del decil 8 (~151 min) están los pasteles, que tardan en
# promedio 183 min. La desviación estándar (59.5 min) muestra que
# la carga de trabajo cambia mucho según el producto.
#
# CANTIDAD DE PIEZAS: La moda es 1 pieza (34%) porque pasteles y
# pays se venden por unidad, mientras que cupcakes, galletas y pan
# dulce se venden por docena. Por eso la media (11.4) se aleja de
# la mediana (7) y hay tanta dispersión.
#
# CONCLUSIONES:
# 1. El pastel es el producto clave: es el más pedido, el que deja
# más dinero y el que más tiempo de cocina requiere.
# 2. La demanda se concentra en fin de semana, por lo que conviene
# preparar insumos desde el jueves y lanzar promociones entre
# semana para equilibrar la producción.
# 3. WhatsApp es el canal de los pedidos de mayor valor, así que
# vale la pena formalizarlo con catálogo y anticipos.
# 4. La satisfacción es alta, pero hay que cuidar la experiencia de
# los clientes nuevos para que se vuelvan frecuentes.
# 5. Como el monto y el tiempo están sesgados a la derecha, la
# mediana representa mejor el pedido típico que la media.