Mood del día: 🛒📊 “Donde hay colas, hay datos; donde hay datos, hay inferencia.”

Este cuaderno de práctica reúne ejercicios potentes y divertidos de estadística no paramétrica aplicados al mundo de supermercados plazaVea.
Cada ejercicio incluye código en R que genera salidas para que tomes decisiones, comentes y concluyas como una/uno data ninja.

knitr::opts_chunk$set(include = TRUE)
set.seed(123)
suppressPackageStartupMessages({
  library(dplyr)
  library(ggplot2)
  library(janitor)
})

1 1. Prueba sobre frecuencias de k categorías (Chi-cuadrado)

1.0.1 Escena A — “¿A qué hora llega la gente?” ⏰

En PlazaVea, la afluencia diaria se agrupa en 5 franjas: Mañana (M), Mediodía (MD), Tarde (T), Noche (N) y Cierre (C). El gerente cree que la proporción de llegadas es 1:2:4:6:3 (más gente en la noche).

Datos (50 días):

##   .  n percent
##   N 18    0.36
##   T 12    0.24
##   C  9    0.18
##  MD  6    0.12
##   M  5    0.10

Contrasta si las frecuencias observadas siguen la proporción 1:2:4:6:3.

esperadas <- 50 * prop_norm
chisq_res <- chisq.test(x = obs$n, p = prop_norm)
chisq_res
## 
##  Chi-squared test for given probabilities
## 
## data:  obs$n
## X-squared = 87.787, df = 4, p-value < 2.2e-16

Preguntas para responder:

1. ¿Cuál es el valor-p y qué concluyes al 5%?


1.0.2 Escena B — “Ticket de compra por categoría” 🧺

Se observan 80 tickets clasificados por categoría predominante: Alimentos, Bebidas, Higiene, Limpieza. Se sospecha la proporción 0.45, 0.25, 0.20, 0.10.

cats <- c("Alimentos","Bebidas","Higiene","Limpieza")
p_cats <- c(.45,.25,.20,.10)
tickets <- sample(cats, size=80, replace=TRUE, prob=p_cats)
tabyl(tickets)
##    tickets  n percent
##  Alimentos 40  0.5000
##    Bebidas 18  0.2250
##    Higiene 15  0.1875
##   Limpieza  7  0.0875
chisq.test(tabyl(tickets)$n, p = p_cats, rescale.p = TRUE)
## 
##  Chi-squared test for given probabilities
## 
## data:  tabyl(tickets)$n
## X-squared = 0.83194, df = 3, p-value = 0.8418

Comenta: decisión, y una acción para el layout de góndolas.


2 2. Bondad de ajuste (Chi-cuadrado)

2.0.1 Escena C — “¿Número de ítems por canasta ~ Poisson?” 🧮

Se registra el número de ítems por canasta en 120 compras. La hipótesis de negocio: Poisson(λ).

lambda_verdadero <- 6.2
items <- rpois(120, lambda = lambda_verdadero)

# Crear clases (0-3, 4-6, 7-9, 10+)
clases <- cut(items, breaks = c(-Inf,3,6,9,Inf), right = TRUE)
tabla <- tabyl(clases)

tabla
##    clases  n    percent
##  (-Inf,3]  6 0.05000000
##     (3,6] 64 0.53333333
##     (6,9] 39 0.32500000
##  (9, Inf] 11 0.09166667
# Estimar λ por MLE
lambda_hat <- mean(items)

lambda_hat
## [1] 6.275
# Frecuencias esperadas por distribución Poisson agrupada
p_esp <- c(ppois(3, lambda_hat),
           ppois(6, lambda_hat) - ppois(3, lambda_hat),
           ppois(9, lambda_hat) - ppois(6, lambda_hat),
           1 - ppois(9, lambda_hat))

esp <- length(items)*p_esp
esp
## [1] 15.39592 52.07072 40.03496 12.49840
chisq.test(tabla$n, p = p_esp, rescale.p = TRUE)
## 
##  Chi-squared test for given probabilities
## 
## data:  tabla$n
## X-squared = 8.6736, df = 3, p-value = 0.03396

Preguntas:
1. ¿Rechazas que “ítems por canasta” siga una Poisson al 5%?
2. Si el ajuste fuese malo, sugiere otra distribución discreta plausible y cómo la probarías.


3 3. Bondad de ajuste (Kolmogorov–Smirnov)

3.0.1 Escena D — “Tiempos de caja ~ Exponencial” ⏳

Se cronometran 60 tiempos (en minutos) en una caja rápida.

tiempos <- rexp(60, rate = 1/3.2) # media ~3.2 min
rate_hat <- 1/mean(tiempos)

# K-S contra Exponencial con parámetro estimado
ks_res <- ks.test(tiempos, "pexp", rate = rate_hat)
ks_res
## 
##  Exact one-sample Kolmogorov-Smirnov test
## 
## data:  tiempos
## D = 0.11307, p-value = 0.3974
## alternative hypothesis: two-sided

Preguntas:
1. Interpreta el valor-p. ¿El supuesto exponencial es razonable?
2. Grafica la CDF empírica y compárala con la teórica.

plot(ecdf(tiempos), main="CDF empírica vs teórica (Exponencial)")
curve(pexp(x, rate = rate_hat), add=TRUE)


4 4. Normalidad (Jarque–Bera)

4.0.1 Escena E — “Variación diaria del ticket promedio” 💳

Se observa la variación diaria (%) del ticket promedio durante 90 días. ¿Normalidad?

x <- c(rnorm(80, 0.2, 1), rnorm(10, 0.2, 3))

if (!requireNamespace("tseries", quietly = TRUE)) install.packages("tseries", repos='https://cloud.r-project.org')
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo
library(tseries)

jarque.bera.test(x)
## 
##  Jarque Bera Test
## 
## data:  x
## X-squared = 187.68, df = 2, p-value < 2.2e-16

Preguntas:
1. ¿Los supuestos de normalidad se sostienen? ¿Qué implicación tiene para usar t-tests?


5 5. Independencia (Chi-cuadrado en tabla de contingencia)

5.0.1 Escena F — “¿Método de pago independe de la zona?” 🧾🗺️

Se toma una muestra de 400 transacciones en 4 tiendas (Norte, Sur, Este, Oeste) y 3 métodos de pago (Efectivo, Tarjeta, App).

zonas <- c("Norte","Sur","Este","Oeste")
pago  <- c("Efectivo","Tarjeta","App")

set.seed(1)
df <- data.frame(
  zona = sample(zonas, 400, replace = TRUE, prob = c(.25,.25,.25,.25)),
  pago = sample(pago , 400, replace = TRUE, prob = c(.35,.5,.15))
)

tab <- table(df$zona, df$pago)
tab
##        
##         App Efectivo Tarjeta
##   Este   18       46      57
##   Norte  15       35      45
##   Oeste   8       33      47
##   Sur    20       31      45
chisq.test(tab)
## 
##  Pearson's Chi-squared test
## 
## data:  tab
## X-squared = 5.3099, df = 6, p-value = 0.5047

Preguntas:
1. ¿Evidencia de asociación entre zona y método de pago?
2. Operativamente, ¿qué harías con App en la zona con mayor sub-uso?


6 6. Homogeneidad (Chi-cuadrado)

6.0.1 Escena G — “¿Satisfacción homogénea?” 🙂

Se aplicó una encuesta con 4 niveles (Muy baja, Baja, Alta, Muy alta) en 3 tiendas (A, B, C).

niv <- c("Muy baja","Baja","Alta","Muy alta")

# Muestras independientes por tienda (tamaños fijos por homogeneidad)
A <- sample(niv, 120, replace=TRUE, prob=c(.10,.25,.45,.20))
B <- sample(niv, 100, replace=TRUE, prob=c(.08,.20,.50,.22))
C <- sample(niv, 140, replace=TRUE, prob=c(.12,.28,.40,.20))

tab_h <- rbind(
  A = tabyl(A)$n,
  B = tabyl(B)$n,
  C = tabyl(C)$n
)
colnames(tab_h) <- levels(factor(niv))
tab_h
##   Alta Baja Muy alta Muy baja
## A   61   20       25       14
## B   50   18       19       13
## C   60   37       29       14
chisq.test(tab_h)
## 
##  Pearson's Chi-squared test
## 
## data:  tab_h
## X-squared = 5.1219, df = 6, p-value = 0.5283

Preguntas:
1. ¿Evidencia de no homogeneidad al 5%?
2. ¿Qué categorías marcan las diferencias?
3. Propón una acción para la tienda con peor perfil.


7 7. Kruskal–Wallis (comparación de medianas)

7.0.1 Escena H — “Tiempo en cola por tienda” 🧍‍♀️🧍‍♂️

Se mide el tiempo en cola (minutos) en 4 tiendas (A, B, C, D), 30 observaciones por tienda.

set.seed(2)
A <- rgamma(30, shape=3, scale=1.0)
B <- rgamma(30, shape=3, scale=1.2)
C <- rgamma(30, shape=3, scale=1.0)
D <- rgamma(30, shape=3, scale=1.5)

grupo <- rep(c("A","B","C","D"), each=30)
tiempo <- c(A,B,C,D)

kruskal.test(tiempo ~ grupo)
## 
##  Kruskal-Wallis rank sum test
## 
## data:  tiempo by grupo
## Kruskal-Wallis chi-squared = 12.381, df = 3, p-value = 0.006187

Preguntas:
1. ¿Difieren las medianas entre tiendas?


8 8. Levene (igualdad de varianzas)

8.0.1 Escena I — “Volatilidad del ticket por tienda” 📈

Compara la variabilidad del ticket promedio diario entre 4 tiendas.

if (!requireNamespace("car", quietly = TRUE)) install.packages("car", repos='https://cloud.r-project.org')
library(car)
## Cargando paquete requerido: carData
## 
## Adjuntando el paquete: 'car'
## The following object is masked from 'package:dplyr':
## 
##     recode
set.seed(3)
A <- rnorm(35, 60,  8)
B <- rnorm(35, 62, 12)
C <- rnorm(35, 61,  8)
D <- rnorm(35, 59, 15)

dfv <- data.frame(
  ticket = c(A,B,C,D),
  tienda = rep(c("A","B","C","D"), each=35)
)

leveneTest(ticket ~ tienda, data = dfv, center = median)
## Levene's Test for Homogeneity of Variance (center = median)
##        Df F value   Pr(>F)    
## group   3  10.863 1.92e-06 ***
##       136                     
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Preguntas:
1. ¿Varianzas iguales al 5%?
2. ¿Qué implicación tiene esto para un ANOVA paramétrico?
3. Si no hay igualdad, ¿qué test o modelo robusto usarías?