1.- Carga de Librerías

En esta sección se cargan las librerías necesarias para el análisis.

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

2.- Leer Datos

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.

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

3.- Selección de la Variable

Se selecciona 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)

4.- Conteo (Frecuencias)

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)

5.- 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

6.- Gráficos de Distribución de Frecuencias

6.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)
  )

6.2 Diagrama de Barras - Frecuencia Relativa Porcentual

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)
  )

6.3 Diagrama Circular

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)
  )


7.- 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

8.- Conclusiones

Los valores de Estado Operativo (Status) fluctúan entre En exploración y Cancelado, y giran en torno a Operativo