# =====================================================================
# Taller 3.3.1 - Distribuciones discretas
# Curso 013 - https://dgonxalex80.github.io/curso013/taller331.html
# Autor: Dilan Velez Rojas
# Convencion de R (se usa en todo el taller):
#   dgeom(x, p)        -> X = numero de FALLOS antes del primer exito
#   dnbinom(x, r, p)   -> X = numero de FALLOS antes del r-esimo exito
# =====================================================================

# Funcion auxiliar para graficar f_X(x) de forma uniforme
graf_fx <- function(x, fx, titulo, col = "steelblue") {
  plot(x, fx, type = "h", lwd = 3, col = col,
       main = titulo, xlab = "x", ylab = expression(f[X](x)),
       ylim = c(0, max(fx) * 1.1))
  points(x, fx, pch = 19, col = col)
  grid()
}
# Problema 1. Binomial  X ~ Bin(n = 10, p = 0.5)
n1 <- 10; p1 <- 0.5
x1 <- 0:n1
tabla1 <- data.frame(x = x1, fx = dbinom(x1, n1, p1), Fx = pbinom(x1, n1, p1))
print(round(tabla1, 4))                                  # funcion de distribucion
##     x     fx     Fx
## 1   0 0.0010 0.0010
## 2   1 0.0098 0.0107
## 3   2 0.0439 0.0547
## 4   3 0.1172 0.1719
## 5   4 0.2051 0.3770
## 6   5 0.2461 0.6230
## 7   6 0.2051 0.8281
## 8   7 0.1172 0.9453
## 9   8 0.0439 0.9893
## 10  9 0.0098 0.9990
## 11 10 0.0010 1.0000
cat("P1 a) P(X = 5)      =", dbinom(5, n1, p1), "\n")
## P1 a) P(X = 5)      = 0.2460938
cat("P1 b) P(X <= 2)     =", pbinom(2, n1, p1), "\n")
## P1 b) P(X <= 2)     = 0.0546875
cat("P1 c) P(3 <= X < 5) =", sum(dbinom(3:4, n1, p1)), "\n")
## P1 c) P(3 <= X < 5) = 0.3222656
cat("P1 d) P(X >= 8)     =", 1 - pbinom(7, n1, p1), "\n")
## P1 d) P(X >= 8)     = 0.0546875
graf_fx(x1, tabla1$fx, "Binomial (n = 10, p = 0.5)")

# Problema 2. Geometrica  p = 0.05  (X = fallos antes del 1er exito)
p2 <- 0.05
cat("\nP2 a) P(X = 1)  =", dgeom(1, p2), "\n")
## 
## P2 a) P(X = 1)  = 0.0475
cat("P2 b) P(X <= 2) =", pgeom(2, p2), "\n")
## P2 b) P(X <= 2) = 0.142625
cat("P2 c) P(X = 8)  =", dgeom(8, p2), "\n")
## P2 c) P(X = 8)  = 0.03317102
cat("P2 d) P(X >= 2) =", 1 - pgeom(1, p2), "\n")
## P2 d) P(X >= 2) = 0.9025
x2 <- 0:80
graf_fx(x2, dgeom(x2, p2), "Geometrica (p = 0.05)")

# Problema 3. Hipergeometrica  N = 100, K = 20 (exitos), n = 4
#   dhyper(x, m = K, n = N - K, k = n)
N3 <- 100; K3 <- 20; n3 <- 4
cat("\nP3 a) P(X = 1)  =", dhyper(1, K3, N3 - K3, n3), "\n")
## 
## P3 a) P(X = 1)  = 0.4190527
cat("P3 b) P(X = 6)  =", dhyper(6, K3, N3 - K3, n3),
    " (imposible: la muestra es de 4)\n")
## P3 b) P(X = 6)  = 0  (imposible: la muestra es de 4)
cat("P3 c) P(X >= 1) =", 1 - dhyper(0, K3, N3 - K3, n3), "\n")
## P3 c) P(X >= 1) = 0.5966618
cat("P3 d) P(X = 4)  =", dhyper(4, K3, N3 - K3, n3), "\n")
## P3 d) P(X = 4)  = 0.001235583
x3 <- 0:n3
graf_fx(x3, dhyper(x3, K3, N3 - K3, n3), "Hipergeometrica (N = 100, K = 20, n = 4)")

# Problema 4. Poisson  lambda = 4
l4 <- 4
cat("\nP4 a) P(X = 0)  =", dpois(0, l4), "\n")
## 
## P4 a) P(X = 0)  = 0.01831564
cat("P4 b) P(X = 4)  =", dpois(4, l4), "\n")
## P4 b) P(X = 4)  = 0.1953668
cat("P4 c) P(X >= 2) =", 1 - ppois(1, l4), "\n")
## P4 c) P(X >= 2) = 0.9084218
cat("P4 d) P(X <= 2) =", ppois(2, l4), "\n")
## P4 d) P(X <= 2) = 0.2381033
x4 <- 0:15
graf_fx(x4, dpois(x4, l4), "Poisson (lambda = 4)")

# Problema 5. Binomial negativa  N = 100, K = 20, n = 5
#   Supuesto: p = K/N = 0.2 y r = n = 5 exitos
#   X = fallos antes del 5o exito
r5 <- 5; p5 <- 20 / 100
cat("\nP5 a) P(X = 0)   =", dnbinom(0, r5, p5), "\n")
## 
## P5 a) P(X = 0)   = 0.00032
cat("P5 b) P(X = 6)   =", dnbinom(6, r5, p5), "\n")
## P5 b) P(X = 6)   = 0.01761608
cat("P5 c) P(X >= 10) =", 1 - pnbinom(9, r5, p5), "\n")
## P5 c) P(X >= 10) = 0.8701604
cat("P5 d) P(X <= 12) =", pnbinom(12, r5, p5), "\n")
## P5 d) P(X <= 12) = 0.2417768
cat("P5 e) E[X] = r(1-p)/p   =", r5 * (1 - p5) / p5, "\n")
## P5 e) E[X] = r(1-p)/p   = 20
cat("P5 f) V[X] = r(1-p)/p^2 =", r5 * (1 - p5) / p5^2, "\n")
## P5 f) V[X] = r(1-p)/p^2 = 100
x5 <- 0:60
graf_fx(x5, dnbinom(x5, r5, p5), "Binomial negativa (r = 5, p = 0.2)")

# Problema 6. Llantas  X ~ Bin(4, 0.05)
cat("\nP6 a) Ninguna con imperfecciones   =", dbinom(0, 4, 0.05), "\n")
## 
## P6 a) Ninguna con imperfecciones   = 0.8145062
cat("P6 b) Exactamente una              =", dbinom(1, 4, 0.05), "\n")
## P6 b) Exactamente una              = 0.171475
cat("P6 c) Una o mas                    =", 1 - dbinom(0, 4, 0.05), "\n")
## P6 c) Una o mas                    = 0.1854938
# Problema 7. Clientes  Poisson, 8 por hora
tasa <- 8
cat("\nP7 a) Exactamente 5 entre 8 y 9 AM (1 h)      =", dpois(5, tasa * 1), "\n")
## 
## P7 a) Exactamente 5 entre 8 y 9 AM (1 h)      = 0.09160366
cat("P7 b) No mas de 3 entre 2:30 y 3:30 PM (1 h)  =", ppois(3, tasa * 1), "\n")
## P7 b) No mas de 3 entre 2:30 y 3:30 PM (1 h)  = 0.04238011
cat("P7 c) Exactamente 2 en 2 horas (lambda = 16)  =", dpois(2, tasa * 2), "\n")
## P7 c) Exactamente 2 en 2 horas (lambda = 16)  = 1.44045e-05
cat("P7 d) Valor esperado entre 2 y 4:30 PM (2.5 h) =", tasa * 2.5, "clientes\n")
## P7 d) Valor esperado entre 2 y 4:30 PM (2.5 h) = 20 clientes
# Problema 8. Germinacion de maiz  X ~ Bin(20, 0.90)
E8 <- 20 * 0.90
p8 <- pbinom(15, 20, 0.90)
cat("\nP8 a) Numero esperado de semillas que germinan =", E8, "\n")
## 
## P8 a) Numero esperado de semillas que germinan = 18
cat("P8 b) P(X <= 15) =", p8, "\n")
## P8 b) P(X <= 15) = 0.0431745
cat("      ", ifelse(p8 < 0.05,
       "Es muy poco probable (< 5%): si germinan 15 o menos hay razon para dudar del 90%.",
       "No es tan raro: no hay razon fuerte para dudar del 90%."), "\n")
##        Es muy poco probable (< 5%): si germinan 15 o menos hay razon para dudar del 90%.
# Problema 9. Examen 100 preguntas, 4 opciones -> p = 0.25
p9 <- 0.25
cat("\nP9 a) P(aprobar: al menos 60 correctas) =", 1 - pbinom(59, 100, p9), "\n")
## 
## P9 a) P(aprobar: al menos 60 correctas) = 1.326717e-13
cat("P9 b) Primera correcta en la pregunta 10 (9 fallos) =", dgeom(9, p9), "\n")
## P9 b) Primera correcta en la pregunta 10 (9 fallos) = 0.01877117
cat("P9 c) E[errores antes de 5 correctas] = r(1-p)/p =", 5 * (1 - p9) / p9, "\n")
## P9 c) E[errores antes de 5 correctas] = r(1-p)/p = 15
# Problema 10. Microorganismos  Poisson, media 15
l10 <- 15
cat("\nP10 a) P(X >= 17) =", 1 - ppois(16, l10), "\n")
## 
## P10 a) P(X >= 17) = 0.3358768
cat("P10 b) P(X <= 18) =", ppois(18, l10), "\n")
## P10 b) P(X <= 18) = 0.8194717
cat("P10 c) P(X = 2)   =", dpois(2, l10), "\n")
## P10 c) P(X = 2)   = 3.441401e-05
# Problema 11. Aerolinea  105 tiquetes, 100 asientos, p = 0.90
#   Todos tienen asiento si llegan 100 o menos
cat("\nP11) P(X <= 100) =", pbinom(100, 105, 0.90), "\n")
## 
## P11) P(X <= 100) = 0.9832837
# Problema 12. Grietas  1 por cada 100 m  (Poisson)
cat("\nP12 a) P(8 grietas en 500 m), lambda = 5     =", dpois(8, 5), "\n")
## 
## P12 a) P(8 grietas en 500 m), lambda = 5     = 0.06527804
cat("P12 b) P(ninguna en 100 m), lambda = 1       =", dpois(0, 1), "\n")
## P12 b) P(ninguna en 100 m), lambda = 1       = 0.3678794
cat("P12 c) P(menos de 2 en 500 m), lambda = 5    =", ppois(1, 5), "\n")
## P12 c) P(menos de 2 en 500 m), lambda = 5    = 0.04042768
# Problema 13. Sensores  X = aprobados ~ Bin(12, 0.92)
n13 <- 12; p13 <- 0.92
c1 <- dbinom(12, n13, p13)          # los 12 aprueban
c2 <- 1 - pbinom(10, n13, p13)      # al menos 11 aprueban
c3 <- pbinom(10, n13, p13)          # 2 o mas fallan  <=>  10 o menos aprueban
c4 <- pbinom(9, n13, p13)           # menos de 10 aprueban

decision <- data.frame(
  Criterio = c("P(12 aprueban) > 35%",
               "P(al menos 11 aprueban) > 70%",
               "P(2 o mas fallan) > 20%",
               "P(menos de 10 aprueban) < 10%"),
  Probabilidad = round(c(c1, c2, c3, c4), 4),
  Cumple = c(c1 > 0.35, c2 > 0.70, c3 > 0.20, c4 < 0.10),
  Accion = c("Reducir frecuencia de inspecciones",
             "Clasificar proceso como alta confiabilidad",
             "Revision preventiva de equipos",
             "Senal de alerta: investigar el proceso")
)
cat("\nP13) Evaluacion de directrices\n")
## 
## P13) Evaluacion de directrices
print(decision)
##                        Criterio Probabilidad Cumple
## 1          P(12 aprueban) > 35%       0.3677   TRUE
## 2 P(al menos 11 aprueban) > 70%       0.7513   TRUE
## 3       P(2 o mas fallan) > 20%       0.2487   TRUE
## 4 P(menos de 10 aprueban) < 10%       0.0652   TRUE
##                                       Accion
## 1         Reducir frecuencia de inspecciones
## 2 Clasificar proceso como alta confiabilidad
## 3             Revision preventiva de equipos
## 4     Senal de alerta: investigar el proceso
cat("Acciones a tomar:\n")
## Acciones a tomar:
print(decision$Accion[decision$Cumple])
## [1] "Reducir frecuencia de inspecciones"        
## [2] "Clasificar proceso como alta confiabilidad"
## [3] "Revision preventiva de equipos"            
## [4] "Senal de alerta: investigar el proceso"
x13 <- 0:n13
graf_fx(x13, dbinom(x13, n13, p13), "Sensores aprobados: Bin(12, 0.92)", col = "#4C78A8")