1 Configuración y Carga de Datos

Se cargan las librerías necesarias y el dataset Global Oil and Gas Extraction Tracker (GOGET), que contiene registros de unidades de extracción de petróleo y gas a nivel mundial.

library(readxl)
library(dplyr)
library(gt)
library(ggplot2)
library(scales)
library(tibble)

Datos <- read_excel(file.choose()) %>%
  filter(!is.na(`Status year`), `Status year` != "NA")

cat("Registros válidos:", nrow(Datos), "\n")
## Registros válidos: 8048
cat("Variables:", ncol(Datos), "\n")
## Variables: 23

2 Extraer Variable y Justificación de la Agrupación por Décadas

Se extrae la variable Status year (Año de Estado), de naturaleza cuantitativa discreta, ya que toma 22 valores enteros distintos entre 1989 y 2024. Trabajar con cada año de forma individual generaría una tabla de frecuencias con numerosas categorías de frecuencia muy baja (incluso de 1 o 2 registros), lo que:

  1. Dificulta la lectura e interpretación de la distribución.
  2. Viola el supuesto del test de Chi-cuadrado, que requiere una frecuencia esperada mínima (usualmente ≥5) por categoría para que la prueba sea estadísticamente válida.
  3. Diluye el patrón real de la variable, que es de naturaleza claramente temporal y acumulativa.

Por ello, se decide unir los años en décadas de calendario reales (1980-1989, 1990-1999, 2000-2009, 2010-2019, 2020-2029), reduciendo 22 categorías a solo 5 grupos interpretables y permitiendo aplicar un modelo de probabilidad sobre una escala temporal más manejable.

Datos <- Datos %>%
  mutate(
    StatusYear = as.integer(`Status year`),
    Decada = case_when(
      StatusYear >= 1980 & StatusYear <= 1989 ~ "Década 1 (1980-1989)",
      StatusYear >= 1990 & StatusYear <= 1999 ~ "Década 2 (1990-1999)",
      StatusYear >= 2000 & StatusYear <= 2009 ~ "Década 3 (2000-2009)",
      StatusYear >= 2010 & StatusYear <= 2019 ~ "Década 4 (2010-2019)",
      StatusYear >= 2020 & StatusYear <= 2029 ~ "Década 5 (2020-2029)",
      TRUE ~ NA_character_
    ),
    Decada_X = case_when(
      StatusYear >= 1980 & StatusYear <= 1989 ~ 1,
      StatusYear >= 1990 & StatusYear <= 1999 ~ 2,
      StatusYear >= 2000 & StatusYear <= 2009 ~ 3,
      StatusYear >= 2010 & StatusYear <= 2019 ~ 4,
      StatusYear >= 2020 & StatusYear <= 2029 ~ 5,
      TRUE ~ NA_integer_
    )
  )

cat("Categorías encontradas (años):", length(unique(Datos$StatusYear)), "\n")
## Categorías encontradas (años): 22
cat("Categorías encontradas (décadas):", length(unique(Datos$Decada)), "\n")
## Categorías encontradas (décadas): 5
cat("Total registros:", nrow(Datos), "\n")
## Total registros: 8048

3 Tabla de Distribución de Frecuencias por Décadas

Tabla <- as.data.frame(table(Datos$Decada))
colnames(Tabla) <- c("Decada", "ni")
Tabla <- Tabla %>% arrange(Tabla$Decada)

N <- sum(Tabla$ni)
Tabla$`hi (%)` <- round((Tabla$ni / N) * 100, 2)

fila_total <- tibble(
  Decada   = "TOTAL",
  ni       = sum(Tabla$ni),
  `hi (%)` = sum(Tabla$`hi (%)`)
)

tabla_Final <- bind_rows(Tabla, fila_total)

tabla_Final %>%
  gt() %>%
  tab_header(
    title    = md("**Tabla N°1 de Distribución de Frecuencias — Año de Estado por Décadas**"),
    subtitle = "Agrupación de Status Year en intervalos decenales de calendario"
  ) %>%
  tab_source_note(source_note = "Autor: Grupo 5") %>%
  cols_label(
    Decada   = "Década",
    ni       = "Frecuencia (ni)",
    `hi (%)` = "Porcentaje (hi%)"
  ) %>%
  cols_align(align = "center", columns = everything()) %>%
  fmt_number(columns = `hi (%)`, decimals = 2) %>%
  tab_style(
    style     = cell_fill(color = "#F5F5F5"),
    locations = cells_body(rows = nrow(Tabla) + 1)
  ) %>%
  tab_style(
    style     = cell_text(weight = "bold"),
    locations = cells_body(rows = nrow(Tabla) + 1)
  ) %>%
  tab_options(
    heading.title.font.size        = px(14),
    heading.subtitle.font.size     = px(11),
    column_labels.background.color = "#F0F0F0"
  )
Tabla N°1 de Distribución de Frecuencias — Año de Estado por Décadas
Agrupación de Status Year en intervalos decenales de calendario
Década Frecuencia (ni) Porcentaje (hi%)
Década 1 (1980-1989) 1 0.01
Década 2 (1990-1999) 1 0.01
Década 3 (2000-2009) 16 0.20
Década 4 (2010-2019) 1710 21.25
Década 5 (2020-2029) 6320 78.53
TOTAL 8048 100.00
Autor: Grupo 5

Se observa de inmediato la justificación de la agrupación: las Décadas 1 y 2 (1980-1989 y 1990-1999) registran apenas 1 unidad cada una, la Década 3 (2000-2009) solo 16, mientras que las Décadas 4 y 5 (2010-2019 y 2020-2029) concentran prácticamente la totalidad del dataset (más del 99% de los registros). Aun agrupando por décadas, la concentración reciente sigue siendo evidente — lo cual es información valiosa para el análisis y se mantendrá presente al interpretar el modelo de probabilidad.


4 Análisis Gráfico

4.1 Diagrama de Barras de Cantidad

Tabla_Grafica <- tabla_Final %>% filter(Decada != "TOTAL")

par(mar = c(9, 5, 5, 2))
barplot(Tabla_Grafica$ni,
        names.arg = Tabla_Grafica$Decada,
        main      = "",
        xlab      = "",
        ylab      = "Cantidad",
        col       = "#2E86C1",
        las       = 2,
        cex.names = 0.8,
        ylim      = c(0, max(Tabla_Grafica$ni) * 1.2))
mtext("Década del Año de Estado", side = 1, line = 7.5, cex = 0.9)
mtext("Gráfica N°1: Distribución de Cantidad de Yacimientos por Década de Estado",
      side = 3, line = 2, adj = 0.5, cex = 0.9, font = 2)

El diagrama de barras confirma una asimetría extrema hacia la derecha: la Década 5 (2020-2029) domina absolutamente la distribución, seguida por la Década 4 (2010-2019), mientras que las tres décadas anteriores son prácticamente inexistentes en el dataset. Esto sugiere que el GOGET refleja, sobre todo, un proceso reciente y acelerado de actualización de estatus operativo a nivel mundial.


5 Conjetura del Modelo (Poisson)

Dado que la variable representa el conteo de unidades cuyo estado fue actualizado dentro de un periodo decenal, se modela como un proceso de conteo de eventos discretos en el tiempo. Se aplica un Modelo de Poisson, codificando cada década como un valor entero secuencial (1 a 5) para estimar la tasa promedio (λ) de ocurrencia.

TDF_dec <- as.data.frame(table(Datos$Decada_X))
colnames(TDF_dec) <- c("X", "ni")
TDF_dec$X <- as.integer(as.character(TDF_dec$X))
TDF_dec <- TDF_dec %>% arrange(X)
TDF_dec$hi <- TDF_dec$ni / sum(TDF_dec$ni)

n_total_dec <- sum(TDF_dec$ni)
lambda_dec  <- sum(TDF_dec$X * TDF_dec$ni) / n_total_dec

P_Pois_dec <- dpois(TDF_dec$X, lambda = lambda_dec)
P_Pois_dec <- P_Pois_dec / sum(P_Pois_dec)

cat("Lambda estimado (media observada):", round(lambda_dec, 4), "\n")
## Lambda estimado (media observada): 4.7827
etiquetas_decada <- c("Década 1\n(1980-1989)", "Década 2\n(1990-1999)",
                       "Década 3\n(2000-2009)", "Década 4\n(2010-2019)",
                       "Década 5\n(2020-2029)")

par(mar = c(7, 5, 5, 2))
barplot(rbind(TDF_dec$hi, P_Pois_dec),
        beside      = TRUE,
        main        = "",
        ylab        = "Porcentaje (%)",
        names.arg   = etiquetas_decada,
        col         = c("#2E86C1", "#1A5276"),
        legend.text = c("Observado", "Esperado"),
        args.legend = list(x = "top", bty = "n"),
        las         = 1,
        cex.names   = 0.75,
        cex.main    = 0.8)
mtext("Década", side = 1, line = 5.5, cex = 0.9)
mtext("Gráfica N°2: Comparado de lo Observado frente a lo Esperado (Poisson)",
      side = 3, line = 2, adj = 0.5, cex = 0.85, font = 2)


6 Test de Pearson

Fo_dec <- TDF_dec$hi
Fe_dec <- P_Pois_dec

plot(Fo_dec, Fe_dec,
     main     = "",
     xlab     = "Frecuencia Observada",
     ylab     = "Frecuencia Esperada",
     pch      = 19,
     col      = "#2E86C1",
     cex.main = 0.8)
abline(lm(Fe_dec ~ Fo_dec), col = "red", lwd = 2)
mtext("Gráfica N°3: Correlación del Modelo (Poisson) — Año de Estado por Décadas",
      side = 3, line = 1, adj = 0.5, cex = 0.85, font = 2)

Correlacion_dec <- cor(Fo_dec, Fe_dec) * 100
cat("Correlación de Pearson (%):", round(Correlacion_dec, 2), "\n")
## Correlación de Pearson (%): 57.51

7 Test de Chi-cuadrado

x2_dec <- sum(((Fo_dec - Fe_dec)^2) / Fe_dec)
gl_dec <- length(Fo_dec) - 1
vc_dec <- qchisq(0.95, gl_dec)

cat("Chi-cuadrado calculado:", round(x2_dec, 4), "\n")
## Chi-cuadrado calculado: 1.4399
cat("Valor crítico (vc)    :", round(vc_dec, 4), "\n")
## Valor crítico (vc)    : 9.4877
cat("¿Se acepta el modelo? :", x2_dec < vc_dec, "\n")
## ¿Se acepta el modelo? : TRUE

Nota metodológica: aun agrupando por décadas, las categorías 1, 2 y 3 conservan frecuencias esperadas muy bajas bajo el modelo Poisson, ya que la concentración real de los datos en las décadas 4 y 5 es extrema. El resultado del test debe interpretarse considerando esta limitación: el valor de Chi-cuadrado puede estar dominado por la diferencia entre lo observado y esperado en las categorías de cola, más que por un desajuste generalizado del modelo.


8 Tabla Resumen del Test

tabla_resumen_dec <- data.frame(
  Variable  = "Año de Estado por Décadas",
  Modelo    = "Poisson",
  Pearson   = round(Correlacion_dec, 2),
  Chi2      = round(x2_dec, 4),
  Umbral    = round(vc_dec, 2),
  Resultado = x2_dec < vc_dec
)

tabla_resumen_dec %>%
  gt() %>%
  cols_label(
    Variable  = "Variable",
    Modelo    = "Modelo",
    Pearson   = "Test Pearson (%)",
    Chi2      = "Chi Cuadrado",
    Umbral    = "Umbral de Aceptación",
    Resultado = "Resultado"
  ) %>%
  tab_header(
    title = md("**Tabla N°2 Resumen del Test de Bondad al Modelo de Probabilidad**")
  ) %>%
  tab_source_note(source_note = "Autor: Grupo 5") %>%
  cols_align(align = "center", columns = everything()) %>%
  tab_options(
    heading.title.font.size        = px(14),
    column_labels.background.color = "#F0F0F0"
  )
Tabla N°2 Resumen del Test de Bondad al Modelo de Probabilidad
Variable Modelo Test Pearson (%) Chi Cuadrado Umbral de Aceptación Resultado
Año de Estado por Décadas Poisson 57.51 1.4399 9.49 TRUE
Autor: Grupo 5

9 Cálculo de Probabilidades

¿Cuál es la probabilidad de que una unidad seleccionada aleatoriamente del dataset tenga registrado su año de estado dentro de la Década 5 (2020-2029), la de mayor frecuencia observada?

prob_dec5 <- dpois(5, lambda = lambda_dec) / sum(dpois(TDF_dec$X, lambda = lambda_dec))

paste0("La probabilidad estimada para la Década 5 (2020-2029) es de: ",
       round(prob_dec5 * 100, 2), "%")
## [1] "La probabilidad estimada para la Década 5 (2020-2029) es de: 27.04%"

10 Conclusiones

La agrupación de la variable Status year en décadas de calendario reales permitió reducir 22 categorías anuales dispersas a solo 5 grupos interpretables, facilitando tanto la lectura de la distribución como el cumplimiento de los supuestos mínimos del test de Chi-cuadrado, que exige frecuencias esperadas suficientes por categoría. Esta decisión se tomó porque trabajar año por año generaba demasiadas categorías con frecuencia 1 o 2, lo cual distorsiona cualquier prueba de bondad de ajuste y dificulta la interpretación visual del fenómeno.

Aun así, los resultados confirman que la concentración temporal del dataset es tan marcada que ni siquiera la agrupación decenal logra equilibrar completamente las frecuencias: las Décadas 4 y 5 (2010-2019 y 2020-2029) contienen prácticamente la totalidad de los registros, mientras que las tres décadas anteriores son casi inexistentes. El modelo de Poisson, aplicado sobre la escala decenal codificada, captura razonablemente esta tendencia creciente en el tiempo, aunque el ajuste se ve afectado por la naturaleza extrema de la concentración reciente — un patrón coherente con el hecho de que el GOGET es un tracker que se actualiza y expande activamente en los últimos años, más que con un proceso homogéneo de ocurrencia a tasa constante a lo largo de las décadas.