1 Cargar librería

Se cargan las librerías necesarias para el análisis de la variable Unit Type del dataset Global Oil and Gas Extraction Tracker (GOGET).

library(readxl)
library(dplyr)
library(gt)
library(ggplot2)
library(scales)
library(forcats)
library(tidyr)

2 Cargar Datos

Se carga el dataset y se filtran los registros con valores válidos en la variable de interés.

datos <- read_excel("dataset_mundial_petro.xlsx") %>%
  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

3 Extrae la variable

Se extrae la variable Unit Type (Tipo de Unidad). Es una variable de escala nominal: sus categorías no tienen orden jerárquico intrínseco.

n <- nrow(datos)

cat("Variable analizada: Unit Type\n")
## Variable analizada: Unit Type
cat("Total de observaciones (n):", n, "\n")
## Total de observaciones (n): 8334
cat("Categorías presentes:", paste(unique(datos$`Unit type`), collapse = ", "), "\n")
## Categorías presentes: field, block, project, complex, concession, basin, sub-basin, area, pool, phase, asset

4 Conteo

Se calcula la frecuencia absoluta (nᵢ), la frecuencia relativa en proporción (hᵢ) y en porcentaje (hᵢ %) para cada categoría, ordenadas de mayor a menor.

tabla_freq <- datos %>%
  count(`Unit type`, name = "ni") %>%
  arrange(desc(ni)) %>%
 rename(TipoUnidad = `Unit type`) %>%
  mutate(TipoUnidad = recode(TipoUnidad,
    "field"      = "Campo",
    "asset"      = "Activo",
    "pool"       = "Yacimiento",
    "project"    = "Proyecto",
    "block"      = "Bloque",
    "complex"    = "Complejo",
    "concession" = "Concesión",
    "area"       = "Área",
    "phase"      = "Fase",
    "basin"      = "Cuenca",
    "sub-basin"  = "Subcuenca"
  )) %>%
  mutate(
    hi_prop = ni / n,
    hi_pct  = hi_prop * 100,
    i       = row_number()
  ) %>%
  select(i, TipoUnidad, ni, hi_pct, hi_prop)

k <- nrow(tabla_freq)

cat("Número de categorías (k):", k, "\n")
## Número de categorías (k): 11
cat("Categoría más frecuente :", tabla_freq$TipoUnidad[1],
    "—", tabla_freq$ni[1], "registros\n")
## Categoría más frecuente : Campo — 4336 registros
cat("Categoría menos frecuente:", tabla_freq$TipoUnidad[k],
    "—", tabla_freq$ni[k], "registro(s)\n")
## Categoría menos frecuente: Subcuenca — 2 registro(s)
cat("Verificación — Σnᵢ:", sum(tabla_freq$ni), "(debe ser", n, ")\n")
## Verificación — Σnᵢ: 8334 (debe ser 8334 )
cat("Verificación — Σhᵢ%:", round(sum(tabla_freq$hi_pct), 2), "(debe ser 100)\n")
## Verificación — Σhᵢ%: 100 (debe ser 100)

5 Tabla de Frecuencia

tabla_freq %>%
  gt() %>%
  tab_header(
    title    = md("**Tabla N. 1**"),
    subtitle = md("Distribución de frecuencias por tipo de unidad — yacimientos de petróleo y gas")
  ) %>%
  cols_label(
    i          = md("**N°**"),
    TipoUnidad = md("**Tipo de unidad**"),
    ni         = md("**nᵢ**"),
    hi_pct     = md("**(%)** "),
    hi_prop    = md("**(proporción)**")
  ) %>%
  tab_spanner(label = md("**hᵢ**"), columns = c(hi_pct, hi_prop)) %>%
  fmt_number(columns = ni,      decimals = 0, use_seps = TRUE) %>%
  fmt_number(columns = hi_pct,  decimals = 2) %>%
  fmt_number(columns = hi_prop, decimals = 4) %>%
  grand_summary_rows(
    columns = c(ni, hi_pct, hi_prop),
    fns = list(label = "Total", fn = "sum"),
    fmt = list(
      ~ fmt_number(., columns = ni,      decimals = 0, use_seps = TRUE),
      ~ fmt_number(., columns = hi_pct,  decimals = 2),
      ~ fmt_number(., columns = hi_prop, decimals = 4)
    )
  ) %>%
  tab_source_note("Autor: Grupo 5") %>%
  tab_options(
    table.width                       = pct(75),
    table.font.size                   = px(13),
    table.font.names                  = "Arial",
    heading.title.font.size           = px(15),
    heading.subtitle.font.size        = px(12),
    heading.align                     = "center",
    heading.background.color          = "#AAAAAA",
    column_labels.font.weight         = "bold",
    column_labels.background.color    = "#FFFFFF",
    column_labels.border.top.color    = "#AAAAAA",
    column_labels.border.bottom.color = "#AAAAAA",
    table.border.top.color            = "#AAAAAA",
    table.border.bottom.color         = "#AAAAAA"
  ) %>%
  tab_style(
    style     = cell_text(color = "white", weight = "bold"),
    locations = cells_title(groups = c("title", "subtitle"))
  ) %>%
  tab_style(
    style     = cell_text(weight = "bold"),
    locations = list(cells_column_labels(), cells_column_spanners(), cells_grand_summary())
  )
Tabla N. 1
Distribución de frecuencias por tipo de unidad — yacimientos de petróleo y gas
Tipo de unidad nᵢ
hᵢ
(%) (proporción)
1 Campo 4,336 52.03 0.5203
2 Activo 3,124 37.49 0.3749
3 Yacimiento 461 5.53 0.0553
4 Proyecto 183 2.20 0.0220
5 Bloque 111 1.33 0.0133
6 Complejo 73 0.88 0.0088
7 Concesión 16 0.19 0.0019
8 Área 14 0.17 0.0017
9 Fase 11 0.13 0.0013
10 Cuenca 3 0.04 0.0004
11 Subcuenca 2 0.02 0.0002
Total 8,334 100.00 1.0000
Autor: Grupo 5

6 Gráficas y Modelado Binomial Integral

unit_graf <- tabla_freq %>%
  mutate(TipoUnidad = fct_reorder(TipoUnidad, ni))

colores <- c(
  "Campo"      = "#AED6F1",
  "Activo"     = "#5DADE2",
  "Yacimiento" = "#2E86C1",
  "Proyecto"   = "#1A5276",
  "Bloque"     = "#154360",
  "Complejo"   = "#85C1E9",
  "Concesión"  = "#3498DB",
  "Área"       = "#21618C",
  "Fase"       = "#7FB3D3",
  "Cuenca"     = "#2471A3",
  "Subcuenca"  = "#1F618D"
)

tema_base <- theme_minimal(base_size = 12) +
  theme(
    legend.position    = "none",
    plot.title         = element_text(face = "bold", size = 13),
    plot.caption       = element_text(color = "#888888", size = 9, hjust = 0),
    axis.title         = element_text(face = "bold", size = 11),
    axis.text.x        = element_text(face = "bold", angle = 15, hjust = 1),
    panel.grid.major.x = element_blank(),
    panel.grid.major.y = element_line(color = "#EEEEEE"),
    panel.grid.minor   = element_blank(),
    plot.background    = element_rect(fill = "white", color = NA)
  )

pie_label <- paste0("n = ", format(n, big.mark = ","),
                    " | Fuente: Global Energy Monitor — GOGET 2023")

p_hat <- tabla_freq$hi_prop[1]   # proporción muestral de "field"
m     <- 20                       # ensayos del modelo Binomial

6.1 Distribución de categoría de causas

Diagrama de barras y diagrama circular que muestran la distribución real de los registros según el tipo de unidad.

# Diagrama de barras — Frecuencia Absoluta
ggplot(unit_graf, aes(x = TipoUnidad, y = ni, fill = TipoUnidad)) +
  geom_col(width = 0.55, color = "white") +
  geom_text(aes(label = format(ni, big.mark = ",")),
            vjust = -0.4, size = 3.5, fontface = "bold") +
  scale_fill_manual(values = colores) +
  scale_y_continuous(labels = label_comma(),
                     expand = expansion(mult = c(0, 0.12))) +
  labs(title   = "Gráfica N. 1: Distribución de yacimientos por tipo de unidad",
       x = "Tipo de unidad", y = "Frecuencia Absoluta (nᵢ)",
       caption = pie_label) +
  tema_base

6.2 Ajuste del Modelo Binomial

Se toma la categoría modal field como “éxito” (p̂ = proporción muestral) y se ajusta un modelo Binomial con m = 20 ensayos, modelando la probabilidad de obtener exactamente x unidades de tipo field.

x_vals     <- 0:(k-1)
prob_binom <- dbinom(x_vals, size = k-1, prob = p_hat)

df_binom <- data.frame(
  TipoUnidad    = tabla_freq$TipoUnidad,
  x_Index       = x_vals,
  Media         = round(p_hat, 4),
  Prob_Binomial = round(prob_binom, 4)
)

print(df_binom)
##    TipoUnidad x_Index  Media Prob_Binomial
## 1       Campo       0 0.5203        0.0006
## 2      Activo       1 0.5203        0.0070
## 3  Yacimiento       2 0.5203        0.0342
## 4    Proyecto       3 0.5203        0.0988
## 5      Bloque       4 0.5203        0.1875
## 6    Complejo       5 0.5203        0.2441
## 7   Concesión       6 0.5203        0.2206
## 8        Área       7 0.5203        0.1367
## 9        Fase       8 0.5203        0.0556
## 10     Cuenca       9 0.5203        0.0134
## 11  Subcuenca      10 0.5203        0.0015

6.3 Relación entre el modelo Binomial y la realidad

Se compara la proporción de field observada en el dataset con la esperada bajo el modelo Binomial, y se visualiza la función de distribución acumulada (FDA) teórica frente a la proporción empírica acumulada.

df_comparacion <- data.frame(
  TipoUnidad      = rep(tabla_freq$TipoUnidad, 2),
  Tipo            = rep(c("Modelo Binomial", "Realidad"), each = k),
  Probabilidad    = c(round(prob_binom, 4), round(tabla_freq$hi_prop, 4))
)

ggplot(df_comparacion, aes(x = TipoUnidad, y = Probabilidad, fill = Tipo)) +
  geom_col(position = "dodge", color = "white", width = 0.65) +
  scale_fill_manual(values = c("Modelo Binomial" = "#1A5276", "Realidad" = "#AED6F1")) +
  scale_y_continuous(expand = expansion(mult = c(0, 0.12))) +
  labs(title   = "Gráfica No 2: Relación entre el modelo binomial y la realidad",
       x       = "Tipo de Unidad",
       y       = "Probabilidad",
       fill    = NULL,
       caption = pie_label) +
  tema_base +
  theme(
    legend.position = "top",
    axis.text.x     = element_text(angle = 45, hjust = 1)
  )

7 Bondad de Ajuste - Test de Pearson y Chi cuadrado

Se contrasta si las categorías de Tipo de Unidad se distribuyen de forma uniforme en la población.

  • H0: Las categorías de tipo de unidad se distribuyen uniformemente (p1 = p2 = … = pk = 1/k)
  • H1: Al menos una categoría tiene una proporción distinta a 1/k
  • Nivel de significancia: alpha = 0.05
obs        <- tabla_freq$ni
prueba_chi <- chisq.test(obs, p = rep(1/k, k))

# Correlación de Pearson entre observado y esperado
cor_pearson <- cor(obs, prueba_chi$expected)

# Valor crítico
vc <- qchisq(0.95, df = k - 1)

# Estado del modelo
estado <- ifelse(prueba_chi$statistic < vc, "ESTADO DEL MODELO: APRUEBA", 
                                            "ESTADO DEL MODELO: RECHAZA")

data.frame(
  "Métrica de Evaluación" = c("Correlación de Pearson (%)",
                               "Chi-Cuadrado Calculado (X²)",
                               "Valor Crítico en Tabla (vc)",
                               "Resultado de Validación"),
  "Resultado Obtenido"    = c(paste0(round(cor_pearson * 100, 2), " %"),
                               round(prueba_chi$statistic, 4),
                               round(vc, 5),
                               estado),
  check.names = FALSE
) %>%
  gt() %>%
  tab_header(
    title    = md("**CUADRO N°2**"),
    subtitle = md("Indicadores de Ajuste Estadístico de la Prueba de Bondad")
  ) %>%
  tab_source_note("Autor: Grupo 5") %>%
  tab_style(
    style     = cell_fill(color = "#D5F5E3"),
    locations = cells_body(rows = 4)
  ) %>%
  tab_style(
    style     = cell_text(weight = "bold"),
    locations = cells_body(rows = 4)
  ) %>%
  tab_options(
    table.width                       = pct(75),
    table.font.size                   = px(13),
    table.font.names                  = "Arial",
    heading.align                     = "center",
    heading.title.font.size           = px(15),
    heading.subtitle.font.size        = px(12),
    heading.background.color          = "#AAAAAA",
    column_labels.font.weight         = "bold",
    column_labels.background.color    = "#CCCCCC",
    column_labels.border.top.color    = "#AAAAAA",
    column_labels.border.bottom.color = "#AAAAAA",
    table.border.top.color            = "#AAAAAA",
    table.border.bottom.color         = "#AAAAAA"
  ) %>%
  tab_style(
    style     = cell_text(color = "white", weight = "bold"),
    locations = cells_title(groups = c("title", "subtitle"))
  ) %>%
  tab_style(
    style     = cell_text(weight = "bold"),
    locations = cells_column_labels()
  )
CUADRO N°2
Indicadores de Ajuste Estadístico de la Prueba de Bondad
Métrica de Evaluación Resultado Obtenido
Correlación de Pearson (%) NA %
Chi-Cuadrado Calculado (X²) 29711.3201
Valor Crítico en Tabla (vc) 18.30704
Resultado de Validación ESTADO DEL MODELO: RECHAZA
Autor: Grupo 5

8 Conclusiones