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.
La finca experimental de la universidad tiene dos necesidades de diseño para el próximo semestre:
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.
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.
¿Cuál es la probabilidad de que la bomba falle a lo sumo 2 veces en el semestre, \(P(X \le 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?
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.
\(P(X \le 2) = F(2) = 0.1353 + 0.2707 + 0.2707 = \mathbf{0.6767}\).
\(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.
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\):
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.)
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.
\(P(X<30) = F(30) = 1 - e^{-1.5} = 1 - 0.2231 = \mathbf{0.7769}\).
\(P(X>60) = 1 - F(60) = e^{-3} = \mathbf{0.0498}\): aproximadamente 1 de cada 20 días lluviosos supera los 60 mm.
\(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.
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 | ___ | ___ |
| # | 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) |
Ahora sí: ejecuten el código y compárenlo con lo que escribieron a mano.
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);scipyusa la escala (scale = media). Por esopexp(30, rate = 1/20)equivale astats.expon(scale=20).cdf(30).
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()
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))
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 |
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
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
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()
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.
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 depgamma()esrate(= 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
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 |
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
ggplot2para 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:
rate vs. scale,
lower.tail)?scipy.stats? Justifique
técnica y visualmente.