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