Este taller tiene como objetivo analizar datos de inventarios de productos en diferentes categorías, explorando su distribución y comportamiento en términos de stock disponible, ventas realizadas y devoluciones. Se trabajará con técnicas estadísticas básicas para interpretar la información y generar insights útiles para la gestión de inventarios.
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
datos <- read.csv("inventarios.csv")
head(datos)
## Categoria_Producto Stock_Disponible Ventas_Realizadas Devoluciones
## 1 Muebles 2541 1825 143
## 2 Electrónica 4255 1483 22
## 3 Alimentos 836 738 61
## 4 Electrónica 3113 1390 62
## 5 Ropa 4435 3598 219
## 6 Muebles 1074 918 17
La base de datos contiene 100 registros y 4 variables. La variable “Categoria_Producto” es de tipo cualitativo y representa cuatro categorías distintas: Alimentos, Electrónica, Muebles y Ropa, siendo “Alimentos” la más frecuente con 32 registros. Las otras tres variables son de tipo cuantitativo: “Stock_Disponible”, “Ventas_Realizadas” y “Devoluciones”, todas expresadas en valores enteros.
library(ggplot2)
# Resumen estadístico de las variables numéricas
summary(datos)
## Categoria_Producto Stock_Disponible Ventas_Realizadas Devoluciones
## Length:100 Min. : 73 Min. : 21.0 Min. : 0.00
## Class :character 1st Qu.:1606 1st Qu.: 466.2 1st Qu.: 15.00
## Mode :character Median :2788 Median :1116.0 Median : 44.00
## Mean :2683 Mean :1418.5 Mean : 76.41
## 3rd Qu.:3880 3rd Qu.:2127.5 3rd Qu.:116.00
## Max. :4806 Max. :4554.0 Max. :346.00
De acuerdo con la información anterior, el stock disponible oscila entre 73 y 4,806 unidades. El 25% de los registros presentan un stock menor o igual a 1,605 unidades, mientras que el 75% tienen un stock menor o igual a 3,879 unidades, lo que indica que la mayoría de los valores se encuentran dentro de este rango. En cuanto a las ventas realizadas, estas varían entre 21 y 4,554 unidades. El 25% de las ventas son menores o iguales a 466 unidades, mientras que el 75% no superan las 2,127 unidades, con una mediana de 1,116 unidades, lo que sugiere una distribución sesgada hacia valores más bajos. Finalmente, el número de devoluciones oscila entre 0 y 346 unidades, con el 25% de los valores por debajo de 15 y el 75% por debajo de 116, lo que indica que en la mayoría de los casos las devoluciones son relativamente bajas, aunque existen algunos valores altos que aumentan la variabilidad.
# Estructura de la base de datos
str(datos)
## 'data.frame': 100 obs. of 4 variables:
## $ Categoria_Producto: chr "Muebles" "Electrónica" "Alimentos" "Electrónica" ...
## $ Stock_Disponible : int 2541 4255 836 3113 4435 1074 3777 4089 3661 315 ...
## $ Ventas_Realizadas : int 1825 1483 738 1390 3598 918 1438 3221 864 308 ...
## $ Devoluciones : int 143 22 61 62 219 17 15 71 37 26 ...
summary(datos)
## Categoria_Producto Stock_Disponible Ventas_Realizadas Devoluciones
## Length:100 Min. : 73 Min. : 21.0 Min. : 0.00
## Class :character 1st Qu.:1606 1st Qu.: 466.2 1st Qu.: 15.00
## Mode :character Median :2788 Median :1116.0 Median : 44.00
## Mean :2683 Mean :1418.5 Mean : 76.41
## 3rd Qu.:3880 3rd Qu.:2127.5 3rd Qu.:116.00
## Max. :4806 Max. :4554.0 Max. :346.00
tabla_frecuencias <- datos %>% count(Categoria_Producto)
print(tabla_frecuencias)
## Categoria_Producto n
## 1 Alimentos 32
## 2 Electrónica 27
## 3 Muebles 24
## 4 Ropa 17
El análisis de frecuencia muestra que la categoría “Alimentos” es la más representativa dentro de la base de datos, con un total de 31 registros, lo que equivale al 31% del total de productos. Le sigue la categoría “Electrónica”, que representa el 27% de los registros, mientras que “Muebles” y “Ropa” cuentan con un 24% y 18% respectivamente. Esto sugiere que los productos de consumo frecuente, como los alimentos y los artículos electrónicos, tienen una mayor presencia en el inventario en comparación con otras categorías.
descriptivas <- datos %>% summarise(across(where(is.numeric), mean, na.rm = TRUE))
## Warning: There was 1 warning in `summarise()`.
## ℹ In argument: `across(where(is.numeric), mean, na.rm = TRUE)`.
## Caused by warning:
## ! The `...` argument of `across()` is deprecated as of dplyr 1.1.0.
## Supply arguments directly to `.fns` through an anonymous function instead.
##
## # Previously
## across(a:b, mean, na.rm = TRUE)
##
## # Now
## across(a:b, \(x) mean(x, na.rm = TRUE))
print(descriptivas)
## Stock_Disponible Ventas_Realizadas Devoluciones
## 1 2683.3 1418.49 76.41
El stock disponible varía ampliamente, con un promedio de 2,683 unidades y una alta dispersión (desviación estándar de 1,364). Las ventas promedian 1,418 unidades, con grandes diferencias entre productos (mínimo de 21 y máximo de 4,554). Las devoluciones tienen un promedio de 76 unidades, con algunos productos alcanzando hasta 346 devoluciones, lo que puede indicar problemas de calidad o insatisfacción del cliente.
ggplot(datos, aes(x = Categoria_Producto)) +
geom_bar(fill = "steelblue") +
labs(title = "Frecuencia de Categorías", x = "Categoría", y = "Frecuencia")
Se observa que la categoría “Alimentos” posee la mayor cantidad de productos, lo que concuerda con los resultados de la tabla de frecuencia. Por el contrario, la categoría “Ropa” tiene la menor representación en el inventario, lo que sugiere una menor variedad o existencia de este tipo de productos en comparación con las demás categorías.
ggplot(datos, aes(x = Ventas_Realizadas)) +
geom_histogram(fill = "darkorange", color = "black", bins = 15) +
labs(title = "Distribución de Ventas", x = "Ventas Realizadas", y = "Frecuencia")
El histograma de ventas muestra que la mayoría de los productos tienen un número de ventas que oscila entre 500 y 2,000 unidades. Sin embargo, también se identifican algunos productos con ventas superiores a 4,000 unidades, lo que indica que ciertos artículos son altamente demandados. Esta distribución sugiere que, aunque la mayoría de los productos tienen un rendimiento de ventas moderado, existen algunos artículos que destacan significativamente por su volumen de ventas.
ggplot(datos, aes(x = Categoria_Producto, y = Stock_Disponible, fill = Categoria_Producto)) +
geom_boxplot() +
labs(title = "Stock Disponible por Categoría", x = "Categoría", y = "Stock Disponible")
Se observa que las categorías “Electrónica” y “Muebles” tienen las medianas de stock más elevadas, lo que indica que estos productos suelen mantenerse en inventario en mayores cantidades. Por otro lado, la categoría “Alimentos” muestra una mayor variabilidad en los niveles de stock, con algunos productos en valores considerablemente bajos. Además, se identifican valores atípicos dentro de la categoría “Muebles”, lo que sugiere la presencia de ciertos productos con niveles de inventario excepcionalmente altos o bajos en comparación con el resto.
ggplot(datos, aes(x = Ventas_Realizadas, y = Stock_Disponible, color = Categoria_Producto)) +
geom_point() +
labs(title = "Ventas vs Stock", x = "Ventas Realizadas", y = "Stock Disponible")
Existe una relación positiva fuerte (correlación de 0.68) entre stock y ventas, indicando que los productos con mayor disponibilidad tienden a venderse más. También se observa una correlación de 0.77 entre ventas y devoluciones, sugiriendo que los productos más vendidos son los que presentan más devoluciones, posiblemente por calidad o expectativas del cliente.
cat ("Un gerente de inventarios desea estimar el stock promedio de productos en las diferentes categorías dentro del almacén. Para ello, ha seleccionado una muestra aleatoria de productos en inventario y desea calcular un intervalo de confianza al 95% para la media poblacional del stock disponible.
Datos:
Muestra: n = número de productos en la base de datos
Media muestral: Calculada con la muestra
Desviación estándar muestral: Calculada con la muestra
Nivel de confianza: 95%
Se debe interpretar el intervalo obtenido y evaluar si es posible hacer inferencias sobre el total del inventario.")
## Un gerente de inventarios desea estimar el stock promedio de productos en las diferentes categorías dentro del almacén. Para ello, ha seleccionado una muestra aleatoria de productos en inventario y desea calcular un intervalo de confianza al 95% para la media poblacional del stock disponible.
##
## Datos:
##
## Muestra: n = número de productos en la base de datos
## Media muestral: Calculada con la muestra
## Desviación estándar muestral: Calculada con la muestra
## Nivel de confianza: 95%
##
## Se debe interpretar el intervalo obtenido y evaluar si es posible hacer inferencias sobre el total del inventario.
calcular_ic_media <- function(variable, conf = 0.95) {
media <- mean(variable, na.rm = TRUE)
error_est <- sd(variable, na.rm = TRUE) / sqrt(length(na.omit(variable)))
alfa <- 1 - conf
margen_error <- qt(1 - alfa/2, df = length(na.omit(variable)) - 1) * error_est
c(inferior = media - margen_error, superior = media + margen_error)
}
ic_stock <- calcular_ic_media(datos$Stock_Disponible)
ic_stock
## inferior superior
## 2412.546 2954.054
El intervalo de confianza al 95% para la media del stock disponible en el inventario es (2412.546, 2954.054). Esto significa que, con un 95% de confianza, la media poblacional del stock disponible se encuentra dentro de este rango. Dado que el intervalo es relativamente amplio, sugiere que existe una variabilidad considerable en los datos. Sin embargo, al no incluir valores extremadamente bajos, se puede inferir que, en promedio, hay un nivel razonable de stock disponible. Este resultado nos permite hacer inferencias sobre el inventario total, indicando que la empresa mantiene una cantidad significativa de productos en existencia.
cat ("Un gerente de inventarios desea estimar la proporción de productos que presentan un alto número de devoluciones dentro del almacén. Para ello, se define como Alta Devolución a aquellos productos cuyo número de devoluciones supera la mediana del total de devoluciones registradas en la base de datos.
Con base en una muestra de productos disponibles en el inventario, se debe calcular un intervalo de confianza al 95% para la proporción poblacional de productos con alta devolución.
¿Cuál la proporción muestral de productos con alta devolución? Intepretar el resultado dado")
## Un gerente de inventarios desea estimar la proporción de productos que presentan un alto número de devoluciones dentro del almacén. Para ello, se define como Alta Devolución a aquellos productos cuyo número de devoluciones supera la mediana del total de devoluciones registradas en la base de datos.
##
## Con base en una muestra de productos disponibles en el inventario, se debe calcular un intervalo de confianza al 95% para la proporción poblacional de productos con alta devolución.
##
## ¿Cuál la proporción muestral de productos con alta devolución? Intepretar el resultado dado
calcular_ic_proporcion <- function(variable_binaria, conf = 0.95) {
p_hat <- mean(variable_binaria, na.rm = TRUE) # Proporción muestral
n <- length(na.omit(variable_binaria)) # Tamaño de la muestra
error <- qnorm((1 + conf) / 2) * sqrt((p_hat * (1 - p_hat)) / n) # Margen de error
c(Proporción = p_hat,
LI = p_hat - error,
LS = p_hat + error) # Intervalo de confianza
}
# Definir umbral de alta devolución como la mediana
umbral_devoluciones <- median(datos$Devoluciones, na.rm = TRUE)
# Crear variable binaria de Alta Devolución
datos <- datos %>% mutate(Alta_Devolución = ifelse(Devoluciones > umbral_devoluciones, 1, 0))
# Calcular intervalo de confianza
ic_devoluciones <- calcular_ic_proporcion(datos$Alta_Devolución)
ic_devolucionescalcular_ic_proporcion <- function(variable_binaria, conf = 0.95) {
p_hat <- mean(variable_binaria, na.rm = TRUE) # Proporción muestral
n <- length(na.omit(variable_binaria)) # Tamaño de la muestra
error <- qnorm((1 + conf) / 2) * sqrt((p_hat * (1 - p_hat)) / n) # Margen de error
c(Proporción = p_hat,
LI = p_hat - error,
LS = p_hat + error) # Intervalo de confianza
}
# Definir umbral de alta devolución como la mediana
umbral_devoluciones <- median(datos$Devoluciones, na.rm = TRUE)
# Crear variable binaria de Alta Devolución
datos <- datos %>% mutate(Alta_Devolución = ifelse(Devoluciones > umbral_devoluciones, 1, 0))
# Calcular intervalo de confianza
ic_devoluciones <- calcular_ic_proporcion(datos$Alta_Devolución)
ic_devoluciones
## Proporción LI LS
## 0.4900000 0.3920214 0.5879786
La proporción muestral de productos con alta devolución es 0.49. Esto significa que el 49% de los productos en el inventario presentan un número de devoluciones superior a la mediana de todas las devoluciones registradas en la base de datos. Este resultado indica que casi la mitad de los productos tienen un nivel de devoluciones por encima del umbral definido. Esto podría sugerir problemas de calidad en ciertos productos, expectativas de los clientes que no se cumplen o fallas en el proceso de entrega.
Un analista de inventarios desea comparar la proporción de productos con alta devolución entre dos categorías: Electrónica y Alimentos. Para ello, se considera que un producto tiene una alta devolución si su número de devoluciones es superior a la mediana del total de devoluciones registradas.
A partir de los datos disponibles en el inventario, se debe calcular la diferencia entre las proporciones de productos con alta devolución en ambas categorías y construir un intervalo de confianza al 95% para esta diferencia. Interprete los resultados.
datos_filtrados_cat <- datos %>% filter(Categoria_Producto %in% c("Electrónica", "Alimentos"))
table(datos_filtrados_cat$Categoria_Producto, datos_filtrados_cat$Alta_Devolución)
##
## 0 1
## Alimentos 13 19
## Electrónica 15 12
electr <- datos_filtrados_cat %>% filter(Categoria_Producto == "Electrónica")
alim <- datos_filtrados_cat %>% filter(Categoria_Producto == "Alimentos")
p1 <- mean(electr$Alta_Devolución, na.rm = TRUE)
p2 <- mean(alim$Alta_Devolución, na.rm = TRUE)
n1 <- nrow(electr)
n2 <- nrow(alim)
p1_hat <- p1 / n1
p2_hat <- p2 / n2
diff_p <- p1_hat - p2_hat
z_critico <- qnorm(0.975)
error_estandar <- sqrt((p1_hat * (1 - p1_hat) / n1) + (p2_hat * (1 - p2_hat) / n2))
IC <- c(diff_p - z_critico * error_estandar, diff_p + z_critico * error_estandar)
cat("Proporción de electrónicos (p1) :", round(p1_hat, 4), "\n")
## Proporción de electrónicos (p1) : 0.0165
cat("Proporción de alimentos (p2):", round(p2_hat, 4), "\n")
## Proporción de alimentos (p2): 0.0186
cat("Diferencia de proporciones (p1 - p2):", round(diff_p, 4), "\n")
## Diferencia de proporciones (p1 - p2): -0.0021
cat("Intervalo de confianza (95%):", round(IC [1], 4), "a", round(IC[2], 4), "\n")
## Intervalo de confianza (95%): -0.0691 a 0.0649
Los resultados obtenidos indican que la proporción de productos electrónicos con alta devolución es 0.0165, mientras que la proporción de productos de alimentos con alta devolución es 0.0186. La diferencia de proporciones es de -0.0021, lo que significa que, en la muestra, los productos de Alimentos tienen una proporción ligeramente mayor de alta devolución en comparación con los de Electrónica.
El intervalo de confianza al 95% para la diferencia de proporciones es [-0.0691, 0.0649]. Como este intervalo incluye el 0, no hay suficiente evidencia estadística para afirmar que existe una diferencia significativa en la proporción de productos con alta devolución entre ambas categorías. Esto implica que cualquier variación observada en las devoluciones entre Electrónica y Alimentos podría ser producto del azar y no de una diferencia real en la calidad, demanda o comportamiento de los clientes hacia estos productos.
La empresa desea saber si el promedio de ventas realizadas por producto es diferente de 2000 unidades. Con base en la muestra proporcionada, realiza una prueba de hipótesis para verificar si el promedio real difiere significativamente de 2000 unidades, utilizando un nivel de significancia del 5%.
H₀: μ = 2000 (la media de ventas es 2000 unidades) H₁: μ ≠ 2000 (la media de ventas no es 2000 unidades)
Tipo de prueba: bilateral (dos colas) Nivel de significancia: α = 0.05
# Cargar librerías necesarias
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ forcats 1.0.0 ✔ stringr 1.5.1
## ✔ lubridate 1.9.4 ✔ tibble 3.2.1
## ✔ purrr 1.0.4 ✔ tidyr 1.3.1
## ✔ readr 2.1.5
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
# Paso 1: Extraer la variable de interés
ventas <- datos$Ventas_Realizadas
# Valor hipotético bajo H0
mu_hipotetica <- 2000
# Paso 2: Estadísticos muestrales
n <- length(na.omit(ventas))
media_muestral <- mean(ventas, na.rm = TRUE)
desv_est <- sd(ventas, na.rm = TRUE)
# Paso 3: Estadístico de prueba
z <- (media_muestral - mu_hipotetica) / (desv_est / sqrt(n))
# Paso 4: Nivel de significancia y valor crítico
alfa <- 0.05
z_critico <- qnorm(1 - alfa / 2)
# Paso 5: p-valor
p_valor <- 2 * (1 - pnorm(abs(z)))
# Paso 6: Resultados e interpretación
cat("Media muestral:", round(media_muestral, 2), "\n")
## Media muestral: 1418.49
cat("Estadístico z:", round(z, 3), "\n")
## Estadístico z: -5.223
cat("Valor crítico z:", round(z_critico, 3), "\n")
## Valor crítico z: 1.96
cat("p-valor:", round(p_valor, 4), "\n")
## p-valor: 0
if (abs(z) > z_critico) {
cat("🟥 Se rechaza H0: hay evidencia de que la media de ventas es diferente a 2000.\n")
} else {
cat("🟩 No se rechaza H0: no hay evidencia suficiente para afirmar que la media de ventas sea diferente a 2000.\n")
}
## 🟥 Se rechaza H0: hay evidencia de que la media de ventas es diferente a 2000.
# Paso 7: Gráfico con zonas de rechazo sombreadas
x_vals <- seq(-4, 4, length.out = 500)
z_dist <- dnorm(x_vals)
data_plot <- data.frame(x = x_vals, y = z_dist)
ggplot(data_plot, aes(x, y)) +
geom_line(color = "blue") +
geom_area(data = subset(data_plot, x <= -z_critico), aes(x = x, y = y), fill = "red", alpha = 0.5) +
geom_area(data = subset(data_plot, x >= z_critico), aes(x = x, y = y), fill = "red", alpha = 0.5) +
geom_vline(xintercept = c(-z_critico, z_critico), linetype = "dashed", color = "red") +
geom_vline(xintercept = z, color = "black", linewidth = 1.2) +
labs(title = "Distribución Z: Prueba de Hipótesis para la Media",
subtitle = paste("z observado =", round(z, 3)),
x = "Z", y = "Densidad") +
theme_minimal()
Con un nivel de significancia del 5%, se rechaza la hipótesis nula debido a que el p-valor obtenido (0.00000018) es menor que 0.05 y el valor del estadístico z (-5.223) supera en valor absoluto al valor crítico (±1.960) según la regla de decisión para una prueba bilateral. Esto indica que existe evidencia estadísticamente significativa para afirmar que la media de las ventas realizadas es diferente a 2000 unidades.
La empresa desea saber si el promedio de devoluciones en productos de la categoría Ropa es mayor a 100 unidades. Con base en una muestra de 10 productos seleccionados aleatoriamente dentro de esta categoría, realiza una prueba de hipótesis para verificar si el promedio real de devoluciones supera significativamente las 100 unidades, utilizando un nivel de significancia del 5%.
H₀: μ ≤ 100 → El promedio de devoluciones en productos de la categoría Ropa es menor o igual a 100 unidades. H₁: μ > 100 → El promedio de devoluciones en productos de la categoría Ropa es mayor a 100 unidades.
Tipo de prueba: unilateral (cola derecha) Nivel de significancia: α = 0.05
# Cargar librerías necesarias
library(tidyverse)
# Filtrar solo categoría "Ropa"
ropa <- datos %>% filter(Categoria_Producto == "Ropa")
# Seleccionar muestra aleatoria de 10 productos
set.seed(123) # Para reproducibilidad
muestra_ropa <- sample_n(ropa, 10)
# Variable de interés
devoluciones <- muestra_ropa$Devoluciones
media_hipotetica <- 100
n <- length(devoluciones)
media_muestral <- mean(devoluciones)
desv_est <- sd(devoluciones)
# Estadístico t
t <- (media_muestral - media_hipotetica) / (desv_est / sqrt(n))
# Grados de libertad
gl <- n - 1
# Valor crítico t (cola derecha)
alfa <- 0.05
t_critico <- qt(1 - alfa, df = gl)
# p-valor (prueba unilateral derecha)
p_valor <- 1 - pt(t, df = gl)
# Resultados
cat("Media muestral:", round(media_muestral, 2), "\n")
## Media muestral: 44.8
cat("Estadístico t:", round(t, 3), "\n")
## Estadístico t: -3.829
cat("Valor crítico t:", round(t_critico, 3), "\n")
## Valor crítico t: 1.833
cat("p-valor:", round(p_valor, 4), "\n")
## p-valor: 0.998
if (t > t_critico) {
cat("🟥 Se rechaza H0: hay evidencia de que el promedio de devoluciones es mayor a 100.\n")
} else {
cat("🟩 No se rechaza H0: no hay evidencia suficiente para afirmar que el promedio es mayor a 100.\n")
}
## 🟩 No se rechaza H0: no hay evidencia suficiente para afirmar que el promedio es mayor a 100.
# Gráfico con zona de rechazo (cola derecha)
x_vals <- seq(-4, 4, length.out = 500)
t_dist <- dt(x_vals, df = gl)
data_plot <- data.frame(x = x_vals, y = t_dist)
ggplot(data_plot, aes(x, y)) +
geom_line(color = "blue") +
geom_area(data = subset(data_plot, x >= t_critico), aes(x, y), fill = "red", alpha = 0.5) +
geom_vline(xintercept = t_critico, linetype = "dashed", color = "red") +
geom_vline(xintercept = t, color = "black", linewidth = 1.2) +
labs(title = "Distribución t: Prueba de Hipótesis para muestra pequeña",
subtitle = paste("t observado =", round(t, 3)),
x = "t", y = "Densidad") +
theme_minimal()
Con un nivel de significancia del 5%, no se rechaza la hipótesis nula debido a que el p-valor obtenido (0.998) es mayor que 0.05 y el valor del estadístico t (-3.28) no supera el valor crítico (1.833) según la regla de decisión para una prueba unilateral derecha. Esto indica que no existe evidencia estadísticamente significativa para afirmar que el promedio de devoluciones en productos de la categoría Ropa sea mayor a 100 unidades.
Una empresa desea saber si la proporción de productos con alta devolución en la categoría Alimentos es mayor al 50%. Se define como “Alta Devolución” a aquellos productos cuyo número de devoluciones supera la mediana general de devoluciones. Con base en los datos del inventario, se realiza una prueba de hipótesis para verificar si la proporción real de productos con alta devolución en Alimentos supera el 50%, utilizando un nivel de significancia del 5%.
H₀: p ≤ 0.5 → La proporción de productos con alta devolución en la categoría Alimentos es menor o igual al 50%. H₁: p > 0.5 → La proporción de productos con alta devolución en la categoría Alimentos es mayor al 50%.
Tipo de prueba: unilateral (cola derecha) Nivel de significancia: α = 0.05
# Cargar librerías
library(tidyverse)
# Paso 1: Crear variable binaria Alta_Devolución según mediana general
umbral <- median(datos$Devoluciones, na.rm = TRUE)
datos <- datos %>%
mutate(Alta_Devolucion = ifelse(Devoluciones > umbral, 1, 0))
# Paso 2: Filtrar categoría Alimentos
alimentos <- datos %>% filter(Categoria_Producto == "Alimentos")
# Paso 3: Calcular proporción muestral
x <- sum(alimentos$Alta_Devolucion) # éxitos
n <- nrow(alimentos) # tamaño de muestra
p_hat <- x / n # proporción muestral
p0 <- 0.5 # proporción bajo H0
# Paso 4: Estadístico z
z <- (p_hat - p0) / sqrt(p0 * (1 - p0) / n)
# Paso 5: Valor crítico y p-valor
alfa <- 0.05
z_critico <- qnorm(1 - alfa) # prueba unilateral derecha
p_valor <- 1 - pnorm(z)
# Paso 6: Mostrar resultados
cat("Proporción muestral:", round(p_hat, 4), "\n")
## Proporción muestral: 0.5938
cat("Estadístico z:", round(z, 3), "\n")
## Estadístico z: 1.061
cat("Valor crítico z:", round(z_critico, 3), "\n")
## Valor crítico z: 1.645
cat("p-valor:", round(p_valor, 4), "\n")
## p-valor: 0.1444
if (z > z_critico) {
cat("🟥 Se rechaza H0: hay evidencia de que la proporción es mayor a 0.5.\n")
} else {
cat("🟩 No se rechaza H0: no hay evidencia suficiente para afirmar que la proporción es mayor a 0.5.\n")
}
## 🟩 No se rechaza H0: no hay evidencia suficiente para afirmar que la proporción es mayor a 0.5.
# Paso 7: Gráfico de la distribución normal con zona de rechazo
x_vals <- seq(-4, 4, length.out = 500)
z_dist <- dnorm(x_vals)
data_plot <- data.frame(x = x_vals, y = z_dist)
ggplot(data_plot, aes(x, y)) +
geom_line(color = "blue") +
geom_area(data = subset(data_plot, x >= z_critico), aes(x, y), fill = "red", alpha = 0.5) +
geom_vline(xintercept = z_critico, linetype = "dashed", color = "red") +
geom_vline(xintercept = z, color = "black", linewidth = 1.2) +
labs(title = "Distribución Z: Prueba de Hipótesis para Proporción",
subtitle = paste("z observado =", round(z, 3)),
x = "Z", y = "Densidad") +
theme_minimal()
Con un nivel de significancia del 5%, no se rechaza la hipótesis nula debido a que el p-valor obtenido (0.1444) es mayor que 0.05 y el valor del estadístico z (1.061) no supera el valor crítico (1.645) según la regla de decisión para una prueba unilateral derecha. Esto indica que no existe evidencia estadísticamente significativa para afirmar que la proporción de productos con alta devolución en la categoría Alimentos sea mayor al 50%.