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(`Unit type`), `Unit type` != "NA",
         !is.na(`Fuel type`), `Fuel type` != "NA")

cat("Registros válidos:", nrow(Datos), "\n")
## Registros válidos: 8334
cat("Variables:", ncol(Datos), "\n")
## Variables: 32
str(Datos)
## tibble [8,334 × 32] (S3: tbl_df/tbl/data.frame)
##  $ Unit ID                           : chr [1:8334] "OG0000001" "OG0000002" "OG0000006" "OG0000007" ...
##  $ Unit Name                         : chr [1:8334] "Matzen" "Abalone" "Aguilhada" "Agulha" ...
##  $ Unit name local script            : chr [1:8334] NA "Abalone" "Aguilhada" "Agulha" ...
##  $ Fuel type                         : chr [1:8334] "oil and gas" "oil and gas" "oil and gas" "oil and gas" ...
##  $ Unit type                         : chr [1:8334] "field" "field" "field" "field" ...
##  $ Country                           : chr [1:8334] "Austria" "Brazil" "Brazil" "Brazil" ...
##  $ Subnational unit (province, state): chr [1:8334] NA "Espírito Santo" "Sergipe" "Rio Grande do Norte" ...
##  $ Latitude                          : num [1:8334] 48.4 -21.4 -10.7 -4.9 -22.1 ...
##  $ Longitude                         : num [1:8334] 16.7 -39.6 -36.9 -36.3 -40 ...
##  $ Location accuracy                 : chr [1:8334] "approximate" "exact" "exact" "exact" ...
##  $ Status                            : chr [1:8334] "operating" "operating" "operating" "operating" ...
##  $ Status year                       : num [1:8334] 2023 2022 2022 2022 2022 ...
##  $ Discovery year                    : num [1:8334] 1949 2001 1966 1975 1984 ...
##  $ FID Year                          : chr [1:8334] NA NA NA NA ...
##  $ Production start year             : chr [1:8334] "1951" "2009" "1969" "1979" ...
##  $ Operator                          : chr [1:8334] "OMV" "Shell Brasil Petróleo Ltda." NA NA ...
##  $ Owner                             : chr [1:8334] "OMV (100%)" "Shell Brasil (50%);ONGC Campos (27%);Qatarenergy (23%)" "Petrobras (100%)" "Petrobras (100%)" ...
##  $ Parent                            : chr [1:8334] "OMV Aktiengesellschaft (100%)" "Shell plc (50%);Oil and Natural Gas Corporation (ONGC) (27%)" "Petróleo Brasileiro S.A. (100%)" "Petróleo Brasileiro S.A. (100%)" ...
##  $ Basin                             : chr [1:8334] NA NA NA NA ...
##  $ Concession / block                : chr [1:8334] NA NA NA NA ...
##  $ Project or complex                : chr [1:8334] "Matzen" NA NA NA ...
##  $ Government unit ID                : chr [1:8334] NA NA NA NA ...
##  $ Wiki URL                          : chr [1:8334] "https://www.gem.wiki/Matzen_Oil_and_Gas_Field_(Austria)" "https://www.gem.wiki/Abalone_Oil_and_Gas_Field_%28Esp%C3%ADrito_Santo%2C_Brazil%29" "https://www.gem.wiki/Aguilhada_Oil_and_Gas_Field_%28Sergipe%2C_Brazil%29" "https://www.gem.wiki/Agulha_Oil_and_Gas_Field_%28Rio_Grande_do_Norte%2C_Brazil%29" ...
##  $ Unit name2                        : logi [1:8334] NA NA NA NA NA NA ...
##  $ Production/reserves               : logi [1:8334] NA NA NA NA NA NA ...
##  $ Fuel description                  : logi [1:8334] NA NA NA NA NA NA ...
##  $ Reserves classification (original): logi [1:8334] NA NA NA NA NA NA ...
##  $ Quantity (original)               : logi [1:8334] NA NA NA NA NA NA ...
##  $ Units (original)                  : logi [1:8334] NA NA NA NA NA NA ...
##  $ Data year                         : logi [1:8334] NA NA NA NA NA NA ...
##  $ Quantity (converted)              : logi [1:8334] NA NA NA NA NA NA ...
##  $ Units (converted)                 : logi [1:8334] NA NA NA NA NA NA ...

2 Extraer Variable

Se realizó la extracción de la variable Unit type (Tipo de Unidad) del dataset GOGET. Esta variable clasifica cada registro según el tipo de estructura geológica o administrativa que representa: campo (field), activo (asset), yacimiento (pool), proyecto (project), bloque (block), complejo (complex), concesión (concession), área (area), fase (phase), cuenca (basin) y sub-cuenca (sub-basin). Es una variable cualitativa nominal con 11 categorías distintas.

tabla_UNIT <- Datos %>%
  select(TipoUnidad = `Unit type`)

# Correcciones de codificación si existieran
tabla_UNIT <- tabla_UNIT %>%
  mutate(TipoUnidad = trimws(TipoUnidad))

TDF_unidad <- table(tabla_UNIT$TipoUnidad)

cat("Categorías encontradas:", length(TDF_unidad), "\n")
## Categorías encontradas: 11
cat("Total registros:", sum(TDF_unidad), "\n")
## Total registros: 8334

3 Tabla de Distribución de Frecuencias

Se calculó la distribución de frecuencias absolutas (nᵢ) y relativas (hᵢ). Los resultados muestran que la categoría field (campo petrolero) predomina con la mayor participación, seguida de asset (activo), lo que evidencia una fuerte concentración del dataset en unidades operativas de extracción directa.

Tabla <- as.data.frame(TDF_unidad)
colnames(Tabla) <- c("TipoUnidad", "ni")
Tabla$TipoUnidad <- as.character(Tabla$TipoUnidad)
Tabla <- Tabla %>% arrange(desc(ni))

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

fila_total <- tibble(
  TipoUnidad = "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 Tipo de Unidad Petrolera**")
  ) %>%
  tab_source_note(source_note = "Autor: Grupo 5") %>%
  cols_label(
    TipoUnidad = "Tipo de Unidad",
    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 Tipo de Unidad Petrolera
Tipo de Unidad Frecuencia (ni) Porcentaje (hi%)
field 4336 52.03
asset 3124 37.49
pool 461 5.53
project 183 2.20
block 111 1.33
complex 73 0.88
concession 16 0.19
area 14 0.17
phase 11 0.13
basin 3 0.04
sub-basin 2 0.02
TOTAL 8334 100.01
Autor: Grupo 5

4 Análisis Gráfico

4.1 Diagrama de Barras de Cantidad

Mediante el diagrama de barras de cantidad, se identificó una distribución asimétrica con una dominancia clara de las categorías field y asset sobre las demás. Esta observación justifica la división del análisis en dos agrupaciones: Unidades Operativas (field, asset, pool) y Unidades Administrativas (project, block, complex, concession, area, phase, basin, sub-basin), para aplicar modelos de probabilidad que describan el comportamiento de cada segmento.

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

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


5 Agrupación 1 (Unidades Operativas)

Se mapean los tipos de unidades con mayor actividad extractiva directa: field, asset y pool. 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 field como nodo principal de extracción.

niveles_operativas <- c("field", "asset", "pool")

Datos_Operativas <- tabla_UNIT %>%
  filter(TipoUnidad %in% niveles_operativas)

Datos_Operativas$TipoUnidad <- factor(Datos_Operativas$TipoUnidad,
                                      levels = niveles_operativas,
                                      ordered = TRUE)

TDF_G1_Op <- as.data.frame(table(Datos_Operativas$TipoUnidad))
colnames(TDF_G1_Op) <- c("TipoUnidad", "ni")

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

TDF_G1_Op %>%
  select(TipoUnidad, X, ni, hi) %>%
  gt() %>%
  tab_header(
    title    = md("**Tabla N°2 de Distribución de Frecuencias del Tipo de Unidad — Mapeado**"),
    subtitle = "Segmento: Unidades Operativas (Extracción Directa)"
  ) %>%
  tab_source_note(source_note = "Autor: Grupo 5") %>%
  cols_label(
    TipoUnidad = "Tipo de Unidad",
    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 Tipo de Unidad — Mapeado
Segmento: Unidades Operativas (Extracción Directa)
Tipo de Unidad Valor Asignado Frecuencia (ni) Porcentaje (hi%)
field 0 4336 0.5474
asset 1 3124 0.3944
pool 2 461 0.0582
Autor: Grupo 5

5.1 Conjetura del Modelo (Geométrico)

Se seleccionan field, asset y pool para analizar el comportamiento de las unidades operativas líderes. Se aplica un Modelo Geométrico bajo la premisa de que la probabilidad de encontrar una unidad de alta capacidad disminuye conforme el mercado se vuelve más específico, concentrando la mayor frecuencia en field como el principal nodo de extracción global.

n_total_op    <- sum(TDF_G1_Op$ni)
media_obs_op  <- sum(TDF_G1_Op$X * TDF_G1_Op$ni) / n_total_op
prob_geom_op  <- 1 / (media_obs_op + 1)

P_Geom_Op <- dgeom(TDF_G1_Op$X, prob = prob_geom_op)
P_Geom_Op <- P_Geom_Op / sum(P_Geom_Op)

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

5.2 Test de Pearson

Fo_Op <- TDF_G1_Op$hi
Fe_Op <- P_Geom_Op

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

Correlacion_Op <- cor(Fo_Op, Fe_Op) * 100
cat("Correlación de Pearson (%):", round(Correlacion_Op, 2), "\n")
## Correlación de Pearson (%): 88.18

5.3 Test de Chi-cuadrado

x2_Op <- sum(((Fo_Op - Fe_Op)^2) / Fe_Op)
gl_Op <- length(Fo_Op) - 1
vc_Op <- qchisq(0.95, gl_Op)

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

5.4 Tabla Resumen del Test

tabla_resumen_Op <- data.frame(
  Variable  = "Unidades Operativas",
  Modelo    = "Geométrico",
  Pearson   = round(Correlacion_Op, 2),
  Chi2      = round(x2_Op, 4),
  Umbral    = round(vc_Op, 2),
  Resultado = x2_Op < vc_Op
)

tabla_resumen_Op %>%
  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
Unidades Operativas Geométrico 88.18 0.1465 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 unidades operativas sea específicamente del tipo field?

prob_field_geom <- dgeom(0, prob = prob_geom_op)
paste0("La probabilidad estimada para 'field' es de: ",
       round(prob_field_geom * 100, 2), "%")
## [1] "La probabilidad estimada para 'field' es de: 66.19%"

6 Agrupación 2 (Unidades Administrativas)

Se asignan valores numéricos a las categorías de menor frecuencia que representan estructuras de gestión y planificación: project, block, complex, concession, area, phase, basin y sub-basin. Se aplica un Modelo de Poisson, ideal para modelar eventos con baja tasa de ocurrencia en regiones con densidades variables.

niveles_admin <- c("project", "block", "complex",
                   "concession", "area", "phase", "basin", "sub-basin")

Datos_Admin <- tabla_UNIT %>%
  filter(TipoUnidad %in% niveles_admin)

TDF_G2_Adm <- as.data.frame(table(Datos_Admin$TipoUnidad))
colnames(TDF_G2_Adm) <- c("TipoUnidad", "ni")
TDF_G2_Adm <- TDF_G2_Adm %>% arrange(desc(ni))

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

TDF_G2_Adm %>%
  select(TipoUnidad, X, ni, hi) %>%
  gt() %>%
  tab_header(
    title    = md("**Tabla N°4 de Distribución de Frecuencias del Tipo de Unidad — Mapeado**"),
    subtitle = "Segmento: Unidades Administrativas"
  ) %>%
  tab_source_note(source_note = "Autor: Grupo 5") %>%
  cols_label(
    TipoUnidad = "Tipo de Unidad",
    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 Tipo de Unidad — Mapeado
Segmento: Unidades Administrativas
Tipo de Unidad Valor Asignado Frecuencia (ni) Porcentaje (hi%)
project 0 183 0.4431
block 1 111 0.2688
complex 2 73 0.1768
concession 3 16 0.0387
area 4 14 0.0339
phase 5 11 0.0266
basin 6 3 0.0073
sub-basin 7 2 0.0048
Autor: Grupo 5

6.1 Conjetura del Modelo (Poisson)

Esta agrupación comprende las unidades de planificación y administración del sector. Se propone un Modelo de Poisson para representar este segmento, ya que es el más robusto para modelar eventos independientes que ocurren con una tasa constante en un área geográfica. A diferencia de otros modelos, Poisson captura mejor la dispersión de unidades en contextos donde la infraestructura aún no es uniforme.

n_total_adm   <- sum(TDF_G2_Adm$ni)
lambda_adm    <- sum(TDF_G2_Adm$X * TDF_G2_Adm$ni) / n_total_adm

P_Pois_Adm <- dpois(TDF_G2_Adm$X, lambda = lambda_adm)
P_Pois_Adm <- P_Pois_Adm / sum(P_Pois_Adm)

par(mar = c(9, 5, 5, 2))
barplot(rbind(TDF_G2_Adm$hi, P_Pois_Adm),
        beside    = TRUE,
        main      = "",
        ylab      = "Porcentaje (%)",
        names.arg = TDF_G2_Adm$TipoUnidad,
        col       = c("#2E86C1", "#1A5276"),
        legend.text = c("Observado", "Esperado"),
        args.legend = list(x = "topright", bty = "n", cex = 0.7),
        las       = 2,
        cex.names = 0.75,
        cex.main  = 0.8)
mtext("Tipo de Unidad", 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_E <- TDF_G2_Adm$hi
Fe_E <- P_Pois_Adm

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

Correlacion_E <- cor(Fo_E, Fe_E) * 100
cat("Correlación de Pearson (%):", round(Correlacion_E, 2), "\n")
## Correlación de Pearson (%): 93.41

6.3 Test de Chi-cuadrado

x2_E <- sum(((Fo_E - Fe_E)^2) / Fe_E)
gl_E <- length(Fo_E) - 1
vc_E <- qchisq(0.95, gl_E)

cat("Chi-cuadrado calculado:", round(x2_E, 4), "\n")
## Chi-cuadrado calculado: 0.4494
cat("Valor crítico (vc)    :", round(vc_E, 4), "\n")
## Valor crítico (vc)    : 14.0671
cat("¿Se acepta el modelo? :", x2_E < vc_E, "\n")
## ¿Se acepta el modelo? : TRUE

6.4 Tabla Resumen del Test

tabla_resumen_E <- data.frame(
  Variable  = "Unidades Administrativas",
  Modelo    = "Poisson",
  Pearson   = round(Correlacion_E, 2),
  Chi2      = round(x2_E, 4),
  Umbral    = round(vc_E, 2),
  Resultado = x2_E < vc_E
)

tabla_resumen_E %>%
  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
Unidades Administrativas Poisson 93.41 0.4494 14.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 project (Valor 0) bajo la tasa de ocurrencia de Poisson?

prob_project_pois <- dpois(0, lambda = lambda_adm)
paste0("La probabilidad estimada para 'project' es de: ",
       round(prob_project_pois * 100, 2), "%")
## [1] "La probabilidad estimada para 'project' es de: 33.8%"

7 Conclusiones

El análisis probabilístico permitió modelar la distribución del tipo de unidad petrolera a nivel mundial mediante un modelo geométrico para las unidades operativas y un modelo de Poisson para las unidades administrativas. Los resultados muestran una clara dominancia de field y asset en el liderazgo operativo, mientras que en el segmento administrativo, project se posiciona como el tipo con mayor tasa de aparición de nuevas estructuras.

Las pruebas de bondad de ajuste, con coeficientes de Pearson del 88.18% y 93.41% respectivamente, confirman que ambos modelos representan adecuadamente los datos observados por tipo de unidad. Esto evidencia una descripción estadística precisa de la estructura operativa del sector petrolero global, validando la diferencia entre la concentración en unidades de extracción directa y la dispersión de estructuras administrativas.