1. Configuración y Carga de Datos

En esta sección se cargan las librerías necesarias y se importa 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(forcats)
datos <- read_excel("dataset_mundial_petro.xlsx")
cat("Número de registros:", nrow(datos), "\n")
## Número de registros: 8334
cat("Número de variables:", ncol(datos), "\n")
## Número de variables: 23

2. Extracción y Limpieza de la Variable

Se extrae la variable Status del dataset y se realiza la limpieza correspondiente: traducción de categorías al español, eliminación de valores nulos y ordenamiento según el ciclo de vida lógico de un yacimiento.

n <- nrow(datos)

# Orden cronológico del ciclo de vida del yacimiento
orden_logico <- c("exploration", "discovered", "in development",
                  "operating", "shut in", "UGS",
                  "decommissioned", "abandoned", "cancelled")

orden_esp <- c("En exploración", "Descubierto", "En desarrollo",
               "Operativo", "Cerrado", "Almacenamiento subterráneo",
               "Desmantelado", "Abandonado", "Cancelado")

# Extraer y limpiar
Variable <- datos$Status
Variable <- Variable[!is.na(Variable)]

cat("Registros con dato:", length(Variable), "\n")
## Registros con dato: 8068
cat("Registros sin dato (NA):", n - length(Variable), "\n")
## Registros sin dato (NA): 266
# Recodificar al español
Variable_esp <- recode(Variable,
  "exploration"    = "En exploración",
  "discovered"     = "Descubierto",
  "in development" = "En desarrollo",
  "operating"      = "Operativo",
  "shut in"        = "Cerrado",
  "UGS"            = "Almacenamiento subterráneo",
  "decommissioned" = "Desmantelado",
  "abandoned"      = "Abandonado",
  "cancelled"      = "Cancelado"
)

# Aplicar orden cronológico
Variable_esp <- factor(Variable_esp, levels = orden_esp, ordered = TRUE)

3. Identificación de la Variable

La variable Status es de tipo cualitativa ordinal, ya que sus categorías representan etapas del ciclo de vida de un yacimiento con un orden lógico natural: desde la exploración inicial hasta el abandono o cancelación del proyecto.

cat("Variable: Status\n")
## Variable: Status
cat("Tipo: Cualitativa Ordinal\n")
## Tipo: Cualitativa Ordinal
cat("Categorías:", nlevels(Variable_esp), "\n")
## Categorías: 9
cat("Orden lógico:\n")
## Orden lógico:
for (i in seq_along(orden_esp)) {
  cat(" ", i, ".", orden_esp[i], "\n")
}
##   1 . En exploración 
##   2 . Descubierto 
##   3 . En desarrollo 
##   4 . Operativo 
##   5 . Cerrado 
##   6 . Almacenamiento subterráneo 
##   7 . Desmantelado 
##   8 . Abandonado 
##   9 . Cancelado

4. Tabla de Distribución de Frecuencias (TDF)

# Construir TDF en orden cronológico
conteo <- as.data.frame(table(Variable_esp)) %>%
  rename(Estado = Variable_esp, ni = Freq) %>%
  mutate(
    Estado  = as.character(Estado),
    ni      = as.numeric(ni),
    hi_prop = round(ni / sum(ni), 3),
    hi_pct  = round(ni / sum(ni) * 100, 2)
  )

# Fila total
fila_total <- tibble(
  Estado  = "TOTAL",
  ni      = sum(conteo$ni),
  hi_prop = sum(conteo$hi_prop),
  hi_pct  = sum(conteo$hi_pct)
)

tdf_final <- bind_rows(conteo, fila_total)

tdf_final %>%
  gt() %>%
  tab_header(
    title    = md("**Tabla N° 1**"),
    subtitle = md("Distribución de yacimientos según estado operativo")
  ) %>%
  cols_label(
    Estado  = "Estado Operativo",
    ni      = "ni",
    hi_prop = "(proporción)",
    hi_pct  = "(%)"
  ) %>%
  tab_spanner(
    label   = md("**hi**"),
    columns = c(hi_prop, hi_pct)
  ) %>%
  fmt_number(columns = hi_prop, decimals = 3) %>%
  fmt_number(columns = hi_pct,  decimals = 2) %>%
  fmt_integer(columns = ni) %>%
  tab_source_note(source_note = "Autor: Grupo 5") %>%
  cols_align(align = "center", columns = everything()) %>%
  tab_style(
    style     = list(cell_text(weight = "bold"),
                     cell_borders(sides = "top", color = "black", weight = px(2))),
    locations = cells_body(rows = nrow(tdf_final))
  ) %>%
  tab_options(
    table.border.top.color            = "black",
    table.border.bottom.color         = "black",
    table.border.top.style            = "solid",
    table.border.bottom.style         = "solid",
    column_labels.font.weight         = "bold",
    column_labels.border.top.color    = "black",
    column_labels.border.bottom.color = "black",
    column_labels.border.bottom.width = px(2),
    heading.border.bottom.color       = "black",
    heading.border.bottom.width       = px(2),
    table_body.hlines.color           = "grey",
    table_body.border.bottom.color    = "black"
  )
Tabla N° 1
Distribución de yacimientos según estado operativo
Estado Operativo ni
hi
(proporción) (%)
En exploración 1 0.000 0.01
Descubierto 396 0.049 4.91
En desarrollo 233 0.029 2.89
Operativo 6,351 0.787 78.72
Cerrado 990 0.123 12.27
Almacenamiento subterráneo 11 0.001 0.14
Desmantelado 71 0.009 0.88
Abandonado 13 0.002 0.16
Cancelado 2 0.000 0.02
TOTAL 8,068 1.000 100.00
Autor: Grupo 5

5. Representación Gráfica

5.1 Gráfica N°1 — Diagrama de Barras (Frecuencia Absoluta)

ggplot(conteo_graf, aes(x = Estado, y = ni, fill = Estado)) +
  geom_col(width = 0.65, color = "white", linewidth = 0.3) +
  geom_text(
    aes(label = format(ni, big.mark = ",")),
    vjust = -0.4, size = 3.2, color = "#222222", fontface = "bold"
  ) +
  scale_fill_manual(values = colores) +
  scale_y_continuous(
    labels = label_comma(),
    expand = expansion(mult = c(0, 0.2))
  ) +
  labs(
    title   = "Gráfica N°1: Distribución de yacimientos por Estado Operativo",
    x       = "Estado Operativo",
    y       = "Frecuencia Absoluta (ni)",
    caption = paste0("n = ", format(n, big.mark = ","),
                     " | Fuente: Global Energy Monitor — GOGET")
  ) +
  theme_minimal(base_size = 12) +
  theme(
    legend.position    = "none",
    plot.title         = element_text(face = "bold", color = "#222222", size = 12),
    axis.title         = element_text(face = "bold", color = "#333333"),
    axis.text.x        = element_text(color = "#333333", angle = 30, hjust = 1),
    axis.text.y        = element_text(color = "#333333"),
    panel.grid.major.x = element_blank(),
    panel.grid.major.y = element_line(color = "#EEEEEE"),
    plot.background    = element_rect(fill = "white", color = NA),
    panel.background   = element_rect(fill = "white", color = NA)
  )

5.2 Gráfica N°2 — Diagrama de Barras (Porcentaje)

ggplot(conteo_graf, aes(x = Estado, y = hi_pct, fill = Estado)) +
  geom_col(width = 0.65, color = "white", linewidth = 0.3) +
  geom_text(
    aes(label = paste0(hi_pct, "%")),
    vjust = -0.4, size = 3.2, color = "#222222", fontface = "bold"
  ) +
  scale_fill_manual(values = colores) +
  scale_y_continuous(
    labels = function(x) paste0(x, "%"),
    expand = expansion(mult = c(0, 0.2))
  ) +
  labs(
    title   = "Gráfica N°2: Distribución porcentual por Estado Operativo",
    x       = "Estado Operativo",
    y       = "Frecuencia Relativa (%)",
    caption = paste0("n = ", format(n, big.mark = ","),
                     " | Fuente: Global Energy Monitor — GOGET")
  ) +
  theme_minimal(base_size = 12) +
  theme(
    legend.position    = "none",
    plot.title         = element_text(face = "bold", color = "#222222", size = 12),
    axis.title         = element_text(face = "bold", color = "#333333"),
    axis.text.x        = element_text(color = "#333333", angle = 30, hjust = 1),
    axis.text.y        = element_text(color = "#333333"),
    panel.grid.major.x = element_blank(),
    panel.grid.major.y = element_line(color = "#EEEEEE"),
    plot.background    = element_rect(fill = "white", color = NA),
    panel.background   = element_rect(fill = "white", color = NA)
  )

5.3 Gráfica N°3 — Diagrama Circular Estructurado

datos_pie <- conteo_graf %>%
  arrange(desc(ni)) %>%
  mutate(
    Estado    = fct_reorder(Estado, hi_pct),
    # Solo mostrar etiqueta si el sector es suficientemente grande
    etiqueta  = ifelse(hi_pct >= 2, paste0(round(hi_pct, 1), "%"), "")
  )

# Paleta que va de oscuro (mayor valor) a claro (menor valor)
n_cats <- nrow(datos_pie)
paleta_pie <- colorRampPalette(c("#AED6F1", "#1A5276"))(n_cats)
names(paleta_pie) <- levels(datos_pie$Estado)

ggplot(datos_pie, aes(x = "", y = hi_pct, fill = Estado)) +
  geom_col(width = 1, color = "white", linewidth = 0.6) +
  geom_text(
    aes(label = etiqueta),
    position  = position_stack(vjust = 0.5),
    size      = 3.5, color = "white", fontface = "bold"
  ) +
  coord_polar(theta = "y", start = 0) +
  scale_fill_manual(values = paleta_pie) +
  labs(
    title   = "Gráfica N°3: Distribución Porcentual por Estado Operativo",
    fill    = "Estado Operativo",
    caption = paste0("n = ", format(n, big.mark = ","),
                     " | Fuente: Global Energy Monitor — GOGET")
  ) +
  theme_void(base_size = 12) +
  theme(
    plot.title      = element_text(face = "bold", color = "#222222",
                                   size = 12, hjust = 0.5),
    plot.caption    = element_text(color = "#888888", size = 9),
    legend.position = "right",
    legend.title    = element_text(face = "bold", color = "#222222"),
    legend.text     = element_text(size = 8, color = "#333333"),
    plot.background = element_rect(fill = "white", color = NA)
  )


6. Tabla de Indicadores

Para variables cualitativas únicamente se calcula la Moda, ya que la media, mediana y demás indicadores numéricos no aplican sobre categorías.

moda <- conteo$Estado[which.max(conteo$ni)]

tabla_ind <- data.frame(
  "Variable"        = "Status",
  "Escala"          = "Ordinal",
  "Rango"           = "Ciclo de vida del yacimiento",
  "Media (X)"       = "-",
  "Mediana (Me)"    = "-",
  "Moda (Mo)"       = moda,
  "Varianza (V)"    = "-",
  "Desv. Est. (Sd)" = "-",
  "C.V. (%)"        = "-",
  "Asimetría (As)"  = "-",
  "Curtosis (K)"    = "-",
  check.names = FALSE
)

tabla_ind %>%
  gt() %>%
  tab_header(
    title    = md("**Tabla N°2: Indicadores Estadísticos**"),
    subtitle = md("Variable: Estado Operativo (Status)")
  ) %>%
  tab_source_note(source_note = "Autor: Grupo 5") %>%
  cols_align(align = "center", columns = everything()) %>%
  tab_options(
    table.border.top.color            = "black",
    table.border.bottom.color         = "black",
    table.border.top.style            = "solid",
    table.border.bottom.style         = "solid",
    column_labels.font.weight         = "bold",
    column_labels.border.top.color    = "black",
    column_labels.border.bottom.color = "black",
    column_labels.border.bottom.width = px(2),
    heading.border.bottom.color       = "black",
    heading.border.bottom.width       = px(2),
    table_body.hlines.color           = "grey",
    table_body.border.bottom.color    = "black"
  )
Tabla N°2: Indicadores Estadísticos
Variable: Estado Operativo (Status)
Variable Escala Rango Media (X) Mediana (Me) Moda (Mo) Varianza (V) Desv. Est. (Sd) C.V. (%) Asimetría (As) Curtosis (K)
Status Ordinal Ciclo de vida del yacimiento - - Operativo - - - - -
Autor: Grupo 5

7. Conclusión

La variable Estado Operativo (Status) de los yacimientos de petróleo y gas presenta una distribución altamente concentrada en la categoría Operativo, que representa el 78.72% del total de registros. Siendo X el estado operativo de un yacimiento y Y su frecuencia relativa, la moda indica que la mayoría de los yacimientos registrados en el dataset se encuentran actualmente en operación activa, lo que refleja el estado predominante de la industria extractiva de hidrocarburos a nivel mundial.