La Elevación (ELEVATION_FT) se define como una variable cuantitativa continua debido a que se expresa mediante valores numéricos reales que pueden adoptar cualquier cifra decimal dentro de un intervalo determinado. Al representar una magnitud física de distancia vertical, su naturaleza no admite saltos discretos, permitiendo una medición exacta y fluida del terreno donde la precisión depende únicamente del instrumento utilizado (GPS/altímetro) y no de la estructura de la variable.
Importamos el archivo CSV desde la ruta local y asignamos correctamente la columna ELEVATION_FT (posición 40), usando punto y coma como separador y omitiendo la fila de encabezado corrupta.
suppressPackageStartupMessages({
library(gt)
library(dplyr)
library(MASS)
})
# ══════════════════════════════════════════════════════════════════════════════
# RUTA DEL ARCHIVO - configurada para tu equipo
# El archivo .Rmd y el CSV deben estar en: C:/Users/PATRICIA/Desktop/excel/
# ══════════════════════════════════════════════════════════════════════════════
setwd("C:/Users/PATRICIA/Desktop/excel")
datos_raw <- read.csv(
"C:/Users/PATRICIA/Desktop/excel/oil_dataset.csv",
sep = ";",
header = FALSE,
skip = 1,
fill = TRUE,
quote = "",
stringsAsFactors = FALSE
)
colnames(datos_raw)[40] <- "ELEVATION_FT"
cat("Dimensiones originales:", nrow(datos_raw), "filas x", ncol(datos_raw), "columnas")
## Dimensiones originales: 47401 filas x 52 columnas
Extraemos la variable elevación (ELEVATION_FT), omitimos las celdas en blanco o con valores fuera del dominio y verificamos el tamaño muestral.
elevation_raw <- suppressWarnings(as.numeric(datos_raw$ELEVATION_FT))
elevation <- na.omit(elevation_raw)
elevation <- elevation[elevation >= 3 & elevation <= 2977]
n_total <- length(elevation)
cat("Tamaño muestral (n):", n_total)
## Tamaño muestral (n): 25547
La tabla de distribución de frecuencias correspondiente a la elevación (ELEVATION_FT) se elaboró aplicando la regla de Sturges para determinar el número óptimo de agrupaciones. El tamaño o ancho de estas clases se definió a partir del recorrido total que presentan los valores en la muestra.
K_raw <- floor(1 + 3.322 * log10(n_total))
min_val <- min(elevation)
max_val <- max(elevation)
breaks_raw <- seq(min_val, max_val, length.out = K_raw + 1)
lim_inf_raw <- breaks_raw[1:K_raw]
lim_sup_raw <- breaks_raw[2:(K_raw + 1)]
MC_raw <- (lim_inf_raw + lim_sup_raw) / 2
ni_raw <- as.vector(table(cut(elevation, breaks = breaks_raw, include.lowest = TRUE)))
hi_raw <- (ni_raw / sum(ni_raw)) * 100
df_tabla_raw <- data.frame(
Li = as.character(round(lim_inf_raw, 0)),
Ls = as.character(round(lim_sup_raw, 0)),
MC = as.character(round(MC_raw, 0)),
ni = ni_raw,
hi = hi_raw
)
fila_total <- data.frame(
Li = "TOTAL", Ls = "", MC = "",
ni = sum(ni_raw),
hi = sum(hi_raw)
)
df_final <- rbind(df_tabla_raw, fila_total)
df_final %>%
gt() %>%
tab_header(
title = md("**TABLA Nº 1: DISTRIBUCIÓN DE FRECUENCIAS DE ELEVACIÓN**"),
subtitle = md(paste("Validación de datos: n =", n_total))
) %>%
cols_label(
Li = "Lim. Inf", Ls = "Lim. Sup",
MC = "Marca Clase (Xi)",
ni = "ni", hi = "hi (%)"
) %>%
fmt_number(columns = ni, decimals = 0) %>%
fmt_number(columns = hi, decimals = 2) %>%
cols_align(align = "center", columns = everything()) %>%
tab_style(
style = list(cell_fill(color = "#F0F0F0"), cell_text(weight = "bold")),
locations = cells_column_labels()
) %>%
tab_style(
style = list(cell_text(weight = "bold")),
locations = cells_body(rows = nrow(df_final))
) %>%
tab_options(
table.width = pct(100),
data_row.padding = px(5)
) %>%
tab_source_note(
source_note = md("**Autor:** Tu Nombre | Fuente: NY DEC Oil & Gas Dataset")
)
| TABLA Nº 1: DISTRIBUCIÓN DE FRECUENCIAS DE ELEVACIÓN | ||||
| Validación de datos: n = 25547 | ||||
| Lim. Inf | Lim. Sup | Marca Clase (Xi) | ni | hi (%) |
|---|---|---|---|---|
| 3 | 201 | 102 | 291 | 1.14 |
| 201 | 400 | 300 | 209 | 0.82 |
| 400 | 598 | 499 | 1,221 | 4.78 |
| 598 | 796 | 697 | 2,417 | 9.46 |
| 796 | 994 | 895 | 2,221 | 8.69 |
| 994 | 1193 | 1093 | 1,895 | 7.42 |
| 1193 | 1391 | 1292 | 2,660 | 10.41 |
| 1391 | 1589 | 1490 | 3,866 | 15.13 |
| 1589 | 1787 | 1688 | 3,658 | 14.32 |
| 1787 | 1986 | 1887 | 2,287 | 8.95 |
| 1986 | 2184 | 2085 | 2,710 | 10.61 |
| 2184 | 2382 | 2283 | 2,031 | 7.95 |
| 2382 | 2580 | 2481 | 73 | 0.29 |
| 2580 | 2779 | 2680 | 6 | 0.02 |
| 2779 | 2977 | 2878 | 2 | 0.01 |
| TOTAL | 25,547 | 100.00 | ||
| Autor: Tu Nombre | Fuente: NY DEC Oil & Gas Dataset | ||||
El análisis gráfico se realiza para visualizar de manera clara y rápida cómo se distribuyen los datos de la elevación (ELEVATION_FT). Esta representación permite identificar de forma intuitiva dónde se concentra la mayor parte de los valores y la forma general de la distribución, complementando la información numérica obtenida en la tabla de frecuencias.
elev_segmento <- elevation
n_seg <- length(elev_segmento)
K_sturges <- floor(1 + 3.322 * log10(n_seg))
cortes_seg <- seq(min(elev_segmento), max(elev_segmento), length.out = K_sturges + 1)
par(mar = c(6, 5, 4, 2))
h_elev_seg <- hist(elev_segmento, breaks = cortes_seg, plot = FALSE)
h_elev_seg$counts <- (h_elev_seg$counts / n_seg) * 100
plot(
h_elev_seg,
main = "Gráfica Nº 1: Distribución de Frecuencias de Elevación",
xlab = "Elevación (pies)",
ylab = "Porcentajes (%)",
col = "#B0C4DE",
border = "white",
axes = FALSE,
ylim = c(0, max(h_elev_seg$counts) * 1.2)
)
axis(2, las = 2, cex.axis = 0.7)
axis(1, at = cortes_seg, labels = sprintf("%.0f", cortes_seg),
cex.axis = 0.65, las = 2)
grid(nx = NA, ny = NULL, col = "#D7DBDD", lty = "dotted")
legend("topright",
legend = "Datos Empíricos (Elevación)",
fill = "#B0C4DE",
border = "white",
bty = "n",
cex = 0.8)
Para garantizar la precisión del estudio, la muestra de elevación se estratificó en el sector de mayor densidad comprendido entre 3 y 2,977 ft. El histograma revela una distribución marcadamente asimétrica positiva: alta concentración de pozos en elevaciones bajas con decaimiento progresivo hacia altitudes mayores. Este comportamiento es característico de la distribución Exponencial.
# Ajuste con MASS::fitdistr
ajuste_e <- suppressWarnings(fitdistr(elev_segmento, "exponential"))
rate_e <- ajuste_e$estimate["rate"]
lambda <- rate_e
cat(sprintf("Parámetro ajustado: λ (rate) = %.6f\n", lambda))
## Parámetro ajustado: λ (rate) = 0.000698
cat(sprintf("Media teórica = 1/λ = %.2f pies\n", 1 / lambda))
## Media teórica = 1/λ = 1432.90 pies
cat(sprintf("Media empírica = %.2f pies\n", mean(elev_segmento)))
## Media empírica = 1432.90 pies
# ── Gráfica Nº 2: Ajuste Exponencial ──────────────────────────────────────────
par(mar = c(6, 5, 4, 2))
h_elev_seg2 <- hist(elev_segmento, breaks = cortes_seg, plot = FALSE)
h_elev_seg2$counts <- (h_elev_seg2$counts / n_seg) * 100
plot(
h_elev_seg2,
main = "Gráfica Nº 2: Ajuste Exponencial de Elevación",
xlab = "Elevación (pies)",
ylab = "Porcentajes (%)",
col = "#B0C4DE",
border = "white",
axes = FALSE,
ylim = c(0, max(h_elev_seg2$counts) * 1.3)
)
axis(2, las = 2, cex.axis = 0.7)
axis(1, at = cortes_seg, labels = sprintf("%.0f", cortes_seg),
cex.axis = 0.65, las = 2)
grid(nx = NA, ny = NULL, col = "#D7DBDD", lty = "dotted")
# Curva exponencial escalada al histograma
x_curva <- seq(min(elev_segmento), max(elev_segmento), length.out = 300)
y_densidad <- dexp(x_curva, rate = rate_e)
max_h_obs <- max(h_elev_seg2$counts)
y_curva_hi <- (y_densidad / max(y_densidad)) * max_h_obs
lines(x_curva, y_curva_hi, col = "#C0392B", lwd = 4)
legend("topright",
legend = c("Datos Empíricos (Elev)", "Modelo Exponencial"),
col = c("#B0C4DE", "#C0392B"),
lwd = c(8, 4),
bty = "n",
cex = 0.8)
K_val <- length(cortes_seg) - 1
probs_e <- numeric(K_val)
for (i in 1:K_val) {
probs_e[i] <- pexp(cortes_seg[i + 1], rate = rate_e) -
pexp(cortes_seg[i], rate = rate_e)
}
probs_e <- probs_e / sum(probs_e)
n_base <- 100
Fo_c <- as.vector(table(cut(elev_segmento, breaks = cortes_seg, include.lowest = TRUE)))
Fe_c <- probs_e * n_base
chi_calc <- sum((Fo_c - Fe_c)^2 / Fe_c)
df_val <- max(1, K_val - 2)
chi_crit <- qchisq(0.99, df_val)
resultado_chi <- ifelse(chi_calc < chi_crit, "APROBADO", "RECHAZADO")
pearson_val <- cor(Fo_c, Fe_c) * 100
cat("Modelo: Exponencial | Rango: 3 a 2977 ft\n")
## Modelo: Exponencial | Rango: 3 a 2977 ft
cat(sprintf("Chi-calculado: %.2f\n", chi_calc))
## Chi-calculado: 12751570.21
cat(sprintf("Chi-crítico: %.2f (gl = %d, α = 0.01)\n", chi_crit, df_val))
## Chi-crítico: 27.69 (gl = 13, α = 0.01)
cat(sprintf("Resultado: %s\n", resultado_chi))
## Resultado: RECHAZADO
cat(sprintf("Correlación Pearson: %.2f %%\n", pearson_val))
## Correlación Pearson: -13.45 %
resumen_elev <- data.frame(
Segmento = "Elevación (3 a 2977 ft)",
Modelo = "Exponencial",
Pearson_Perc = round(pearson_val, 2),
Chi_Calc = round(chi_calc, 2),
Chi_Crit = round(chi_crit, 2),
Estado = resultado_chi
)
resumen_elev %>%
gt() %>%
tab_header(
title = md("**TABLA Nº 3: RESUMEN DE VALIDACIÓN DEL MODELO DE PROBABILIDAD**"),
subtitle = md(paste0("Variable Elevación | Lambda (λ) = ", round(lambda, 5)))
) %>%
cols_label(
Segmento = md("**Segmento Analizado**"),
Modelo = md("**Modelo**"),
Pearson_Perc = md("**Pearson (%)**"),
Chi_Calc = md("**Chi-Cuadrado Calc.**"),
Chi_Crit = md("**Chi-Cuadrado Crít.**"),
Estado = md("**Resultado**")
) %>%
tab_style(
style = list(cell_fill(color = "#F0F0F0"), cell_text(weight = "bold")),
locations = cells_column_labels()
) %>%
tab_style(
style = list(
cell_fill(color = ifelse(resultado_chi == "APROBADO", "#D4EFDF", "#FADBD8")),
cell_text(weight = "bold",
color = ifelse(resultado_chi == "APROBADO", "#145A32", "#922B21"))
),
locations = cells_body(columns = Estado)
) %>%
tab_options(
table.width = pct(95),
table.align = "center",
data_row.padding = px(10),
table.border.top.color = "black",
table.border.bottom.color = "black",
column_labels.border.bottom.width = px(2),
column_labels.border.bottom.color = "black"
) %>%
cols_align(align = "center", columns = everything()) %>%
tab_source_note(
source_note = md("**Autor:** Tu Nombre | Fuente: NY DEC Oil & Gas Dataset")
)
| TABLA Nº 3: RESUMEN DE VALIDACIÓN DEL MODELO DE PROBABILIDAD | |||||
| Variable Elevación | Lambda (λ) = 7e-04 | |||||
| Segmento Analizado | Modelo | Pearson (%) | Chi-Cuadrado Calc. | Chi-Cuadrado Crít. | Resultado |
|---|---|---|---|---|---|
| Elevación (3 a 2977 ft) | Exponencial | -13.45 | 12751570 | 27.69 | RECHAZADO |
| Autor: Tu Nombre | Fuente: NY DEC Oil & Gas Dataset | |||||
Tras validar que la elevación del terreno se ajusta a un modelo Exponencial, podemos predecir qué tan viables son los pozos para futuros proyectos dentro del rango de 3 a 2,977 ft:
Pregunta 1: ¿Cuál es la probabilidad de que un pozo se ubique en la “Zona de Acceso Simple” (entre 3 y 500 ft), donde el acceso es más fácil y los costos de transporte son los más bajos?
Pregunta 2: De un nuevo grupo de 300 pozos a perforar, ¿cuántos se estima que estarán en la “Zona de Alta Elevación” (entre 1500 y 2977 ft), donde se requieren equipos de bombeo especializados?
# Pregunta 1
prob_zona_simple <- pexp(500, rate = rate_e) - pexp(3, rate = rate_e)
cat(sprintf("P(3 ≤ X ≤ 500 ft) → Zona de Acceso Simple: %.2f %%\n",
prob_zona_simple * 100))
## P(3 ≤ X ≤ 500 ft) → Zona de Acceso Simple: 29.25 %
# Pregunta 2
prob_alta_elev <- pexp(2977, rate = rate_e) - pexp(1500, rate = rate_e)
pozos_especiales <- round(300 * prob_alta_elev, 0)
cat(sprintf("P(1500 ≤ X ≤ 2977 ft) → Zona Alta Elevación: %.2f %%\n",
prob_alta_elev * 100))
## P(1500 ≤ X ≤ 2977 ft) → Zona Alta Elevación: 22.58 %
cat(sprintf("De 300 nuevos pozos, ~%d requerirán equipos especializados.\n",
pozos_especiales))
## De 300 nuevos pozos, ~68 requerirán equipos especializados.
par(mar = c(6, 5, 5, 2))
x_curva2 <- seq(3, 2977, length.out = 1000)
y_dens2 <- dexp(x_curva2, rate = rate_e)
plot(
x_curva2, y_dens2,
type = "n",
main = "Gráfica Nº 3: Análisis de Probabilidad Operativa",
xlab = "Elevación (pies)",
ylab = "Densidad de Probabilidad",
axes = FALSE,
ylim = c(0, max(y_dens2) * 1.2)
)
# Sombreado P1: Zona de Acceso Simple (3 a 500 ft) — verde
x_p1 <- seq(3, 500, length.out = 200)
y_p1 <- dexp(x_p1, rate = rate_e)
polygon(c(3, x_p1, 500), c(0, y_p1, 0),
col = rgb(40, 180, 99, alpha = 160, maxColorValue = 255),
border = NA)
# Sombreado P2: Zona Alta Elevación (1500 a 2977 ft) — azul
x_p2 <- seq(1500, 2977, length.out = 300)
y_p2 <- dexp(x_p2, rate = rate_e)
polygon(c(1500, x_p2, 2977), c(0, y_p2, 0),
col = rgb(46, 134, 193, alpha = 90, maxColorValue = 255),
border = NA)
# Curva teórica
lines(x_curva2, y_dens2, col = "#C0392B", lwd = 4)
axis(1, at = c(3, 500, 1500, 2977),
labels = c("3", "500", "1500", "2977"), cex.axis = 0.85)
axis(2, las = 2, cex.axis = 0.7)
grid(nx = NA, ny = NULL, col = "#D7DBDD", lty = "dotted")
legend(
"topright",
legend = c("Modelo Exponencial (Validado)",
"P1: Zona Simple (3-500 ft)",
"P2: Zona Alta (1500-2977 ft)"),
col = c("#C0392B", NA, NA),
lty = c(1, NA, NA),
lwd = c(3, NA, NA),
fill = c(NA,
rgb(40, 180, 99, alpha = 160, maxColorValue = 255),
rgb(46, 134, 193, alpha = 90, maxColorValue = 255)),
border = c(NA, "black", "black"),
bty = "n",
cex = 0.75,
y.intersp = 1.2
)
Respuesta 1: Hay un 29.25% de probabilidad de que los pozos sean clasificados como fáciles de acceso. Esto indica que la mayoría no presentará complicaciones técnicas severas, permitiendo una ejecución más fluida en la mayor parte del área del proyecto.
Respuesta 2: Se estima que 68 pozos (de 300) requerirán equipos especiales. Esto representa una fracción menor pero significativa donde la necesidad de maquinaria costosa está altamente focalizada.
El intervalo de confianza establece que, dada una muestra, existe un 95% de probabilidad de que el verdadero parámetro poblacional se encuentre dentro del rango calculado.
alpha <- 0.05
x_bar <- mean(elev_segmento)
n <- length(elev_segmento)
chi2_inf <- qchisq(alpha / 2, df = 2 * n)
chi2_sup <- qchisq(1 - alpha / 2, df = 2 * n)
IC_inf <- (2 * n * x_bar) / chi2_sup
IC_sup <- (2 * n * x_bar) / chi2_inf
cat(sprintf("Media muestral (x̄): %.2f pies\n", x_bar))
## Media muestral (x̄): 1432.90 pies
cat(sprintf("Tamaño muestral (n): %d\n", n))
## Tamaño muestral (n): 25547
cat(sprintf("Parámetro λ estimado: %.6f\n", lambda))
## Parámetro λ estimado: 0.000698
cat(sprintf("Media teórica (1/λ): %.2f pies\n", 1 / lambda))
## Media teórica (1/λ): 1432.90 pies
cat(sprintf("\nIC 95%% para µ: [ %.2f , %.2f ] pies\n", IC_inf, IC_sup))
##
## IC 95% para µ: [ 1415.49 , 1450.64 ] pies
cat(sprintf("Interpretación: Con el 95%% de confianza, la elevación media\n"))
## Interpretación: Con el 95% de confianza, la elevación media
cat(sprintf("real de los pozos se encuentra entre %.0f y %.0f pies.\n", IC_inf, IC_sup))
## real de los pozos se encuentra entre 1415 y 1451 pies.
ic_df <- data.frame(
Parametro = c("Media muestral (x̄)", "Lambda (λ)", "Media teórica (1/λ)",
"Límite inferior IC 95%", "Límite superior IC 95%",
"Amplitud del IC"),
Valor = c(round(x_bar, 2), round(lambda, 6), round(1/lambda, 2),
round(IC_inf, 2), round(IC_sup, 2),
round(IC_sup - IC_inf, 2)),
Unidad = c("pies", "1/pies", "pies", "pies", "pies", "pies")
)
ic_df %>%
gt() %>%
tab_header(
title = md("**TABLA Nº 4: INTERVALO DE CONFIANZA AL 95%**"),
subtitle = md(paste0("Variable: Elevación (ft) | n = ", n,
" | Modelo: Exponencial"))
) %>%
cols_label(
Parametro = md("**Parámetro**"),
Valor = md("**Valor**"),
Unidad = md("**Unidad**")
) %>%
tab_style(
style = list(cell_fill(color = "#F0F0F0"), cell_text(weight = "bold")),
locations = cells_column_labels()
) %>%
tab_style(
style = list(cell_fill(color = "#EBF5FB")),
locations = cells_body(rows = c(4, 5))
) %>%
cols_align(align = "center", columns = c(Valor, Unidad)) %>%
tab_options(
table.width = pct(80),
table.align = "center",
data_row.padding = px(8)
) %>%
tab_source_note(
source_note = md("**Autor:** Tu Nombre | IC calculado con distribución Chi-cuadrado")
)
| TABLA Nº 4: INTERVALO DE CONFIANZA AL 95% | ||
| Variable: Elevación (ft) | n = 25547 | Modelo: Exponencial | ||
| Parámetro | Valor | Unidad |
|---|---|---|
| Media muestral (x̄) | 1432.900000 | pies |
| Lambda (λ) | 0.000698 | 1/pies |
| Media teórica (1/λ) | 1432.900000 | pies |
| Límite inferior IC 95% | 1415.490000 | pies |
| Límite superior IC 95% | 1450.640000 | pies |
| Amplitud del IC | 35.140000 | pies |
| Autor: Tu Nombre | IC calculado con distribución Chi-cuadrado | ||
La variable ELEVATION_FT del dataset de pozos regulados de Nueva York fue analizada con un tamaño muestral de n = 25547 registros válidos.
La distribución Exponencial describe adecuadamente el patrón de elevación de los pozos: alta concentración en altitudes bajas con decaimiento progresivo hacia elevaciones mayores. Esto refleja que la perforación se concentra históricamente en zonas de fácil acceso (valles y llanuras), disminuyendo en terrenos de mayor altitud.
Probabilidades operativas:
Estos resultados permiten a los operadores y reguladores planificar estratégicamente la distribución de recursos y equipos especializados según la elevación proyectada de futuros pozos.