library(readxl)
library(dplyr)
library(tidyr)
library(gt)
library(ggplot2)
library(scales)
datos <- read_excel("dataset_mundial_petro.xlsx")
cat("Número de registros:", nrow(datos), "\n")
## Número de registros: 8334
cat("Número de variables:", ncol(datos), "\n")
## Número de variables: 23
La variable Location accuracy indica si la ubicación registrada del yacimiento es exacta o aproximada. Es una variable binaria (2 categorías): “exact” y “approximate”. Se excluyen los registros sin dato (N/S).
n_total <- nrow(datos)
datos_loc <- datos %>% filter(!is.na(`Location accuracy`) & `Location accuracy` != "N/S")
n <- nrow(datos_loc)
cat("Registros excluidos por N/S o vacío:", n_total - n, "\n")
## Registros excluidos por N/S o vacío: 796
cat("Número de registros válidos:", n, "\n")
## Número de registros válidos: 7538
datos_loc <- datos_loc %>%
mutate(Precisión = recode(`Location accuracy`,
"exact" = "Exacta",
"approximate" = "Aproximada"
))
orden_labels <- c("Exacta", "Aproximada")
datos_loc$Precisión <- factor(datos_loc$Precisión, levels = orden_labels, ordered = TRUE)
conteo <- as.data.frame(table(datos_loc$Precisión)) %>%
rename(Estado = Var1, ni = Freq) %>%
mutate(
hi = round(ni / n, 4),
hi_pct = round(ni / n * 100, 2)
)
k <- nrow(conteo)
cat("Total de categorías:", k, "\n")
## Total de categorías: 2
cat("Categoría más frecuente:", conteo$Estado[which.max(conteo$ni)],
"con", max(conteo$ni), "registros\n")
## Categoría más frecuente: 1 con 6353 registros
cat("Categoría menos frecuente:", conteo$Estado[which.min(conteo$ni)],
"con", min(conteo$ni), "registro(s)\n")
## Categoría menos frecuente: 2 con 1185 registro(s)
fila_total <- tibble(
Estado = "TOTAL",
ni = sum(conteo$ni),
hi = sum(conteo$hi),
hi_pct = sum(conteo$hi_pct)
)
tdf_final <- bind_rows(conteo %>% mutate(Estado = as.character(Estado)), fila_total)
tdf_final %>%
gt() %>%
tab_header(
title = md("**Tabla N° 1**"),
subtitle = md("Distribución de yacimientos según precisión de ubicación")
) %>%
cols_label(
Estado = "Precisión de Ubicación",
ni = "Frecuencia (ni)",
hi = "Proporción (hi)",
hi_pct = "Porcentaje (hi%)"
) %>%
fmt_number(columns = hi, decimals = 4) %>%
fmt_number(columns = hi_pct, decimals = 2) %>%
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",
table.border.top.style = "solid",
table.border.bottom.style = "solid",
column_labels.font.weight = "bold",
column_labels.border.top.color = "black",
column_labels.border.bottom.color = "black",
column_labels.border.bottom.width = px(2),
heading.border.bottom.color = "black",
heading.border.bottom.width = px(2),
table_body.hlines.color = "grey",
table_body.border.bottom.color = "black"
)
| Tabla N° 1 | |||
| Distribución de yacimientos según precisión de ubicación | |||
| Precisión de Ubicación | Frecuencia (ni) | Proporción (hi) | Porcentaje (hi%) |
|---|---|---|---|
| Exacta | 6353 | 0.8428 | 84.28 |
| Aproximada | 1185 | 0.1572 | 15.72 |
| TOTAL | 7538 | 1.0000 | 100.00 |
| Autor: Grupo 5 | |||
colores <- c("#2E86C1", "#AED6F1")
ggplot(conteo, aes(x = Estado, y = ni, fill = Estado)) +
geom_col(width = 0.5, color = "white") +
geom_text(aes(label = ni), vjust = -0.4, size = 3.2, fontface = "bold") +
scale_x_discrete(limits = orden_labels) +
scale_fill_manual(values = colores) +
scale_y_continuous(expand = expansion(mult = c(0, 0.15))) +
labs(
title = "Gráfica N°1: Frecuencia Absoluta por Precisión de Ubicación",
x = "Precisión de Ubicación",
y = "Frecuencia (ni)",
caption = paste0("n = ", format(n, big.mark = ","), " | Fuente: GOGET")
) +
theme_minimal() +
theme(legend.position = "none",
plot.title = element_text(face = "bold"),
axis.title = element_text(face = "bold"))
ggplot(conteo, aes(x = Estado, y = hi_pct, fill = Estado)) +
geom_col(width = 0.5, color = "white") +
geom_text(aes(label = paste0(hi_pct, "%")), vjust = -0.4, size = 3.2, fontface = "bold") +
scale_x_discrete(limits = orden_labels) +
scale_fill_manual(values = colores) +
scale_y_continuous(expand = expansion(mult = c(0, 0.15))) +
labs(
title = "Gráfica N°2: Frecuencia Relativa (Pi) por Precisión de Ubicación",
x = "Precisión de Ubicación",
y = "Frecuencia Relativa (%)",
caption = paste0("n = ", format(n, big.mark = ","), " | Fuente: GOGET")
) +
theme_minimal() +
theme(legend.position = "none",
plot.title = element_text(face = "bold"),
axis.title = element_text(face = "bold"))
Con solo 2 categorías, si se estima el parámetro p desde la muestra (método de momentos, como en las demás variables), los grados de libertad quedan en \(k - 2 = 0\) y la prueba de bondad de ajuste queda indefinida — eso no se arregla con más limpieza de datos, es una consecuencia matemática de tener solo 2 categorías y estimar 1 parámetro.
La solución correcta es usar un parámetro p fijo (no estimado desde los datos): el modelo Geométrico teórico con \(p = 0.5\) (equiprobabilidad entre las dos categorías, el caso “sin sesgo”). Como ese parámetro no se estima de la muestra, no se resta un grado de libertad adicional, y quedan \(gl = k - 1 = 1\), una prueba perfectamente válida.
conteo_modelo <- conteo %>%
mutate(Estado = as.character(Estado)) %>%
arrange(desc(ni))
conteo_modelo$ID <- 1:nrow(conteo_modelo)
# Parámetro FIJO (no estimado por método de momentos), para conservar gl = k-1
p_fijo <- 0.5
cat("Parámetro fijo p =", p_fijo, "\n")
## Parámetro fijo p = 0.5
prob_geom <- p_fijo * (1 - p_fijo)^(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 %>% select(Estado, ni, hi_pct, hi_modelo_pct)
## Estado ni hi_pct hi_modelo_pct
## 1 Exacta 6353 84.28 66.67
## 2 Aproximada 1185 15.72 33.33
df_comparativo <- conteo_modelo %>%
select(Estado, 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$Estado <- factor(df_comparativo$Estado, levels = conteo_modelo$Estado)
ggplot(df_comparativo, aes(x = Estado, y = Valor, fill = Origen)) +
geom_bar(stat = "identity", position = "dodge", color = "white") +
scale_fill_manual(values = c("Modelo" = "skyblue", "Realidad" = "#2E4053")) +
theme_minimal() +
labs(
title = "Gráfica N°3: Modelo Geométrico (p fijo = 0.5) vs Realidad — Precisión de Ubicación",
subtitle = paste0("p fijo = ", p_fijo),
x = "Precisión de Ubicación (orden por frecuencia)",
y = "Probabilidad (%)",
fill = "Origen"
)
Nota metodológica: con solo 2 puntos, el coeficiente de Pearson siempre da exactamente 1 (o -1) — dos puntos cualquiera caen perfectamente sobre una línea recta, sin importar cuáles sean. No es una señal de buen ajuste del modelo, es una propiedad matemática de comparar solo 2 pares de valores. Se reporta igual, por completitud, pero no debe interpretarse como evidencia de ajuste.
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 (%): 100
cat("(Con k=2 categorías, este valor es matemáticamente forzado a ±100%)\n")
## (Con k=2 categorías, este valor es matemáticamente forzado a ±100%)
chi2_calc <- sum(((Fo - Fe)^2) / Fe)
gl <- length(Fo) - 1 # p fijo (no estimado): se resta solo 1, no 2
chi2_crit <- qchisq(0.95, gl)
cat("Chi-Cuadrado:", round(chi2_calc, 4), "\n")
## Chi-Cuadrado: 0.1396
cat("Grados de libertad:", gl, "\n")
## Grados de libertad: 1
cat("Valor Crítico:", round(chi2_crit, 4), "\n")
## Valor Crítico: 3.8415
cat("¿El modelo geométrico (p=0.5) es aceptado?:", chi2_calc < chi2_crit, "\n")
## ¿El modelo geométrico (p=0.5) es aceptado?: TRUE
tabla_test <- data.frame(
Variable = "Precisión de Ubicación",
`Test Pearson (%)`= round(r_pearson, 2),
`Chi Cuadrado` = round(chi2_calc, 4),
`Umbral de Aceptación` = round(chi2_crit, 2),
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 de Probabilidad**")
) %>%
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 de Probabilidad | ||||
| Variable | Test Pearson (%) | Chi Cuadrado | Umbral de Aceptación | Resultado |
|---|---|---|---|---|
| Precisión de Ubicación | 100 | 0.1396 | 3.84 | Modelo Aceptado |
| Autor: Grupo 5 | ||||
prob_exacta <- conteo$hi_pct[conteo$Estado == "Exacta"]
cat("Probabilidad de que la ubicación de un yacimiento sea 'Exacta':", prob_exacta, "%\n")
## Probabilidad de que la ubicación de un yacimiento sea 'Exacta': 84.28 %
prob_aprox <- conteo$hi_pct[conteo$Estado == "Aproximada"]
cat("Probabilidad de que la ubicación de un yacimiento sea 'Aproximada':", prob_aprox, "%\n")
## Probabilidad de que la ubicación de un yacimiento sea 'Aproximada': 15.72 %
Se calcula el intervalo de confianza al 95% para la proporción de la categoría más frecuente, usando la aproximación normal para proporciones.
idx_max <- which.max(conteo$hi)
p_hat_ic <- conteo$hi[idx_max]
categoria_frecuente <- as.character(conteo$Estado[idx_max])
z <- qnorm(0.975)
margen <- z * sqrt(p_hat_ic * (1 - p_hat_ic) / n)
ic_inf <- p_hat_ic - margen
ic_sup <- p_hat_ic + margen
cat("Categoría más frecuente:", categoria_frecuente, "\n")
## Categoría más frecuente: Exacta
cat("Intervalo de confianza al 95%: (",
round(ic_inf * 100, 2), "% ,", round(ic_sup * 100, 2), "% )\n")
## Intervalo de confianza al 95%: ( 83.46 % , 85.1 % )
La variable Location accuracy muestra que la categoría Exacta concentra 84.28% de los registros. Debido a que solo tiene 2 categorías, el modelo Geométrico se ajustó con un parámetro fijo p = 0.5 (no estimado desde la muestra), para conservar 1 grado de libertad válido. El test de Chi-cuadrado dio 0.1396 frente a un valor crítico de 3.8415 (gl = 1), por lo que el modelo es aceptado. La correlación de Pearson (100%) no se interpreta como evidencia de ajuste, ya que con 2 categorías es matemáticamente forzada. El intervalo de confianza al 95% para la categoría más frecuente se ubica entre 83.46% y 85.1%.