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), Status != "NA")

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

2 Extraer Variable

Se realizó la extracción de la variable Status (Estado de la Unidad) del dataset GOGET. Esta variable clasifica cada registro según su situación operativa actual: en operación (operating), cerrado temporalmente (shut in), descubierto (discovered), en desarrollo (in development), descomisionado (decommissioned), abandonado (abandoned), almacenamiento subterráneo de gas (UGS), cancelado (cancelled) y en exploración (exploration). Es una variable cualitativa nominal con 9 categorías distintas.

tabla_STATUS <- Datos %>%
  select(Status) %>%
  mutate(Status = trimws(Status))

TDF_status <- table(tabla_STATUS$Status)

cat("Categorías encontradas:", length(TDF_status), "\n")
## Categorías encontradas: 9
cat("Total registros:", sum(TDF_status), "\n")
## Total registros: 8068

3 Tabla de Distribución de Frecuencias

Tabla <- as.data.frame(TDF_status)
colnames(Tabla) <- c("Status", "ni")
Tabla$Status <- as.character(Tabla$Status)
orden_cronologico <- c(
  "exploration",
  "discovered",
  "in development",
  "operating",
  "shut in",
  "UGS",
  "decommissioned",
  "abandoned",
  "cancelled"
)

Tabla$Status <- factor(
  Tabla$Status,
  levels = orden_cronologico,
  ordered = TRUE
)

Tabla <- Tabla %>%
  arrange(Status)

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

fila_total <- tibble(
  Status   = "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 por Estado de la Unidad**")
  ) %>%
  tab_source_note(source_note = "Autor: Grupo 5") %>%
  cols_label(
    Status   = "Estado",
    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),
    column_labels.background.color = "#F0F0F0"
  )
Tabla N°1 de Distribución de Frecuencias por Estado de la Unidad
Estado Frecuencia (ni) Porcentaje (hi%)
exploration 1 0.01
discovered 396 4.91
in development 233 2.89
operating 6351 78.72
shut in 990 12.27
UGS 11 0.14
decommissioned 71 0.88
abandoned 13 0.16
cancelled 2 0.02
TOTAL 8068 100.00
Autor: Grupo 5

4 Análisis Gráfico

4.1 Diagrama de Barras de Cantidad

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

par(mar = c(9, 5, 5, 2))
barplot(Tabla_Grafica$ni,
        names.arg = Tabla_Grafica$Status,
        main      = "",
        xlab      = "",
        ylab      = "Cantidad",
        col       = "#2E86C1",
        las       = 2,
        cex.names = 0.85,
        ylim      = c(0, max(Tabla_Grafica$ni) * 1.2))
mtext("Estado de la Unidad", side = 1, line = 7, cex = 0.9)
mtext("Gráfica N°1: Distribución de Cantidad de Yacimientos por Estado",
      side = 3, line = 2, adj = 0.5, cex = 0.9, font = 2)

Mediante el diagrama de barras de cantidad, se identificó una distribución sumamente asimétrica con una dominancia abrumadora de la categoría operating, seguida a distancia por shut in y discovered. Esta observación justifica la división del análisis en dos agrupaciones: Estados Activos (operating, shut in, discovered), que concentran la actividad sustancial del sector, y Estados de Transición/Cierre (in development, decommissioned, abandoned, UGS, cancelled, exploration), para aplicar modelos de probabilidad que describan el comportamiento de cada segmento.


5 Agrupación 1 (Estados Activos)

Se mapean los estados con mayor representación operativa directa: operating, shut in y discovered. Se aplica un Modelo Geométrico bajo la premisa de que la probabilidad de encontrar una unidad de alta frecuencia disminuye conforme se avanza en la secuencia, concentrando la mayor frecuencia en operating como nodo principal del estado operativo mundial.

niveles_activos <- c("operating", "shut in", "discovered")

Datos_Activos <- tabla_STATUS %>%
  filter(Status %in% niveles_activos)

Datos_Activos$Status <- factor(Datos_Activos$Status,
                                levels = niveles_activos,
                                ordered = TRUE)

TDF_G1_St <- as.data.frame(table(Datos_Activos$Status))
colnames(TDF_G1_St) <- c("Status", "ni")

TDF_G1_St$X  <- 0:(nrow(TDF_G1_St) - 1)
TDF_G1_St$hi <- TDF_G1_St$ni / sum(TDF_G1_St$ni)

TDF_G1_St %>%
  select(Status, X, ni, hi) %>%
  gt() %>%
  tab_header(
    title    = md("**Tabla N°2 de Distribución de Frecuencias del Estado — Mapeado**"),
    subtitle = "Segmento: Estados Activos (Operación Directa)"
  ) %>%
  tab_source_note(source_note = "Autor: Grupo 5") %>%
  cols_label(
    Status = "Estado",
    X      = "Valor Asignado",
    ni     = "Frecuencia (ni)",
    hi     = "Porcentaje (hi%)"
  ) %>%
  cols_align(align = "center", columns = everything()) %>%
  fmt_number(columns = hi, decimals = 4) %>%
  tab_options(
    heading.title.font.size        = px(14),
    column_labels.background.color = "#F0F0F0"
  )
Tabla N°2 de Distribución de Frecuencias del Estado — Mapeado
Segmento: Estados Activos (Operación Directa)
Estado Valor Asignado Frecuencia (ni) Porcentaje (hi%)
operating 0 6351 0.8209
shut in 1 990 0.1280
discovered 2 396 0.0512
Autor: Grupo 5

5.1 Conjetura del Modelo (Geométrico)

n_total_act    <- sum(TDF_G1_St$ni)
media_obs_act  <- sum(TDF_G1_St$X * TDF_G1_St$ni) / n_total_act
prob_geom_act  <- 1 / (media_obs_act + 1)

P_Geom_St <- dgeom(TDF_G1_St$X, prob = prob_geom_act)
P_Geom_St <- P_Geom_St / sum(P_Geom_St)

par(mar = c(8, 5, 5, 2))
barplot(rbind(TDF_G1_St$hi, P_Geom_St),
        beside      = TRUE,
        main        = "",
        ylab        = "Porcentaje (%)",
        names.arg   = TDF_G1_St$Status,
        col         = c("#2E86C1", "#1A5276"),
        legend.text = c("Observado", "Esperado"),
        args.legend = list(x = "topright", bty = "n"),
        las         = 2,
        cex.names   = 0.85,
        cex.main    = 0.8)
mtext("Estado", side = 1, line = 6, cex = 0.9)
mtext("Gráfica N°2: Comparado de lo Observado frente a lo Esperado (Estados Activos)",
      side = 3, line = 2, adj = 0.5, cex = 0.85, font = 2)

5.2 Test de Pearson

Fo_Act <- TDF_G1_St$hi
Fe_Act <- P_Geom_St

plot(Fo_Act, Fe_Act,
     main     = "",
     xlab     = "Frecuencia Observada",
     ylab     = "Frecuencia Esperada",
     pch      = 19,
     col      = "#2E86C1",
     cex.main = 0.8)
abline(lm(Fe_Act ~ Fo_Act), col = "red", lwd = 2)
mtext("Gráfica N°3: Correlación del Modelo Observado y Esperado — Estados Activos",
      side = 3, line = 1, adj = 0.5, cex = 0.8, font = 2)

Correlacion_Act <- cor(Fo_Act, Fe_Act) * 100
cat("Correlación de Pearson (%):", round(Correlacion_Act, 2), "\n")
## Correlación de Pearson (%): 99.84

5.3 Test de Chi-cuadrado

x2_Act <- sum(((Fo_Act - Fe_Act)^2) / Fe_Act)
gl_Act <- length(Fo_Act) - 1
vc_Act <- qchisq(0.95, gl_Act)

cat("Chi-cuadrado calculado:", round(x2_Act, 4), "\n")
## Chi-cuadrado calculado: 0.0218
cat("Valor crítico (vc)    :", round(vc_Act, 4), "\n")
## Valor crítico (vc)    : 5.9915
cat("¿Se acepta el modelo? :", x2_Act < vc_Act, "\n")
## ¿Se acepta el modelo? : TRUE

5.4 Tabla Resumen del Test

tabla_resumen_Act <- data.frame(
  Variable  = "Estados Activos",
  Modelo    = "Geométrico",
  Pearson   = round(Correlacion_Act, 2),
  Chi2      = round(x2_Act, 4),
  Umbral    = round(vc_Act, 2),
  Resultado = x2_Act < vc_Act
)

tabla_resumen_Act %>%
  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°3 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°3 Resumen del Test de Bondad al Modelo de Probabilidad
Variable Modelo Test Pearson (%) Chi Cuadrado Umbral de Aceptación Resultado
Estados Activos Geométrico 99.84 0.0218 5.99 TRUE
Autor: Grupo 5

5.5 Cálculo de Probabilidades

¿Cuál es la probabilidad de que una unidad seleccionada aleatoriamente dentro del bloque de Estados Activos sea específicamente del tipo operating?

prob_operating_geom <- dgeom(0, prob = prob_geom_act)
paste0("La probabilidad estimada para 'operating' es de: ",
       round(prob_operating_geom * 100, 2), "%")
## [1] "La probabilidad estimada para 'operating' es de: 81.28%"

6 Agrupación 2 (Estados de Transición y Cierre)

Se asignan valores numéricos a las categorías de menor frecuencia que representan situaciones de transición, planificación o cierre de las unidades: in development, decommissioned, abandoned, UGS, cancelled y exploration. Se aplica un Modelo de Poisson, ideal para modelar eventos con baja tasa de ocurrencia en un contexto donde los estados de cierre o transición son comparativamente raros frente a la operación activa.

niveles_transicion <- c("in development", "decommissioned", "abandoned",
                         "UGS", "cancelled", "exploration")

Datos_Transicion <- tabla_STATUS %>%
  filter(Status %in% niveles_transicion)

TDF_G2_St <- as.data.frame(table(Datos_Transicion$Status))
colnames(TDF_G2_St) <- c("Status", "ni")
TDF_G2_St <- TDF_G2_St %>% arrange(desc(ni))

TDF_G2_St$X  <- 0:(nrow(TDF_G2_St) - 1)
TDF_G2_St$hi <- TDF_G2_St$ni / sum(TDF_G2_St$ni)

TDF_G2_St %>%
  select(Status, X, ni, hi) %>%
  gt() %>%
  tab_header(
    title    = md("**Tabla N°4 de Distribución de Frecuencias del Estado — Mapeado**"),
    subtitle = "Segmento: Estados de Transición y Cierre"
  ) %>%
  tab_source_note(source_note = "Autor: Grupo 5") %>%
  cols_label(
    Status = "Estado",
    X      = "Valor Asignado",
    ni     = "Frecuencia (ni)",
    hi     = "Porcentaje (hi%)"
  ) %>%
  cols_align(align = "center", columns = everything()) %>%
  fmt_number(columns = hi, decimals = 4) %>%
  tab_options(
    heading.title.font.size        = px(16),
    heading.subtitle.font.size     = px(12),
    column_labels.background.color = "#F0F0F0"
  )
Tabla N°4 de Distribución de Frecuencias del Estado — Mapeado
Segmento: Estados de Transición y Cierre
Estado Valor Asignado Frecuencia (ni) Porcentaje (hi%)
in development 0 233 0.7039
decommissioned 1 71 0.2145
abandoned 2 13 0.0393
UGS 3 11 0.0332
cancelled 4 2 0.0060
exploration 5 1 0.0030
Autor: Grupo 5

6.1 Conjetura del Modelo (Poisson)

n_total_tra   <- sum(TDF_G2_St$ni)
lambda_tra    <- sum(TDF_G2_St$X * TDF_G2_St$ni) / n_total_tra

P_Pois_St <- dpois(TDF_G2_St$X, lambda = lambda_tra)
P_Pois_St <- P_Pois_St / sum(P_Pois_St)

par(mar = c(9, 5, 5, 2))
barplot(rbind(TDF_G2_St$hi, P_Pois_St),
        beside      = TRUE,
        main        = "",
        ylab        = "Porcentaje (%)",
        names.arg   = TDF_G2_St$Status,
        col         = c("#2E86C1", "#1A5276"),
        legend.text = c("Observado", "Esperado"),
        args.legend = list(x = "topright", bty = "n"),
        las         = 2,
        cex.names   = 0.75,
        cex.main    = 0.8)
mtext("Estado", side = 1, line = 7.5, cex = 0.9)
mtext("Gráfica N°4: Comparado de lo Observado frente a lo Esperado (Poisson)",
      side = 3, line = 2, adj = 0.5, cex = 0.85, font = 2)

6.2 Test de Pearson

Fo_Tra <- TDF_G2_St$hi
Fe_Tra <- P_Pois_St

plot(Fo_Tra, Fe_Tra,
     main     = "",
     xlab     = "Frecuencia Observada",
     ylab     = "Frecuencia Esperada",
     pch      = 19,
     col      = "#1B4F72",
     cex.main = 0.8)
abline(lm(Fe_Tra ~ Fo_Tra), col = "red", lwd = 2)
mtext("Gráfica N°5: Correlación del Modelo (Poisson) en Estados de Transición",
      side = 3, line = 1, adj = 0.5, cex = 0.8, font = 2)

Correlacion_Tra <- cor(Fo_Tra, Fe_Tra) * 100
cat("Correlación de Pearson (%):", round(Correlacion_Tra, 2), "\n")
## Correlación de Pearson (%): 98.98

6.3 Test de Chi-cuadrado

x2_Tra <- sum(((Fo_Tra - Fe_Tra)^2) / Fe_Tra)
gl_Tra <- length(Fo_Tra) - 1
vc_Tra <- qchisq(0.95, gl_Tra)

cat("Chi-cuadrado calculado:", round(x2_Tra, 4), "\n")
## Chi-cuadrado calculado: 0.2302
cat("Valor crítico (vc)    :", round(vc_Tra, 4), "\n")
## Valor crítico (vc)    : 11.0705
cat("¿Se acepta el modelo? :", x2_Tra < vc_Tra, "\n")
## ¿Se acepta el modelo? : TRUE

6.4 Tabla Resumen del Test

tabla_resumen_Tra <- data.frame(
  Variable  = "Estados de Transición y Cierre",
  Modelo    = "Poisson",
  Pearson   = round(Correlacion_Tra, 2),
  Chi2      = round(x2_Tra, 4),
  Umbral    = round(vc_Tra, 2),
  Resultado = x2_Tra < vc_Tra
)

tabla_resumen_Tra %>%
  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°5 Resumen del Test de Bondad (Modelo Poisson)**")
  ) %>%
  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°5 Resumen del Test de Bondad (Modelo Poisson)
Variable Modelo Test Pearson (%) Chi Cuadrado Umbral de Aceptación Resultado
Estados de Transición y Cierre Poisson 98.98 0.2302 11.07 TRUE
Autor: Grupo 5

6.5 Cálculo de Probabilidades

¿Cuál es la probabilidad de que una nueva unidad registrada se localice específicamente en la categoría in development (Valor 0) bajo la tasa de ocurrencia de Poisson?

prob_indev_pois <- dpois(0, lambda = lambda_tra)
paste0("La probabilidad estimada para 'in development' es de: ",
       round(prob_indev_pois * 100, 2), "%")
## [1] "La probabilidad estimada para 'in development' es de: 64.92%"

7 Conclusiones

El análisis probabilístico permitió modelar la distribución del estado operativo de las unidades de extracción a nivel mundial mediante un modelo geométrico para los Estados Activos (operating, shut in, discovered) y un modelo de Poisson para los Estados de Transición y Cierre (in development, decommissioned, abandoned, UGS, cancelled, exploration). Los resultados muestran una clara dominancia de operating en el segmento activo, reflejando que casi 4 de cada 5 unidades del dataset se encuentran actualmente en producción, mientras que en el segmento de transición, in development se posiciona como el estado con mayor frecuencia, evidenciando que la mayoría de los proyectos no operativos están en fase de desarrollo más que en cierre definitivo.

Las pruebas de bondad de ajuste confirman, con distinto grado de precisión, que ambos modelos representan razonablemente los datos observados por estado de la unidad. Esto evidencia una descripción estadística coherente de la estructura operativa del sector petrolero global, validando la diferencia entre la concentración en estados de operación activa y la dispersión, mucho menor en volumen, de los estados de transición o cierre del ciclo de vida de las unidades de extracción.