1. Configuración y Carga de Datos

En este primer paso, se prepara el entorno de trabajo cargando las librerías necesarias para el análisis de datos (dplyr), la creación de gráficas avanzadas (ggplot2), y el formato profesional de tablas (gt).

library(readxl)
library(dplyr)
library(gt)
library(ggplot2)

# Se abre ventana emergente para seleccionar dinámicamente el dataset
ruta_archivo <- file.choose()
datos_originales <- read_excel(ruta_archivo)

cat("Dataset cargado exitosamente. Total de variables:", ncol(datos_originales), "\n")
## Dataset cargado exitosamente. Total de variables: 32

2. Extracción y Limpieza de la Variable

Se aísla la variable de interés y se eliminan los valores nulos (NA) para garantizar que la distribución de frecuencias y los porcentajes reflejen exclusivamente los registros operativos válidos.

tdf_unidades <- datos_originales %>%
  select(`Unit type`) %>%
  filter(!is.na(`Unit type`)) %>%
  mutate(Unit_Type = trimws(as.character(`Unit type`))) %>%
  group_by(Unit_Type) %>%
  summarise(Fi = n()) %>%
  arrange(desc(Fi)) %>%
  mutate(
    hi = Fi / sum(Fi),
    Pi = hi * 100,
    Fi_ac = cumsum(Fi),
    hi_ac = cumsum(hi)
  )

N <- sum(tdf_unidades$Fi)

cat("Variable analizada: Unit type\n")
## Variable analizada: Unit type
cat("Total de observaciones limpias (N):", N, "\n")
## Total de observaciones limpias (N): 8334

3. Identificación de la Variable

  • Variable: UNIT TYPE (Tipo de unidad/instalación).
  • Tipo: Cualitativa Nominal.
  • Descripción: Representa la categoría o infraestructura operativa de los yacimientos (ej. field, asset, pool, etc.). No posee un orden jerárquico inherente.

4. Tabla de Distribución de Frecuencias (TDF)

La tabla se estructura ordenando las categorías por su frecuencia absoluta de mayor a menor, facilitando la identificación inmediata de las tipologías más comunes en la industria.

# Fila de totales
fila_total <- data.frame(
  Unit_Type = "TOTAL",
  Fi = sum(tdf_unidades$Fi),
  hi = sum(tdf_unidades$hi),
  Pi = sum(tdf_unidades$Pi),
  Fi_ac = NA,
  hi_ac = NA
)

TDF_Final <- bind_rows(tdf_unidades %>% mutate(Unit_Type = as.character(Unit_Type)), fila_total)

fuente_nota <- paste("Fuente: Global Energy Monitor — GOGET 2023 | n =", format(N, big.mark = ","))

TDF_Final %>%
  gt() %>%
  tab_header(
    title = md("**TABLA 1. Distribución de Frecuencias por Tipo de Unidad**")
  ) %>%
  cols_label(
    Unit_Type = "Tipo de Unidad",
    Fi = md("Frec. Absoluta<br>(Fi)"),
    hi = md("Frec. Relativa<br>(hi)"),
    Pi = md("Porcentaje<br>(%)"),
    Fi_ac = md("Frec. Abs.<br>Acumulada (Fi_ac)"),
    hi_ac = md("Frec. Rel.<br>Acumulada (hi_ac)")
  ) %>%
  cols_align(align = "center", columns = everything()) %>%
  fmt_number(columns = c(hi, hi_ac), decimals = 5) %>%
  fmt_number(columns = c(Pi), decimals = 2) %>%
  fmt_number(columns = c(Fi, Fi_ac), decimals = 0, use_seps = TRUE) %>%
  sub_missing(columns = everything(), missing_text = "") %>%
  tab_source_note(fuente_nota) %>%
  tab_style(
    style = cell_fill(color = "#F5F5F5"),
    locations = cells_body(rows = nrow(TDF_Final))
  ) %>%
  tab_style(
    style = cell_text(weight = "bold"),
    locations = cells_body(rows = nrow(TDF_Final))
  ) %>%
  tab_options(heading.background.color = "#EBF5FB", column_labels.font.weight = "bold")
TABLA 1. Distribución de Frecuencias por Tipo de Unidad
Tipo de Unidad Frec. Absoluta
(Fi)
Frec. Relativa
(hi)
Porcentaje
(%)
Frec. Abs.
Acumulada (Fi_ac)
Frec. Rel.
Acumulada (hi_ac)
field 4,336 0.52028 52.03 4,336 0.52028
asset 3,124 0.37485 37.49 7,460 0.89513
pool 461 0.05532 5.53 7,921 0.95044
project 183 0.02196 2.20 8,104 0.97240
block 111 0.01332 1.33 8,215 0.98572
complex 73 0.00876 0.88 8,288 0.99448
concession 16 0.00192 0.19 8,304 0.99640
area 14 0.00168 0.17 8,318 0.99808
phase 11 0.00132 0.13 8,329 0.99940
basin 3 0.00036 0.04 8,332 0.99976
sub-basin 2 0.00024 0.02 8,334 1.00000
TOTAL 8,334 1.00000 100.00

Fuente: Global Energy Monitor — GOGET 2023 | n = 8,334

5. Representación Gráfica

# Paleta de colores dinámica para adaptarse a la cantidad de categorías
paleta_azul <- colorRampPalette(c("#08519c", "#3182bd", "#6baed6", "#9ecae1", "#c6dbef"))(nrow(tdf_unidades))

5.1. Gráfica N°1 — Frecuencia Absoluta

ggplot(tdf_unidades, aes(x = reorder(Unit_Type, -Fi), y = Fi, fill = Unit_Type)) +
  geom_bar(stat = "identity", show.legend = FALSE, color = "black", size = 0.3) +
  geom_text(aes(label = format(Fi, big.mark = ",")), vjust = -0.5, size = 3.5, fontface = "bold") +
  scale_fill_manual(values = paleta_azul) +
  theme_minimal() +
  labs(x = "Tipo de Unidad", y = "Frecuencia Absoluta (Fi)") +
  theme(
    plot.title = element_blank(),
    axis.title = element_text(size = 12, face = "bold"),
    axis.text = element_text(size = 10),
    axis.text.x = element_text(angle = 45, hjust = 1)
  ) +
  scale_y_continuous(expand = expansion(mult = c(0, 0.15)))

5.2. Gráfica N°2 — Distribución Porcentual

ggplot(tdf_unidades, aes(x = reorder(Unit_Type, -Pi), y = Pi, fill = Unit_Type)) +
  geom_bar(stat = "identity", show.legend = FALSE, color = "black", size = 0.3) +
  geom_text(aes(label = paste0(round(Pi, 1), "%")), vjust = -0.5, size = 3.5, fontface = "bold") +
  scale_fill_manual(values = paleta_azul) +
  theme_minimal() +
  labs(x = "Tipo de Unidad", y = "Porcentaje (%)") +
  theme(
    plot.title = element_blank(),
    axis.title = element_text(size = 12, face = "bold"),
    axis.text = element_text(size = 10),
    axis.text.x = element_text(angle = 45, hjust = 1)
  ) +
  scale_y_continuous(expand = expansion(mult = c(0, 0.15)))

5.3. Gráfica N°3 — Distribución Porcentual (Circular)

# Preparación de etiquetas para leyenda
plot_data <- tdf_unidades %>% 
  mutate(label_leyenda = paste0(Unit_Type, " (", round(Pi, 1), "%)"))

ggplot(plot_data, aes(x = "", y = Pi, fill = reorder(label_leyenda, -Pi))) +
  geom_bar(stat = "identity", width = 1, color = "white", size = 0.5) +
  coord_polar("y", start = 0) +
  scale_fill_manual(values = paleta_azul) +
  theme_void() +
  theme(
    legend.position = "right", 
    legend.text = element_text(size = 11),
    legend.title = element_text(face = "bold", size = 12),
    plot.margin = margin(t = 20, r = 20, b = 20, l = 20)
  ) +
  guides(fill = guide_legend(title = "Tipo de Unidad"))

6. Tabla de Indicadores

# Cálculos de indicadores
num_categorias <- nrow(tdf_unidades)
moda_cat <- as.character(tdf_unidades$Unit_Type[1])
moda_ni <- tdf_unidades$Fi[1]
moda_hi <- round(tdf_unidades$Pi[1], 2)

tabla_ind <- data.frame(
  "Total Registros (N)" = format(N, big.mark = ","),
  "Total Categorías" = num_categorias,
  "Categoría Dominante (Moda)" = moda_cat,
  "Frecuencia de la Moda" = format(moda_ni, big.mark = ","),
  "Peso de la Moda" = paste0(moda_hi, "%"),
  check.names = FALSE
)

tabla_ind %>%
  gt() %>%
  tab_header(
    title = md("**TABLA 2. Indicadores Estadísticos**")
  ) %>%
  cols_align(align = "center", columns = everything()) %>%
  tab_source_note("Autor: Grupo 5") %>%
  tab_options(heading.background.color = "#EBF5FB", column_labels.font.weight = "bold")
TABLA 2. Indicadores Estadísticos
Total Registros (N) Total Categorías Categoría Dominante (Moda) Frecuencia de la Moda Peso de la Moda
8,334 11 field 4,336 52.03%
Autor: Grupo 5

7. Conclusión

  • El tipo de unidad field es el predominante, abarcando el 52.03% de los registros analizados.
  • Esta tendencia refleja la estructura operativa actual y la alineación de las instalaciones extractivas dentro de los estándares más comunes de la industria energética mundial.