# 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.