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:
DEPTH_LEVEL tiene un orden natural (SHALLOW
< MEDIUM < DEEP) pero no es numérica. Se
le asigna un código de orden (Asignación) 1, 2, 3.
niveles_orden <- c("SHALLOW", "MEDIUM", "DEEP")
x_raw <- datos %>%
mutate(ESTADO = factor(DEPTH_LEVEL, 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: SHALLOW < MEDIUM < DEEP
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)) %>%
gt() %>%
tab_header(title = md("**TABLA N\u00b0 1: DISTRIBUCIÓN DE FRECUENCIAS DEL NIVEL DE PROFUNDIDAD**")) %>%
cols_label(Asignacion = md("**Asignación**"), Categoria = md("**Nivel de Profundidad**"),
ni = md("**ni**"), hi_pct = md("**hi (%)**")) %>%
tab_style(style = cell_text(color = "gray20", weight = "bold"),
locations = cells_body(columns = c(Asignacion, Categoria))) %>%
cols_align(align = "center", columns = c(Asignacion, ni, hi_pct)) %>%
tab_source_note(source_note = md("*Autor: Fernando Almeida*"))
| TABLA N° 1: DISTRIBUCIÓN DE FRECUENCIAS DEL NIVEL DE PROFUNDIDAD | |||
| Asignación | Nivel de Profundidad | ni | hi (%) |
|---|---|---|---|
| 1 | SHALLOW | 15986 | 33.47 |
| 2 | MEDIUM | 15852 | 33.19 |
| 3 | DEEP | 15919 | 33.33 |
| 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("Nivel de Profundidad", side = 1, line = 3, cex = 1)
mtext("Distribución del Nivel de Profundidad", 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, `Uniforme Discreto` = p_uniforme)
par(mar = c(5, 6, 6, 2))
bp2 <- barplot(comparacion, beside = TRUE,
col = c("#555555", "#B0B0B0"),
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("Nivel de Profundidad", side = 1, line = 3, cex = 1)
mtext("Frecuencia Observada en función del Modelo Uniforme Teórico", side = 3, line = 1.5, cex = 1, font = 2)
text(bp2, comparacion, labels = paste0(round(comparacion * 100, 1), "%"), pos = 3, cex = 0.8)
legend("topright", legend = c("Observado", "Uniforme Discreto"),
fill = c("#555555", "#B0B0B0"), bty = "n", cex = 0.9)
Nota: en el segundo gráfico, barras grises oscuras = frecuencia real observada; barras grises claras = probabilidad teórica del modelo Uniforme Discreto. Entre más parecidas las alturas de cada par, mejor el ajuste.
Al observar el gráfico, las tres categorías presentan prácticamente la misma frecuencia (cerca de 33% cada una), por lo que se conjetura un modelo Uniforme Discreto, donde cada categoría tiene la misma probabilidad:
\[P(X = k) = \frac{1}{k\_niveles} \,, \quad k = 1, 2, 3\]
data.frame(Categoria = niveles_orden,
p_H0 = round(p_uniforme, 4),
p_observada = round(hi_dec, 4))
## Categoria p_H0 p_observada
## SHALLOW SHALLOW 0.3333 0.3347
## MEDIUM MEDIUM 0.3333 0.3319
## DEEP DEEP 0.3333 0.3333
Como el modelo Uniforme Discreto tiene varianza cero (todas las probabilidades teóricas son idénticas), la correlación de Pearson queda matemáticamente indefinida. En su lugar se usa el índice de similitud (\(1 - \tfrac{1}{2}\sum|h_i - p_i|\)), que mide qué tan parecidas son las frecuencias observadas y teóricas. También se aplica la prueba Chi-Cuadrado de Bondad de Ajuste sobre una submuestra aleatoria, dado el tamaño muestral tan grande.
# Índice de Similitud (complemento de la distancia de variación total)
indice_similitud <- (1 - 0.5 * sum(abs(hi_dec - p_uniforme))) * 100
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_uniforme)
chi_stat <- unname(prueba_chi$statistic)
chi_gl <- unname(prueba_chi$parameter)
chi_pval <- prueba_chi$p.value
val_similitud <- ifelse(indice_similitud > 70, "APROBADO", "RECHAZADO")
val_chi <- ifelse(chi_pval > 0.05, "APROBADO", "RECHAZADO")
bind_rows(
data.frame(Prueba = "Índice de Similitud (hi vs. p teórico)",
Estadistico = round(indice_similitud, 2), GL = NA_integer_,
p_valor = NA_real_, Validacion = val_similitud),
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)
) %>%
gt() %>%
tab_header(
title = md("**Tabla N\u00b0 2: Validación de la Conjetura (Modelo Uniforme Discreto)**"),
subtitle = md("*Nivel de Profundidad*")
) %>%
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 = "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(Estadistico, GL, p_valor, Validacion)) %>%
fmt_missing(columns = everything(), missing_text = "-") %>%
tab_source_note(source_note = md("*Autor: Fernando Almeida*"))
| Tabla N° 2: Validación de la Conjetura (Modelo Uniforme Discreto) | ||||
| Nivel de Profundidad | ||||
| Prueba | Estadístico | G.L. | p-valor | Validación |
|---|---|---|---|---|
| Índice de Similitud (hi vs. p teórico) | 99.86 | - | - | APROBADO |
| Chi-Cuadrado (submuestra n=100) | 3.02 | 2 | 0.2209 | APROBADO |
| Autor: Fernando Almeida | ||||
En una variable cualitativa el parámetro poblacional de interés es
una proporción. Se estima la proporción de pozos con
nivel de profundidad DEEP, por ser la categoría de mayor
relevancia operativa:
\[P(\hat{p} - E < p < \hat{p} + E) \approx 95\%\]
\[E = z \sqrt{\frac{\hat{p}(1-\hat{p})}{n}}\]
categoria_interes <- "DEEP"
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 Nivel '", 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 el Nivel de Profundidad*")
) %>%
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 el Nivel de Profundidad | |||||
| Parámetro | Lim_Inferior | Proporción_Muestral | Lim_Superior | Error_Estándar | Confianza |
|---|---|---|---|---|---|
| Proporción Nivel 'DEEP' | 0.3291 | 0.3333 | 0.3376 | +/- 0.0042 | 95% (Z=1.96) |
| Autor: Fernando Almeida | |||||
Se trabajó con la variable cualitativa ordinal Nivel de
Profundidad (DEPTH_LEVEL), con categorías SHALLOW
< MEDIUM < DEEP codificadas como Asignación 1, 2, 3, sobre 47,757
observaciones. Se conjeturó un modelo Uniforme
Discreto, ya que las tres categorías presentan una frecuencia
prácticamente idéntica (33.47%, 33.19%, 33.33%). El índice de similitud
obtuvo 99.86% (APROBADO) y la prueba Chi-Cuadrado sobre
una submuestra (n=100) obtuvo un estadístico de 3.02 con 2 grado(s) de
libertad y un p-valor de 0.2209 (APROBADO); el modelo
Uniforme Discreto fue aprobado. El intervalo de confianza al 95% para la
proporción poblacional de pozos con nivel DEEP fue [32.91%, 33.76%], con
proporción muestral 33.33% y margen de error +/- 0.42%.
Autor: Fernando Almeida — Análisis Estadístico, Kansas Hydrocarbon Leases Dataset