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)
})
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%?
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.
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.
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)
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?
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?
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.
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?
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?