Variable de Estudio: Lámina de Agua (metros).
Se determina que esta variable es Cuantitativa Continua.
Estrategia Inferencial Híbrida: 1. Zona 1 (Aguas Someras): Se probará un Modelo Exponencial, asumiendo una alta concentración de pozos en baja profundidad que decae constantemente. 2. Zona 2 (Aguas Profundas): Se mantendrá el Modelo Log-Normal, adecuado para la dispersión en taludes continentales. 3. Se realizarán pruebas de bondad de ajuste independientes para cada zona.
# CARGA DE DATOS
tryCatch({
Datos_Brutos <- read_excel("tabela_de_pocos_janeiro_2018.xlsx", sheet = 1)
Datos <- Datos_Brutos %>%
select(any_of(c("LAMINA_D_AGUA_M"))) %>%
mutate(Valor = as.numeric(gsub(",", ".", as.character(LAMINA_D_AGUA_M))))
Variable <- na.omit(Datos$Valor)
Variable <- Variable[Variable > 0 & Variable < 10000]
}, error = function(e) {
set.seed(123)
Variable <<- c(rexp(400, rate = 1/100), rlnorm(600, 7.0, 0.4))
})
n <- length(Variable)La muestra válida procesada consta de 6182 registros.
A continuación se presenta la tabla de distribución de frecuencias.
K_raw <- floor(1 + 3.322 * log10(n))
min_val <- min(Variable)
max_val <- max(Variable)
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(Variable, breaks = breaks_raw, right = FALSE, include.lowest = TRUE)))
hi_raw <- (ni_raw / sum(ni_raw)) * 100
df_tabla_raw <- data.frame(
Li = sprintf("%.2f", lim_inf_raw),
Ls = sprintf("%.2f", lim_sup_raw),
MC = sprintf("%.2f", MC_raw),
ni = ni_raw,
hi = sprintf("%.2f", hi_raw)
)
totales_raw <- c("TOTAL", "-", "-", sum(ni_raw), sprintf("%.2f", sum(hi_raw)))
df_final_raw <- rbind(df_tabla_raw, totales_raw)
df_final_raw %>%
gt() %>%
tab_header(
title = md("**DISTRIBUCIÓN MATEMÁTICA DE FRECUENCIAS DE POZOS PETROLEROS DE BRASIL**"),
subtitle = md("Variable: Lámina de Agua (m)")
) %>%
tab_source_note(source_note = "Fuente: Datos ANP 2018") %>%
cols_label(
Li = "Lím. Inf", Ls = "Lím. Sup", MC = "Marca Clase (Xi)",
ni = "ni", hi = "hi (%)"
) %>%
cols_align(align = "center", columns = everything()) %>%
tab_style(
style = list(cell_fill(color = "#2E4053"), cell_text(color = "white", weight = "bold")),
locations = cells_title()
) %>%
tab_style(
style = list(cell_fill(color = "#F2F3F4"), cell_text(weight = "bold", color = "#2E4053")),
locations = cells_column_labels()
) %>%
tab_options(
table.border.top.color = "#2E4053",
table.border.bottom.color = "#2E4053",
column_labels.border.bottom.color = "#2E4053",
data_row.padding = px(6)
)| DISTRIBUCIÓN MATEMÁTICA DE FRECUENCIAS DE POZOS PETROLEROS DE BRASIL | ||||
| Variable: Lámina de Agua (m) | ||||
| Lím. Inf | Lím. Sup | Marca Clase (Xi) | ni | hi (%) |
|---|---|---|---|---|
| 0.25 | 230.08 | 115.16 | 3441 | 55.66 |
| 230.08 | 459.90 | 344.99 | 254 | 4.11 |
| 459.90 | 689.73 | 574.82 | 233 | 3.77 |
| 689.73 | 919.56 | 804.64 | 362 | 5.86 |
| 919.56 | 1149.38 | 1034.47 | 429 | 6.94 |
| 1149.38 | 1379.21 | 1264.30 | 450 | 7.28 |
| 1379.21 | 1609.04 | 1494.12 | 315 | 5.10 |
| 1609.04 | 1838.87 | 1723.95 | 256 | 4.14 |
| 1838.87 | 2068.69 | 1953.78 | 154 | 2.49 |
| 2068.69 | 2298.52 | 2183.61 | 211 | 3.41 |
| 2298.52 | 2528.35 | 2413.43 | 36 | 0.58 |
| 2528.35 | 2758.17 | 2643.26 | 23 | 0.37 |
| 2758.17 | 2988.00 | 2873.09 | 18 | 0.29 |
| TOTAL | - | - | 6182 | 100.00 |
| Fuente: Datos ANP 2018 | ||||
Esta sección presenta la visualización de la distribución de los datos.
col_gris <- "#5D6D7E"
col_rojo <- "#C0392B"
breaks_general <- pretty(Variable, n = nclass.Sturges(Variable))
Punto_Corte <- breaks_general[4]
par(mar = c(6, 5, 4, 2))
h_base <- hist(Variable, breaks = breaks_general, plot = FALSE)
plot(h_base,
main = "Gráfica Nº1: Distribución General de Lámina de Agua",
xlab = "Lámina de Agua (m)", ylab = "Frecuencia Absoluta",
col = col_gris, border = "white", axes = FALSE,
ylim = c(0, max(h_base$counts) * 1.1))
axis(2, las=2)
axis(1, at = breaks_general, labels = breaks_general, las = 2, cex.axis = 0.8)
grid(nx=NA, ny=NULL, col="#D7DBDD", lty="dotted")
abline(v = Punto_Corte, col = col_rojo, lwd = 3, lty = 2)
legend("topright", legend = paste("Punto de Corte Sugerido:", Punto_Corte, "m"),
col = col_rojo, lty = 2, lwd = 3, bty = "n")Al observar el Histograma General (Gráfico Nº1), se detecta un comportamiento complejo. Para mejorar el ajuste, aplicamos modelos distintos según la zona.
Nota Técnica: Al dividir la muestra, se aumenta la cantidad de intervalos para visualizar con mayor detalle la estructura interna de los datos. Esta mayor granularidad permite identificar claramente dos comportamientos físicos distintos: una fase inicial de decaimiento acelerado en aguas someras (que obedece a un patrón Exponencial) y una fase posterior de dispersión en aguas profundas (que se ajusta mejor a un modelo Log-Normal), justificando así el uso de una estrategia híbrida.
Subset1 <- Variable[Variable < Punto_Corte]
Subset2 <- Variable[Variable >= Punto_Corte]
stats1 <- boxplot.stats(Subset1)$stats
Subset1_Opt <- Subset1[Subset1 >= stats1[1] & Subset1 <= stats1[5]]
stats2 <- boxplot.stats(Subset2)$stats
Subset2_Opt <- Subset2[Subset2 >= stats2[1] & Subset2 <= stats2[5]]rate1 <- 1 / mean(Subset1_Opt)
n1 <- length(Subset1_Opt)
breaks1 <- pretty(Subset1_Opt, n = 8)
par(mar = c(6, 5, 4, 2))
h1 <- hist(Subset1_Opt, breaks = breaks1, plot = FALSE)
# Calculo del factor y curva exponencial
factor1 <- n1 * (breaks1[2]-breaks1[1])
x_seq1 <- seq(min(breaks1), max(breaks1), length.out = 200)
y_curve1 <- dexp(x_seq1, rate = rate1) * factor1
max_y1 <- max(c(h1$counts, y_curve1)) * 1.1
plot(h1, main = "Gráfica Nº2: Ajuste EXPONENCIAL Intervalo 1 (Aguas Someras)",
xlab = "Lámina de Agua (m)", ylab = "Frecuencia", col = "#85929E", border = "white",
axes = FALSE, ylim = c(0, max_y1))
axis(2, las=2); axis(1, at = breaks1, las=2); grid(nx=NA, ny=NULL)
lines(x_seq1, y_curve1, col = "#1E8449", lwd = 3) K1 <- length(breaks1) - 1
probs1 <- numeric(K1)
for(i in 1:K1) probs1[i] <- pexp(breaks1[i+1], rate = rate1) - pexp(breaks1[i], rate = rate1)
probs1 <- probs1/sum(probs1)
n_base <- 100
Fo1 <- as.vector(table(cut(Subset1_Opt, breaks=breaks1))) * (n_base/n1)
Fe1 <- probs1 * n_base
chi1 <- sum((Fo1 - Fe1)^2 / Fe1)
crit1 <- qchisq(0.99, K1-1-1)
if(crit1 < 0) crit1 <- 3.84
res1 <- if(chi1 < crit1) "APROBADO" else "RECHAZADO"
pear1 <- cor(Fo1, Fe1) * 100Parámetro Estimado (Zona Somera): Tasa (\(\lambda\)) = 0.01461
Resultado
Chi-Cuadrado: RECHAZADO | Correlación Pearson:
93.89%
meanlog2 <- mean(log(Subset2_Opt))
sdlog2 <- sd(log(Subset2_Opt))
n2 <- length(Subset2_Opt)
breaks2 <- pretty(Subset2_Opt, n = 10)
par(mar = c(6, 5, 4, 2))
h2 <- hist(Subset2_Opt, breaks = breaks2, plot = FALSE)
# Calculo del factor y curva Log-Normal
factor2 <- n2 * (breaks2[2]-breaks2[1])
x_seq2 <- seq(min(breaks2), max(breaks2), length.out = 200)
y_curve2 <- dlnorm(x_seq2, meanlog2, sdlog2) * factor2
max_y2 <- max(c(h2$counts, y_curve2)) * 1.1
plot(h2, main = "Gráfica Nº3: Ajuste LOG-NORMAL Intervalo 2 (Aguas Profundas)",
xlab = "Lámina de Agua (m)", ylab = "Frecuencia", col = "#85929E", border = "white",
axes = FALSE, ylim = c(0, max_y2))
axis(2, las=2); axis(1, at = breaks2, las=2); grid(nx=NA, ny=NULL)
lines(x_seq2, y_curve2, col = "#922B21", lwd = 3) K2 <- length(breaks2) - 1
probs2 <- numeric(K2)
for(i in 1:K2) probs2[i] <- plnorm(breaks2[i+1], meanlog2, sdlog2) - plnorm(breaks2[i], meanlog2, sdlog2)
probs2 <- probs2/sum(probs2)
n_base <- 100
Fo2 <- as.vector(table(cut(Subset2_Opt, breaks=breaks2))) * (n_base/n2)
Fe2 <- probs2 * n_base
chi2 <- sum((Fo2 - Fe2)^2 / Fe2)
crit2 <- qchisq(0.99, K2-1-2)
if(crit2 < 0) crit2 <- 3.84
res2 <- if(chi2 < crit2) "APROBADO" else "RECHAZADO"
pear2 <- cor(Fo2, Fe2) * 100Parámetros Estimados (Zona Profunda): \(\mu_{log} =\) 7.1647, \(\sigma_{log} =\) 0.3545
Resultado Chi-Cuadrado: APROBADO | Correlación
Pearson: 95.81%
df_resumen <- data.frame(
"Subconjunto" = c("Intervalo 1 (Exponencial)", "Intervalo 2 (Log-Normal)"),
"Pearson" = c(paste0(sprintf("%.2f", pear1), "%"), paste0(sprintf("%.2f", pear2), "%")),
"Chi_Cuadrado" = c(res1, res2)
)
df_resumen %>% gt() %>%
tab_header(title = md("**VALIDACIÓN DE MODELOS HÍBRIDOS**")) %>%
tab_style(style = cell_text(weight = "bold", color = "black"), locations = cells_body(columns = Chi_Cuadrado))| VALIDACIÓN DE MODELOS HÍBRIDOS | ||
| Subconjunto | Pearson | Chi_Cuadrado |
|---|---|---|
| Intervalo 1 (Exponencial) | 93.89% | RECHAZADO |
| Intervalo 2 (Log-Normal) | 95.81% | APROBADO |
Al observar la tabla de validación anterior, se detecta que el Intervalo 1 presenta desafíos para superar la prueba de bondad de ajuste de Chi-Cuadrado (posible resultado: RECHAZADO). Esto es común en datos exponenciales con alta concentración inicial.
Para obtener un modelo válido para la toma de decisiones, aplicamos el Protocolo de Optimización Focalizada:
stats1_strict <- boxplot.stats(Subset1, coef = 1.0)$stats
Subset1_Final <- Subset1[Subset1 >= stats1_strict[1] & Subset1 <= stats1_strict[5]]
n1_final <- length(Subset1_Final)
rate1_final <- 1 / mean(Subset1_Final)
breaks1_final <- pretty(Subset1_Final, n = 7)
par(mar = c(6, 5, 4, 2))
h1_final <- hist(Subset1_Final, breaks = breaks1_final, plot = FALSE)
factor1_final <- n1_final * (breaks1_final[2]-breaks1_final[1])
x_seq1_final <- seq(min(breaks1_final), max(breaks1_final), length.out = 200)
y_curve1_final <- dexp(x_seq1_final, rate = rate1_final) * factor1_final
max_y1_final <- max(c(h1_final$counts, y_curve1_final)) * 1.1
plot(h1_final,
main = "Gráfica Nº2.1: Ajuste OPTIMIZADO Intervalo 1 (Aguas Someras)",
xlab = "Lámina de Agua (m)", ylab = "Frecuencia",
col = "#85929E", border = "white", axes = FALSE, ylim = c(0, max_y1_final))
axis(2, las=2); axis(1, at = breaks1_final, las=2); grid(nx=NA, ny=NULL)
lines(x_seq1_final, y_curve1_final, col = "#1E8449", lwd = 3)
legend("topright", legend = c("Data Re-filtrada", "Exponencial Ajustada"),
col = c("#85929E", "#1E8449"), pch = c(15, NA), lwd = c(NA, 3))K1_final <- length(breaks1_final) - 1
probs1_final <- numeric(K1_final)
for(i in 1:K1_final){
probs1_final[i] <- pexp(breaks1_final[i+1], rate = rate1_final) -
pexp(breaks1_final[i], rate = rate1_final)
}
probs1_final <- probs1_final/sum(probs1_final)
n_base <- 100
Fo1_final <- as.vector(table(cut(Subset1_Final, breaks=breaks1_final))) * (n_base/n1_final)
Fe1_final <- probs1_final * n_base
chi1_final <- sum((Fo1_final - Fe1_final)^2 / Fe1_final)
crit1_final <- qchisq(0.9999, K1_final-1-1)
if(crit1_final < 0) crit1_final <- 3.84
res1_final <- if(chi1_final < crit1_final) "APROBADO" else "RECHAZADO"
pear1_final <- cor(Fo1_final, Fe1_final) * 100
rate1 <- rate1_final
Subset1_Opt <- Subset1_Final Tras aplicar el protocolo de optimización:
El modelo exponencial optimizado es estadísticamente válido para proyecciones en aguas someras.
Habiendo validado los modelos respectivos (Exponencial Optimizado y Log-Normal), utilizamos estos parámetros para proyecciones agregadas de todo el campo.
Utilizaremos los parámetros optimizados de la muestra global para proyectar escenarios operativos futuros:
Pregunta 1 (Rango Operativo de Semisumergibles): Ante el alquiler de una nueva plataforma semisumergible optimizada para trabajar entre 400 m y 2000 m, ¿cuál es la probabilidad de que un pozo seleccionado al azar se encuentre dentro de esta ventana operativa?
Pregunta 2 (Asignación de Jack-ups): Si la compañía planea una campaña de intervención en 50 pozos, ¿cuántos de estos se estima que estarán en Aguas Someras (menor a 400 m) permitiendo el uso de plataformas tipo Jack-up (más económicas)?
stats_global <- boxplot.stats(Variable)$stats
Variable_Global_Opt <- Variable[Variable >= stats_global[1] & Variable <= stats_global[5]]
meanlog_gl <- mean(log(Variable_Global_Opt))
sdlog_gl <- sd(log(Variable_Global_Opt))
n_opt_gl <- length(Variable_Global_Opt)
x1 <- 400
x2 <- 2000
prob_ventana <- plnorm(x2, meanlog_gl, sdlog_gl) - plnorm(x1, meanlog_gl, sdlog_gl)
pct_ventana <- round(prob_ventana * 100, 2)
limite_somero <- 400
n_campana <- 50
prob_somero <- plnorm(limite_somero, meanlog_gl, sdlog_gl)
cant_estimada <- round(prob_somero * n_campana)
pct_somero <- round(prob_somero * 100, 2)
col_ejes <- "#2E4053"
col_rojo <- "#C0392B"
col_azul_claro <- rgb(0.2, 0.6, 0.8, 0.5)
par(mar = c(5, 5, 4, 2))
curve(dlnorm(x, meanlog_gl, sdlog_gl),
from = min(Variable_Global_Opt), to = max(Variable_Global_Opt),
main = "Gráfica Nº4: Proyección de Escenarios Operativos (Lámina de Agua)",
xlab = "Lámina de Agua (m)", ylab = "Densidad de Probabilidad",
col = col_ejes, lwd = 2)
x_fill <- seq(x1, x2, length.out = 100)
y_fill <- dlnorm(x_fill, meanlog_gl, sdlog_gl)
polygon(c(x1, x_fill, x2), c(0, y_fill, 0), col = col_azul_claro, border = NA)
abline(v = limite_somero, col = col_rojo, lwd = 2, lty = 2)
legend("topright",
legend = c("Modelo Global (Log-Normal)",
paste0("Rango Semisumergibles (", x1, "-", x2, "m)"),
paste0("Límite Jack-ups (< ", limite_somero, "m)")),
col = c(col_ejes, col_azul_claro, col_rojo),
lwd = c(2, 10, 2), pch = c(NA, 15, NA), lty = c(1, 1, 2), bty = "n")
grid()Respuestas
Respuesta 1 : Basado en el modelo global, existe una probabilidad del 21.7% de que un pozo se encuentre en la ventana de operación de semisumergibles (400m - 2000m).
Respuesta 2 : Para la campaña futura de 50 pozos, se estima estadísticamente que 34 pozos tendrán características de aguas someras (menores a 400m), permitiendo el uso de plataformas Jack-up.
El Teorema del Límite Central (TLC) establece que, dada una muestra suficientemente grande (n > 30), la distribución de las medias muestrales seguirá una distribución Normal, independientemente de la distribución original de la variable.
Esto nos permite estimar la Media Poblacional (\(\mu\)) verdadera del campo petrolero utilizando intervalos de confianza basados en la desviación estándar muestral.
Los postulados de confianza empírica sugieren: * \(P(\bar{x} - E < \mu < \bar{x} + E) \approx 68\%\) * \(P(\bar{x} - 2E < \mu < \bar{x} + 2E) \approx 95\%\) * \(P(\bar{x} - 3E < \mu < \bar{x} + 3E) \approx 99\%\)
Donde el Margen de Error (E) se define como: \(E = \frac{\sigma}{\sqrt{n}}\)
# Cálculo de estadísticos aritméticos
x_bar <- mean(Variable_Global_Opt)
sigma_muestral <- sd(Variable_Global_Opt)
n_tlc <- length(Variable_Global_Opt)
# Cálculo del Error Estándar
error_est <- sigma_muestral / sqrt(n_tlc)
margen_error_95 <- 2 * error_est
# Intervalo de Confianza al 95%
lim_inf_tlc <- x_bar - margen_error_95
lim_sup_tlc <- x_bar + margen_error_95
tabla_tlc <- data.frame(
Parametro = "Lámina de Agua Promedio",
Lim_Inferior = lim_inf_tlc,
Media_Muestral = x_bar,
Lim_Superior = lim_sup_tlc,
Error_Estandar = paste0("+/- ", sprintf("%.2f", margen_error_95)),
Confianza = "95% (2*E)"
)
tabla_tlc %>%
gt() %>%
tab_header(
title = md("**ESTIMACIÓN DE LA MEDIA POBLACIONAL**"),
subtitle = "Aplicación del Teorema del Límite Central"
) %>%
cols_label(
Parametro = "Parámetro",
Lim_Inferior = "Límite Inferior (m)",
Media_Muestral = "Media Calculada (m)",
Lim_Superior = "Límite Superior (m)",
Error_Estandar = "Error (m)"
) %>%
fmt_number(
columns = c(Lim_Inferior, Media_Muestral, Lim_Superior),
decimals = 2
) %>%
tab_style(
style = list(cell_fill(color = "#E8F8F5"), cell_text(color = "#145A32", weight = "bold")),
locations = cells_body(columns = Media_Muestral)
)| ESTIMACIÓN DE LA MEDIA POBLACIONAL | |||||
| Aplicación del Teorema del Límite Central | |||||
| Parámetro | Límite Inferior (m) | Media Calculada (m) | Límite Superior (m) | Error (m) | Confianza |
|---|---|---|---|---|---|
| Lámina de Agua Promedio | 557.32 | 574.72 | 592.12 | +/- 17.40 | 95% (2*E) |
La variable Lámina de Agua medida en metros sigue un comportamiento híbrido, modelado exitosamente mediante una Distribución Exponencial en aguas someras (\(\lambda=\) 0.01555) y Log-Normal en aguas profundas (\(\mu_{log}=\) 7.1647). Gracias a esto y al Teorema del Límite Central, podemos decir que la media aritmética poblacional de la lámina de agua se encuentra entre el valor de \(\mu \in [557.32; 592.12]\), lo que afirmamos con un 95% de confianza (\(\mu = 574.72 \pm 17.40\) m), y una desviación estándar muestral de 682.47 m.