knitr::opts_chunk$set(echo = TRUE, message = FALSE, warning = FALSE)
library(readr)
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
library(ggplot2)
##CONTEXTUALIZACIÓN##
El estudio analiza el desempeño de distintas rutas logísticas, evaluando la relación entre los kilómetros recorridos, los tiempos de entrega y los costos operativos asociados. A partir de estos datos, se busca comprender la eficiencia de cada trayecto y su impacto en la rentabilidad general, identificando cuáles rutas permiten optimizar el tiempo de entrega y cuáles generan mayores gastos de operación.
# Carga de datos
datos <- read_csv("datos_negocios_extra_5_logistica.csv") # usa read_csv para tipos limpios
glimpse(datos)
## Rows: 100
## Columns: 4
## $ Ruta <chr> "Ruta Sur", "Ruta Norte", "Ruta Sur", "Ruta Oeste…
## $ KM_Recorridos <dbl> 1796, 4856, 2909, 3643, 4753, 4354, 3956, 2001, 2…
## $ Tiempo_Entrega_Horas <dbl> 17.2, 29.8, 13.3, 12.7, 23.1, 1.1, 46.8, 45.5, 10…
## $ Costos_Operativos <dbl> 17458.55, 9828.49, 11964.23, 18625.55, 12811.67, …
# Resumen por ruta (totales y promedios)
datos_agrupados <- datos %>%
group_by(Ruta) %>%
summarise(
KM_Totales = sum(KM_Recorridos, na.rm = TRUE),
KM_Promedio = mean(KM_Recorridos, na.rm = TRUE),
Tiempo_Total = sum(Tiempo_Entrega_Horas, na.rm = TRUE),
Tiempo_Promedio = mean(Tiempo_Entrega_Horas, na.rm = TRUE),
Costo_Total = sum(Costos_Operativos, na.rm = TRUE),
Costo_Promedio = mean(Costos_Operativos, na.rm = TRUE),
n = n(),
.groups = "drop"
)
datos_agrupados
## # A tibble: 4 × 8
## Ruta KM_Totales KM_Promedio Tiempo_Total Tiempo_Promedio Costo_Total
## <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 Ruta Este 60326 3016. 538. 26.9 238137.
## 2 Ruta Norte 54470 2594. 530. 25.2 243928.
## 3 Ruta Oeste 62835 2094. 693. 23.1 296983.
## 4 Ruta Sur 79941 2757. 793. 27.3 325822.
## # ℹ 2 more variables: Costo_Promedio <dbl>, n <int>
# Dimensión y resumen estadístico global
dim(datos)
## [1] 100 4
summary(datos)
## Ruta KM_Recorridos Tiempo_Entrega_Horas Costos_Operativos
## Length:100 Min. : 166 Min. : 1.10 Min. : 1009
## Class :character 1st Qu.:1471 1st Qu.:13.07 1st Qu.: 5189
## Mode :character Median :2729 Median :25.90 Median :10408
## Mean :2576 Mean :25.54 Mean :11049
## 3rd Qu.:3551 3rd Qu.:39.67 3rd Qu.:16304
## Max. :4948 Max. :47.60 Max. :19844
n <- nrow(datos)
# Función auxiliar para IC de la media
ic_media <- function(x, conf = 0.95){
x <- x[is.finite(x)]
m <- mean(x); s <- sd(x); n <- length(x)
tcrit <- qt( (1+conf)/2, df = n-1 )
se <- s/sqrt(n)
c(media = m, li = m - tcrit*se, ls = m + tcrit*se, n = n)
}
ic_km <- ic_media(datos$KM_Recorridos)
ic_tiempo <- ic_media(datos$Tiempo_Entrega_Horas)
ic_costo <- ic_media(datos$Costos_Operativos)
rbind(
KM_Recorridos = ic_km,
Tiempo_Entrega_Horas= ic_tiempo,
Costos_Operativos = ic_costo
) %>% round(2)
## media li ls n
## KM_Recorridos 2575.72 2300.79 2850.65 100
## Tiempo_Entrega_Horas 25.54 22.59 28.50 100
## Costos_Operativos 11048.70 9910.51 12186.90 100
ic_por_ruta <- datos %>%
group_by(Ruta) %>%
summarise(
n = n(),
media_km = mean(KM_Recorridos),
se_km = sd(KM_Recorridos)/sqrt(n),
tcrit = qt(0.975, df = n-1),
km_li = media_km - tcrit*se_km,
km_ls = media_km + tcrit*se_km,
media_t = mean(Tiempo_Entrega_Horas),
se_t = sd(Tiempo_Entrega_Horas)/sqrt(n),
tcrit_t = qt(0.975, df = n-1),
t_li = media_t - tcrit_t*se_t,
t_ls = media_t + tcrit_t*se_t,
media_c = mean(Costos_Operativos),
se_c = sd(Costos_Operativos)/sqrt(n),
tcrit_c = qt(0.975, df = n-1),
c_li = media_c - tcrit_c*se_c,
c_ls = media_c + tcrit_c*se_c,
.groups = "drop"
)
ic_por_ruta %>% select(Ruta, n,
media_km, km_li, km_ls,
media_t, t_li, t_ls,
media_c, c_li, c_ls) %>%
mutate(across(-c(Ruta,n), ~round(.x,2)))
## # A tibble: 4 × 11
## Ruta n media_km km_li km_ls media_t t_li t_ls media_c c_li c_ls
## <chr> <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 Ruta Este 20 3016. 2327. 3705. 26.9 20.3 33.5 11907. 8888. 14926.
## 2 Ruta Norte 21 2594. 2022. 3166. 25.2 18.8 31.6 11616. 8717. 14514.
## 3 Ruta Oeste 30 2094. 1540. 2649. 23.1 17.3 28.9 9899. 7902. 11896.
## 4 Ruta Sur 29 2757. 2293. 3220. 27.3 21.4 33.2 11235. 9248. 13223.
# Kilómetros
ggplot(datos, aes(x = Ruta, y = KM_Recorridos, fill = Ruta)) +
geom_boxplot() +
labs(title = "Distribución de kilómetros recorridos por ruta",
x = "Ruta", y = "Kilómetros recorridos") +
theme_minimal() +
theme(legend.position = "none")
# Tiempos
ggplot(datos, aes(x = Ruta, y = Tiempo_Entrega_Horas, fill = Ruta)) +
geom_boxplot() +
labs(title = "Distribución de tiempos de entrega por ruta",
x = "Ruta", y = "Tiempo de entrega (horas)") +
theme_minimal() +
theme(legend.position = "none")
# Costos
ggplot(datos, aes(x = Ruta, y = Costos_Operativos, fill = Ruta)) +
geom_boxplot() +
labs(title = "Distribución de costos operativos por ruta",
x = "Ruta", y = "Costos operativos") +
theme_minimal() +
theme(legend.position = "none")
# Filtrar datos de dos rutas específicas (ejemplo: Sur y Norte)
datos_A <- subset(datos, Ruta == "Ruta Sur")
datos_B <- subset(datos, Ruta == "Ruta Norte")
# --- MEDIA E IC PARA RUTA A ---
media_A <- mean(datos_A$KM_Recorridos)
sd_A <- sd(datos_A$KM_Recorridos)
n_A <- nrow(datos_A)
error_A <- qt(0.975, df = n_A - 1) * sd_A / sqrt(n_A)
IC_A <- c(media_A - error_A, media_A + error_A)
cat("Ruta Sur - Media KM recorridos:", media_A, "\n")
## Ruta Sur - Media KM recorridos: 2756.586
cat("IC 95%:", IC_A[1], "a", IC_A[2], "\n\n")
## IC 95%: 2292.76 a 3220.412
# --- MEDIA E IC PARA RUTA B ---
media_B <- mean(datos_B$KM_Recorridos)
sd_B <- sd(datos_B$KM_Recorridos)
n_B <- nrow(datos_B)
error_B <- qt(0.975, df = n_B - 1) * sd_B / sqrt(n_B)
IC_B <- c(media_B - error_B, media_B + error_B)
cat("Ruta Norte - Media KM recorridos:", media_B, "\n")
## Ruta Norte - Media KM recorridos: 2593.81
cat("IC 95%:", IC_B[1], "a", IC_B[2], "\n\n")
## IC 95%: 2021.928 a 3165.691
# ---
#COMENTARIO DE RESULTADOS # En Ruta, se observa que las cuatro categorías principales (Sur, Norte, Este y Oeste) tienen una representación equilibrada, aunque Sur y Oeste registran más viajes en comparación con las demás.
En kilómetros recorridos, el promedio fue de 2,576, con recorridos que van desde 166 hasta 4,948 km. Esto muestra una amplia variabilidad: algunas rutas son cortas, mientras que otras implican trayectos extensos.
En tiempo de entrega, el promedio fue de 25,5 horas, con entregas que pueden tomar desde poco más de una hora hasta casi dos días completos. Esto refleja que la eficiencia depende en gran medida de la ruta asignada.
En costos operativos, el promedio fue de 11,049 unidades, pero con valores que oscilan entre 1,009 y 19,844. Esto indica que los gastos de transporte pueden variar mucho, en función de la distancia y la complejidad del trayecto.
La base no presenta datos faltantes y los valores siguen una distribución consistente, lo que permite realizar un análisis confiable para la planificación logística.
# Leer base logística
datos <- read.csv("datos_negocios_extra_5_logistica.csv")
# Variable a analizar (ejemplo: Tiempo de entrega en horas)
x <- datos$Tiempo_Entrega_Horas
# Parámetros
N <- nrow(datos) # tamaño poblacional
n <- 25 # tamaño de la muestra
media_poblacional <- mean(x, na.rm = TRUE)
desviacion_poblacional <- sd(x, na.rm = TRUE)
# Error estándar con corrección por población finita
error_estandar <- (desviacion_poblacional / sqrt(n)) * sqrt((N - n)/(N - 1))
# Probabilidad de que la media muestral esté entre 20 y 30 horas
prob_20_30 <- pnorm(30, mean = media_poblacional, sd = error_estandar) -
pnorm(20, mean = media_poblacional, sd = error_estandar)
# Probabilidad de que la media muestral supere 30 horas
prob_mayor_30 <- 1 - pnorm(30, mean = media_poblacional, sd = error_estandar)
# Resultados
cat("Media poblacional del tiempo de entrega:", round(media_poblacional, 2), "horas\n")
## Media poblacional del tiempo de entrega: 25.54 horas
cat("Desviación estándar poblacional:", round(desviacion_poblacional, 2), "\n")
## Desviación estándar poblacional: 14.89
cat("Error estándar (FPC):", round(error_estandar, 4), "\n")
## Error estándar (FPC): 2.5919
cat("P(20 < X̄ < 30):", round(prob_20_30, 3), "\n")
## P(20 < X̄ < 30): 0.941
cat("P(X̄ > 30):", round(prob_mayor_30, 3), "\n")
## P(X̄ > 30): 0.043
7
## [1] 7
Estos resultados muestran que los tiempos de entrega son relativamente estables y tienden a mantenerse en torno a un rango medio (20–30 horas). Es poco probable que el promedio de entregas se dispare más allá de las 30 horas, lo cual brinda confianza en la planificación logística. Sin embargo, los valores extremos individuales (entregas muy rápidas o muy lentas) siguen existiendo, aunque no afectan de manera significativa al comportamiento promedio.