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.