1 Carga de Datos y Librerías

Preparación del entorno de trabajo cargando los paquetes necesarios para el manejo de datos, formato de tablas y visualización de gráficas.

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

# Selección del archivo Excel (se abre ventana emergente)
ruta_archivo <- file.choose()
Datos <- read_excel(ruta_archivo)

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

2 Extracción de la Variable

Se extrae y limpia la variable Unit type (Tipo de Unidad). Se eliminan los valores nulos y se estandarizan los textos (eliminando espacios) para garantizar que el conteo de categorías sea correcto.

Variable <- Datos$`Unit type` %>%
  na.omit() %>%
  as.character() %>%
  trimws()

N <- length(Variable)

cat("Variable analizada: Unit type\n")
## Variable analizada: Unit type
cat("Tipo de variable: Cualitativa Nominal\n")
## Tipo de variable: Cualitativa Nominal
cat("Total de observaciones útiles (n):", N, "\n")
## Total de observaciones útiles (n): 8334

3 Conteo y Cálculo

La variable Unit Type es de naturaleza cualitativa nominal (no posee orden jerárquico entre sus categorías: field, asset, pool, etc.). Se calcula la frecuencia absoluta, relativa y porcentual de cada categoría, ordenando de mayor a menor para facilitar la lectura.

TDF_Cat <- data.frame(Categoria = Variable) %>%
  group_by(Categoria) %>%
  summarise(ni = n(), .groups = "drop") %>%
  arrange(desc(ni)) %>%
  mutate(
    hi_unit = ni / N,
    hi_perc = hi_unit * 100,
    Ni_ac = cumsum(ni),
    hi_ac_perc = cumsum(hi_perc)
  )

K_real <- nrow(TDF_Cat)

cat("Número de categorías distintas (k):", K_real, "\n")
## Número de categorías distintas (k): 11

4 Tabla de Distribución de Frecuencias

Se estructura la matriz de resultados ordenando las categorías por su frecuencia absoluta, de mayor a menor, para identificar rápidamente las tipologías más comunes en la industria.

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

fila_total_cat <- data.frame(
  Categoria = "TOTAL",
  ni = sum(TDF_Cat$ni),
  hi_unit = sum(TDF_Cat$hi_unit),
  hi_perc = sum(TDF_Cat$hi_perc),
  Ni_ac = NA,
  hi_ac_perc = NA
)

bind_rows(TDF_Cat, fila_total_cat) %>%
  gt() %>%
  tab_header(
    title = md("**Tabla N°1**"),
    subtitle = md("Distribución de frecuencias de Unit Type")
  ) %>%
  cols_label(
    Categoria = "Tipo de Unidad", ni = md("n~i~"),
    hi_unit = md("h~i~ (Unit)"), hi_perc = md("h~i~ (%)"),
    Ni_ac = md("N~i~ (Acum \u2191)"), hi_ac_perc = md("H~i~ (% Acum \u2191)")
  ) %>%
  cols_align(align = "center", columns = everything()) %>%
  fmt_number(columns = c(hi_perc, hi_ac_perc), decimals = 2) %>%
  fmt_number(columns = c(hi_unit), decimals = 4) %>%
  fmt_number(columns = c(ni, Ni_ac), decimals = 0, use_seps = TRUE) %>%
  tab_source_note(fuente_nota) %>%
  tab_style(
    style = cell_fill(color = "#F5F5F5"),
    locations = cells_body(rows = nrow(TDF_Cat) + 1)
  ) %>%
  tab_style(
    style = cell_text(weight = "bold"),
    locations = cells_body(rows = nrow(TDF_Cat) + 1)
  ) %>%
  sub_missing(columns = everything(), missing_text = "") %>%
  tab_options(heading.background.color = "#EBF5FB", column_labels.font.weight = "bold")
Tabla N°1
Distribución de frecuencias de Unit Type
Tipo de Unidad ni hi (Unit) hi (%) Ni (Acum ↑) Hi (% Acum ↑)
field 4,336 0.5203 52.03 4,336 52.03
asset 3,124 0.3749 37.49 7,460 89.51
pool 461 0.0553 5.53 7,921 95.04
project 183 0.0220 2.20 8,104 97.24
block 111 0.0133 1.33 8,215 98.57
complex 73 0.0088 0.88 8,288 99.45
concession 16 0.0019 0.19 8,304 99.64
area 14 0.0017 0.17 8,318 99.81
phase 11 0.0013 0.13 8,329 99.94
basin 3 0.0004 0.04 8,332 99.98
sub-basin 2 0.0002 0.02 8,334 100.00
TOTAL 8,334 1.0000 100.00

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

5 Gráficas

paleta_azul <- colorRampPalette(c("#08519c", "#3182bd", "#6baed6", "#9ecae1", "#c6dbef"))(K_real)

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

df_graf <- TDF_Cat %>%
  mutate(Categoria = factor(Categoria, levels = Categoria))

5.1 Diagrama de Barras — Frecuencia Absoluta

ggplot(df_graf, aes(x = Categoria, y = ni, fill = Categoria)) +
  geom_col(color = "black", linewidth = 0.3) +
  geom_text(aes(label = format(ni, big.mark = ",")), vjust = -0.4, size = 3.5, fontface = "bold") +
  scale_fill_manual(values = paleta_azul) +
  scale_y_continuous(labels = label_comma(), expand = expansion(mult = c(0, 0.15))) +
  labs(title = "Diagrama de Barras de Frecuencia Absoluta",
       x = "Tipo de Unidad", y = "Frecuencia Absoluta (ni)",
       caption = fuente_nota) +
  tema_base

5.2 Diagrama de Barras — Frecuencia Relativa Porcentual

ggplot(df_graf, aes(x = Categoria, y = hi_perc, fill = Categoria)) +
  geom_col(color = "black", linewidth = 0.3) +
  geom_text(aes(label = paste0(round(hi_perc, 1), "%")), vjust = -0.4, size = 3.5, fontface = "bold") +
  scale_fill_manual(values = paleta_azul) +
  scale_y_continuous(labels = function(x) paste0(x, "%"), expand = expansion(mult = c(0, 0.15))) +
  labs(title = "Diagrama de Barras de Frecuencia Relativa Porcentual",
       x = "Tipo de Unidad", y = "Frecuencia Relativa (%)",
       caption = fuente_nota) +
  tema_base

5.3 Diagrama Circular

df_pie <- df_graf %>%
  mutate(etiqueta = paste0(Categoria, " (", round(hi_perc, 1), "%)"))

ggplot(df_pie, aes(x = "", y = hi_perc, fill = reorder(etiqueta, -hi_perc))) +
  geom_col(width = 1, color = "white", linewidth = 0.5) +
  coord_polar("y", start = 0) +
  scale_fill_manual(values = paleta_azul) +
  theme_void(base_size = 12) +
  theme(
    legend.position = "right",
    legend.text = element_text(size = 10),
    legend.title = element_text(face = "bold", size = 11),
    plot.margin = margin(t = 20, r = 20, b = 20, l = 20)
  ) +
  guides(fill = guide_legend(title = "Tipo de Unidad"))

6 Indicadores Estadísticos

La variable Unit Type es cualitativa nominal, por lo que el único indicador de tendencia central aplicable es la moda, complementado con el número de categorías presentes en el dataset.

num_categorias <- K_real
moda_cat <- TDF_Cat$Categoria[1]
moda_ni <- TDF_Cat$ni[1]
moda_hi <- round(TDF_Cat$hi_perc[1], 2)

tabla_ind <- data.frame(
  Variable = "Unit Type",
  Total_N = format(N, big.mark = ","),
  Num_Categorias = num_categorias,
  Moda = moda_cat,
  Frec_Moda = format(moda_ni, big.mark = ","),
  Peso_Moda = paste0(moda_hi, "%"),
  check.names = FALSE
)

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

7 Conclusiones

El tipo de unidad field es la categoría predominante, abarcando el 52.03% de los 8,334 registros analizados, seguido en frecuencia por las demás categorías operativas identificadas (11 en total). Esta concentración refleja la estructura operativa actual y la alineación de las instalaciones extractivas con los estándares más comunes de clasificación en la industria energética mundial.