paquetes <- c("ggplot2", "dplyr", "ggpubr", "tidyr", "evd")
instalar_si_faltan <- function(paquetes) {
  nuevos <- paquetes[!(paquetes %in% installed.packages()[, "Package"])]
  if(length(nuevos)) install.packages(nuevos)
}
instalar_si_faltan(paquetes)
invisible(lapply(paquetes, library, character.only = TRUE))

Problema 2

a) Primeras estimaciones de edad

Para simular los conteos de desintegraciones por minuto, usamos la distribución de Poisson con media 45.62. Luego aplicamos la fórmula de decaimiento radioactivo para estimar la edad de cada muestra:

\[ t = \frac{\log(15.3) - \log(\frac{X}{10})}{0.0001210} \]

set.seed(123)
X <- rpois(10000, lambda = 45.62)
t_hat <- (log(15.3) - log(X / 10)) / 0.0001210
head(t_hat)
## [1] 10883.189  8761.537 12430.392  9932.203  8160.220  9580.470

b) Estimación promedio de la edad

Calculamos la media de las edades estimadas para tener una idea general del tiempo transcurrido:

mean_t <- mean(t_hat)
mean_t
## [1] 10114.79

c) Desviación estándar de las estimaciones

La desviación estándar nos permite ver cuánta variabilidad hay en las estimaciones:

desv_t <- sd(t_hat)
desv_t
## [1] 1237.73

d) Probabilidad de error mayor a 1000 años

Calculamos la proporción de estimaciones que se alejan más de 1000 años del valor real (10,000 años):

prob_error <- mean(abs(t_hat - 10000) > 1000)
prob_error
## [1] 0.4114

Problema 3

a) Generación de los tiempos de vida

Simulamos los tiempos de vida de cuatro componentes con distribuciones log-normales, cada una con distintos parámetros. Luego construimos tres sistemas distintos usando operaciones de series (suma) y paralelos (máximo o mínimo):

set.seed(123)
n <- 1000
R1 <- rlnorm(n, meanlog = 2, sdlog = 1)
R2 <- rlnorm(n, meanlog = 1, sdlog = 0.1)
R3 <- rlnorm(n, meanlog = 2, sdlog = 1)
R4 <- rlnorm(n, meanlog = 1, sdlog = 0.1)

sistema1 <- pmax(R1, R2) + pmax(R3, R4)
sistema2 <- pmin(pmax(R1, R3), pmax(R2, R4))
sistema3 <- pmin(R1 + R3, R2 + R4)

head(sistema1)
## [1]  8.648674 15.234423 39.416929 32.937650 17.203458 45.055010
head(sistema2)
## [1] 2.677730 2.630632 2.713399 2.682589 3.524889 3.016380
head(sistema3)
## [1] 5.138366 5.080428 5.065205 5.217787 5.631469 5.724510

b) Tiempo de vida promedio de cada sistema

Se calcula la media de los tiempos de vida de cada sistema:

print(mean(sistema1))
## [1] 24.43403
print(mean(sistema2))
## [1] 2.872922
print(mean(sistema3))
## [1] 5.416374

c) Probabilidad de que el sistema dure menos de 2 unidades de tiempo

Esto se hace comparando cada simulación con el umbral de 2 unidades:

print(mean(sistema1 < 2))
## [1] 0
print(mean(sistema2 < 2))
## [1] 0.008
print(mean(sistema3 < 2))
## [1] 0.001

d) Percentil 20 del sistema 1

El percentil 20 nos dice cuál es el tiempo de vida por debajo del cual cae el 20% de las observaciones:

quantile(sistema1, 0.20)
##      20% 
## 10.15041

e) Evaluar la normalidad

Se generan QQ plots para comparar visualmente los tiempos de vida con una distribución normal:

qq1 <- ggqqplot(sistema1, title = "Sistema 1")
qq2 <- ggqqplot(sistema2, title = "Sistema 2")
qq3 <- ggqqplot(sistema3, title = "Sistema 3")
ggarrange(qq1, qq2, qq3, ncol = 3)

f) Histogramas de vida útil

Se grafican histogramas para cada sistema con diferentes colores:

hist1 <- ggplot(data.frame(sistema1), aes(sistema1)) + geom_histogram(bins = 30, fill = "skyblue") + ggtitle("Sistema 1")
hist2 <- ggplot(data.frame(sistema2), aes(sistema2)) + geom_histogram(bins = 30, fill = "salmon") + ggtitle("Sistema 2")
hist3 <- ggplot(data.frame(sistema3), aes(sistema3)) + geom_histogram(bins = 30, fill = "lightgreen") + ggtitle("Sistema 3")
ggarrange(hist1, hist2, hist3, ncol = 3)


Problema 6

a) Simulación de solicitudes por minuto

Se usa la distribución de Poisson con media 30 para representar el número de solicitudes que recibe el servidor cada minuto:

set.seed(123)
solicitudes <- rpois(10000, lambda = 30)
head(solicitudes)
## [1] 26 36 20 30 39 32

b) Probabilidad de recibir más de 40 solicitudes en un minuto

prob_mas_40 <- mean(solicitudes > 40)
print(prob_mas_40)
## [1] 0.0298

c) Probabilidad de sobrecarga (>35 solicitudes)

sobrecarga <- mean(solicitudes > 35)
print(sobrecarga)
## [1] 0.1503

d) Mejora propuesta

Para evitar sobrecargas, se puede implementar:

  • Escalamiento automático

  • Balanceadores de carga

  • Distribución geográfica de servidores

e) Histograma de solicitudes

ggplot(data.frame(solicitudes), aes(solicitudes)) + 
  geom_histogram(bins = 30, fill = "purple") + 
  ggtitle("Distribución de Solicitudes por Minuto")


Problema 9

a) Simulación de 10 años de datos diarios de caudal

Se utiliza la distribución Gumbel para simular datos diarios durante 10 años (3650 días):

set.seed(123)
mu <- 500
beta <- 100
n <- 3650
caudales <- evd::rgumbel(n, loc = mu, scale = beta)
head(caudales)
## [1] 517.0246 555.0589 471.5532 845.5315 787.8643 615.0428

b) Probabilidad de que al menos un día supere 750 m³/s

Calculamos la probabilidad de que el caudal diario supere el umbral al menos una vez:

prob_superado <- 1 - (mean(caudales <= 750))^3650
print(prob_superado)
## [1] 1

c) Caudal de diseño para nuevo puente (percentil 99)

El percentil 99 de la distribución de Gumbel representa el valor de diseño:

nuevo_diseño <- evd::qgumbel(0.99, loc = mu, scale = beta)
print(nuevo_diseño)
## [1] 960.0149

d) Histograma de los caudales simulados

ggplot(data.frame(caudales), aes(caudales)) + 
  geom_histogram(bins = 30, fill = "dodgerblue") + 
  ggtitle("Distribución del Caudal Máximo Diario")

e) Medidas de mitigación

Para reducir el riesgo:

  • Mejorar infraestructura del puente

  • Canales de desvío

  • Refuerzo estructural

  • Sistemas de alerta temprana