5.2 Ejemplo ilustrativo: estimación de \(\pi\)

set.seed(123)
n <- 10000
x <- runif(n)
y <- runif(n)
inside_circle <- (x^2 + y^2) <= 1
pi_estimate <- 4 * mean(inside_circle)
cat("Estimación de pi:", pi_estimate)
## Estimación de pi: 3.18

Este ejemplo usa el método de Monte Carlo para estimar el área de un círculo inscrito en un cuadrado (estimando así el valor de \(\pi\)).

Veamos el ejemplo paso a paso:

Paso 1: Definir las variables aleatorias

Se simulan puntos aleatorios \((x, y)\) dentro del cuadrado unidad \([0,1] \times [0,1]\). Cada punto es una variable aleatoria.

x <- runif(n)
y <- runif(n)

Paso 2: Asignar distribuciones de probabilidad

Las variables \(x\) e \(y\) se asumen distribuidas Uniforme(0,1), lo que garantiza una cobertura uniforme del cuadrado.

Paso 3: Generar múltiples escenarios

Se generan \(n = 10000\) simulaciones o escenarios aleatorios.

n <- 10000

Paso 4: Calcular el resultado en cada escenario

Se calcula si cada punto cae dentro del cuarto de círculo de radio 1.

inside_circle <- (x^2 + y^2) <= 1

Paso 5: Analizar los resultados simulados

Se estima \(\pi\) como cuatro veces la proporción de puntos que caen dentro del círculo:

pi_estimate <- 4 * mean(inside_circle)

Este valor se aproxima al valor real de \(\pi \approx 3.1416\) usando simulación estadística.

set.seed(123)
n <- 10000
x <- runif(n)
y <- runif(n)
inside_circle <- (x^2 + y^2) <= 1
pi_estimate <- 4 * mean(inside_circle)
cat("Estimación de pi:", pi_estimate)
## Estimación de pi: 3.18

Este ejemplo usa el método de Monte Carlo para estimar el área de un círculo inscrito en un cuadrado (estimando así el valor de \(\pi\)).

5.2.1 Aplicación a Riesgos Cibernéticos

Supongamos que una organización desea estimar la pérdida financiera anual esperada por ataques cibernéticos exitosos.

Supuestos del modelo:

  • El número de ataques exitosos por año sigue una distribución Poisson(\(\lambda\) = 3).

  • La pérdida por ataque exitoso sigue una distribución lognormal(\(\mu\) = 10, \(\sigma\) = 1.5).

  • Se desean simular 10.000 años hipotéticos.

set.seed(123)

# Parámetros
n_sim <- 10000
lambda <- 3
mu <- 10
sigma <- 1.5

# Función de simulación por año
simular_perdida_anual <- function() {
  n_ataques <- rpois(1, lambda)
  if (n_ataques == 0) return(0)
  sum(rlnorm(n_ataques, meanlog = mu, sdlog = sigma))
}

# Simulación Monte Carlo
perdidas <- replicate(n_sim, simular_perdida_anual())

# Estadísticas clave
mean(perdidas)               # Pérdida esperada anual
## [1] 200219.7
quantile(perdidas, 0.95)     # Valor en Riesgo al 95%
##    95% 
## 704838
quantile(perdidas, 0.99)     # Valor en Riesgo al 99%
##     99% 
## 1505755
# Visualización
hist(perdidas, breaks = 50,
     main = "Distribución simulada de pérdidas anuales por ciberataques",
     xlab = "Pérdida anual (USD)", col = "steelblue", border = "white")

5.2.2 Relación con la Convolución

¿Qué es la convolución?

La convolución es una operación matemática que describe la distribución de la suma de dos variables aleatorias independientes. Si \(X \sim f(x)\) y \(Y \sim g(y)\), entonces la suma \(Z = X + Y\) tiene distribución dada por:

\[ (f * g)(z) = \int_{-\infty}^{\infty} f(x)g(z - x) \, dx \]

5.2.3 Convolución en riesgo cibernético

Cuando el número de eventos \(N\) también es aleatorio, como en una distribución Poisson, la pérdida total \(S = \sum_{i=1}^N X_i\) no puede modelarse con una sola convolución. En cambio, se utiliza una mezcla ponderada de convoluciones:

\[ f_S(s) = \sum_{n=0}^{\infty} \mathbb{P}(N = n) \cdot f^{*n}(s) \]

Donde:

  • \(\mathbb{P}(N = n)\) es la probabilidad de que ocurran exactamente \(n\) eventos.
  • \(f^{*n}(s)\) representa la n-ésima convolución de la densidad \(f\), es decir, la densidad de la suma de \(n\) pérdidas independientes.

¿Qué significa \(f^{*n}(s)\)?

La notación \(f^{*n}(s)\) representa la convolución de \(n\) funciones de densidad. Para \(n = 2\), por ejemplo:

\[ f^{*2}(s) = \int_{0}^{s} f(x) f(s - x) \, dx \]

Esto es la densidad de \(X_1 + X_2\) si \(X_1, X_2 \sim f(x)\) son independientes.

Si \(f(x)\) es, por ejemplo, una distribución exponencial \(\text{Exp}(\lambda)\), entonces la convolución tiene forma cerrada:

\[ f^{*2}(s) = \lambda^2 s e^{-\lambda s}, \quad s \geq 0 \]

corresponde a una distribución Gamma(2, \(\lambda\)).

Para \(n > 2\):

Se vuelve más complicado. Por ejemplo, para \(n = 3\):

\[ f^{*3}(s) = \int_{-\infty}^{\infty} f^{*2}(x) f(s - x) \, dx \]

Y así sucesivamente, lo cual rápidamente se vuelve intratable analíticamente, especialmente si \(f\) es lognormal o Burr.

Relación con la simulación Monte Carlo

En vez de resolver esta expresión analíticamente, Monte Carlo genera directamente muestras desde el modelo generativo. Formalmente, se estima:

  1. Para cada simulación \(k\):
    • Simular \(N^{(k)} \sim \text{Poisson}(\lambda)\)
    • Simular \(X_1^{(k)}, \dots, X_{N^{(k)}}^{(k)} \sim f(x)\)
    • Calcular \(S^{(k)} = \sum_{i=1}^{N^{(k)}} X_i^{(k)}\)
  2. Repetir para \(k = 1, \dots, M\) veces

Entonces:

\[ \{ S^{(1)}, S^{(2)}, \dots, S^{(M)} \} \approx \text{muestra de la distribución de } S \]

Y se pueden estimar:

  • \(\mathbb{E}[S] \approx \frac{1}{M} \sum_{k=1}^{M} S^{(k)}\)
  • VaR, percentiles, colas extremas, etc.
Elemento Expresión teórica Aproximación Monte Carlo
Distribución de pérdidas \(f_S(s) = \sum_{n=0}^{\infty} P(N=n) \cdot f^{*n}(s)\) Muestreo empírico de \(S^{(k)} = \sum X_i\)
Complejidad Altamente compleja, sin forma cerrada Simple de implementar
Ejemplo Poisson + Lognormal rpois() + rlnorm()

5.2.4 Monte Carlo como aproximación

Realizar esta convolución de forma analítica es complejo. Por eso, usamos simulación de Monte Carlo para aproximar la distribución de \(S\):

  1. Simulamos un valor de \(N\).
  2. Generamos \(N\) pérdidas individuales \(X_i\).
  3. Calculamos la suma total \(S\).
  4. Repetimos este proceso muchas veces para obtener una aproximación empírica de la distribución.

Este enfoque permite obtener estimaciones del valor esperado, VaR, colas de riesgo, etc., sin necesidad de derivar convoluciones analíticas.