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 Subnational unit (province, state) y se eliminan los valores nulos (NA).

Nota metodológica: Según requerimiento, los datos no se ordenarán por frecuencia de mayor a menor, sino que se mantendrá el orden estricto de aparición en la base de datos original. Para ello, se bloquea la variable como un factor respetando sus niveles originales.

tdf_unidades <- datos_originales %>%
  select(`Subnational unit (province, state)`) %>%
  filter(!is.na(`Subnational unit (province, state)`)) %>%
  # Se respeta el orden de aparición usando unique()
  mutate(Subnational_Unit = factor(trimws(as.character(`Subnational unit (province, state)`)), 
                                   levels = unique(trimws(as.character(`Subnational unit (province, state)`))))) %>%
  group_by(Subnational_Unit) %>%
  summarise(Fi = n(), .groups = 'drop') %>%
  # NOTA: Se elimina arrange(desc(Fi)) para mantener el orden de origen
  mutate(
    hi = Fi / sum(Fi),
    Pi = hi * 100,
    Fi_ac = cumsum(Fi),
    hi_ac = cumsum(hi)
  )

N <- sum(tdf_unidades$Fi)

cat("Variable analizada: Subnational unit (province, state)\n")
## Variable analizada: Subnational unit (province, state)
cat("Total de observaciones limpias (N):", N, "\n")
## Total de observaciones limpias (N): 5278

3. Identificación de la Variable

  • Variable: SUBNATIONAL UNIT (Provincia o Estado).
  • Tipo: Cualitativa Nominal.
  • Descripción: Representa la subdivisión geopolítica (estado, provincia o región) donde se localiza el yacimiento. En este reporte, las categorías se presentan tal y como se registraron en la fuente, sin aplicar ordenamientos jerárquicos de frecuencia.

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

La tabla se estructura respetando la secuencia de recolección de los datos. Nota: Debido a la gran cantidad de provincias a nivel mundial, esta tabla muestra las primeras 20 regiones que aparecen en el registro.

# Mostramos los primeros 20 registros según el orden de aparición
tdf_top20 <- head(tdf_unidades, 20)

fila_total <- data.frame(
  Subnational_Unit = "TOTAL GLOBAL (Muestra)",
  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_top20 %>% mutate(Subnational_Unit = as.character(Subnational_Unit)), 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. Frecuencias por Provincia/Estado (Orden de Origen)**")
  ) %>%
  cols_label(
    Subnational_Unit = "Provincia / Estado",
    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. Frecuencias por Provincia/Estado (Orden de Origen)
Provincia / Estado Frec. Absoluta
(Fi)
Frec. Relativa
(hi)
Porcentaje
(%)
Frec. Abs.
Acumulada (Fi_ac)
Frec. Rel.
Acumulada (hi_ac)
Espírito Santo 10 0.00189 0.19 10 0.00189
Sergipe 2 0.00038 0.04 12 0.00227
Rio Grande do Norte 8 0.00152 0.15 20 0.00379
Rio de Janeiro 34 0.00644 0.64 54 0.01023
Alagoas 1 0.00019 0.02 55 0.01042
Bahia 6 0.00114 0.11 61 0.01156
Amazonas 3 0.00057 0.06 64 0.01213
São Paulo 10 0.00189 0.19 74 0.01402
Maranhão 2 0.00038 0.04 76 0.01440
Federal Offshore 62 0.01175 1.17 138 0.02615
Tabasco 41 0.00777 0.78 179 0.03391
Tamaulipas 12 0.00227 0.23 191 0.03619
Chiapas; Tabasco 4 0.00076 0.08 195 0.03695
Veracruz 27 0.00512 0.51 222 0.04206
Chiapas 4 0.00076 0.08 226 0.04282
Nuevo León; Tamaulipas 4 0.00076 0.08 230 0.04358
Tabasco; Veracruz 1 0.00019 0.02 231 0.04377
Puebla; Veracruz 7 0.00133 0.13 238 0.04509
Puebla 1 0.00019 0.02 239 0.04528
Nuevo León 1 0.00019 0.02 240 0.04547
TOTAL GLOBAL (Muestra) 5,278 1.00000 100.00

Fuente: Global Energy Monitor — GOGET 2023 | n = 5,278

5. Representación Gráfica

Para asegurar la legibilidad, las siguientes gráficas ilustran las primeras 15 provincias registradas en el dataset, conservando la cronología de los datos (sin ordenar las barras por tamaño).

# Filtramos los primeros 15 registros de aparición
tdf_graficas <- head(tdf_unidades, 15)

# Paleta de colores dinámica
paleta_azul <- colorRampPalette(c("#08519c", "#3182bd", "#6baed6", "#9ecae1", "#c6dbef"))(nrow(tdf_graficas))

5.1. Gráfica N°1 — Frecuencia Absoluta

# No se usa reorder(), se mantiene el factor original
ggplot(tdf_graficas, aes(x = Subnational_Unit, y = Fi, fill = Subnational_Unit)) +
  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 = "Provincia / Estado (Orden de Aparición)", 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_graficas, aes(x = Subnational_Unit, y = Pi, fill = Subnational_Unit)) +
  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 = "Provincia / Estado (Orden de Aparición)", 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 sin reordenar
plot_data <- tdf_graficas %>% 
  mutate(label_leyenda = factor(paste0(Subnational_Unit, " (", round(Pi, 1), "%)"), 
                                levels = paste0(Subnational_Unit, " (", round(Pi, 1), "%)")))

ggplot(plot_data, aes(x = "", y = Pi, fill = label_leyenda)) +
  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 = "Provincias (Primeros Registros)"))

6. Tabla de Indicadores

# Cálculos de indicadores globales buscando el máximo valor (sin importar el orden de la tabla)
num_categorias <- nrow(tdf_unidades)
indice_moda <- which.max(tdf_unidades$Fi)
moda_cat <- as.character(tdf_unidades$Subnational_Unit[indice_moda])
moda_ni <- tdf_unidades$Fi[indice_moda]
moda_hi <- round(tdf_unidades$Pi[indice_moda], 2)

tabla_ind <- data.frame(
  "Total Registros (N)" = format(N, big.mark = ","),
  "Total Provincias" = num_categorias,
  "Provincia 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 Globales**")
  ) %>%
  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 Globales
Total Registros (N) Total Provincias Provincia Dominante (Moda) Frecuencia de la Moda Peso de la Moda
5,278 103 Texas 1,504 28.5%
Autor: Grupo 5

7. Conclusión

  • El comportamiento de los datos se evaluó respetando el orden secuencial de registro en la fuente primaria.
  • A nivel global, la base de datos se fragmenta en 103 provincias o estados diferentes.
  • A pesar de no presentar las gráficas ordenadas por volumen, el cálculo paramétrico general de la variable identifica a la unidad subnacional Texas como la predominante absoluta en la industria (Moda), concentrando un total de 1,504 instalaciones que representan un peso específico del 28.5% sobre toda la muestra poblacional.