Modalidad: desarrollo manuscrito en clase (lápiz, cuaderno cuadriculado y calculadora científica con teclas ln y e^x), individual o en parejas.

Duración sugerida: 30 minutos a mano + 20 minutos en R.

Prerrequisitos: notebook de la Sesión 1 (Poisson, Normal y Gamma) y las diapositivas de la Sesión 2 (PDF, CDF y cuantiles).

Regla del Lápiz y el Algoritmo. Primero resuelvan a mano y anoten su respuesta. Luego predigan qué función de R responde cada pregunta. Solo entonces ejecuten el código: R confirma su cálculo, no lo reemplaza. Si R y su cuaderno no coinciden, uno de los dos tiene un error, y encontrarlo es parte del aprendizaje.


Situación de interés

La finca experimental de la universidad tiene dos necesidades de diseño para el próximo semestre:

  1. Bodega de repuestos. La bomba del sistema de riego falla, en promedio, 2 veces por semestre. ¿Cuántos repuestos debe presupuestar la bodega para no quedarse sin ellos en la mayoría de los semestres? (Variable discreta: se cuenta.)
  2. Canal de drenaje perimetral. Cuando llueve, la lámina de un día lluvioso tiene una media de 20 mm, pero con pocos días muy fuertes. ¿Qué lámina diaria debe poder evacuar el canal? (Variable continua: se mide.)

En ambos casos la pregunta del ingeniero no es “¿exactamente cuánto?” sino “¿cuál es la probabilidad de no superar un umbral?” y “¿qué umbral cubre el 90% de los casos?”. Eso es la CDF y el cuantil.


Parte A — Variable discreta: fallas de la bomba (Poisson) · 10 min

Sea \(X\) el número de fallas de la bomba en un semestre, con \(X \sim \text{Poisson}(\lambda = 2)\):

\[P(X = k) = \frac{e^{-\lambda}\,\lambda^k}{k!}, \qquad k = 0, 1, 2, \dots \qquad \text{con } e^{-2} \approx 0.1353\]

A1. Tabla de masa y acumulada. Calculen \(P(X=k)\) con la fórmula y luego la acumulada \(F(k) = P(X \le k)\) sumando las probabilidades hasta \(k\) (4 decimales):

\(k\) 0 1 2 3 4 5
\(P(X = k)\) ___ ___ ___ ___ ___ ___
\(F(k) = P(X \le k)\) ___ ___ ___ ___ ___ ___

A2. Probabilidades.

  1. ¿Cuál es la probabilidad de que la bomba falle a lo sumo 2 veces en el semestre, \(P(X \le 2)\)?

  2. ¿Cuál es la probabilidad de que falle 3 o más veces, \(P(X \ge 3)\)? (Pista: use el complemento; no sume infinitos términos.)

A3. Cuantil discreto. La bodega quiere tener repuestos suficientes para cubrir al menos el 90% de los semestres. Encuentren el menor \(k\) tal que \(F(k) \ge 0.90\).

A4. Dibujo. En dos gráficos, uno bajo el otro, dibujen (i) las barras de \(P(X=k)\) y (ii) la escalera de \(F(k)\). Marquen sobre la escalera el punto que responde A3. ¿Qué mide la altura de cada escalón de la CDF?

Solución de referencia — Parte A (docente)

A1. Como \(\lambda^k/k! = 1,\ 2,\ 2,\ 1.3333,\ 0.6667,\ 0.2667\) para \(k=0,\dots,5\), multiplicando por \(0.1353\):

\(k\) 0 1 2 3 4 5
\(P(X = k)\) 0.1353 0.2707 0.2707 0.1804 0.0902 0.0361
\(F(k)\) 0.1353 0.4060 0.6767 0.8571 0.9473 0.9834

A2.

  1. \(P(X \le 2) = F(2) = 0.1353 + 0.2707 + 0.2707 = \mathbf{0.6767}\).

  2. \(P(X \ge 3) = 1 - P(X \le 2) = 1 - 0.6767 = \mathbf{0.3233}\): en casi 1 de cada 3 semestres la bomba falla 3 o más veces.

A3. \(F(3) = 0.8571 < 0.90\) no alcanza; \(F(4) = 0.9473 \ge 0.90\) sí. El cuantil 0.90 es \(\mathbf{k = 4}\): con 4 repuestos se cubre el 94.73% de los semestres. (En discretas el cuantil se define como el menor valor cuya acumulada alcanza o supera \(p\); por eso queda “pasado” de 0.90.)

A4. La altura de cada escalón en \(k\) es exactamente \(P(X = k)\): la CDF discreta es una suma de barras y por eso sube a saltos.


Parte B — Variable continua: lluvia de un día lluvioso (Exponencial) · 15 min

Sea \(X\) la lámina de lluvia (mm) de un día lluvioso, con media de 20 mm y densidad

\[f(x) = \frac{1}{20}\,e^{-x/20}, \qquad x \ge 0\]

(Es una Gamma con forma \(\alpha = 1\): la versión de la distribución de la Sesión 1 que sí podemos integrar con lápiz y papel.)

B1. ¿Es una densidad válida? Calculen \(\displaystyle\int_0^{\infty} \frac{1}{20}e^{-x/20}\,dx\). Luego calculen \(P(X = 30)\) como \(\displaystyle\int_{30}^{30} f(x)\,dx\). ¿Qué significa ese resultado para la pregunta “¿cuál es la probabilidad de que llueva exactamente 30 mm?”

B2. De la PDF a la CDF. Deduzcan la acumulada \(F(x) = \displaystyle\int_0^{x} f(t)\,dt\) y completen (4 decimales):

\(x\) (mm) 0 10 20 40 60 100
\(F(x) = P(X \le x)\) ___ ___ ___ ___ ___ ___

Dibujen \(f(x)\) y \(F(x)\) una bajo la otra, con el mismo eje \(x\).

B3. Probabilidades como áreas. Sombreen en el gráfico de \(f(x)\) y calculen con \(F\):

  1. \(P(X < 30)\) b) \(P(X > 60)\) c) \(P(30 < X < 60)\)

B4. Cuantiles (la operación inversa). Despejen \(x_p\) de \(F(x_p) = p\) y calculen la mediana (\(p = 0.50\)), el cuantil 0.90 y el cuantil 0.99. Interpreten los dos últimos como decisiones de diseño para el canal.

B5. Reflexión. Comparen la media (20 mm) con la mediana que obtuvieron. ¿Qué dice esa diferencia sobre la forma de la distribución? ¿Serviría una Normal para esta variable? (Recuerden la diapositiva 3.)

Solución de referencia — Parte B (docente)

B1. \(\displaystyle\int_0^\infty \tfrac{1}{20}e^{-x/20}dx = \left[-e^{-x/20}\right]_0^\infty = 0 - (-1) = \mathbf{1}\), así que es una densidad válida. \(P(X = 30) = \int_{30}^{30} f = \mathbf{0}\): el área de un segmento de ancho cero es cero. En variables continuas la probabilidad de un valor exacto es cero; solo tienen probabilidad los intervalos (diapositiva 4). Por eso preguntamos por umbrales.

B2. \(F(x) = \left[-e^{-t/20}\right]_0^x = \mathbf{1 - e^{-x/20}}\).

\(x\) (mm) 0 10 20 40 60 100
\(F(x)\) 0.0000 0.3935 0.6321 0.8647 0.9502 0.9933

La CDF empieza en 0, es creciente y tiende a 1 (nunca es negativa ni pasa de 1).

B3.

  1. \(P(X<30) = F(30) = 1 - e^{-1.5} = 1 - 0.2231 = \mathbf{0.7769}\).

  2. \(P(X>60) = 1 - F(60) = e^{-3} = \mathbf{0.0498}\): aproximadamente 1 de cada 20 días lluviosos supera los 60 mm.

  3. \(P(30<X<60) = F(60) - F(30) = 0.9502 - 0.7769 = \mathbf{0.1733}\).

B4. \(1 - e^{-x_p/20} = p \;\Rightarrow\; x_p = -20\,\ln(1-p)\).

\(p\) \(x_p\) (mm) Cálculo
0.50 (mediana) 13.86 \(20 \times 0.6931\)
0.90 46.05 \(20 \times 2.3026\)
0.99 92.10 \(20 \times 4.6052\)

Un canal para 46 mm se desborda en ~10% de los días lluviosos; uno para 92.1 mm, solo en ~1% (1 de cada 100 días lluviosos). El costo de la obra crece con el cuantil elegido: el cuantil traduce un nivel de confianza en una magnitud física de diseño.

B5. Mediana (13.86) < media (20): la mitad de los días lluviosos llueve menos de 13.9 mm aunque el promedio sea 20, porque unos pocos días muy fuertes “jalan” la media hacia arriba (sesgo a la derecha). Una Normal es simétrica (media = mediana) y además asigna probabilidad a lluvia negativa: no sirve.


Parte C — Predicción antes de ejecutar · 5 min

Cada pregunta se responde con un prefijo de R: d (densidad/masa), p (acumulada), q (cuantil) o r (simulación). Sin abrir R, escriban el prefijo y la llamada completa. Las familias son pois (Poisson) y exp (Exponencial, que en R usa rate = 1/media).

# Pregunta Prefijo Llamada en R
1 \(P(X = 2)\) fallas de la bomba ___ ___
2 \(P(X \le 2)\) fallas de la bomba ___ ___
3 Menor \(k\) con \(F(k) \ge 0.90\) ___ ___
4 \(P(X < 30)\) mm de lluvia ___ ___
5 \(P(X > 60)\) mm de lluvia ___ ___
6 Lámina que cubre el 90% de los días ___ ___
7 Generar 1000 días lluviosos simulados ___ ___
Solución de referencia — Parte C (docente)
# Prefijo Llamada en R
1 d dpois(2, lambda = 2)
2 p ppois(2, lambda = 2)
3 q qpois(0.90, lambda = 2)
4 p pexp(30, rate = 1/20)
5 p pexp(60, rate = 1/20, lower.tail = FALSE)
6 q qexp(0.90, rate = 1/20)
7 r rexp(1000, rate = 1/20)

De la pizarra a R

Ahora sí: ejecuten el código y compárenlo con lo que escribieron a mano.

Piedra Rosetta: scipy.stats vs. R

Concepto Python (scipy.stats) R
Simulación .rvs() r + familia: rpois(), rexp(), rgamma()
Densidad / masa .pdf() / .pmf() d + familia: dpois(), dexp(), dgamma()
Acumulada (CDF) .cdf() p + familia: ppois(), pexp(), pgamma()
Cuantil (PPF) .ppf() q + familia: qpois(), qexp(), qgamma()

Cuidado con los parámetros. R parametriza la Exponencial con la tasa (rate = 1/media); scipy usa la escala (scale = media). Por eso pexp(30, rate = 1/20) equivale a stats.expon(scale=20).cdf(30).

Parte A en R: la bomba de riego

lambda <- 2
k <- 0:5

tabla_A <- data.frame(
  k       = k,
  P_igual = dpois(k, lambda = lambda),   # d: masa de probabilidad
  F_acum  = ppois(k, lambda = lambda)    # p: probabilidad acumulada
)
knitr::kable(round(tabla_A, 4), align = "c")
k P_igual F_acum
0 0.1353 0.1353
1 0.2707 0.4060
2 0.2707 0.6767
3 0.1804 0.8571
4 0.0902 0.9473
5 0.0361 0.9834
# La CDF discreta es la suma acumulada de las barras
all.equal(tabla_A$F_acum, cumsum(tabla_A$P_igual))
## [1] TRUE
p_a  <- ppois(2, lambda = lambda)                        # P(X <= 2)
p_b  <- 1 - ppois(2, lambda = lambda)                    # P(X >= 3), complemento
p_b2 <- ppois(2, lambda = lambda, lower.tail = FALSE)    # lo mismo con lower.tail
k90  <- qpois(0.90, lambda = lambda)                     # q: cuantil discreto

cat(sprintf("P(X <= 2) = %.4f\nP(X >= 3) = %.4f (complemento) = %.4f (lower.tail)\n",
            p_a, p_b, p_b2))
## P(X <= 2) = 0.6767
## P(X >= 3) = 0.3233 (complemento) = 0.3233 (lower.tail)
cat(sprintf("Cuantil 0.90: k = %d repuestos  ->  F(k-1) = %.4f < 0.90 <= F(k) = %.4f\n",
            k90, ppois(k90 - 1, lambda), ppois(k90, lambda)))
## Cuantil 0.90: k = 4 repuestos  ->  F(k-1) = 0.8571 < 0.90 <= F(k) = 0.9473
ggplot(data.frame(k = 0:10, prob = dpois(0:10, lambda)), aes(x = k, y = prob)) +
  geom_col(fill = "steelblue", alpha = 0.8) +
  geom_text(aes(label = sprintf("%.3f", prob)), vjust = -0.5, size = 3) +
  scale_x_continuous(breaks = 0:10) +
  labs(title = "PMF de Poisson (lambda = 2 fallas por semestre)",
       x = "Número exacto de fallas k", y = "P(X = k)") +
  theme_minimal()

k_seq <- -1:10   # desde -1 para que la escalera parta de F = 0
ggplot(data.frame(k = k_seq, F = ppois(k_seq, lambda)), aes(x = k, y = F)) +
  geom_step(direction = "hv", color = "steelblue4", linewidth = 1) +
  geom_point(data = data.frame(k = 0:10, F = ppois(0:10, lambda)),
             color = "steelblue4", size = 2) +
  annotate("segment", x = -1, xend = k90, y = 0.90, yend = 0.90,
           linetype = "dashed", color = "red") +
  annotate("segment", x = k90, xend = k90, y = 0, yend = 0.90,
           linetype = "dashed", color = "red") +
  annotate("text", x = k90 + 0.3, y = 0.12, hjust = 0, color = "red",
           label = paste0("Cuantil 0.90: k = ", k90)) +
  scale_x_continuous(breaks = 0:10) +
  labs(title = "CDF de Poisson: una escalera (cada salto es P(X = k))",
       x = "Número de fallas k", y = "F(k) = P(X <= k)") +
  theme_minimal()

Parte B en R: la lluvia de un día lluvioso

B1. ¿Es una densidad válida? La probabilidad exacta es cero

media <- 20
tasa  <- 1 / media

# Área total bajo la curva: debe ser 1
integrate(dexp, lower = 0, upper = Inf, rate = tasa)
## 1.000001 with absolute error < 0.00011
# La ALTURA de la curva es una densidad (probabilidad por mm), no una probabilidad
dexp(30, rate = tasa)
## [1] 0.01115651
# P(X = 30) = 0: estrechamos la franja alrededor de 30 mm y el área se desvanece
ancho <- c(10, 1, 0.1, 0.001)
p_franja <- pexp(30 + ancho / 2, rate = tasa) - pexp(30 - ancho / 2, rate = tasa)
data.frame(ancho_mm = ancho, probabilidad = round(p_franja, 6))

B2. La CDF: fórmula deducida a mano vs. pexp()

x_tab <- c(0, 10, 20, 40, 60, 100)
tabla_B <- data.frame(
  x_mm      = x_tab,
  F_R       = pexp(x_tab, rate = tasa),      # p: acumulada de R
  F_formula = 1 - exp(-x_tab / media)        # la fórmula 1 - e^(-x/20) del tablero
)
knitr::kable(round(tabla_B, 4), align = "c")
x_mm F_R F_formula
0 0.0000 0.0000
10 0.3935 0.3935
20 0.6321 0.6321
40 0.8647 0.8647
60 0.9502 0.9502
100 0.9933 0.9933

B3. Probabilidades como áreas

p_menor_30 <- pexp(30, rate = tasa)
p_mayor_60 <- pexp(60, rate = tasa, lower.tail = FALSE)
p_entre    <- pexp(60, rate = tasa) - pexp(30, rate = tasa)

cat(sprintf("P(X < 30)      = %.4f\nP(X > 60)      = %.4f\nP(30 < X < 60) = %.4f\n",
            p_menor_30, p_mayor_60, p_entre))
## P(X < 30)      = 0.7769
## P(X > 60)      = 0.0498
## P(30 < X < 60) = 0.1733
# La CDF ES un área: integrar la densidad da lo mismo que restar dos valores de F
integrate(dexp, lower = 30, upper = 60, rate = tasa)
## 0.1733431 with absolute error < 1.9e-15

B4. Cuantiles: la operación inversa

p_deseadas <- c(0.50, 0.90, 0.99)
cuantiles  <- qexp(p_deseadas, rate = tasa)            # q: cuantil

tabla_Q <- data.frame(
  p         = p_deseadas,
  x_R       = cuantiles,
  x_formula = -media * log(1 - p_deseadas)             # x_p = -20 ln(1 - p) del tablero
)
knitr::kable(round(tabla_Q, 2), align = "c")
p x_R x_formula
0.50 13.86 13.86
0.90 46.05 46.05
0.99 92.10 92.10
# Ida y vuelta: aplicar p a un cuantil devuelve la probabilidad original
all.equal(pexp(cuantiles, rate = tasa), p_deseadas)
## [1] TRUE

B5. Gráficos: el área (PDF) y el cuantil (CDF)

x <- seq(0, 120, by = 0.1)
df_pdf <- data.frame(x = x, densidad = dexp(x, rate = tasa))
df_cdf <- data.frame(x = x, F = pexp(x, rate = tasa))
q90    <- qexp(0.90, rate = tasa)

ggplot(df_pdf, aes(x = x, y = densidad)) +
  geom_area(data = subset(df_pdf, x <= 30), fill = "steelblue", alpha = 0.5) +
  geom_line(color = "steelblue4", linewidth = 1) +
  geom_vline(xintercept = 30, linetype = "dashed") +
  annotate("text", x = 32, y = 0.03, hjust = 0,
           label = sprintf("Área = P(X < 30) = %.4f", p_menor_30)) +
  labs(title = "PDF: la probabilidad es el ÁREA bajo la curva",
       x = "Lluvia de un día lluvioso (mm)", y = "Densidad f(x)") +
  theme_minimal()

ggplot(df_cdf, aes(x = x, y = F)) +
  geom_line(color = "steelblue4", linewidth = 1) +
  annotate("segment", x = 0, xend = q90, y = 0.90, yend = 0.90,
           linetype = "dashed", color = "red") +
  annotate("segment", x = q90, xend = q90, y = 0, yend = 0.90,
           linetype = "dashed", color = "red") +
  annotate("text", x = q90 + 2, y = 0.10, hjust = 0, color = "red",
           label = sprintf("Cuantil 0.90 = %.1f mm", q90)) +
  labs(title = "CDF: de la probabilidad (eje y) a la magnitud física (eje x)",
       x = "Lluvia de un día lluvioso (mm)", y = "F(x) = P(X <= x)") +
  theme_minimal()

B6. Simulación: ¿la muestra confirma la teoría?

set.seed(123)
lluvia_sim <- rexp(10000, rate = tasa)                 # r: simulación

data.frame(
  medida  = c("Proporción con X < 30", "Proporción con X > 60"),
  teorico = round(c(p_menor_30, p_mayor_60), 4),
  simulado = c(mean(lluvia_sim < 30), mean(lluvia_sim > 60))
)
# Cuantiles muestrales (empíricos) vs. teóricos
rbind(teorico  = round(cuantiles, 2),
      simulado = round(quantile(lluvia_sim, probs = p_deseadas), 2))
##            50%   90%   99%
## teorico  13.86 46.05 92.10
## simulado 13.97 46.20 89.18

Los valores simulados deben quedar cerca de los teóricos (no idénticos: una muestra siempre tiene ruido). Con más simulaciones el acuerdo mejora.

Puente a la Gamma del notebook

La Exponencial es una Gamma con shape = 1. La Gamma de la Sesión 1 (shape = 2.5, scale = 20, media de 50 mm) ya no se integra fácilmente a lápiz: aquí el algoritmo hace lo que el lápiz no puede.

# La Exponencial(media 20) es la Gamma(shape = 1, scale = 20)
all.equal(pexp(30, rate = 1/20), pgamma(30, shape = 1, scale = 20))
## [1] TRUE
shape_g <- 2.5
scale_g <- 20

cat(sprintf("P(X < 100 mm)      = %.4f\n", pgamma(100, shape = shape_g, scale = scale_g)))
## P(X < 100 mm)      = 0.9248
cat(sprintf("Cuantil 0.90 (mm)  = %.1f\n", qgamma(0.90, shape = shape_g, scale = scale_g)))
## Cuantil 0.90 (mm)  = 92.4
cat(sprintf("Cuantil 0.99 (mm)  = %.1f\n", qgamma(0.99, shape = shape_g, scale = scale_g)))
## Cuantil 0.99 (mm)  = 150.9

Trampa clásica. Si no se nombra scale, el tercer argumento de pgamma() es rate (= 1/escala). Compare:

pgamma(100, shape_g, 20)            # incorrecto: R lo lee como rate = 20
## [1] 1
pgamma(100, shape_g, scale = 20)    # correcto: scale = 20
## [1] 0.9247648

Verificación: mi cuaderno vs. R

Escriba en A_mano los resultados de su cuaderno (redondeados a 4 decimales, o 2 en los milímetros) y ejecute el chunk. Una diferencia distinta de cero es una pista de dónde revisar.

comparacion <- data.frame(
  Pregunta = c("P(X <= 2) bomba", "P(X >= 3) bomba", "Cuantil 0.90 de fallas (k)",
               "P(X < 30 mm)", "P(X > 60 mm)", "P(30 < X < 60 mm)",
               "Mediana (mm)", "Cuantil 0.90 (mm)", "Cuantil 0.99 (mm)"),
  A_mano = rep(NA_real_, 9),   # <- ESCRIBA AQUÍ sus 9 resultados, p. ej. c(0.6767, 0.3233, ...)
  R = round(c(ppois(2, lambda), 1 - ppois(2, lambda), qpois(0.90, lambda),
              pexp(30, rate = tasa), pexp(60, rate = tasa, lower.tail = FALSE),
              pexp(60, rate = tasa) - pexp(30, rate = tasa),
              qexp(c(0.50, 0.90, 0.99), rate = tasa)), 4)
)
comparacion$Diferencia <- round(comparacion$A_mano - comparacion$R, 4)
knitr::kable(comparacion, align = "lccc")
Pregunta A_mano R Diferencia
P(X <= 2) bomba NA 0.6767 NA
P(X >= 3) bomba NA 0.3233 NA
Cuantil 0.90 de fallas (k) NA 4.0000 NA
P(X < 30 mm) NA 0.7769 NA
P(X > 60 mm) NA 0.0498 NA
P(30 < X < 60 mm) NA 0.1733 NA
Mediana (mm) NA 13.8629 NA
Cuantil 0.90 (mm) NA 46.0517 NA
Cuantil 0.99 (mm) NA 92.1034 NA

Bitácora de IA (entrega)

Su asistente de IA puede generar código en R, pero usted es quien verifica. Un prompt sugerido:

“Actúa como profesor de hidrología estadística en R. Resolví a mano dos ejercicios: una Poisson con lambda = 2 (calculé P(X <= 2), P(X >= 3) y el cuantil 0.90 discreto) y una Exponencial con media 20 mm (calculé P(X < 30), P(X > 60) y los cuantiles 0.50, 0.90 y 0.99). Explícame el sistema de prefijos r, d, p, q y dame el código en R con ggplot2 para verificar mis resultados y graficar la PDF con el área sombreada y la CDF con el cuantil marcado. No me des las respuestas numéricas sin mostrar la llamada a R.”

Responda en 5 a 8 líneas:

  1. ¿Coincidieron todos sus resultados manuscritos con R? Si alguno no coincidió, ¿dónde estaba el error: en el cuaderno, en el código de la IA o en un argumento (rate vs. scale, lower.tail)?
  2. ¿Le pareció más intuitivo el sistema r, d, p, q de R o los métodos de objetos de scipy.stats? Justifique técnica y visualmente.
  3. Con sus palabras: ¿por qué en una variable continua preguntamos por un umbral (CDF) o un cuantil y no por un valor exacto?
  4. Declare qué parte del código fue generada por IA y cómo comprobó que era correcta.