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