1.Carga de Datos y Librerías

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

2.Extracción de Variable Aleatoria

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)

3.Tabla de Distribución de Frecuencias

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

4.Análisis Gráfico

4.1 Diagrama de Barras — Frecuencia Absoluta

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"))

4.2 Diagrama de Barras — Frecuencia Relativa (Pi)

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"))


5.Conjetura de Modelo Geométrico

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

5.1 Gráfica comparativa observado vs modelo

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"
  )


6.Test de bondad

6.1 Test de Pearson

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%)

6.2 Test Chi-Cuadrado

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 resumen del test

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

7.Cálculo de probabilidades

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 %

8.Intervalo de confianza

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 % )

9.Conclusión

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%.