Problema 1

Christian David Vera Mendivelso
Paula Vidal Godoy

Métodos y Simulación estadística
Maestría en Ciencia de Datos
Pontificia Universidad Javeriana de Cali


Estimación del valor de \(\pi\)

Este texto tiene como propósito estimar el valor de \(\pi\) mediante la generación de puntos aleatorios en un cuadrado de area 1 y un circulo inscrito de área \(\pi\)/4 ,al contar los puntos dispuestos dentro del área del circulo, se puede estimar el valor del area y de este hallar el valor de \(\pi\).

Para dar solución a este problema se siguen los siguientes pasos:

1.Se generan valores aleatorios con una distribución uniforme usando “runif” para las coordenadas \((x,y)\)

inicial = 1000
x = runif(inicial,0,1)
y = runif(inicial,0,1)

2.Posteriormente se determina si los puntos generados se encuentran dentro del circulo, teniendo en cuenta que cada punto (x,y) se encuentra en el circulo si la distancia desde el centro es menor a 0.5 que es el radio.Mediante la siguiente expresión se puede calcular la distancia al cuadrado al centro del circulo:

\[(x - 0.5)^2 + (y - 0.5)^2 \]

#Función que determina si los puntos están dentro del circulo
Circulo <- function(x, y) {
  distancia_2 <- (x - 0.5)^2 + (y - 0.5)^2
  condicion <- distancia_2 < 0.25
  return(data.frame(X = x, Y = y, Distancia = distancia_2, Condicion = condicion))
}

resultados1 <- Circulo(x, y)

3.Seguidamente se resalta la cantidad de puntos que cumplen esta condición en color verde (figura 1) con una cantidad de 1.000 valores generados para facilitar su visualización, esto con el motivo de verificar de manera sencilla que la clasificación de las coordenadas es correcta.\

library(ggplot2)

t <- seq(0, 2*pi, length.out = 100)
circulo <- data.frame(
  X = 0.5 + 0.5 * cos(t),
  Y = 0.5 + 0.5 * sin(t)
)


ggplot(resultados1, aes(x = X, y = Y)) +
  geom_point(aes(color = Condicion), size = 2) +
  geom_path(data = circulo, aes(x = X, y = Y), color = "black", linewidth = 0.8) +  # Círculo de referencia
  scale_color_manual(values = c("red", "#4baf32"), labels = c("Fuera", "Dentro")) +
  labs(x = "Coordenada X",y = "Coordenada Y", color = "Posición") + #Colores
  coord_fixed(ratio = 1) + theme_minimal() + theme(legend.position = "bottom") 

Fig1.Clasificación de 1,000 puntos generados aleatoriamente.


Seguidamente, se realiza esta clasificación para mayor cantidad de puntos aleatorios (Tabla 1), mostrando como a medida que se aumenta la muestra se disminuye el error respecto al valor real de \(\pi\) (figura 2)

Tabla 1. Estimaciones con distintas cantidades de puntos.
# Cargar librerías necesarias
library(ggplot2)
library(knitr)
library(kableExtra)

# Define los tamaños de muestra a evaluar
tamanos_muestra <- c(100, 1000, 10000, 100000, 1000000, 10000000, 20000000)

pi_real <- pi

# Lista para guardar resultados del bucle for
resultados_estimaciones <- list()

# Calcular la estimación de pi para cada tamaño de muestra
for (n in tamanos_muestra) {
  x <- runif(n, min = 0, max = 1)
  y <- runif(n, min = 0, max = 1)
  resultados <- Circulo(x, y)
  num_dentro <- sum(resultados$Condicion)
  total <- n 
  
  # Calcular la estimación y el error de pi
  estimacion_pi <- 4 * num_dentro / total
  error <- estimacion_pi - pi_real
  
  # Guardar los resultados
  resultados_estimaciones[[as.character(n)]] <- data.frame(
    TamañoDeMuestra = format(n, big.mark = ",", scientific = FALSE),
    P_Dentro = format(num_dentro, big.mark = ",", scientific = FALSE),
    Pi_Estimado = format(round(estimacion_pi, 6), nsmall = 6, scientific = FALSE),
    Error = format(round(error, 6), nsmall = 6, scientific = FALSE)
  )}

# Unir los data frames en uno solo con los resultados de pi estimado
tabla_resultados <- do.call(rbind, resultados_estimaciones)

# Mostrar la tabla de resultados con kableExtra
Tabla_final <- kable(tabla_resultados, 
      format = "pipe",  
      col.names = c("Tamaño de Muestra", "Puntos Dentro", "Estimación", "Error"),
      digits = 6,  # Número de decimales para los valores numéricos
      row.names = FALSE,
      align = 'c') %>%
  kable_styling(
    bootstrap_options = c("striped", "hover", "condensed", "responsive"), 
    font_size = 12, 
    full_width = FALSE
  )

# Mostrar la tabla
Tabla_final
Tamaño de Muestra Puntos Dentro Estimación Error
100 76 3.040000 -0.101593
1,000 791 3.164000 0.022407
10,000 7,808 3.123200 -0.018393
100,000 78,591 3.143640 0.002047
1,000,000 785,310 3.141240 -0.000353
10,000,000 7,853,927 3.141571 -0.000022
20,000,000 15,708,487 3.141697 0.000105
library(ggplot2)
library(knitr)
library(kableExtra)

#Se crea una gráfica que muestra como se acerca al valor ral a medida que se incrementa la cantidad de puntos.

ggplot(tabla_resultados, aes(x = as.numeric(gsub(",", "", TamañoDeMuestra)), y = as.numeric(Pi_Estimado))) +
  geom_smooth(color = "blue", linewidth = 0.8, method = "loess", formula = y ~ x, se = FALSE) +
  geom_hline(yintercept = pi_real, linetype = "dashed", color = "#4baf32", linewidth = 1) +
  scale_x_log10(labels = scales::label_number(big.mark = ",")) +
  labs(
    x = "Cantidad de puntos",
    y = "Estimación"
  ) +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 90, hjust = 1))

Fig2. Aproximación al valor real por cantidad de puntos.