Bloque 3. Probabilidad

Formación PDI - Universidad de Málaga

Antonio Elías

Agenda

  1. Variables aleatorias cualitativas y cuantitativas discretas finitas

  2. Variables aleatorias cualitativas continuas y discretas

Variable Aleatoria

Una variable aleatoria es una función que asigna un valor (numérico continuo o discreto o categórico) a cada resultado posible de un experimento aleatorio.

\[X: \Omega \rightarrow \mathcal{X}\]

donde:

  • \(\Omega\): conjunto de resultados posibles (espacio muestral).
  • \(\mathcal{X}\): conjunto de valores que puede tomar la variable (números o categorías).
  • La probabilidad de cada valor \(X = x_i\) se deriva de la probabilidad sobre \(\Omega\).

Variable Aleatoria

Sea \(X\) una v.a. discreta o categórica que toma valores \(x = 0, 1, \dots\) con parámetro \(\theta\):

  • Función de probabilidad

\[P(X = x).\]

  • Función de probabilidad acumulada

\[F_{\theta}(x) = P(X \leq x) = \sum_{i = 0}^x P(X = x).\]

Variable Aleatoria

Sea \(X\) una v.a. continua que toma valores \(x \in \mathbb{R}\) con parámetro \(\theta\):

  • Función de densidad:

\[f(x) \text{ o } f_{\theta}(x).\]

  • Función de distribución:

\[F_{\theta}(x) = P(X \leq x) = \int_{-\infty}^x f_{\theta}(x).\]

  • Función cuantíl:

\[Q_{\theta}(p) = F_{\theta}^{-1}(p) = \inf \{ x \in \mathbb{R} : F_{\theta}(x) \ge p \}, \quad 0 < p < 1\]

Tipos de Variables Aleatorias

Tipo Naturaleza Descripción Ejemplo
Discreta Cuantitativa Toma un número finito o contable de valores. Número de caras al lanzar 3 monedas.
Continua Cuantitativa Puede tomar cualquier valor dentro de un intervalo real. Tiempo de espera en una cola.
Categórica/Cualitativa (nominal u ordinal) Cualitativa Representa categorías o etiquetas con o sin orden. Color de una bola extraída de una urna.

Distribuciones Cualitativas o Cuantitativas discretas finitas

Cualitativas o Cuantitativas discretas finitas

Sea \(X\) una variable aleatoria discreta que puede tomar valores \(\Omega = \{x_1, x_2, \dots , x_n\}\) con probabilidades \(p_1, p_2, ..., p_n\), tal que:

\[P(X = x_i) = p_i, \quad i = 1, ..., n, \quad \sum_{i=1}^{n} p_i = 1\]

  • Si \(\{x_1, x_2, \dots , x_n\}\) son categorías, tenemos una v.a. cualitativa discreta. Ejemplo: nacionalidades.

  • Si \(\{x_1, x_2, \dots , x_n\}\) son números enteros, tenemos una v.a. cuantitativa discreta. Ejemplo: distribución uniforme discreta, lanzamiento de un dado.

💻 Tu turno 1

Generación de variables cualitativas: crea un script de cero, programa lo indicado debajo y ejecútalo

📝 Define un vector que contenta el espacio muestral del experimento “lanzamiento de una moneda”.

Code
omega <- c("CARA", "CRUZ")

📝 Use la función sample para generar una muestra con 100 realizaciones de este experimento.

Code
n <- 10

omega <- c("CARA", "CRUZ")

muestra <- sample(omega, size = n, replace = TRUE)

📝 Utilice la tabla de frecuencias para calcular las probabilidades empíricas de cada suceso.

Code
n <- 100

omega <- c("CARA", "CRUZ")

muestra <- sample(omega, size = n, replace = TRUE)

prop.table(table(muestra))

📝 Use la función sample para generar una muestra con 100 realizaciones de este experimento. Determine que la probabilidad de cara es 3/4 y la de cruz es 1/4. Utilice la tabla de frecuencias para calcular las probabilidades empíricas de cada suceso.

Code
n <- 100

omega <- c("CARA", "CRUZ")
prob <- c(3/4, 1/4)

muestra <- sample(omega, size = n, replace = TRUE, prob = prob)

prop.table(table(muestra))

📝 Considere el experimento “lanzamiento de un dado” justo.

Code
n <- 100

omega <- c(1:6)
prob <- rep(1/6, 6)

muestra <- sample(omega, size = n, replace = TRUE, prob = prob)

prop.table(table(muestra))

📝 Considere el experimento “lanzamiento de un dado” justo. Aproxime por simulación la probabilidad de sacar un número mayor que 4 y compare con la teórica.

Code
n <- 10000

omega <- c(1:6)
prob <- rep(1/6, 6)

muestra <- sample(omega, size = n, replace = TRUE, prob = prob)

prop_teorica <- 1/6 + 1/6
prop_aprox <- mean(muestra > 4)

📝 Considere el experimento “lanzamiento de un dado” justo. Aproxime por simulación la probabilidad de sacar un número mayor que 4 y compare con la teórica. Represente la diferencia entre la aproximada y la teórica a medida que aumentamos el número de replicas.

Code
n <- 1000

omega <- c(1:6)
prob <- rep(1/6, 6)

prop_teorica <- 1/6 + 1/6

vec_prop_aprox <- numeric(length = n)*NA

for(i in 1:n){
  
  muestra <- sample(omega, size = i, replace = TRUE, prob = prob)

  vec_prop_aprox[i] <- mean(muestra > 4)
}

plot(1:n, vec_prop_aprox - prop_teorica, type = "l")
abline(h = 0, col = "red")

📝 Repita el ejercicio 7 pero use la función sapply.

Code
n <- 1000

omega <- c(1:6)
prob <- rep(1/6, 6)

prop_teorica <- 1/6 + 1/6

vec_prop_aprox <- sapply(1:n, function(i) mean(sample(omega, size = i, replace = TRUE, prob = prob)>4))

plot(1:n, vec_prop_aprox - prop_teorica, type = "l")
abline(h = 0, col = "red")

Conteo en Probabilidad

Los principios de conteo permiten determinar el número de resultados posibles en experimentos aleatorios sin enumerarlos directamente.

  • Permutaciones

  • Combinaciones

  • Variaciones

Permutaciones

Número de formas de ordenar todos los elementos de un conjunto.

\[P(n) = n!\]

Si solo se ordenan \(k\) elementos de \(n\):

\[P(n, k) = \frac{n!}{(n - k)!}\]

El orden importa.

# Permutaciones de 3 elementos tomados de 5
factorial(5) / factorial(5 - 3)
[1] 60

Combinaciones

Número de formas de elegir elementos sin importar el orden.

\[C(n, k) = \frac{n!}{k!(n - k)!}\]

El orden no importa.

# Combinaciones de 3 elementos tomados de 5
choose(5, 3)
[1] 10

Variaciones

Número de formas de elegir y ordenar k elementos de un conjunto de \(n\).

\[V(n, k) = \frac{n!}{(n - k)!}\]

Se eligen y se ordenan.

# Variaciones de 3 elementos tomados de 5
V <- function(n, k) factorial(n) / factorial(n - k)
V(5, 3)
[1] 60

Distribuciones v.a. Cuantitativas

Distribuciones de Probabilidad

En R, hay un estandar en la terminología para nombrar a las diferentes funciones relacionadas con una distribución concreta, llamémosla ~:

  • d~(): devuelve la densidad (continua) o función de probabilidad (discreta).
  • p~(): devuelve la función de distribución.
  • q~(): devuelve la función cuantíl.
  • r~(): genera números aleatorios de esa distribución.

Los argumentos específicos de estas funciones para cada distribución dependerán principalmente del número de parámetros que tenga la distribución. Las distribuciones más conocidas se encuentran en el paquete R base.

Distribuciones discretas univariadas

Distribución Prefijo Función de densidad (d) Parámetros principales
Bernoulli binom dbinom(x, 1, prob) prob: probabilidad de éxito (1)
Binomial binom dbinom(x, size, prob) size: n. de ensayos, prob: probabilidad de éxito por ensayo
Geométrica geom dgeom(x, prob) prob: probabilidad de éxito por intento
Binomial negativa nbinom dnbinom(x, size, prob) size: n. de éxitos deseados, prob: probabilidad de éxito
Hipergeométrica hyper dhyper(x, m, n, k) m: éxitos en población, n: fracasos, k: tamaño de muestra
Poisson pois dpois(x, lambda) lambda: media de eventos esperados en un intervalo

Distribuciones continuas univariadas

Distribución Prefijo Función de densidad (d) Parámetros principales
Uniforme unif dunif(x, min, max) min, max: límites inferior y superior
Normal norm dnorm(x, mean, sd) mean: media, sd: desviación estándar
Exponencial exp dexp(x, rate) rate: tasa de ocurrencia (lambda), media = 1/rate
Gamma gamma dgamma(x, shape, rate) shape: forma (alpha), rate: tasa (lambda); alternativa: scale = 1/rate
Beta beta dbeta(x, shape1, shape2) shape1, shape2: parámetros de forma (alpha, beta), definen la asimetría
Log-normal lnorm dlnorm(x, meanlog, sdlog) meanlog, sdlog: media y desviación estándar del logaritmo
Chi-cuadrado chisq dchisq(x, df) df: grados de libertad
t de Student t dt(x, df) df: grados de libertad
F de Snedecor f df(x, df1, df2) df1, df2: grados de libertad del numerador y denominador
Weibull weibull dweibull(x, shape, scale) shape: forma, scale: escala
Cauchy cauchy dcauchy(x, location, scale) location: ubicación (mediana), scale: parámetro de escala

💻 Tu turno 2

Generación de variables cualitativas: crea un script de cero, programa lo indicado debajo y ejecútalo

📝 Calcule \(P(X = 10)\) para \(X\sim Bin(n = 20, p = 0.7)\).

Code
dbinom(10, size = 20, prob = 0.7)

📝 Calcule \(P(X \geq 10)\) para \(X\sim Bin(n = 20, p = 0.7)\).

Code
sum(sapply(10:20, function(x) dbinom(x, size = 20, prob = 0.7)))

1 - pbinom(9, size = 20, prob = 0.7)

📝 Genere \(100\) realizaciones de una variable aleatoria \(X\sim N(0,1)\). Estime y represente su densidad.

Code
x <- rnorm(100)

plot(density(x))

📝 Calcule la probabilidad \(P(X \leq 0.5)\) y \(P(X \geq 0.5)\) siendo \(X \sim N(0,1)\).

Code
pnorm(0.5)

1 - pnorm(0.5)
pnorm(0.5, lower.tail = FALSE)

📝 Represente la densidad de la distribución Normal y de la t-student con 1, 5 y 25 grados de libertad.

Code
x <- seq(-3, 3, length.out = 1000)

plot(x, dnorm(x), type = "l", col = "blue", lwd = 2, ylab = "Densidad", xlab = "x",
     main = "Distribución Normal vs t de Student")
lines(x, dt(x, df = 1), col = "red", lwd = 2)
lines(x, dt(x, df = 5), col = "orange", lwd = 2)
lines(x, dt(x, df = 25), col = "yellow", lwd = 2)

legend("topright",
       legend = c("Normal(0,1)", "t (df=1)", "t (df=5)", "t (df=25)"),
       col = c("blue", "red", "orange", "yellow"),
       lty = 1, lwd = 2, bty = "n")

📝 ¿Qué diferencia hay entre los siguientes dos gráficos?

x <- seq(-3, 3, length.out = 1000)

plot(x, dnorm(x), type = "l", col = "blue", lwd = 2, ylab = "Densidad", xlab = "x",
     main = "Distribución Normal")

plot(density(rnorm(100)))

Distribución Normal Multivariada

Queremos simular datos \(X \sim \mathcal{N}(\mu, \Sigma)\) con:

  • \(\mu\): vector de medias
  • \(\Sigma\): matriz de covarianzas (simétrica y definida positiva)

Podemos simular variable aleatorias de esta distribución de dos formas:

  1. Vía descomposición de Cholesky.

  2. Utilizando una librería que implementa la función.

Generación de normales multivariadas vía Descomposición de Cholesky

Sea \(Z \sim \mathcal{N}_d(0, I_d)\), y sea \(\Sigma\) una matriz simétrica definida positiva. Si \(L\) es tal que \(\Sigma = L L^\top\) (descomposición de Cholesky), entonces:

\[X = \mu + L Z \sim \mathcal{N}_d(\mu, \Sigma)\]

  • \(\mathbb{E}[X] = \mu + L \mathbb{E}[Z] = \mu\)

  • \(\text{Cov}(X) = L \text{Cov}(Z) L^\top = L I_d L^\top = \Sigma\)

  • \(X\) es una combinación lineal de normales, por lo tanto, también es normal.

💻 Tu turno 3

Generación de normales bivariada vía Descomposición de Cholesky:

\[X = (X_1, X_2) \sim N_2 \big(\mu, \Sigma \big)\] donde \(\mu = (\mu_1, \mu_2)\) y \(\Sigma = \begin{pmatrix} \sigma_{X_1}^2 & \sigma_{X_1X_2} \\ \sigma_{X_2X_1} & \sigma_{X_2}^2 \end{pmatrix}\).

📝 Cree un vector mu para la media y una matriz sigma para la matriz de covarianza tal que:

\[\mu = (2, 3), \qquad \Sigma = \begin{pmatrix} 4 & 2 \\ 2 & 3 \end{pmatrix}.\]

Code
mu <- c(2, 3)
Sigma <- matrix(c(4, 2, 2, 3), ncol = 2)

📝 Obtenga la descomposición de Cholerky de la matriz de covarianzas:

Code
# Descomposición de Cholesky
L <- chol(Sigma)

📝 Genere la matriz \(Z \sim N_2(0, I_d)\) que nos permita generar \(n=500\) realizaciones:

Code
n <- 500
Z <- matrix(rnorm(n * 2), ncol = 2)

📝 Genere las \(500\) realizaciones de \(X\) usando la fórmula y represente su gráfico de dispersión:

Code
# Generación de datos

X <- Z %*% t(L) + matrix(mu, n, 2, byrow = TRUE)

# Visualización
plot(X, col = rgb(0.2, 0.4, 0.6, 0.4), pch = 19,
     main = "Normal multivariada vía Cholesky",
     xlab = "X1", ylab = "X2")

Distribución Normal Multivariada (mvtnorm)

library(mvtnorm)

set.seed(123)
mu <- c(2, 3)
Sigma <- matrix(c(4, 2, 
                  2, 3), ncol = 2)

X2 <- rmvnorm(n = 500, mean = mu, sigma = Sigma)

# Visualización
plot(X2, col = rgb(0.8, 0.3, 0.2, 0.4), pch = 19,
     main = "Normal multivariada con mvtnorm",
     xlab = "X1", ylab = "X2")

Lista de distribuciones disponibles

https://cran.r-project.org/web/views/Distributions.html#base

help("Distributions")

Funciones y conceptos de utilidad

  • Semilla set.seed(): Fijar para obtener siempre los mismos resultados.

  • Función manipulate::manipulate(): permite ejecutar un gráfico con diferentes parámetros.

library(manipulate)
manipulate(
  hist(rnorm(n)),
  n = slider(5, 1000))

Concurso de Monty Hall

Hay 3 puertas: detrás de una hay un coche (premio) y detrás de las otras dos cabras.

El concursante elige una puerta (sin abrirla).

El presentador, que sabe dónde está el coche, abre una de las otras dos puertas mostrando siempre una cabra.

Se ofrece al concursante la opción de mantener su elección inicial o cambiar a la otra puerta cerrada.

Pregunta: ¿conviene cambiar o mantener? Simula el experimento y estima la probabilidad de ganar si cambias y si mantienes.

📝 Utilice 100000 simulaciones para estimar la probabilidad y compare con los valores teóricos.

Code
replicates <- 100000

prob_ganar_si_no_cambio <- mean(sample(1:3, n, replace = TRUE) == sample(1:3, n, replace = TRUE)) 

prob_ganar_si_si_cambio <- 1 - prob_ganar_si_no_cambio

# Pero la forma más directa es:
prob_teo__ganar_si_no_cambio <- 1/3
prob_teo_ganar_si_si_cambio <- 2/3

📝 ¿Cómo cambian las probabilidades si tenemos 100 puertas en vez de 3 y el presentador abre todas las que no son el premio excepto 1?

Code
n_replicates <- 1000

prob_ganar_si_no_cambio <- mean(sample(1:100, n_replicates, replace = TRUE) == sample(1:100, n_replicates, replace = TRUE)) 

prob_ganar_si_si_cambio <- 1 - prob_ganar_si_no_cambio

El problema del cumpleaños

¿Cuál es la probabilidad de que, en un grupo de \(n\) personas, al menos dos compartan cumpleaños?

📝 Estime la probabilidad por simulación para un grupo de \(n = 23\) personas. Asuma que cada año tiene 365 días y utilice.

Code
n_replicates <- 1000
n <- 23
dias <- 365

# Simula todos los cumpleaños de golpe
cumples_matrix <- matrix(sample(1:dias, n * n_replicates, replace = TRUE),
                           nrow = n_replicates, ncol = n)

# Detecta filas con duplicados
comparten_cumple <- apply(cumples_matrix, 1, function(x) any(duplicated(x)))

prob_sim <- mean(comparten_cumple)

📝 Repita el ejercicio anterior usando la función replicate.

Code
n_replicates <- 1000
n <- 23
dias <- 365

mean(replicate(n_replicates, 
          any(duplicated(sample(1:dias, n, replace = TRUE))))) 

📝 Grafique la probabilidad para un rango de valores de n desde 2 hasta 80.

Code
n_replicates <- 1000
nseq <- seq(2, 80, 2)

prob_un_n <- function(n){mean(replicate(n_replicates, any(duplicated(sample(1:dias, n, replace = TRUE)))))}

probs_n <- sapply(nseq, function(n) prob_un_n(n))

plot(nseq, probs_n, type = "l")