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
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)
## Total de observaciones limpias (N): 5278
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 | |||||
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))# 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)))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)))# 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)"))# 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 | ||||