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)
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
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)
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)
# 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 | ||||||||||
Los valores de Estado Operativo (Status) fluctúan entre En exploración y Cancelado, y giran en torno a Operativo