1. Cargar Librerías

suppressMessages(suppressWarnings({
  library(readr)
  library(dplyr)
  library(gt)
}))
cat("Librerías cargadas correctamente.\n")
## Librerías cargadas correctamente.

Este documento usa librerías para lectura de datos, depuración, tablas y presentación en HTML.

2. Cargar Datos

ruta_archivo <- file.choose()

primera_linea    <- readLines(ruta_archivo, n = 1)
n_punto_coma     <- lengths(regmatches(primera_linea, gregexpr(";", primera_linea)))
n_coma           <- lengths(regmatches(primera_linea, gregexpr(",", primera_linea)))
delim_detectado  <- ifelse(n_punto_coma >= n_coma, ";", ",")

datos_vale <- read_delim(ruta_archivo, delim = delim_detectado, show_col_types = FALSE)

cat("Archivo:", basename(ruta_archivo), "\n")
## Archivo: oil_and_gas_leases_data.csv.csv
cat("Delimitador detectado:", delim_detectado, "\n")
## Delimitador detectado: ,
cat("Total de registros:", nrow(datos_vale), "| Total de columnas:", ncol(datos_vale), "\n")
## Total de registros: 47757 | Total de columnas: 24
nombre_col <- names(datos_vale)[toupper(trimws(names(datos_vale))) == "PRODUCING_FORMATION"]

if (length(nombre_col) == 0) {
  stop("No se encontr\u00f3 la columna 'PRODUCING_FORMATION' en el archivo cargado. Columnas disponibles: ",
       paste(names(datos_vale), collapse = ", "))
}

names(datos_vale)[names(datos_vale) == nombre_col] <- "PRODUCING_FORMATION"
cat("Columna 'PRODUCING_FORMATION' localizada correctamente.\n")
## Columna 'PRODUCING_FORMATION' localizada correctamente.

La base corresponde a registros de arrendamientos de hidrocarburos del estado de Kansas, EE.UU.

3. Conteo

La variable analizada es Formación Productora (PRODUCING_FORMATION). Es una variable cualitativa nominal con muchas categorías distintas (nombres de formaciones geológicas), sin ningún orden natural entre ellas. Para poder analizarla, se agrupan las 10 categorías más frecuentes y el resto se agrupa en una categoría “Otros” — una práctica estándar cuando una nominal tiene demasiadas categorías para tratarlas una por una.

Criterio Clasificación
Nombre de la variable Formación Productora
Nombre técnico PRODUCING_FORMATION
Tipo Cualitativa nominal policotómica
Dominio Nombres de formaciones geológicas productoras
Unidad No aplica
Escala Nominal
x_raw <- datos_vale %>%
  filter(!is.na(PRODUCING_FORMATION), trimws(PRODUCING_FORMATION) != "") %>%
  pull(PRODUCING_FORMATION)

x_raw <- trimws(as.character(x_raw))
x_raw <- x_raw[!is.na(x_raw) & x_raw != ""]

n <- length(x_raw)
freq_total <- sort(table(x_raw), decreasing = TRUE)
top_k <- 10

if (is.finite(top_k) && length(freq_total) > top_k) {
  principales <- names(head(freq_total, top_k))
  x_analisis <- ifelse(x_raw %in% principales, x_raw, "Otros")
} else {
  x_analisis <- x_raw
}

freq_analisis <- sort(table(x_analisis), decreasing = TRUE)
analisis_df <- data.frame(
  Categoria = names(freq_analisis),
  Frecuencia_ni = as.integer(freq_analisis),
  Porcentaje_hi = as.numeric(freq_analisis) / sum(freq_analisis) * 100,
  stringsAsFactors = FALSE
)

cat("Observaciones válidas:", n, "\n")
## Observaciones válidas: 47756
cat("Número de formaciones distintas:", length(unique(x_raw)), "\n")
## Número de formaciones distintas: 313
cat("Categorías usadas en el modelo:", nrow(analisis_df), "\n")
## Categorías usadas en el modelo: 11

4. Tabla de Distribución de Frecuencias

tabla_frecuencia <- analisis_df %>%
  mutate(Porcentaje_hi = round(Porcentaje_hi, 2),
         Fraccion_hi = round(Frecuencia_ni / sum(Frecuencia_ni), 4))

tabla_total <- data.frame(Categoria = "TOTAL",
                           Frecuencia_ni = sum(tabla_frecuencia$Frecuencia_ni),
                           Fraccion_hi = 1,
                           Porcentaje_hi = 100)

tabla_presentacion <- bind_rows(tabla_frecuencia, tabla_total)

tabla_presentacion %>%
  select(Categoria, Frecuencia_ni, Fraccion_hi, Porcentaje_hi) %>%
  gt() %>%
  tab_header(title = md("**Tabla N\u00b0 1: Distribuci\u00f3n de Frecuencias de la Formaci\u00f3n Productora (Top 10 + Otros)**")) %>%
  cols_label(Categoria = md("**Formación Productora**"), Frecuencia_ni = md("**Frecuencia absoluta (ni)**"),
             Fraccion_hi = md("**Frecuencia relativa (hi)**"), Porcentaje_hi = md("**Porcentaje (%)**")) %>%
  tab_style(style = cell_borders(sides = "bottom", color = "#333333", weight = px(2)),
            locations = cells_column_labels()) %>%
  tab_style(style = cell_borders(sides = "bottom", color = "#eeeeee", weight = px(1)),
            locations = cells_body(rows = everything())) %>%
  tab_style(style = cell_text(weight = "bold"),
            locations = cells_body(rows = Categoria == "TOTAL")) %>%
  cols_align(align = "center", columns = c(Frecuencia_ni, Fraccion_hi, Porcentaje_hi)) %>%
  cols_align(align = "left",   columns = Categoria) %>%
  tab_source_note(source_note = md("*Autor: Valeska Araujo*")) %>%
  tab_options(table.width = pct(100), table.font.size = px(13), data_row.padding = px(9),
              table.border.top.style = "hidden", table.border.bottom.style = "hidden",
              column_labels.border.top.style = "hidden")
Tabla N° 1: Distribución de Frecuencias de la Formación Productora (Top 10 + Otros)
Formación Productora Frecuencia absoluta (ni) Frecuencia relativa (hi) Porcentaje (%)
UNKNOWN 32073 0.6716 67.16
Otros 4125 0.0864 8.64
Mississippian System 3351 0.0702 7.02
Chase Group 2053 0.0430 4.30
Arbuckle Group 1963 0.0411 4.11
Lansing Group 1509 0.0316 3.16
Kansas City Group 696 0.0146 1.46
Council Grove Group 559 0.0117 1.17
Upper Kearny Member 559 0.0117 1.17
Bevier Coal Bed 555 0.0116 1.16
Marmaton Group 313 0.0066 0.66
TOTAL 47756 1.0000 100.00
Autor: Valeska Araujo

5. Gráficos

op <- par(mar = c(10, 6, 5, 2))
bp <- barplot(tabla_frecuencia$Frecuencia_ni, names.arg = tabla_frecuencia$Categoria, las = 2,
              col = gray(seq(0.25, 0.80, length.out = nrow(tabla_frecuencia))), border = "black",
              ylim = c(0, max(tabla_frecuencia$Frecuencia_ni) * 1.18), main = "", xlab = "", ylab = "")
text(bp, tabla_frecuencia$Frecuencia_ni, labels = tabla_frecuencia$Frecuencia_ni, pos = 3, cex = 0.75)
mtext("Frecuencia absoluta (ni)", side = 2, line = 4)
mtext("Formación Productora", side = 1, line = 8)
mtext("Distribución de frecuencia absoluta - Formación Productora", side = 3, line = 2, font = 2)

par(op)
op <- par(mar = c(10, 6, 5, 2))
bp <- barplot(tabla_frecuencia$Porcentaje_hi, names.arg = tabla_frecuencia$Categoria, las = 2,
              col = gray(seq(0.25, 0.80, length.out = nrow(tabla_frecuencia))), border = "black",
              ylim = c(0, max(tabla_frecuencia$Porcentaje_hi) * 1.18), main = "", xlab = "", ylab = "")
text(bp, tabla_frecuencia$Porcentaje_hi, labels = paste0(tabla_frecuencia$Porcentaje_hi, "%"), pos = 3, cex = 0.75)
mtext("Porcentaje (hi %)", side = 2, line = 4)
mtext("Formación Productora", side = 1, line = 8)
mtext("Distribución porcentual - Formación Productora", side = 3, line = 2, font = 2)

par(op)
op <- par(mar = c(2, 2, 5, 11), xpd = TRUE)
colores <- gray(seq(0.20, 0.85, length.out = nrow(tabla_frecuencia)))
pie(tabla_frecuencia$Porcentaje_hi, labels = paste0(tabla_frecuencia$Porcentaje_hi, "%"), col = colores, border = "black", main = "")
legend("right", inset = c(-0.45, 0), legend = tabla_frecuencia$Categoria, fill = colores, cex = 0.75, bty = "n")
mtext("Distribución porcentual - Formación Productora", side = 3, line = 2, font = 2)

par(op)
matriz_comparacion <- rbind(Realidad = observados, Modelo = esperados)

op <- par(mar = c(10, 6, 5, 2))
barplot(matriz_comparacion, beside = TRUE, names.arg = tabla_frecuencia$Categoria, las = 2,
        col = c("gray25", "gray75"), border = "black",
        ylim = c(0, max(matriz_comparacion) * 1.18), main = "", xlab = "", ylab = "")
legend("topright", legend = rownames(matriz_comparacion), fill = c("gray25", "gray75"), bty = "n")
mtext("Frecuencia", side = 2, line = 4)
mtext("Formación Productora", side = 1, line = 8)
mtext("Realidad observada frente al modelo uniforme - Formación Productora", side = 3, line = 2, font = 2)

par(op)

Nota: en el último gráfico, barras grises oscuras = frecuencia real observada; barras grises claras = frecuencia esperada bajo el modelo Uniforme (misma frecuencia esperada para cada categoría). Entre más distintas las alturas de cada par, mayor evidencia de concentración de la producción.

6. Conjetura

Se plantea como conjetura estadística que la distribución de Formación Productora no es uniforme. Es decir, algunas categorías concentran una proporción mayor de registros que otras.

Hipótesis nula (H0): todas las categorías usadas en el análisis tienen la misma probabilidad de ocurrencia.

Hipótesis alternativa (H1): al menos una categoría presenta una probabilidad diferente.

7. Test

Se valida el modelo con dos criterios: el estadístico Pearson X2 y una prueba Chi-Cuadrado de Bondad de Ajuste, ambos calculados sobre las categorías usadas en el análisis (n = 47756).

test_chi   <- chisq.test(x = observados, p = rep(1 / length(observados), length(observados)))
pearson_x2 <- sum((observados - esperados)^2 / esperados)

chi_stat <- unname(test_chi$statistic)
chi_gl   <- unname(test_chi$parameter)
chi_pval <- test_chi$p.value

val_pearson <- ifelse(pearson_x2 < chi_gl * 2, "APROBADO", "RECHAZADO")
val_chi     <- ifelse(chi_pval > 0.05, "APROBADO", "RECHAZADO")

data.frame(
  Prueba      = c("Pearson X2", "Chi-cuadrado de bondad de ajuste"),
  Estadistico = c(round(pearson_x2, 4), round(chi_stat, 4)),
  GL          = c(length(observados) - 1, chi_gl),
  p_valor     = c(NA_real_, round(chi_pval, 6)),
  Validacion  = c(val_pearson, val_chi),
  stringsAsFactors = FALSE
) %>%
  gt() %>%
  tab_header(
    title    = md("**Tabla N\u00b0 2: Validación de la Conjetura (Modelo Uniforme)**"),
    subtitle = md("*Formación Productora (Top 10 + Otros)*")
  ) %>%
  cols_label(Prueba = md("**Prueba**"), Estadistico = md("**Estadístico**"),
             GL = md("**G.L.**"), p_valor = md("**p-valor**"), Validacion = md("**Validación**")) %>%
  tab_style(style = list(cell_fill(color = "#2C2C2C"), cell_text(color = "white", weight = "bold")),
            locations = cells_column_labels()) %>%
  tab_style(style = list(cell_fill(color = "#2C2C2C"), cell_text(color = "white", weight = "bold")),
            locations = cells_title(groups = "title")) %>%
  tab_style(style = cell_text(color = "#000000", weight = "bold"),
            locations = cells_body(columns = Validacion, rows = Validacion == "APROBADO")) %>%
  tab_style(style = cell_text(color = "#8A8A8A", weight = "bold"),
            locations = cells_body(columns = Validacion, rows = Validacion == "RECHAZADO")) %>%
  cols_align(align = "center", columns = c(Estadistico, GL, p_valor, Validacion)) %>%
  cols_align(align = "left",   columns = Prueba) %>%
  fmt_missing(columns = everything(), missing_text = "-") %>%
  tab_source_note(source_note = md("*Autor: Valeska Araujo*")) %>%
  tab_options(table.width = pct(90), table.font.size = px(13),
              heading.title.font.size = px(16), heading.subtitle.font.size = px(12),
              data_row.padding = px(6),
              column_labels.border.top.width = px(2),
              column_labels.border.bottom.width = px(2),
              table_body.border.bottom.width = px(2),
              table.border.top.style = "hidden", table.border.bottom.style = "hidden")
Tabla N° 2: Validación de la Conjetura (Modelo Uniforme)
Formación Productora (Top 10 + Otros)
Prueba Estadístico G.L. p-valor Validación
Pearson X2 198424.8 10 - RECHAZADO
Chi-cuadrado de bondad de ajuste 198424.8 10 0 RECHAZADO
Autor: Valeska Araujo

Con un nivel de significancia de 0.05, si el valor p es menor que 0.05 se rechaza H0 y se concluye que la variable no sigue una distribución uniforme.

8. Conclusiones

Se trabajó con la variable cualitativa nominal Formación Productora (PRODUCING_FORMATION), agrupada en sus 10 categorías más frecuentes más “Otros” (313 formaciones distintas en total). La categoría con mayor presencia es UNKNOWN, con una frecuencia de 32,073 registros y una proporción de 67.16%. Se conjeturó un modelo Uniforme Discreto; al realizar la prueba de bondad de ajuste se obtuvo un estadístico Chi-Cuadrado de 1.9842481^{5} con 10 grado(s) de libertad y un p-valor de 0, lo que demuestra que no hay un reparto uniforme entre formaciones (la producción está concentrada en pocas formaciones).


Autor: Valeska Araujo — Análisis Estadístico, Kansas Hydrocarbon Leases Dataset