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
Es una variable cualitativa ordinal:
LIFE_STAGE tiene un orden natural (NEW <
MATURE < OLD) pero no es numérica. Se le
asigna un código de orden (Asignación) 0, 1, 2.
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 <- 0:(k_niveles - 1)
data.frame(Codigo = asignacion, Categoria = niveles_orden,
ni = freq_abs, hi_pct = round(hi_dec * 100, 2)) %>%
gt() %>%
tab_header(title = md("**TABLA N\u00b0 1: DISTRIBUCIÓN DE FRECUENCIAS DE LA ETAPA DE VIDA**")) %>%
cols_label(Codigo = md("**Código**"), Categoria = md("**Etapa de Vida**"),
ni = md("**ni**"), hi_pct = md("**hi (%)**")) %>%
tab_style(style = cell_text(color = "gray20", weight = "bold"),
locations = cells_body(columns = c(Codigo, Categoria))) %>%
cols_align(align = "center", columns = c(Codigo, ni, hi_pct)) %>%
tab_source_note(source_note = md("*Autor: Fernando Almeida*"))
| TABLA N° 1: DISTRIBUCIÓN DE FRECUENCIAS DE LA ETAPA DE VIDA | |||
| Código | Etapa de Vida | ni | hi (%) |
|---|---|---|---|
| 0 | NEW | 11615 | 24.32 |
| 1 | MATURE | 20939 | 43.84 |
| 2 | 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 = etiquetas_grafico, col = grises, border = "black",
las = 1, ylim = c(0, max(hi_dec) * 1.2), ylab = "", xlab = "")
mtext("Probabilidad", side = 2, line = 4.2, cex = 1)
mtext("Etapa de Vida", side = 1, line = 3, cex = 1)
mtext("Distribución de la Etapa de Vida", 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)
comparacion <- rbind(Observado = hi_dec, Poisson = p_poisson,
Geometrico = p_geom, Binomial = p_binomial)
par(mar = c(5, 6, 6, 2))
bp2 <- barplot(comparacion, beside = TRUE,
col = gray(seq(0.20, 0.80, length.out = 4)),
border = "black", las = 1,
names.arg = etiquetas_grafico,
ylim = c(0, max(comparacion) * 1.25),
ylab = "", xlab = "")
mtext("Probabilidad", side = 2, line = 4.2, cex = 1)
mtext("Etapa de Vida", side = 1, line = 3, cex = 1)
mtext("Frecuencia Observada en función de los Modelos Teóricos", side = 3, line = 1.5, cex = 1, font = 2)
legend("topright", legend = rownames(comparacion),
fill = gray(seq(0.20, 0.80, length.out = 4)), bty = "n", cex = 0.9)
Nota: entre más parecida la altura de cada barra teórica a la barra observada, mejor el ajuste del modelo.
Se conjeturan tres modelos de conteo sobre el código de Etapa de Vida:
Los tres parámetros se estiman a partir del código promedio observado (\(\bar{k}=\) 1.0751).
data.frame(Categoria = niveles_orden,
p_Poisson = round(p_poisson, 4),
p_Geometrico = round(p_geom, 4),
p_Binomial = round(p_binomial, 4),
p_observada = round(hi_dec, 4))
## Categoria p_Poisson p_Geometrico p_Binomial p_observada
## 1 NEW 0.3769 0.5597 0.2138 0.2432
## 2 MATURE 0.4052 0.2900 0.4972 0.4384
## 3 OLD 0.2178 0.1503 0.2890 0.3183
Se valida cada modelo con dos criterios: la correlación de Pearson entre las frecuencias observadas y las teóricas, y una prueba Chi-Cuadrado de Bondad de Ajuste sobre una submuestra aleatoria, dado que el tamaño muestral completo es demasiado grande para esta prueba.
pearson_poisson <- cor(hi_dec, p_poisson) * 100
pearson_geom <- cor(hi_dec, p_geom) * 100
pearson_binom <- cor(hi_dec, p_binomial) * 100
set.seed(42)
n_samp <- 100
muestra <- sample(asignacion[match(x, niveles_orden)], size = n_samp, replace = FALSE)
freq_samp <- as.integer(table(factor(muestra, levels = asignacion)))
chi_poisson <- chisq.test(x = freq_samp, p = p_poisson)
chi_geom <- chisq.test(x = freq_samp, p = p_geom)
chi_binom <- chisq.test(x = freq_samp, p = p_binomial)
val <- function(r) ifelse(r > 70, "APROBADO", "RECHAZADO")
bind_rows(
data.frame(Modelo = "Poisson", Pearson = round(pearson_poisson, 2),
Chi = round(unname(chi_poisson$statistic), 4),
p_valor = round(chi_poisson$p.value, 4), Validacion = val(pearson_poisson)),
data.frame(Modelo = "Geométrico", Pearson = round(pearson_geom, 2),
Chi = round(unname(chi_geom$statistic), 4),
p_valor = round(chi_geom$p.value, 4), Validacion = val(pearson_geom)),
data.frame(Modelo = "Binomial", Pearson = round(pearson_binom, 2),
Chi = round(unname(chi_binom$statistic), 4),
p_valor = round(chi_binom$p.value, 4), Validacion = val(pearson_binom))
) %>%
gt() %>%
tab_header(
title = md("**Tabla N\u00b0 2: Validación de las Conjeturas**"),
subtitle = md("*Etapa de Vida — Poisson, Geométrico y Binomial*")
) %>%
cols_label(Modelo = md("**Modelo**"), Pearson = md("**Pearson (%)**"),
Chi = md("**Chi-Cuadrado**"), p_valor = md("**p-valor**"),
Validacion = md("**Validación**")) %>%
tab_style(style = list(cell_fill(color = "gray25"), cell_text(color = "white", weight = "bold")),
locations = cells_column_labels()) %>%
tab_style(style = cell_text(weight = "bold"),
locations = cells_body(columns = Validacion, rows = Validacion == "APROBADO")) %>%
tab_style(style = cell_text(color = "gray55", style = "italic"),
locations = cells_body(columns = Validacion, rows = Validacion == "RECHAZADO")) %>%
cols_align(align = "center", columns = c(Pearson, Chi, p_valor, Validacion)) %>%
tab_source_note(source_note = md("*Autor: Fernando Almeida*"))
| Tabla N° 2: Validación de las Conjeturas | ||||
| Etapa de Vida — Poisson, Geométrico y Binomial | ||||
| Modelo | Pearson (%) | Chi-Cuadrado | p-valor | Validación |
|---|---|---|---|---|
| Poisson | 26.95 | 15.8946 | 0.0004 | RECHAZADO |
| Geométrico | -54.18 | 57.0479 | 0.0000 | RECHAZADO |
| Binomial | 99.12 | 1.2686 | 0.5303 | APROBADO |
| Autor: Fernando Almeida | ||||
De los tres modelos, únicamente el Binomial logra un ajuste aceptable (Pearson > 70%); Poisson y Geométrico no reproducen bien la forma de la distribución observada.
En una variable cualitativa el parámetro poblacional de interés es
una proporción. Se estima la proporción de pozos en
etapa 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 Etapa '", 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)"
) %>%
gt() %>%
tab_header(
title = md("**TABLA N\u00b0 3: ESTIMACIÓN DE LA PROPORCIÓN POBLACIONAL**"),
subtitle = md("*Inferencia Estadística para la Etapa de Vida*")
) %>%
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 = "gray25"), cell_text(color = "white", weight = "bold")),
locations = cells_column_labels()) %>%
tab_style(style = list(cell_fill(color = "gray90"), cell_text(weight = "bold")),
locations = cells_body(columns = Proporcion_Muestral)) %>%
cols_align(align = "center", columns = c(Lim_Inferior, Proporcion_Muestral, Lim_Superior, Error_Estandar, Confianza)) %>%
tab_source_note(source_note = md("*Autor: Fernando Almeida*"))
| TABLA N° 3: ESTIMACIÓN DE LA PROPORCIÓN POBLACIONAL | |||||
| Inferencia Estadística para la Etapa de Vida | |||||
| Parámetro | Lim_Inferior | Proporción_Muestral | Lim_Superior | Error_Estándar | Confianza |
|---|---|---|---|---|---|
| Proporción Etapa 'OLD' | 0.3142 | 0.3183 | 0.3225 | +/- 0.0042 | 95% (Z=1.96) |
| Autor: Fernando Almeida | |||||
Se trabajó con la variable cualitativa ordinal Etapa de
Vida (LIFE_STAGE), con categorías NEW < MATURE
< OLD codificadas como 0, 1, 2, sobre 47,757 observaciones. Se
probaron tres modelos: Poisson (\(\hat{\lambda}=\) 1.0751),
Geométrico (\(\hat{p}=\) 0.4819) y
Binomial (\(n=\) 2,
\(\hat{p}=\) 0.5376), todos estimados a
partir del código promedio observado (\(\bar{k}=\) 1.0751). La prueba de Pearson
obtuvo 26.95%, -54.18% y 99.12% respectivamente; únicamente el modelo
Binomial fue APROBADO (Pearson >
70%). El intervalo de confianza al 95% para la proporción poblacional de
pozos en etapa OLD fue [31.42%, 32.25%], con proporción muestral 31.83%
y margen de error +/- 0.42%.
Autor: Fernando Almeida — Análisis Estadístico, Kansas Hydrocarbon Leases Dataset