1 Cargar Librerías

Preparación del entorno de trabajo con las librerías necesarias para el análisis estocástico, pruebas de bondad de ajuste y visualización avanzada.

library(readxl)
library(dplyr)
library(gt)
library(ggplot2)
library(scales)
library(e1071)
library(MASS) # Fundamental para el ajuste de distribuciones (fitdistr)

2 Cargar Datos

Se importa el dataset base de la investigación. Al ejecutar el documento, se abrirá una ventana del sistema para localizar dinámicamente el archivo Excel correspondiente.

# Selección del archivo Excel (se abre ventana emergente)
ruta_archivo <- file.choose()
Datos <- read_excel(ruta_archivo)

cat("Variables importadas exitosamente:", ncol(Datos), "\n")
## Variables importadas exitosamente: 32

3 Extraer la Variable

Se aísla la variable Longitude (Longitud Geográfica). Al ser una variable cuantitativa continua que abarca desde coordenadas negativas (Occidente) hasta positivas (Oriente), requiere un tratamiento analítico segmentado para su correcta inferencia estadística.

# Limpieza de caracteres y conversión a vector numérico continuo
valores_limpios <- gsub(",", ".", Datos$Longitude)
Variable <- na.omit(as.numeric(valores_limpios))
N <- length(Variable)

cat("Variable analizada: Longitude\n")
## Variable analizada: Longitude
cat("Total de observaciones poblacionales (n):", N, "\n")
## Total de observaciones poblacionales (n): 7537

4 Tabla de Frecuencia

Organización sistemática de la dispersión geográfica aplicando la Ley de Sturges para definir los intervalos de clase óptimos.

BASE <- 10
min_int <- floor(min(Variable) / BASE) * BASE
max_int <- ceiling(max(Variable) / BASE) * BASE
k_int_sug <- floor(1 + 3.322 * log10(N))

Rango_int <- max_int - min_int
Amplitud_int <- ceiling((Rango_int / k_int_sug) / 10) * 10
if (Amplitud_int == 0) Amplitud_int <- 10

cortes_int <- seq(from = min_int, by = Amplitud_int, length.out = k_int_sug + 1)
if (max(cortes_int) < max(Variable)) cortes_int <- c(cortes_int, max(cortes_int) + Amplitud_int)

while (length(cortes_int) > 2 && cortes_int[length(cortes_int) - 1] >= max(Variable)) {
  cortes_int <- cortes_int[-length(cortes_int)]
}

K_real <- length(cortes_int) - 1
inter_int <- cut(Variable, breaks = cortes_int, include.lowest = TRUE, right = FALSE)
ni_int <- as.vector(table(inter_int))
hi_int <- (ni_int / N) * 100

TDF_Enteros <- data.frame(
  Li = cortes_int[1:K_real],
  Ls = cortes_int[2:(K_real + 1)],
  MC = (cortes_int[1:K_real] + cortes_int[2:(K_real + 1)]) / 2,
  ni = ni_int,
  hi = round(hi_int, 2)
)

TDF_Enteros %>%
  gt() %>%
  tab_header(
    title = md("**Tabla N°1: Distribución de Frecuencias de Longitud**")
  ) %>%
  cols_label(
    Li = "Lím. Inf (°)", Ls = "Lím. Sup (°)",
    MC = "Marca Clase", ni = "Frecuencia (nᵢ)", hi = "Probabilidad Empírica (%)"
  ) %>%
  cols_align(align = "center", columns = everything()) %>%
  tab_options(heading.background.color = "#AAAAAA", column_labels.font.weight = "bold")
Tabla N°1: Distribución de Frecuencias de Longitud
Lím. Inf (°) Lím. Sup (°) Marca Clase Frecuencia (nᵢ) Probabilidad Empírica (%)
-160 -130 -145 37 0.49
-130 -100 -115 2689 35.68
-100 -70 -85 2018 26.77
-70 -40 -55 403 5.35
-40 -10 -25 51 0.68
-10 20 5 1130 14.99
20 50 35 431 5.72
50 80 65 384 5.09
80 110 95 183 2.43
110 140 125 178 2.36
140 170 155 26 0.34
170 200 185 7 0.09

5 Gráficas y Modelado (Normal y Log-Normal)

Debido a la naturaleza continua de la variable y a la dispersión de los yacimientos en ambos hemisferios, un solo modelo teórico es insuficiente. Por ello, se aplica una estrategia de Modelado Estocástico Híbrido:

  • Zona 1 (Hemisferio Occidental): Modelado con Distribución Normal.
  • Zona 2 (Hemisferio Oriental): Modelado con Distribución Log-Normal, ideal para datos con asimetría positiva a partir del meridiano cero.

5.1 Hemisferio Occidental (Modelo Normal)

# Segmentación Zona 1
z1 <- Variable[Variable <= 0]
mu1 <- mean(z1, na.rm = TRUE)
sd1 <- sd(z1, na.rm = TRUE)

h1 <- hist(z1, breaks = 15, plot = FALSE)
df_z1 <- data.frame(x = h1$mids, y = (h1$counts / length(z1)) * 100)

ggplot(df_z1, aes(x = x, y = y)) +
  geom_bar(stat = "identity", fill = "#B0C4DE", color = "black", width = diff(h1$breaks)[1]) +
  stat_function(fun = function(x) dnorm(x, mean = mu1, sd = sd1) * 100 * diff(h1$breaks)[1], 
                color = "#C0392B", linewidth = 1.5) +
  labs(title = "Ajuste Normal - Hemisferio Occidental (Longitudes Negativas)",
       x = "Longitud (°)", y = "Densidad Porcentual (%)") +
  theme_minimal(base_size = 12) +
  theme(plot.title = element_text(face = "bold"))

5.2 Hemisferio Oriental (Modelo Log-Normal)

# Segmentación Zona 2 (valores estrictamente positivos para Log-Normal)
z2 <- Variable[Variable > 0.1]
fit2 <- fitdistr(z2, "lognormal")
mu_log2 <- fit2$estimate[1]
sd_log2 <- fit2$estimate[2]

h2 <- hist(z2, breaks = 15, plot = FALSE)
df_z2 <- data.frame(x = h2$mids, y = (h2$counts / length(z2)) * 100)

ggplot(df_z2, aes(x = x, y = y)) +
  geom_bar(stat = "identity", fill = "#AED6F1", color = "black", width = diff(h2$breaks)[1]) +
  stat_function(fun = function(x) dlnorm(x, meanlog = mu_log2, sdlog = sd_log2) * 100 * diff(h2$breaks)[1], 
                color = "#2E86C1", linewidth = 1.5) +
  labs(title = "Ajuste Log-Normal - Hemisferio Oriental (Longitudes Positivas)",
       x = "Longitud (°)", y = "Densidad Porcentual (%)") +
  theme_minimal(base_size = 12) +
  theme(plot.title = element_text(face = "bold"))

6 Conjetura

Se hipotetiza que la distribución global de los yacimientos petroleros y gasíferos no obedece a un patrón uniforme o aleatorio simple. La conformación geológica de las cuencas sedimentarias sugiere la existencia de clústers hiper-concentrados. Específicamente, se conjetura que el hemisferio oriental posee una fuerte asimetría positiva (cola larga) debido a la extensa concentración de cuencas desde Medio Oriente hasta Asia central, la cual es capturada matemáticamente por la distribución Log-Normal.

7 Bondad de Ajuste - Test de Pearson y Chi Cuadrado

Se valida la fiabilidad de las curvas teóricas ajustadas comparándolas estadísticamente contra los datos empíricos de los yacimientos.

# Test Zona 1
teorico1 <- dnorm(h1$mids, mean(z1), sd(z1))
p1_real <- cor(h1$counts, teorico1) * 100
chi1 <- suppressWarnings(chisq.test(h1$counts, p = teorico1, rescale.p = TRUE)$p.value)

# Test Zona 2
teorico2 <- dlnorm(h2$mids, mu_log2, sd_log2)
p2_real <- cor(h2$counts, teorico2) * 100
chi2 <- suppressWarnings(chisq.test(h2$counts, p = teorico2, rescale.p = TRUE)$p.value)

resumen_ajuste <- data.frame(
  Segmento = c("Hemisferio Occidental", "Hemisferio Oriental"),
  Modelo = c("Normal", "Log-Normal"),
  Pearson_R = c(p1_real, p2_real),
  Chi_P_Value = c(chi1, chi2)
)

resumen_ajuste <- resumen_ajuste %>%
  mutate(Estado = ifelse(Pearson_R > 75, "APROBADO", "REVISIÓN"))

resumen_ajuste %>%
  gt() %>%
  tab_header(
    title = md("**Tabla N°2: Resumen de Validación Geográfica**"),
    subtitle = "Pruebas de Bondad de Ajuste Estocástico"
  ) %>%
  cols_label(
    Segmento = "Segmento Operativo",
    Modelo = "Modelo de Ajuste",
    Pearson_R = "Correlación Pearson (R%)",
    Chi_P_Value = "Chi-Cuadrado (p-valor)",
    Estado = "Estado"
  ) %>%
  fmt_number(columns = c(Pearson_R), decimals = 2) %>%
  fmt_number(columns = c(Chi_P_Value), decimals = 4) %>%
  cols_align(align = "center", columns = everything()) %>%
  tab_style(
    style = list(cell_text(color = "#1D8348", weight = "bold")),
    locations = cells_body(columns = Estado, rows = Estado == "APROBADO")
  ) %>%
  tab_options(heading.background.color = "#AAAAAA", column_labels.font.weight = "bold")
Tabla N°2: Resumen de Validación Geográfica
Pruebas de Bondad de Ajuste Estocástico
Segmento Operativo Modelo de Ajuste Correlación Pearson (R%) Chi-Cuadrado (p-valor) Estado
Hemisferio Occidental Normal 78.68 0.0000 APROBADO
Hemisferio Oriental Log-Normal 92.74 0.0000 APROBADO

8 Calculo de Probabilidades

A partir del modelo Log-Normal validado para el Hemisferio Oriental, podemos calcular la probabilidad teórica de encontrar un yacimiento en la franja geoestratégica del Medio Oriente (por ejemplo, entre los meridianos 40° y 60° Este).

# Probabilidad entre 40 y 60 grados de longitud este usando el modelo Log-Normal
prob_medio_oriente <- (plnorm(60, mu_log2, sd_log2) - plnorm(40, mu_log2, sd_log2)) * 100

cat("La probabilidad matemática de que un nuevo proyecto en el hemisferio oriental se ubique \n")
## La probabilidad matemática de que un nuevo proyecto en el hemisferio oriental se ubique
cat("específicamente entre los 40° y 60° de longitud (zona de Medio Oriente) es del:", round(prob_medio_oriente, 2), "%\n")
## específicamente entre los 40° y 60° de longitud (zona de Medio Oriente) es del: 8.84 %

9 Intervalo de Confianza

Por el Teorema del Límite Central (TLC), calculamos el intervalo de confianza poblacional para la media de la longitud de los yacimientos a nivel mundial con un nivel de seguridad del 95% (\(Z = 1.96\)).

\(E = \frac{\sigma}{\sqrt{n}}\)

x_bar <- mean(Variable, na.rm = TRUE)
sigma <- sd(Variable, na.rm = TRUE)
E_margen <- 1.96 * (sigma / sqrt(N))

tabla_ic <- data.frame(
  Parametro = "Centro de Masa Longitudinal (°)",
  Lim_Inferior = x_bar - E_margen,
  Media_Muestral = x_bar,
  Lim_Superior = x_bar + E_margen,
  Error = paste0("+/- ", round(E_margen, 4)),
  Confianza = "95% (Z=1.96)"
)

tabla_ic %>%
  gt() %>%
  tab_header(
    title = md("**Tabla N°3: Estimación de la Media Poblacional**")
  ) %>%
  cols_label(
    Lim_Inferior = "Límite Inferior",
    Media_Muestral = "Media Central (μ)",
    Lim_Superior = "Límite Superior",
    Error = "Margen de Error (E)"
  ) %>%
  fmt_number(columns = 2:4, decimals = 3) %>%
  cols_align(align = "center", columns = everything()) %>%
  tab_style(
    style = list(cell_fill(color = "#E8F8F5"), cell_text(color = "#145A32", weight = "bold")),
    locations = cells_body(columns = Media_Muestral)
  ) %>%
  tab_options(heading.background.color = "#AAAAAA", column_labels.font.weight = "bold")
Tabla N°3: Estimación de la Media Poblacional
Parametro Límite Inferior Media Central (μ) Límite Superior Margen de Error (E) Confianza
Centro de Masa Longitudinal (°) −56.186 −54.653 −53.120 +/- 1.5329 95% (Z=1.96)

10 Conclusiones

La longitud geográfica de los yacimientos petroleros a nivel mundial exhibe un comportamiento altamente complejo que requiere un modelado estocástico segmentado. El hemisferio occidental responde con robustez a un modelo de ajuste Normal, mientras que la marcada acumulación de proyectos en el hemisferio oriental se representa eficazmente mediante una curva Log-Normal.

Mediante inferencia estadística, se comprueba que la media poblacional del posicionamiento longitudinal de la industria se encuentra acotada estrictamente en el intervalo de [-56.186° ; -53.12°] con un 95% de confianza empírica. Esto valida la conjetura inicial sobre la hiper-concentración geológica y brinda una herramienta paramétrica validada (vía Correlación de Pearson) para predecir y evaluar la viabilidad posicional de futuros bloques de exploración y extracción.