title: “🎲 Laboratorio 14: Modelos Probabilísticos Discretos en R” author: “Nicole” date: “05/11/2026” output: html_document: theme: cosmo highlight: tango toc: true toc_float: collapsed: false smooth_scroll: true toc_depth: 2 code_folding: show df_print: paged —
Aprender a utilizar R y sus funciones estadísticas
base (junto con ggplot2 para las gráficas) para
modelar, calcular y graficar las distribuciones de
probabilidad discretas más importantes:
🪙 Bernoulli • 🎯 Binomial • 🔁 Binomial Negativa • 📞 Poisson • 🎱 Hipergeométrica
🧰 Herramientas: RStudio / Posit Cloud • R 4.x •
Paquetes ggplot2 y dplyr
Antes de comenzar, cargamos las librerías que nos permitirán realizar los cálculos y las gráficas.
# install.packages(c("ggplot2", "dplyr")) # Ejecutar solo la primera vez
library(ggplot2)
library(dplyr)
cat("¡Entorno listo para el laboratorio!\n")
## ¡Entorno listo para el laboratorio!
base_fill <- "#4facfe" # color base de las barras (cambia en cada sección)
plot_distribution <- function(values, pmf, title, highlight = NULL,
highlight_color = "#ff4d6d", label = NULL,
fill = base_fill) {
df <- data.frame(k = values, prob = pmf)
p <- ggplot(df, aes(x = factor(k), y = prob)) +
geom_bar(stat = "identity", fill = fill, color = "white", alpha = 0.9) +
labs(title = title, x = "Valores (k)", y = "Probabilidad P(X=k)") +
theme_minimal(base_size = 14) +
theme(plot.title = element_text(hjust = 0.5, face = "bold", color = "#2b2d42"),
axis.text.x = element_text(size = 9),
panel.grid.minor = element_blank(),
plot.background = element_rect(fill = "#fbfbff", color = NA))
if (!is.null(highlight)) {
df_high <- df %>% filter(k %in% highlight)
p <- p + geom_bar(data = df_high, aes(x = factor(k), y = prob),
stat = "identity", fill = highlight_color, color = "white")
}
if (!is.null(label)) {
p <- p + annotate("label", x = length(values)/2 + 0.5, y = max(pmf) * 0.92,
label = label, size = 5, color = "#1b4332",
fill = "#d8f3dc", fontface = "bold")
}
print(p)
}
💡 Cómo leerlo: las barras azules son la distribución completa y las barras rojas son el evento cuya probabilidad se calcula.
Definición: modela un experimento con dos únicos resultados: “éxito” (1) o “fracaso” (0). La probabilidad de éxito es \(p\).
Ejemplo: lanzamiento de una moneda una vez. \(X = 1\) si sale cara, \(0\) si sale sello, con \(p = 0.5\).
n_bernoulli <- 1 # Un solo ensayo
p_bernoulli <- 0.5 # Probabilidad de éxito (cara)
x_bernoulli <- 0:n_bernoulli
pmf_bernoulli <- dbinom(x_bernoulli, n_bernoulli, p_bernoulli)
plot_distribution(x_bernoulli, pmf_bernoulli,
sprintf("Distribución de Bernoulli (p=%.1f)", p_bernoulli))
cat(sprintf("Media (Esperanza): %.2f\n", n_bernoulli * p_bernoulli))
## Media (Esperanza): 0.50
cat(sprintf("Varianza: %.2f\n", n_bernoulli * p_bernoulli * (1 - p_bernoulli)))
## Varianza: 0.25
Definición: modela el número de éxitos en \(n\) ensayos independientes de Bernoulli, cada uno con probabilidad de éxito \(p\).
Ejemplo general: lanzar una moneda 10 veces. \(X\) = número de caras, con \(n=10\) y \(p=0.5\).
n_binom <- 10
p_binom <- 0.5
x_binom <- 0:n_binom
pmf_binom <- dbinom(x_binom, n_binom, p_binom)
plot_distribution(x_binom, pmf_binom,
sprintf("Distribución Binomial (n=%d, p=%.1f)", n_binom, p_binom))
cat(sprintf("Media (Esperanza): %.2f\n", n_binom * p_binom))
## Media (Esperanza): 5.00
cat(sprintf("Varianza: %.2f\n", n_binom * p_binom * (1 - p_binom)))
## Varianza: 2.50
Lanzamos una moneda justa (\(p=0.5\)) \(n=10\) veces. ¿Cuál es la probabilidad de obtener exactamente 6 caras?
n <- 10; p <- 0.5; k <- 6
prob_binom_1 <- dbinom(k, n, p)
cat(sprintf("Probabilidad de obtener exactamente 6 caras: P(X = 6) = %.5f\n", prob_binom_1))
## Probabilidad de obtener exactamente 6 caras: P(X = 6) = 0.20508
plot_distribution(0:n, dbinom(0:n, n, p),
"Distribución Binomial - P(X=6)",
highlight = k,
label = sprintf("P(X = 6) = %.5f", prob_binom_1))
La probabilidad de que una pieza sea defectuosa es 0.1. Halla la probabilidad de que en una muestra de 25 piezas haya a lo sumo cuatro defectuosas.
n <- 25; p <- 0.1
probabilidades <- dbinom(0:n, n, p)
probabilidad_acumulada <- pbinom(4, n, p)
plot_distribution(0:n, probabilidades,
"Distribución Binomial - P(X <= 4)",
highlight = 0:4,
label = sprintf("P(X <= 4) = %.5f", probabilidad_acumulada))
cat(sprintf("La probabilidad de que en una muestra de 25 piezas se encuentren a lo sumo 4 defectuosas es: %.5f\n",
probabilidad_acumulada))
## La probabilidad de que en una muestra de 25 piezas se encuentren a lo sumo 4 defectuosas es: 0.90201
El 60% de los psicólogos de una facultad encuentra trabajo el primer año. De 100 psicólogos de un curso, ¿cuántos se espera que se coloquen en el primer año? ¿Cuál es la varianza?
n <- 100; p <- 0.6
esperanza_binom <- n * p
varianza_binom <- n * p * (1 - p)
cat(sprintf("Se espera que %.0f psicólogos encuentren trabajo en el primer año.\n", esperanza_binom))
## Se espera que 60 psicólogos encuentren trabajo en el primer año.
cat(sprintf("La varianza es: %.2f\n", varianza_binom))
## La varianza es: 24.00
Suponiendo que el 40% de los comunicadores sociales tiene Rh-, en una muestra de siete: (a) ¿qué probabilidad hay de que todas sean Rh-? (b) ¿y de que máximo cuatro sean Rh-?
n <- 7; p <- 0.4
# (a) Probabilidad de que todas sean Rh-
prob_todas_rh_neg <- dbinom(n, n, p)
cat(sprintf("Probabilidad de que todas sean Rh-: P(X = 7) = %.5f\n", prob_todas_rh_neg))
## Probabilidad de que todas sean Rh-: P(X = 7) = 0.00164
plot_distribution(0:n, dbinom(0:n, n, p),
"Distribución Binomial - P(X = 7)",
highlight = 7,
label = sprintf("P(X = 7) = %.5f", prob_todas_rh_neg))
# (b) Probabilidad de que máximo cuatro sean Rh-
prob_maximo_cuatro <- pbinom(4, n, p)
cat(sprintf("Probabilidad de que máximo cuatro sean Rh-: P(X <= 4) = %.5f\n", prob_maximo_cuatro))
## Probabilidad de que máximo cuatro sean Rh-: P(X <= 4) = 0.90374
plot_distribution(0:n, dbinom(0:n, n, p),
"Distribución Binomial - P(X <= 4)",
highlight = 0:4,
label = sprintf("P(X <= 4) = %.5f", prob_maximo_cuatro))
El 25% de quienes toman un antibiótico sufre efectos secundarios. De una muestra de 8 enfermos, halla la probabilidad de que sufran efectos secundarios al menos tres.
p <- 0.25; n <- 8
# P(X >= 3) = 1 - P(X < 3) = 1 - P(X <= 2)
prob_al_menos_tres <- 1 - pbinom(2, n, p)
cat(sprintf("La probabilidad de que al menos tres enfermos sufran efectos secundarios es: %.5f\n",
prob_al_menos_tres))
## La probabilidad de que al menos tres enfermos sufran efectos secundarios es: 0.32146
plot_distribution(0:n, dbinom(0:n, n, p),
"Distribución Binomial - P(X >= 3)",
highlight = 3:n,
label = sprintf("P(X >= 3) = %.5f", prob_al_menos_tres))
Con los mismos datos del antibiótico (25%, muestra de 8), halla la probabilidad de que sufran efectos secundarios menos de 3.
p <- 0.25; n <- 8
# P(X < 3) = P(X <= 2)
prob_menos_de_tres <- pbinom(2, n, p)
cat(sprintf("La probabilidad de que menos de 3 enfermos sufran efectos secundarios es: %.5f\n",
prob_menos_de_tres))
## La probabilidad de que menos de 3 enfermos sufran efectos secundarios es: 0.67854
plot_distribution(0:n, dbinom(0:n, n, p),
"Distribución Binomial - P(X < 3)",
highlight = 0:2,
label = sprintf("P(X < 3) = %.5f", prob_menos_de_tres))
Definición: modela el número de ensayos de Bernoulli necesarios para obtener un número fijo de éxitos (\(r\)).
⚠️ Nota de R:
dnbinom(x, size=r, prob=p) devuelve la probabilidad de
obtener x fracasos antes del \(r\)-ésimo éxito (misma convención que
scipy.stats.nbinom).
¿Cuál es la probabilidad de obtener 5 éxitos antes de 3 fracasos si la probabilidad de éxito es \(p = 0.7\)?
r <- 5 # Número de éxitos
p <- 0.7 # Probabilidad de éxito
k <- 3 # Número de fracasos antes de obtener 5 éxitos
prob_nbinom_1 <- dnbinom(k, size = r, prob = p)
cat(sprintf("Probabilidad de obtener 5 éxitos antes de 3 fracasos: P(X=5) = %.5f\n",
prob_nbinom_1))
## Probabilidad de obtener 5 éxitos antes de 3 fracasos: P(X=5) = 0.15883
# Momentos
esperanza_nbinom <- r * (1 - p) / p
varianza_nbinom <- r * (1 - p) / (p^2)
desviacion_nbinom <- sqrt(varianza_nbinom)
cat("\nMomentos en el Modelo Binomial Negativo\n")
##
## Momentos en el Modelo Binomial Negativo
cat(sprintf("Esperanza: E(X) = %.2f\n", esperanza_nbinom))
## Esperanza: E(X) = 2.14
cat(sprintf("Varianza: V(X) = %.2f\n", varianza_nbinom))
## Varianza: V(X) = 3.06
cat(sprintf("Desviación estándar: %.2f\n", desviacion_nbinom))
## Desviación estándar: 1.75
La probabilidad de que un niño expuesto al COVID-19 se contagie es 0.6. ¿Cuál es la probabilidad de que el 10.º niño expuesto sea el tercero en contagiarse?
n <- 10; r <- 3; p <- 0.6
k <- n - r # Número de fracasos antes de obtener 3 éxitos
prob_nbinom_2 <- dnbinom(k, size = r, prob = p)
cat(sprintf("Probabilidad de que el 10° niño sea el tercero en contagiarse: %.5f\n",
prob_nbinom_2))
## Probabilidad de que el 10° niño sea el tercero en contagiarse: 0.01274
Definición: modela el número de eventos que ocurren en un intervalo de tiempo o espacio, dado un promedio de ocurrencia (\(\lambda\)).
Una central telefónica recibe en promedio 2 llamadas por minuto. ¿Cuál es la probabilidad de que en un minuto se reciban exactamente 3 llamadas?
lambda_poisson <- 2
k <- 3
prob_poisson_1 <- dpois(k, lambda_poisson)
cat(sprintf("Probabilidad de recibir exactamente 3 llamadas: P(X=3) = %.5f\n", prob_poisson_1))
## Probabilidad de recibir exactamente 3 llamadas: P(X=3) = 0.18045
plot_distribution(0:14, dpois(0:14, lambda_poisson),
"Distribución de Poisson - P(X=3)",
highlight = k,
label = sprintf("P(X=3) = %.5f", prob_poisson_1))
Los erizos cruzan una autovía a razón de 4 cada 30 minutos. ¿Cuál es la probabilidad de que 6 o más erizos la crucen en una hora?
lambda_poisson <- 8 # 4 erizos/30 min * 2 = 8 por hora
prob_6_o_mas <- 1 - ppois(5, lambda_poisson) # P(X >= 6)
cat(sprintf("La probabilidad de que 6 o más erizos crucen la autovía en una hora es: %.5f\n",
prob_6_o_mas))
## La probabilidad de que 6 o más erizos crucen la autovía en una hora es: 0.80876
plot_distribution(0:19, dpois(0:19, lambda_poisson),
"Distribución de Poisson - P(X >= 6)",
highlight = 6:19,
label = sprintf("P(X >= 6) = %.5f", prob_6_o_mas))
En una carretera ocurren en promedio 2 accidentes anuales. Calcula la probabilidad de que en cinco años se produzcan más de 3 accidentes.
lambda_5_years <- 2 * 5
prob_mas_de_3 <- 1 - ppois(3, lambda_5_years) # P(X > 3)
cat(sprintf("La probabilidad de que en 5 años se produzcan más de 3 accidentes es: %.5f\n",
prob_mas_de_3))
## La probabilidad de que en 5 años se produzcan más de 3 accidentes es: 0.98966
plot_distribution(0:24, dpois(0:24, lambda_5_years),
"Distribución de Poisson - P(X > 3) en 5 años",
highlight = 4:24,
label = sprintf("P(X > 3) = %.5f", prob_mas_de_3))
En la hora punta pasan en promedio 10 coches por minuto por un semáforo. ¿Cuál es la probabilidad de que pasen exactamente 16 coches en 2 minutos?
lambda_poisson <- 10 * 2
k <- 16
prob_poisson <- dpois(k, lambda_poisson)
cat(sprintf("La probabilidad de que pasen exactamente 16 coches en 2 minutos es: %.5f\n",
prob_poisson))
## La probabilidad de que pasen exactamente 16 coches en 2 minutos es: 0.06456
plot_distribution(0:39, dpois(0:39, lambda_poisson),
"Distribución de Poisson - P(X=16)",
highlight = k,
label = sprintf("P(X=16) = %.5f", prob_poisson))
Un banco recibe en promedio 6 cheques sin fondo por día. ¿Cuál es la probabilidad de que reciba: a. cuatro en un día, b. cincuenta en una semana, c. diez en 12 horas, d. cinco en 4 horas?
lambda_dia <- 6
# a. Cuatro cheques sin fondo en un día dado
prob_a <- dpois(4, lambda_dia)
cat(sprintf("a. Probabilidad de 4 cheques sin fondo en un día: %.5f\n", prob_a))
## a. Probabilidad de 4 cheques sin fondo en un día: 0.13385
plot_distribution(0:14, dpois(0:14, lambda_dia),
"Poisson - P(X=4) en un día",
highlight = 4,
label = sprintf("P(X=4) = %.5f", prob_a))
# b. Cincuenta cheques sin fondo en una semana
lambda_semana <- lambda_dia * 7
prob_b <- dpois(50, lambda_semana)
cat(sprintf("b. Probabilidad de 50 cheques sin fondo en una semana: %.5f\n", prob_b))
## b. Probabilidad de 50 cheques sin fondo en una semana: 0.02748
plot_distribution(0:69, dpois(0:69, lambda_semana),
"Poisson - P(X=50) en una semana",
highlight = 50,
label = sprintf("P(X=50) = %.5f", prob_b))
# c. Diez cheques sin fondo en 12 horas
lambda_12horas <- lambda_dia * 0.5
prob_c <- dpois(10, lambda_12horas)
cat(sprintf("c. Probabilidad de 10 cheques sin fondo en 12 horas: %.5f\n", prob_c))
## c. Probabilidad de 10 cheques sin fondo en 12 horas: 0.00081
plot_distribution(0:19, dpois(0:19, lambda_12horas),
"Poisson - P(X=10) en 12 horas",
highlight = 10,
label = sprintf("P(X=10) = %.5f", prob_c))
# d. 5 cheques sin fondos en 4 horas
lambda_4horas <- lambda_dia * (4/24)
prob_d <- dpois(5, lambda_4horas)
cat(sprintf("d. Probabilidad de 5 cheques sin fondo en 4 horas: %.5f\n", prob_d))
## d. Probabilidad de 5 cheques sin fondo en 4 horas: 0.00307
plot_distribution(0:14, dpois(0:14, lambda_4horas),
"Poisson - P(X=5) en 4 horas",
highlight = 5,
label = sprintf("P(X=5) = %.5f", prob_d))
En una empresa el promedio es de 5 accidentes por mes. Calcula la probabilidad de que ocurran como mínimo 2 accidentes en un mes.
lambda_poisson <- 5
# P(X >= 2) = 1 - P(X <= 1)
prob_al_menos_2 <- 1 - ppois(1, lambda_poisson)
cat(sprintf("La probabilidad de que ocurran como mínimo 2 accidentes en un mes es: %.5f\n",
prob_al_menos_2))
## La probabilidad de que ocurran como mínimo 2 accidentes en un mes es: 0.95957
plot_distribution(0:14, dpois(0:14, lambda_poisson),
"Poisson - P(X >= 2) accidentes/mes",
highlight = 2:14,
label = sprintf("P(X >= 2) = %.5f", prob_al_menos_2))
Con el mismo promedio de 5 accidentes por mes, calcula la probabilidad de que ocurran 8 accidentes en un trimestre.
lambda_trimestre <- 5 * 3
k <- 8
prob_poisson_8 <- dpois(k, lambda_trimestre)
cat(sprintf("La probabilidad de que ocurran 8 accidentes en un trimestre es: %.5f\n",
prob_poisson_8))
## La probabilidad de que ocurran 8 accidentes en un trimestre es: 0.01944
plot_distribution(0:24, dpois(0:24, lambda_trimestre),
"Poisson - P(X=8) en un trimestre",
highlight = k,
label = sprintf("P(X=8) = %.5f", prob_poisson_8))
Definición: modela el número de éxitos en una muestra de tamaño \(n\) extraída sin reemplazo de una población finita de tamaño \(N\) que contiene \(K\) éxitos.
⚠️ Nota de R:
dhyper(x, m=K, n=N-K, k=n) — cuidado con los nombres de los
argumentos: m = éxitos en la población, n =
fracasos en la población, k = tamaño de la muestra.
Ejemplo 1: una urna contiene 10 bolas rojas y 20 azules. Se seleccionan 5 bolas sin reemplazo. ¿Cuál es la probabilidad de seleccionar exactamente 3 rojas?
N <- 30 # Población total
K <- 10 # Éxitos en la población (bolas rojas)
n <- 5 # Tamaño de la muestra
k <- 3 # Éxitos en la muestra
prob_hyper_1 <- dhyper(k, m = K, n = N - K, k = n)
cat(sprintf("Probabilidad de seleccionar exactamente 3 bolas rojas: P(X=3) = %.5f\n",
prob_hyper_1))
## Probabilidad de seleccionar exactamente 3 bolas rojas: P(X=3) = 0.15999
# Momentos
esperanza_hyper <- n * (K / N)
varianza_hyper <- n * (K/N) * (1 - K/N) * ((N - n) / (N - 1))
desviacion_hyper <- sqrt(varianza_hyper)
cat("\nMomentos en el Modelo Hipergeométrico\n")
##
## Momentos en el Modelo Hipergeométrico
cat(sprintf("Esperanza: E(X) = %.2f\n", esperanza_hyper))
## Esperanza: E(X) = 1.67
cat(sprintf("Varianza: V(X) = %.2f\n", varianza_hyper))
## Varianza: V(X) = 0.96
cat(sprintf("Desviación estándar: %.2f\n", desviacion_hyper))
## Desviación estándar: 0.98
plot_distribution(0:n, dhyper(0:n, m = K, n = N - K, k = n),
"Distribución Hipergeométrica - P(X=3)",
highlight = k,
label = sprintf("P(X=3) = %.5f", prob_hyper_1))
| Distribución | Probabilidad puntual | Acumulada | Media | Varianza |
|---|---|---|---|---|
| 🪙 Bernoulli | dbinom(x, 1, p) |
pbinom(x, 1, p) |
\(p\) | \(p(1-p)\) |
| 🎯 Binomial | dbinom(x, n, p) |
pbinom(x, n, p) |
\(np\) | \(np(1-p)\) |
| 🔁 Binomial Negativa | dnbinom(x, r, p) |
pnbinom(x, r, p) |
\(r/p\) | \(r(1-p)/p^2\) |
| 📞 Poisson | dpois(x, lambda) |
ppois(x, lambda) |
\(\lambda\) | \(\lambda\) |
| 🎱 Hipergeométrica | dhyper(x, m, n, k) |
phyper(x, m, n, k) |
\(nK/N\) | ver fórmula |
Resolvemos los problemas usando el código aprendido: para cada uno calculamos la probabilidad y graficamos la distribución.
base_fill <- "#43e97b"
n <- 15; p <- 1/4
prob_6 <- dbinom(6, n, p)
prob_5_o_menos <- pbinom(5, n, p)
cat(sprintf("P(X = 6) = %.5f\n", prob_6))
## P(X = 6) = 0.09175
cat(sprintf("P(X <= 5) = %.5f\n", prob_5_o_menos))
## P(X <= 5) = 0.85163
plot_distribution(0:n, dbinom(0:n, n, p),
"Binomial - Examen (n=15, p=0.25)",
highlight = 6,
label = sprintf("P(X=6)=%.5f", prob_6))
base_fill <- "#ffb347"
lambda <- 3
prob_5 <- dpois(5, lambda)
prob_2_o_menos <- ppois(2, lambda)
cat(sprintf("P(X = 5) = %.5f\n", prob_5))
## P(X = 5) = 0.10082
cat(sprintf("P(X <= 2) = %.5f\n", prob_2_o_menos))
## P(X <= 2) = 0.42319
plot_distribution(0:14, dpois(0:14, lambda),
"Poisson - Visitas por minuto (λ=3)",
highlight = 5,
label = sprintf("P(X=5)=%.5f", prob_5))
base_fill <- "#a0e7e5"
N <- 50; K <- 10; n <- 8; k <- 2
prob_2_defectuosas <- dhyper(k, m = K, n = N - K, k = n)
cat(sprintf("P(X = 2 defectuosas) = %.5f\n", prob_2_defectuosas))
## P(X = 2 defectuosas) = 0.32172
plot_distribution(0:n, dhyper(0:n, m = K, n = N - K, k = n),
"Hipergeométrica - 2 defectuosas en muestra de 8",
highlight = k,
label = sprintf("P(X=2) = %.5f", prob_2_defectuosas))
base_fill <- "#f6a6ff"
r <- 3 # 3 defectuosas (éxitos)
p <- 0.05 # Probabilidad de defecto
k <- 10 - 3 # Fracasos antes del 3er éxito
prob_3ra_defectuosa <- dnbinom(k, size = r, prob = p)
cat(sprintf("P(la 3ª defectuosa sea la 10ª pieza) = %.5f\n", prob_3ra_defectuosa))
## P(la 3ª defectuosa sea la 10ª pieza) = 0.00314
plot_distribution(0:60 + r, dnbinom(0:60, size = r, prob = p),
"Binomial Negativa - Posición de la 3ª defectuosa (p=0.05)",
highlight = 10,
label = sprintf("P(X=10) = %.5f", prob_3ra_defectuosa))
d___() dan la
probabilidad en un punto y las p___() la
probabilidad acumulada.1 - p___(k - 1, ...).