library(readr); library(dplyr); library(gt)
cat("Librerías cargadas correctamente.\n")
## Librerías cargadas correctamente.
ruta_csv <- file.choose()
datos <- read_csv(ruta_csv, show_col_types = FALSE)
cat("Archivo:", basename(ruta_csv), "| Filas:", nrow(datos), "\n")
## Archivo: oil_and_gas_leases_data (2).csv | Filas: 47757
A diferencia de una variable cuantitativa continua (donde se agrupa
en intervalos vía Sturges), el Estado Operacional
(LIFE_STAGE) es una variable cualitativa
ordinal: sus categorías tienen un orden natural
(NEW < MATURE < OLD) pero
no son numéricas. Se les asigna un código de orden (Asignación) 1, 2,
3.
niveles_orden <- c("NEW", "MATURE", "OLD")
x_raw <- datos %>%
mutate(ESTADO = factor(LIFE_STAGE, levels = niveles_orden, ordered = TRUE)) %>%
filter(!is.na(ESTADO)) %>%
pull(ESTADO)
n_conteo <- length(x_raw)
k_niveles <- length(niveles_orden)
cat("Observaciones válidas:", n_conteo, "\n")
## Observaciones válidas: 47757
cat("Categorías (orden natural):", k_niveles, "\n")
## Categorías (orden natural): 3
cat("Niveles:", paste(niveles_orden, collapse = " < "), "\n")
## Niveles: NEW < MATURE < OLD
x <- x_raw
n <- length(x)
freq_abs <- as.integer(table(x))
hi_dec <- freq_abs / n
asignacion <- seq_along(niveles_orden)
data.frame(Asignacion = asignacion, Categoria = niveles_orden,
ni = freq_abs, hi_pct = round(hi_dec * 100, 2),
stringsAsFactors = FALSE) %>%
gt() %>%
tab_header(title = md("**TABLA N\u00b0 1: DISTRIBUCIÓN DE FRECUENCIAS DEL ESTADO OPERACIONAL**")) %>%
cols_label(Asignacion = md("**Asignación**"), Categoria = md("**Estado Operacional**"),
ni = md("**ni**"), hi_pct = md("**hi (%)**")) %>%
tab_style(style = cell_text(color = "#1565C0", weight = "bold"),
locations = cells_body(columns = Asignacion)) %>%
tab_style(style = cell_text(color = "#C2185B", weight = "bold"),
locations = cells_body(columns = Categoria)) %>%
cols_align(align = "center", columns = c(Asignacion, ni, hi_pct)) %>%
cols_align(align = "left", columns = Categoria) %>%
tab_source_note(source_note = md("*Autor: Fernando Almeida*")) %>%
tab_options(table.width = pct(100), table.font.size = px(13), data_row.padding = px(6))
| TABLA N° 1: DISTRIBUCIÓN DE FRECUENCIAS DEL ESTADO OPERACIONAL | |||
| Asignación | Estado Operacional | ni | hi (%) |
|---|---|---|---|
| 1 | NEW | 11615 | 24.32 |
| 2 | MATURE | 20939 | 43.84 |
| 3 | OLD | 15203 | 31.83 |
| Autor: Fernando Almeida | |||
grises <- gray(seq(0.30, 0.75, length.out = k_niveles))
par(mar = c(5, 6, 6, 2))
bp <- barplot(hi_dec, names.arg = niveles_orden, col = grises, border = "black",
las = 1, ylim = c(0, max(hi_dec) * 1.2), ylab = "", xlab = "")
mtext("Frecuencia Relativa (hi)", side = 2, line = 4.2, cex = 1)
mtext("Estado Operacional", side = 1, line = 3, cex = 1)
mtext("Distribución del Estado Operacional", side = 3, line = 1.5, cex = 1, font = 2)
text(bp, hi_dec, labels = paste0(round(hi_dec * 100, 2), "%"), pos = 3, cex = 0.9)
El Estado Operacional no decae monótonamente (MATURE es
la categoría más frecuente, no NEW), por lo que un modelo
Geométrico no era adecuado. La forma observada — baja, alta, media —
corresponde mejor a un modelo Binomial, interpretando
cada pozo como si hubiera “superado” 0, 1 o 2 transiciones de vida
(NEW=0, MATURE=1, OLD=2) de un
total de \(n=2\) ensayos:
\[P(X = k) = \binom{2}{k} p^{k} (1-p)^{2-k} \,, \quad k = 0, 1, 2\]
El parámetro \(p\) se estima por Máxima Verosimilitud: \(\hat{p} = \bar{k}/2\), donde \(\bar{k}\) es el código promedio observado (0, 1 o 2).
k_bin <- asignacion - 1 # recodifica 1,2,3 -> 0,1,2
k_media <- sum(k_bin * freq_abs) / n
p_hat <- k_media / 2
p_binomial <- dbinom(0:2, size = 2, prob = p_hat)
names(p_binomial) <- niveles_orden
cat("Código promedio (k_barra):", round(k_media, 4), "\n")
## Código promedio (k_barra): 1.0751
cat("p estimado (MLE):", round(p_hat, 4), "\n")
## p estimado (MLE): 0.5376
data.frame(Categoria = niveles_orden,
p_H0 = round(p_binomial, 4),
p_observada = round(hi_dec, 4))
## Categoria p_H0 p_observada
## NEW NEW 0.2138 0.2432
## MATURE MATURE 0.4972 0.4384
## OLD OLD 0.2890 0.3183
Se valida el modelo con dos criterios, igual que en los archivos de
zonas geográficas: la correlación de Pearson entre las
frecuencias observadas y las teóricas, y una prueba Chi-Cuadrado
de Bondad de Ajuste. Dado el tamaño muestral tan grande (\(n=\) 47,757), el Chi-Cuadrado sobre la
población completa rechaza cualquier modelo ante la mínima desviación
(es hipersensible con \(n\) grande);
por eso, siguiendo la misma convención usada para la prueba K-S en el
archivo de Longitud (n_samp), el Chi-Cuadrado se aplica
sobre una submuestra aleatoria representativa.
# Correlación de Pearson entre hi observado y p teórico (modelo Binomial)
pearson_r <- cor(hi_dec, p_binomial) * 100
# Chi-Cuadrado sobre submuestra (p_hat ya estimado con la población completa,
# por lo que no se resta grado de libertad adicional: GL = k - 1)
set.seed(42)
n_samp <- 100
muestra <- sample(x, size = n_samp, replace = FALSE)
freq_samp <- as.integer(table(factor(muestra, levels = niveles_orden)))
prueba_chi <- chisq.test(x = freq_samp, p = p_binomial)
chi_stat <- unname(prueba_chi$statistic)
chi_gl <- unname(prueba_chi$parameter)
chi_pval <- prueba_chi$p.value
val_pearson <- ifelse(pearson_r > 70, "APROBADO", "RECHAZADO")
val_chi <- ifelse(chi_pval > 0.05, "APROBADO", "RECHAZADO")
bind_rows(
data.frame(Prueba = "Correlación de Pearson (hi vs. p teórico)",
Estadistico = round(pearson_r, 2), GL = NA_integer_,
p_valor = NA_real_, Validacion = val_pearson, stringsAsFactors = FALSE),
data.frame(Prueba = paste0("Chi-Cuadrado (submuestra n=", n_samp, ")"),
Estadistico = round(chi_stat, 4), GL = chi_gl,
p_valor = round(chi_pval, 4), Validacion = val_chi, stringsAsFactors = FALSE)
) %>%
gt() %>%
tab_header(
title = md("**Tabla N\u00b0 2: Validación de la Conjetura (Modelo Binomial)**"),
subtitle = md(paste0("*p\u0302 = ", round(p_hat, 4), " — Estado Operacional*"))
) %>%
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 = "darkgreen", weight = "bold"),
locations = cells_body(columns = Validacion, rows = Validacion == "APROBADO")) %>%
tab_style(style = cell_text(color = "darkred", 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: Fernando Almeida*")) %>%
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 Binomial) | ||||
| p̂ = 0.5376 — Estado Operacional | ||||
| Prueba | Estadístico | G.L. | p-valor | Validación |
|---|---|---|---|---|
| Correlación de Pearson (hi vs. p teórico) | 99.1200 | - | - | APROBADO |
| Chi-Cuadrado (submuestra n=100) | 1.2686 | 2 | 0.5303 | APROBADO |
| Autor: Fernando Almeida | ||||
A diferencia de una variable continua (donde el Intervalo de
Confianza estima una media poblacional vía TLC), en una
variable cualitativa el parámetro poblacional de interés es una
proporción. Se estima la proporción de pozos en estado
OLD, por ser la categoría de mayor relevancia operativa
(pozos al final de su vida útil):
\[P(\hat{p} - E < p < \hat{p} + E) \approx 95\%\]
\[E = z \sqrt{\frac{\hat{p}(1-\hat{p})}{n}}\]
categoria_interes <- "OLD"
p_hat_ic <- hi_dec[niveles_orden == categoria_interes]
n_total <- n
z_95 <- 1.96
error_est <- sqrt(p_hat_ic * (1 - p_hat_ic) / n_total)
margen <- z_95 * error_est
lim_inf_ic <- max(0, p_hat_ic - margen)
lim_sup_ic <- min(1, p_hat_ic + margen)
data.frame(
Parametro = paste0("Proporción Estado '", categoria_interes, "'"),
Lim_Inferior = round(lim_inf_ic, 4),
Proporcion_Muestral = round(p_hat_ic, 4),
Lim_Superior = round(lim_sup_ic, 4),
Error_Estandar = paste0("+/- ", round(margen, 4)),
Confianza = "95% (Z=1.96)",
stringsAsFactors = FALSE
) %>%
gt() %>%
tab_header(
title = md("**TABLA N\u00b0 3: ESTIMACIÓN DE LA PROPORCIÓN POBLACIONAL**"),
subtitle = md("*Inferencia Estadística para el Estado Operacional*")
) %>%
cols_label(
Parametro = md("**Parámetro**"),
Lim_Inferior = md("**Lim_Inferior**"),
Proporcion_Muestral = md("**Proporción_Muestral**"),
Lim_Superior = md("**Lim_Superior**"),
Error_Estandar = md("**Error_Estándar**"),
Confianza = md("**Confianza**")
) %>%
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 = list(cell_fill(color = "#C8E6C9"), cell_text(weight = "bold")),
locations = cells_body(columns = Proporcion_Muestral)) %>%
tab_style(style = cell_borders(sides = "bottom", color = "#E0E0E0", weight = px(1)),
locations = cells_body(rows = everything())) %>%
cols_align(align = "center", columns = c(Lim_Inferior, Proporcion_Muestral, Lim_Superior, Error_Estandar, Confianza)) %>%
cols_align(align = "left", columns = Parametro) %>%
tab_source_note(source_note = md("*Autor: Fernando Almeida*")) %>%
tab_options(table.width = pct(100), 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° 3: ESTIMACIÓN DE LA PROPORCIÓN POBLACIONAL | |||||
| Inferencia Estadística para el Estado Operacional | |||||
| Parámetro | Lim_Inferior | Proporción_Muestral | Lim_Superior | Error_Estándar | Confianza |
|---|---|---|---|---|---|
| Proporción Estado 'OLD' | 0.3142 | 0.3183 | 0.3225 | +/- 0.0042 | 95% (Z=1.96) |
| Autor: Fernando Almeida | |||||
Se trabajó con la variable cualitativa ordinal Estado
Operacional (LIFE_STAGE), con categorías NEW <
MATURE < OLD codificadas como Asignación 1, 2, 3, sobre un total de
47,757 observaciones. La distribución observada fue:
NEW (24.32%), MATURE (43.84%), OLD (31.83%). Se conjeturó un modelo
Binomial (\(n=2\)) con
\(\hat{p}=\) 0.5376, validado mediante
dos criterios: la correlación de Pearson entre frecuencias observadas y
teóricas, que resultó de 99.12% (APROBADO), y la prueba
Chi-Cuadrado de Bondad de Ajuste sobre una submuestra de tamaño 100, que
obtuvo un estadístico de 1.2686 con 2 grado(s) de libertad y un p-valor
de 0.5303 (APROBADO). Adicionalmente, se estimó con 95%
de confianza que la proporción poblacional de pozos en estado OLD se
encuentra entre 31.42% y 32.25%.
Autor: Fernando Almeida — Análisis Estadístico, Kansas Hydrocarbon Leases Dataset