library(readxl)
library(dplyr)
library(gt)
library(ggplot2)
library(scales)
library(forcats)
datos <- read_excel("dataset_mundial_petro.xlsx")
n     <- nrow(datos)
cat("Número de registros:", n, "\n")
## Número de registros: 8334
cat("Número de variables:", ncol(datos), "\n")
## Número de variables: 23

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.


2 Extracción y Conteo Inicial

Se extrae la variable Status (Estado Operativo) del dataset y se realiza el conteo inicial de registros por categoría. Esta variable es de escala ordinal, ya que sus categorías siguen un orden lógico natural que va desde el descubrimiento hasta el abandono del yacimiento.

conteo_inicial <- datos %>%
  count(Status, name = "fi") %>%
  arrange(desc(fi))

k <- nrow(conteo_inicial)
cat("Total de estados (categorías):", k, "\n")
## Total de estados (categorías): 10
cat("Estado más frecuente:", conteo_inicial$Status[1],
    "con", conteo_inicial$fi[1], "registros\n")
## Estado más frecuente: operating con 6351 registros
cat("Estado menos frecuente:", conteo_inicial$Status[k],
    "con", conteo_inicial$fi[k], "registro(s)\n")
## Estado menos frecuente: exploration con 1 registro(s)

Vista previa del conteo:

head(conteo_inicial, 9)
## # A tibble: 9 × 2
##   Status            fi
##   <chr>          <int>
## 1 operating       6351
## 2 shut in          990
## 3 discovered       396
## 4 <NA>             266
## 5 in development   233
## 6 decommissioned    71
## 7 abandoned         13
## 8 UGS               11
## 9 cancelled          2

3 Categorización y Ordenamiento Lógico

Dado que Status es una variable cualitativa ordinal, se organiza según el orden lógico natural del ciclo de vida de un yacimiento: de la etapa de descubrimiento hasta su abandono o desmantelamiento.

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

tabla_freq <- conteo_inicial %>%
  mutate(
    Status = recode(Status,
      "operating"       = "Operativo",
      "shut in"         = "Cerrado",
      "discovered"      = "Descubierto",
      "in development"  = "En desarrollo",
      "decommissioned"  = "Desmantelado",
      "abandoned"       = "Abandonado",
      "UGS"             = "Almacenamiento subterráneo",
      "cancelled"       = "Cancelado",
      "exploration"     = "En exploración"
    ),
    hi_prop = fi / n,
    hi_pct  = hi_prop * 100,
    Fi      = cumsum(fi),
    Hi_prop = cumsum(hi_prop),
    Hi_pct  = cumsum(hi_pct)
  ) %>%
  mutate(i = row_number()) %>%
  select(i, Status, fi, hi_pct, hi_prop, Fi, Hi_pct, Hi_prop)

cat("Verificación — suma de fi:", sum(tabla_freq$fi), "\n")
## Verificación — suma de fi: 8334
cat("Verificación — suma de hi (%):", round(sum(tabla_freq$hi_pct), 2), "(debe ser 100)\n")
## Verificación — suma de hi (%): 100 (debe ser 100)

4 Tabla de Distribución de Frecuencias

tabla_freq %>%
  select(i, Status, fi, hi_pct, hi_prop) %>%
  gt() %>%
  tab_header(
    title    = md("**Tabla N° 1**"),
    subtitle = md("Agrupación por estado operativo de yacimientos de extracción de petróleo y gas")
  ) %>%
  cols_label(
    i       = md("**N°**"),
    Status  = md("**Estado Operativo**"),
    fi      = md("**ni**"),
    hi_pct  = md("**(%)** "),
    hi_prop = md("**(proporción)**")
  ) %>%
  tab_spanner(
    label   = md("**hi**"),
    columns = c(hi_pct, hi_prop)
  ) %>%
  fmt_number(columns = hi_pct,  decimals = 2) %>%
  fmt_number(columns = hi_prop, decimals = 3) %>%
  fmt_number(columns = fi,      decimals = 0, use_seps = TRUE) %>%
  grand_summary_rows(
    columns = c(fi, hi_pct, hi_prop),
    fns     = list(label = "Total", fn = "sum"),
    fmt     = list(
      ~ fmt_number(., columns = fi,      decimals = 0),
      ~ fmt_number(., columns = hi_pct,  decimals = 2),
      ~ fmt_number(., columns = hi_prop, decimals = 3)
    )
  ) %>%
  cols_hide(columns = i) %>%
  tab_source_note(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",
    heading.border.bottom.color       = "#AAAAAA",
    heading.border.bottom.width       = px(1),
    column_labels.font.weight         = "bold",
    column_labels.background.color    = "#FFFFFF",
    column_labels.border.top.color    = "#AAAAAA",
    column_labels.border.top.width    = px(1),
    column_labels.border.bottom.color = "#AAAAAA",
    column_labels.border.bottom.width = px(1),
    row.striping.include_table_body   = FALSE,
    source_notes.font.size            = px(11),
    source_notes.border.lr.color      = "transparent",
    table.border.top.color            = "#AAAAAA",
    table.border.top.width            = px(1),
    table.border.bottom.color         = "#AAAAAA",
    table.border.bottom.width         = px(1)
  ) %>%
  tab_style(
    style     = cell_text(color = "white", weight = "bold"),
    locations = cells_title(groups = c("title", "subtitle"))
  ) %>%
  tab_style(
    style     = cell_text(color = "#000000", weight = "bold"),
    locations = cells_column_labels()
  ) %>%
  tab_style(
    style     = cell_text(color = "#000000", weight = "bold"),
    locations = cells_column_spanners()
  ) %>%
  tab_style(
    style = list(
      cell_text(weight = "bold", color = "#000000"),
      cell_borders(sides = "top", color = "#333333", weight = px(1))
    ),
    locations = cells_grand_summary()
  ) %>%
  tab_style(
    style     = cell_text(color = "#333333"),
    locations = cells_body()
  )
Tabla N° 1
Agrupación por estado operativo de yacimientos de extracción de petróleo y gas
Estado Operativo ni
hi
(%) (proporción)
Operativo 6,351 76.21 0.762
Cerrado 990 11.88 0.119
Descubierto 396 4.75 0.048
NA 266 3.19 0.032
En desarrollo 233 2.80 0.028
Desmantelado 71 0.85 0.009
Abandonado 13 0.16 0.002
Almacenamiento subterráneo 11 0.13 0.001
Cancelado 2 0.02 0.000
En exploración 1 0.01 0.000
Total 8,334 100.00 1.000
Autor: Grupo 5

5 Análisis Gráfico

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

colores_status <- colorRampPalette(c("#2E86C1", "#AED6F1"))(9)

status_graf <- tabla_freq %>%
  mutate(Status = fct_reorder(Status, fi))

5.1 Diagrama de Barras de Cantidad

ggplot(status_graf, aes(x = Status, y = fi, fill = Status)) +
  geom_col(width = 0.65, color = "white", linewidth = 0.3) +
  geom_text(
    aes(label = format(fi, big.mark = ",")),
    hjust = -0.1, size = 3.4, color = "#222222", fontface = "bold"
  ) +
  coord_flip() +
  scale_fill_manual(values = colores_status) +
  scale_y_continuous(
    labels = label_comma(),
    expand = expansion(mult = c(0, 0.18))
  ) +
  labs(
    title   = "Gráfica N. 1: Distribución de yacimientos de petróleo y gas por estado operativo",
    x       = "Estado Operativo",
    y       = "Frecuencia Absoluta (fi)",
    caption = paste0("n = ", format(n, big.mark = ","), " | Fuente: Global Energy Monitor — GOGET 2023")
  ) +
  tema_base

5.2 Diagrama de Barras Porcentual

ggplot(status_graf, aes(x = Status, y = hi_pct, fill = Status)) +
  geom_col(width = 0.65, color = "white", linewidth = 0.3) +
  geom_text(
    aes(label = paste0(round(hi_pct, 2), "%")),
    hjust = -0.1, size = 3.4, color = "#222222", fontface = "bold"
  ) +
  coord_flip() +
  scale_fill_manual(values = colores_status) +
  scale_y_continuous(
    labels = function(x) paste0(x, "%"),
    expand = expansion(mult = c(0, 0.18))
  ) +
  labs(
    title   = "Gráfica N. 2: Distribución porcentual de yacimientos de petróleo y gas por estado operativo",
    x       = "Estado Operativo",
    y       = "Frecuencia Relativa (%)",
    caption = paste0("n = ", format(n, big.mark = ","), " | Fuente: Global Energy Monitor — GOGET 2023")
  ) +
  tema_base

5.3 Diagrama Circular

datos_pie <- tabla_freq %>%
  arrange(desc(fi)) %>%
  mutate(
    Status   = fct_reorder(Status, hi_pct),
    etiqueta = paste0(round(hi_pct, 1), "%")
  )

ggplot(datos_pie, aes(x = "", y = hi_pct, fill = Status)) +
  geom_col(width = 1, color = "white", linewidth = 0.6) +
  geom_text(
    aes(label = etiqueta),
    position  = position_stack(vjust = 0.5),
    size      = 3.5, color = "#1A1A1A", fontface = "bold"
  ) +
  coord_polar(theta = "y", start = 0) +
  scale_fill_manual(values = colorRampPalette(c("#2E86C1", "#AED6F1"))(9)) +
  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 2023")
  ) +
  theme_void(base_size = 12) +
  theme(
    plot.title      = element_text(face = "bold", color = "#222222", size = 13, 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 = 9, color = "#333333"),
    plot.background = element_rect(fill = "white", color = NA)
  )


6 Indicadores Estadísticos

# Moda: categoría con mayor frecuencia
moda_status <- tabla_freq$Status[which.max(tabla_freq$fi)]

tabla_indicadores <- data.frame(
  "Variable"       = "Status",
  "Rango"          = "Estados Operativos",
  "Media (X)"      = "-",
  "Mediana (Me)"   = "-",
  "Moda (Mo)"      = moda_status,
  "Varianza (V)"   = "-",
  "Desv. Est. (Sd)"= "-",
  "C.V. (%)"       = "-",
  "Asimetría (As)" = "-",
  "Curtosis (K)"   = "-",
  check.names = FALSE
)

tabla_indicadores %>%
  gt() %>%
  tab_header(
    title = md("**Tabla N°3 de Conclusiones yacimientos de petróleo y gas por Estado Operativo**")
  ) %>%
  tab_source_note(source_note = "Autor: Grupo 5") %>%
  tab_options(
    table.width                       = pct(92),
    table.font.size                   = px(13),
    table.font.names                  = "Arial",
    heading.title.font.size           = px(15),
    heading.align                     = "left",
    heading.border.bottom.color       = "#CCCCCC",
    heading.border.bottom.width       = px(1),
    column_labels.font.weight         = "bold",
    column_labels.background.color    = "#F0F0F0",
    column_labels.border.top.color    = "#AAAAAA",
    column_labels.border.top.width    = px(1),
    column_labels.border.bottom.color = "#AAAAAA",
    column_labels.border.bottom.width = px(1),
    row.striping.include_table_body   = FALSE,
    source_notes.font.size            = px(11),
    source_notes.border.lr.color      = "transparent",
    table.border.top.color            = "#AAAAAA",
    table.border.top.width            = px(1),
    table.border.bottom.color         = "#AAAAAA",
    table.border.bottom.width         = px(2)
  ) %>%
  tab_style(
    style     = cell_text(color = "#000000", weight = "bold"),
    locations = cells_column_labels()
  ) %>%
  tab_style(
    style     = cell_text(color = "#333333"),
    locations = cells_body()
  )
Tabla N°3 de Conclusiones yacimientos de petróleo y gas por Estado Operativo
Variable Rango Media (X) Mediana (Me) Moda (Mo) Varianza (V) Desv. Est. (Sd) C.V. (%) Asimetría (As) Curtosis (K)
Status Estados Operativos - - Operativo - - - - -
Autor: Grupo 5