1. Carga de Datos y Librerías

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 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. Conteo y Cálculo

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

tabla_freq <- as.data.frame(table(Variable_esp)) %>%
  rename(Estado = Variable_esp, ni = Freq) %>%
  arrange(desc(ni)) %>%
  mutate(
    Estado  = as.character(Estado),
    ni      = as.numeric(ni),
    hi_prop = ni / length(Variable),
    hi_pct  = hi_prop * 100,
    i       = row_number()
  ) %>%
  select(i, Estado, ni, hi_pct, hi_prop)

k <- nrow(tabla_freq)

cat("Número de categorías (k):", k, "\n")
## Número de categorías (k): 9
cat("Categoría más frecuente :", tabla_freq$Estado[1],
    "-", tabla_freq$ni[1], "registros\n")
## Categoría más frecuente : Operativo - 6351 registros
cat("Categoría menos frecuente:", tabla_freq$Estado[k],
    "-", tabla_freq$ni[k], "registro(s)\n")
## Categoría menos frecuente: En exploración - 1 registro(s)
cat("Verificación - Σni:", sum(tabla_freq$ni),
    "(debe ser", length(Variable), ")\n")
## Verificación - Σni: 8068 (debe ser 8068 )
cat("Verificación - Σhi%:", round(sum(tabla_freq$hi_pct)), "(debe ser 100)\n")
## Verificación - Σhi%: 100 (debe ser 100)

4. Tabla de Distribución de Frecuencias

# 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. Gráficas

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. Indicadores Estadísticos

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.