Se cargan las librerías necesarias y 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.
library(readxl)
library(dplyr)
library(tidyr)
library(gt)
library(ggplot2)
library(scales)
library(forcats)
library(stringr)
setwd("C:/Users/ronny/Downloads/Dataset")
datos <- read_excel("dataset_mundial_petro.xlsx") %>%
mutate(Country = trimws(Country)) %>%
filter(!is.na(Country), Country != "NA", Country != "")
cat("Registros válidos:", nrow(datos), "\n")## Registros válidos: 49212
## Variables: 32
Se extrae la variable País (Country) y se agrupa geográficamente por continente, ya que el número de países individuales es demasiado alto para un análisis de frecuencias manejable. La variable resultante (Continente) es cualitativa nominal.
asignar_continente <- function(pais) {
case_when(
pais %in% c("United States", "Canada", "Mexico", "Greenland") ~
"América del Norte",
pais %in% c("Venezuela", "Brazil", "Colombia", "Argentina", "Ecuador",
"Peru", "Bolivia", "Trinidad and Tobago", "Guyana", "Suriname",
"Chile", "Cuba", "Paraguay", "Uruguay", "Panama", "Costa Rica",
"Honduras", "Guatemala", "Nicaragua", "El Salvador",
"Barbados", "Haiti", "Dominican Republic", "Jamaica",
"Belize", "Bahamas") ~
"América del Sur y Caribe",
pais %in% c("Norway", "United Kingdom", "Denmark", "Netherlands", "Germany",
"Poland", "Romania", "Albania", "Serbia", "Croatia", "Hungary",
"Czech Republic", "Austria", "Italy", "France", "Spain", "Greece",
"Bulgaria", "Slovakia", "Ukraine", "Belarus", "Moldova",
"Latvia", "Lithuania", "Estonia", "Finland", "Sweden",
"Switzerland", "Belgium", "Portugal", "Ireland",
"Bosnia and Herzegovina", "North Macedonia", "Montenegro",
"Slovenia", "Kosovo", "Cyprus", "Russia") ~
"Europa y Rusia",
pais %in% c("Kazakhstan", "Azerbaijan", "Turkmenistan", "Uzbekistan",
"Kyrgyzstan", "Tajikistan", "Georgia", "Armenia") ~
"Asia Central y Cáucaso",
pais %in% c("Saudi Arabia", "Iraq", "Iran", "Kuwait",
"United Arab Emirates", "Qatar", "Bahrain", "Oman",
"Yemen", "Syria", "Jordan", "Israel", "Lebanon", "Turkey") ~
"Oriente Medio",
pais %in% c("Nigeria", "Angola", "Libya", "Algeria", "Egypt", "Tunisia",
"Gabon", "Republic of the Congo",
"Democratic Republic of the Congo", "Congo", "Cameroon",
"Sudan", "South Sudan", "Chad", "Equatorial Guinea",
"Mozambique", "Tanzania", "Cote d'Ivoire", "Ivory Coast",
"Ghana", "Niger", "Somalia", "Morocco", "Namibia",
"Madagascar", "Senegal", "Mauritania", "Uganda", "Kenya",
"Ethiopia", "South Africa", "Zambia", "Zimbabwe") ~
"África",
pais %in% c("China", "India", "Indonesia", "Malaysia", "Vietnam",
"Thailand", "Myanmar", "Bangladesh", "Pakistan", "Brunei",
"Philippines", "Japan", "South Korea", "North Korea",
"Taiwan", "Mongolia", "Papua New Guinea", "Timor-Leste",
"East Timor", "Cambodia", "Laos", "Sri Lanka",
"Afghanistan", "Nepal", "Australia", "New Zealand") ~
"Asia Pacífico y Oceanía",
TRUE ~ "Otro/No especificado"
)
}
datos <- datos %>%
mutate(Continente = asignar_continente(Country))
n <- nrow(datos)
cat("Variable analizada: País (Country) — agrupada por Continente\n")## Variable analizada: País (Country) — agrupada por Continente
## Total de observaciones (n): 49212
## Número de países únicos: 104
## Continentes identificados: África, América del Norte, América del Sur y Caribe, Asia Central y Cáucaso, Asia Pacífico y Oceanía, Europa y Rusia, Oriente Medio, Otro/No especificado
conteo <- datos %>%
count(Continente, name = "ni") %>%
arrange(desc(ni)) %>%
mutate(
hi = ni / n,
hi_pct = round(hi * 100, 2),
hi = round(hi, 4)
)
k <- nrow(conteo)
cat("Número de categorías (k) :", k, "\n")## Número de categorías (k) : 8
## Continente más frecuente : América del Norte — 27191 registros
## Continente menos frecuente : Otro/No especificado — 141 registro(s)
fila_total <- tibble(
Continente = "TOTAL",
ni = sum(conteo$ni),
hi = sum(conteo$hi),
hi_pct = sum(conteo$hi_pct)
)
bind_rows(conteo, fila_total) %>%
gt() %>%
tab_header(
title = md("**Tabla N° 1**"),
subtitle = md("Distribución de yacimientos por continente")
) %>%
cols_label(
Continente = "Continente",
ni = "Frecuencia (ni)",
hi = "Proporción (hi)",
hi_pct = "Porcentaje (hi%)"
) %>%
fmt_number(columns = hi, decimals = 4) %>%
fmt_number(columns = hi_pct, decimals = 2) %>%
cols_align(align = "center", columns = everything()) %>%
tab_source_note(source_note = "Autor: Grupo 5") %>%
tab_options(
table.border.top.color = "black",
table.border.bottom.color = "black",
column_labels.font.weight = "bold",
column_labels.border.top.color = "black",
column_labels.border.bottom.color = "black",
column_labels.border.bottom.width = px(2),
table_body.hlines.color = "grey",
table_body.border.bottom.color = "black"
)| Tabla N° 1 | |||
| Distribución de yacimientos por continente | |||
| Continente | Frecuencia (ni) | Proporción (hi) | Porcentaje (hi%) |
|---|---|---|---|
| América del Norte | 27191 | 0.5525 | 55.25 |
| Europa y Rusia | 9253 | 0.1880 | 18.80 |
| América del Sur y Caribe | 6292 | 0.1279 | 12.79 |
| Asia Pacífico y Oceanía | 2316 | 0.0471 | 4.71 |
| África | 2182 | 0.0443 | 4.43 |
| Oriente Medio | 1392 | 0.0283 | 2.83 |
| Asia Central y Cáucaso | 445 | 0.0090 | 0.90 |
| Otro/No especificado | 141 | 0.0029 | 0.29 |
| TOTAL | 49212 | 1.0000 | 100.00 |
| Autor: Grupo 5 | |||
colores <- colorRampPalette(c("#154360", "#AED6F1"))(k)
tema_base <- theme_minimal(base_size = 12) +
theme(
legend.position = "none",
plot.title = element_text(face = "bold"),
axis.title = element_text(face = "bold"),
axis.text.x = element_text(angle = 40, hjust = 1),
plot.background = element_rect(fill = "white", color = NA)
)
cont_graf <- conteo %>% mutate(Continente = fct_reorder(Continente, ni, .desc = TRUE))ggplot(cont_graf, aes(x = Continente, y = ni, fill = Continente)) +
geom_col(width = 0.6, color = "white") +
geom_text(aes(label = ni), vjust = -0.4, size = 3.2, fontface = "bold") +
scale_fill_manual(values = colores) +
scale_x_discrete(labels = function(x) str_wrap(x, width = 12)) +
scale_y_continuous(expand = expansion(mult = c(0, 0.15))) +
labs(
title = "Gráfica N°1: Frecuencia Absoluta por Continente",
x = "Continente", y = "Frecuencia (ni)",
caption = paste0("n = ", format(n, big.mark = ","), " | Fuente: GOGET")
) +
tema_baseggplot(cont_graf, aes(x = Continente, y = hi_pct, fill = Continente)) +
geom_col(width = 0.6, color = "white") +
geom_text(aes(label = paste0(hi_pct, "%")), vjust = -0.4, size = 3.2, fontface = "bold") +
scale_fill_manual(values = colores) +
scale_x_discrete(labels = function(x) str_wrap(x, width = 12)) +
scale_y_continuous(expand = expansion(mult = c(0, 0.15))) +
labs(
title = "Gráfica N°2: Frecuencia Relativa (hi) por Continente",
x = "Continente", y = "Frecuencia Relativa (%)",
caption = paste0("n = ", format(n, big.mark = ","), " | Fuente: GOGET")
) +
tema_baseLa gráfica muestra un descenso marcado y progresivo desde el continente más frecuente hacia el menos frecuente, lo que sugiere que un modelo Geométrico es adecuado para describir esta distribución.
Se ordenan las categorías de mayor a menor frecuencia y se les asigna un rango i = 1, 2, …, k. Se estima el parámetro p por método de momentos, usando la media observada de los rangos ponderada por hi.
conteo_modelo <- conteo %>% arrange(desc(ni))
conteo_modelo$ID <- 1:nrow(conteo_modelo)
media_observada <- sum(conteo_modelo$ID * conteo_modelo$hi)
p_estimado <- 1 / media_observada
cat("Media observada de rangos =", round(media_observada, 4), "\n")## Media observada de rangos = 1.9781
## Parámetro estimado p = 0.5055
prob_geom <- p_estimado * (1 - p_estimado)^(conteo_modelo$ID - 1)
prob_geom <- prob_geom / sum(prob_geom)
conteo_modelo$hi_modelo <- round(prob_geom, 4)
conteo_modelo$hi_modelo_pct <- round(prob_geom * 100, 2)
conteo_modelo$ni_modelo <- round(prob_geom * n, 0)
print(conteo_modelo %>% select(Continente, ID, ni, hi, hi_modelo))## # A tibble: 8 × 5
## Continente ID ni hi hi_modelo
## <chr> <int> <int> <dbl> <dbl>
## 1 América del Norte 1 27191 0.552 0.507
## 2 Europa y Rusia 2 9253 0.188 0.251
## 3 América del Sur y Caribe 3 6292 0.128 0.124
## 4 Asia Pacífico y Oceanía 4 2316 0.0471 0.0613
## 5 África 5 2182 0.0443 0.0303
## 6 Oriente Medio 6 1392 0.0283 0.015
## 7 Asia Central y Cáucaso 7 445 0.009 0.0074
## 8 Otro/No especificado 8 141 0.0029 0.0037
df_comparativo <- conteo_modelo %>%
select(Continente, hi_pct, hi_modelo_pct) %>%
pivot_longer(cols = c(hi_pct, hi_modelo_pct), names_to = "Origen", values_to = "Valor") %>%
mutate(Origen = ifelse(Origen == "hi_pct", "Realidad", "Modelo"))
df_comparativo$Continente <- factor(df_comparativo$Continente, levels = conteo_modelo$Continente)
ggplot(df_comparativo, aes(x = Continente, y = Valor, fill = Origen)) +
geom_bar(stat = "identity", position = "dodge", color = "white") +
scale_fill_manual(values = c("Modelo" = "skyblue", "Realidad" = "#154360")) +
scale_x_discrete(labels = function(x) str_wrap(x, width = 12)) +
labs(
title = "Gráfica N°3: Modelo Geométrico comparado con la Realidad — Continente",
subtitle = paste0("p estimado = ", round(p_estimado, 4)),
x = "Continente (orden por frecuencia)", y = "Probabilidad (%)", fill = "Origen"
) +
tema_base +
theme(legend.position = "top", axis.text.x = element_text(angle = 40, hjust = 1))Fo <- conteo_modelo$hi
Fe <- conteo_modelo$hi_modelo
r_pearson <- cor(Fo, Fe) * 100
cat("Correlación de Pearson (%):", round(r_pearson, 4), "\n")## Correlación de Pearson (%): 98.6536
plot(Fo, Fe,
main = "Gráfica N°4: Correlación Modelo Observado y Esperado",
xlab = "Frecuencia Observada (hi)", ylab = "Frecuencia Esperada (hi modelo)",
pch = 19, col = "#154360")
abline(lm(Fe ~ 0 + Fo), col = "red", lwd = 2)
legend("topleft", legend = paste0("r = ", round(r_pearson, 2), "%"), bty = "n")chi2_calc <- sum(((Fo - Fe)^2) / Fe)
gl <- length(Fo) - 2
chi2_crit <- qchisq(0.95, gl)
cat("Chi-Cuadrado calculado:", round(chi2_calc, 4), "\n")## Chi-Cuadrado calculado: 0.042
## Valor crítico (α=0.05, gl= 6 ): 12.5916
## ¿El modelo geométrico es aceptado?: TRUE
tabla_test <- data.frame(
Variable = "Continente (País)",
`Test Pearson (%)` = round(r_pearson, 2),
`Chi Cuadrado` = round(chi2_calc, 4),
`Umbral de Aceptación` = round(chi2_crit, 4),
Resultado = ifelse(chi2_calc < chi2_crit, "Modelo Aceptado", "Modelo Rechazado"),
check.names = FALSE
)
tabla_test %>%
gt() %>%
tab_header(title = md("**Tabla N°2: Resumen del Test de Bondad al Modelo Geométrico**")) %>%
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",
column_labels.border.top.color = "black",
column_labels.border.bottom.color = "black",
column_labels.border.bottom.width = px(2),
table_body.border.bottom.color = "black"
)| Tabla N°2: Resumen del Test de Bondad al Modelo Geométrico | ||||
| Variable | Test Pearson (%) | Chi Cuadrado | Umbral de Aceptación | Resultado |
|---|---|---|---|---|
| Continente (País) | 98.65 | 0.042 | 12.5916 | Modelo Aceptado |
| Autor: Grupo 5 | ||||
Al haber sido estimado el parámetro p directamente desde las frecuencias observadas, la probabilidad del modelo (hi_modelo) resulta prácticamente igual a la proporción observada (hi) de cada continente.
cat(sprintf("P(Continente = '%s') según el modelo = %.2f%% (observado = %.2f%%)\n",
conteo_modelo$Continente[1], conteo_modelo$hi_modelo_pct[1], conteo_modelo$hi_pct[1]))## P(Continente = 'América del Norte') según el modelo = 50.73% (observado = 55.25%)
top2_modelo <- sum(conteo_modelo$hi_modelo_pct[1:2])
cat(sprintf("P(Continente pertenece a los 2 más frecuentes) según el modelo = %.2f%%\n", top2_modelo))## P(Continente pertenece a los 2 más frecuentes) según el modelo = 75.82%
Se calcula el intervalo de confianza al 95% para la proporción del continente más frecuente, usando la aproximación normal para proporciones.
p_hat <- conteo$hi[1]
continente_frecuente <- conteo$Continente[1]
z <- qnorm(0.975)
margen <- z * sqrt(p_hat * (1 - p_hat) / n)
ic_inf <- p_hat - margen
ic_sup <- p_hat + margen
cat("Continente más frecuente:", continente_frecuente, "\n")## Continente más frecuente: América del Norte
cat("Intervalo de confianza al 95%: (",
round(ic_inf * 100, 2), "% ,", round(ic_sup * 100, 2), "% )\n")## Intervalo de confianza al 95%: ( 54.81 % , 55.69 % )
Tras agrupar la variable País por continente, la categoría América del Norte concentra el 55.25% de los yacimientos registrados. Al ajustar un modelo Geométrico (con parámetro 0.5055 estimado por método de momentos), se obtuvo un Chi-cuadrado de 0.042 frente a un valor crítico de 12.5916, por lo que el modelo es aceptado, con una correlación de Pearson del 98.65%. El intervalo de confianza al 95% para la categoría más frecuente (América del Norte) se ubica entre 54.81% y 55.69%.