El presente informe estadístico analiza la variable Lámina de Agua (en metros) de pozos petroleros de Brasil, aplicando técnicas descriptivas e inferenciales avanzadas de bondad de ajuste.
Dado que la lámina de agua de los pozos abarca un rango muy amplio (desde pozos terrestres hasta aguas ultraprofundas de más de 3,000 metros), agrupamos los datos en intervalos de 500 metros para visualizar la tendencia estructural y facilitar el cálculo de probabilidades en los modelos continuos.
library(tidyverse)
library(gt)
library(MASS)
if(!require(janitor)) install.packages("janitor", quiet = TRUE)
library(janitor)
# 1. Carga de datos
Datos_Brutos <- read.csv(
"C:/Users/LEO/Documents/ESTA/R/Inferencial/tabela_de_pocos_janeiro_2018.csv",
header = TRUE,
sep = ",",
dec = ".",
fileEncoding = "UTF-8"
)
Datos <- Datos_Brutos %>%
clean_names() %>%
mutate(lamina_d_agua_m = as.numeric(as.character(lamina_d_agua_m))) %>%
filter(!is.na(lamina_d_agua_m) & lamina_d_agua_m >= 0 & lamina_d_agua_m <= 3500)
X <- Datos$lamina_d_agua_m
# TABLA DE FRECUENCIAS GENERAL
breaks_lamina <- seq(0, 3500, by = 500)
h_total <- hist(X, breaks = breaks_lamina, plot = FALSE)
TDF_General <- data.frame(
Rango = paste(head(breaks_lamina, -1), tail(breaks_lamina, -1), sep = "-"),
ni = h_total$counts,
hi = round((h_total$counts / sum(h_total$counts)) * 100, 2)
)
totales_simplificados <- data.frame(
Rango = "TOTAL",
ni = sum(TDF_General$ni),
hi = 100.00
)
TDF_Show_Simple <- rbind(TDF_General, totales_simplificados)
TDF_Show_Simple %>%
gt() %>%
tab_header(
title = md("TABLA DE FRECUENCIAS: INFERENCIA ESTADÍSTICA"),
subtitle = md("Variable: **Lámina de Agua (m)**")
) %>%
tab_source_note(source_note = "Fuente: Tabela de Poços 2018") %>%
cols_label(
Rango = "Lámina de Agua (m)",
ni = "Frecuencia Absoluta (ni)",
hi = "Frecuencia Relativa (hi%)"
) %>%
cols_align(align = "center", columns = everything()) %>%
tab_style(
style = list(cell_fill(color = "#2E4053"), cell_text(color = "white", weight = "bold")),
locations = cells_title(groups = c("title", "subtitle"))
) %>%
tab_style(
style = list(cell_fill(color = "#F2F3F4"), cell_text(weight = "bold", color = "#2E4053")),
locations = cells_column_labels()
)
| TABLA DE FRECUENCIAS: INFERENCIA ESTADÍSTICA | ||
| Variable: Lámina de Agua (m) | ||
| Lámina de Agua (m) | Frecuencia Absoluta (ni) | Frecuencia Relativa (hi%) |
|---|---|---|
| 0-500 | 11037 | 81.96 |
| 500-1000 | 713 | 5.29 |
| 1000-1500 | 888 | 6.59 |
| 1500-2000 | 500 | 3.71 |
| 2000-2500 | 286 | 2.12 |
| 2500-3000 | 42 | 0.31 |
| 3000-3500 | 0 | 0.00 |
| TOTAL | 13466 | 100.00 |
| Fuente: Tabela de Poços 2018 | ||
A continuación, presentamos el histograma de frecuencias.
col_barras <- "#5D6D7E"
col_ejes <- "#2E4053"
par(mar = c(6, 5, 4, 2))
vals_x <- TDF_General$Rango
vals_y <- TDF_General$ni
ylim_max <- max(vals_y) * 1.1
bp <- barplot(
vals_y,
main = "Gráfica N°1: Distribución de Lámina de Agua de Pozos Petroleros de Brasil",
cex.main = 0.9,
ylab = "Cantidad de Pozos",
col = col_barras, border = "white",
axes = FALSE, ylim = c(0, ylim_max), axisnames = FALSE
)
axis(2, col = col_ejes, col.axis = col_ejes)
axis(1, at = bp, labels = vals_x, col = col_ejes, col.axis = col_ejes, las = 2, cex.axis = 0.9)
title(xlab = "Intervalos de Lámina de Agua (m)", line = 4)
grid(nx = NA, ny = NULL, col = "#D7DBDD", lty = "dotted")
box(bty = "l", col = col_ejes)
Al observar la Gráfica N°1, se evidencia que la variable Lámina de Agua posee una distribución altamente bimodal y segmentada por la naturaleza física del entorno:
Fase Terrestre y Somera (0–50 m): Caracterizada por la mayor concentración de pozos en cuencas terrestres históricas y plataformas costeras someras convencionales.
Fase de Aguas Profundas y Ultraprofundas (50–3,500 m): Una distribución asimétrica continua con una cola extendida hacia la derecha que responde al desarrollo del Presalt y de aguas profundas.
Por lo tanto, segmentamos de forma óptima fijando el umbral de transición en los 50 metros para aislar el efecto del desarrollo terrestre y modelar adecuadamente el desafío marítimo.
En este bloque analizamos si las láminas de agua menores o iguales a 300 metros siguen un comportamiento ajustado a la Distribución Exponencial.
X1 <- X[!is.na(X) & X <= 300]
if(length(X1) > 0) {
hist(
X1,
breaks = seq(0, 300, by = 50),
col = col_barras,
border = "white",
main = "Histograma Sección 1 (0–300 m)",
xlab = "Lámina de Agua (m)",
ylab = "Frecuencia"
)
} else {
print("¡Cuidado! No hay datos en el rango de 0 a 300 después de la limpieza.")
}
Calculamos el parámetro fundamental de la distribución exponencial: la Tasa (rate) de este tramo, para generar una curva teórica y compararla con los datos reales. Dado que las frecuencias caen de manera abrupta desde el valor cero, este modelo es idóneo para capturar dicho decaimiento.
if(length(X1) > 1) {
rate_e1 <- 1 / mean(X1)
h1 <- hist(X1, breaks = seq(0, 300, by = 50), plot = FALSE)
Fo1 <- h1$counts / sum(h1$counts)
Fe1 <- diff(pexp(seq(0, 300, by = 50), rate = rate_e1))
Fe1 <- Fe1 / sum(Fe1)
# Gráfica
barplot(
rbind(Fo1, Fe1),
beside = TRUE,
col = c(col_barras, "#F2F3F4"),
border = "black",
names.arg = paste0(head(seq(0, 300, by = 50), -1), "-", tail(seq(0, 300, by = 50), -1)),
main = "Gráfica N°2: Modelo de Probabilidad Exponencial (0–300 m)",
cex.main = 0.85,
ylab = "Probabilidad",
xlab = "Rangos (m)"
)
legend("topright", legend = c("Real", "Modelo Exponencial"),
fill = c(col_barras, "#F2F3F4"), border = "white", bty = "n")
} else {
message("No hay datos suficientes en el Tramo 1 para calcular el modelo.")
}
Aplicamos el coeficiente de correlación para medir qué tan fuerte es la relación lineal entre la frecuencia observada (realidad) y la esperada (modelo Exponencial).
plot(
Fo1, Fe1,
main = "Gráfica N°3: Correlación de Pearson — Sección 1 (Exponencial)",
xlab = "Frecuencia Observada",
ylab = "Frecuencia Esperada",
pch = 19, col = col_barras,
xlim = c(0, max(Fo1) * 1.05),
ylim = c(0, max(Fe1) * 1.05)
)
abline(lm(Fe1 ~ Fo1 + 0), col = "red", lwd = 2)
cor1 <- cor(Fo1, Fe1) * 100
cor1
## [1] 99.41081
Realizamos la prueba de bondad de ajuste de Chi-Cuadrado (χ²). Esta prueba indica si las diferencias entre el modelo y la realidad son aceptables (modelo válido) o si el modelo debe rechazarse.
x2_1 <- sum((Fo1 - Fe1)^2 / Fe1)
x2_1
## [1] 4.182982
vc1 <- qchisq(0.95, length(Fo1) - 1)
vc1
## [1] 11.0705
tabla_1 <- data.frame(
Modelo = "Exponencial",
Pearson = round(cor1, 2),
Chi_Cuadrado = round(x2_1, 4),
Umbral = round(vc1, 4),
Decision = ifelse(x2_1 < vc1, "Modelo aceptado", "Modelo rechazado")
)
gt(tabla_1) %>%
tab_header(title = md("**Tabla N°2: Resumen Bondad de Ajuste Sección 1**")) %>%
tab_source_note(source_note = "Autor: Leonardo Ruiz") %>%
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))
| Tabla N°2: Resumen Bondad de Ajuste Sección 1 | ||||
| Modelo | Pearson | Chi_Cuadrado | Umbral | Decision |
|---|---|---|---|---|
| Exponencial | 99.41 | 4.183 | 11.0705 | Modelo aceptado |
| Autor: Leonardo Ruiz | ||||
¿Cuál fue la probabilidad calculada de que un pozo tenga una lámina de agua menor a 150 metros en este primer tramo?
p_150 <- pexp(150, rate = rate_e1)
p_150
## [1] 0.9983378
La probabilidad es del 99.83%.
Analizamos la segunda etapa probando un ajuste a la Distribución Log-Normal, ideal para modelar fenómenos físicos con sesgo positivo.
X2 <- X[X > 300 & X <= 3500]
X2 <- X2[!is.na(X2)]
breaks_seccion2 <- seq(300, 3500, by = 400)
hist(
X2,
breaks = breaks_seccion2,
col = col_barras,
border = "white",
main = "Histograma Sección 2 (300–3,500 m)",
xlab = "Lámina de Agua (m)",
ylab = "Frecuencia"
)
La distribución Log-Normal es ampliamente utilizada en la industria petrolera para modelar variables cuya tasa de crecimiento es proporcional al valor actual, lo que permite un ajuste preciso en ambientes de profundidad variable. Estimamos los parámetros (meanlog, sdlog) mediante máxima verosimilitud.
fit_ln <- fitdistr(X2, "lognormal")
m_log <- fit_ln$estimate["meanlog"]
s_log <- fit_ln$estimate["sdlog"]
h2 <- hist(X2, breaks = breaks_seccion2, plot = FALSE)
Fo2 <- h2$counts / sum(h2$counts)
Fe2 <- diff(plnorm(breaks_seccion2, meanlog = m_log, sdlog = s_log))
Fe2 <- Fe2 / sum(Fe2)
etiquetas_prof <- paste0(head(breaks_seccion2, -1), "-", tail(breaks_seccion2, -1))
barplot(
rbind(Fo2, Fe2),
beside = TRUE,
col = c(col_barras, "#F2F3F4"),
border = "black",
names.arg = etiquetas_prof,
main = "Gráfica N°5: Modelo Log-Normal de Lámina de Agua (300–3,500 m)",
cex.main = 0.85,
ylab = "Probabilidad",
las = 2,
cex.names = 0.7
)
legend("topright", legend = c("Real", "Modelo Log-Normal"),
fill = c(col_barras, "#F2F3F4"), border = "white", bty = "n")
Evaluamos la Correlación de Pearson para cuantificar la relación lineal entre las frecuencias observadas y las probabilidades teóricas generadas por la distribución Log-Normal.
plot(
Fo2, Fe2,
main = "Gráfica N°6: Correlación de Pearson — Sección 2 (Log-Normal)",
xlab = "Frecuencia Observada",
ylab = "Frecuencia Esperada",
pch = 19, col = col_barras,
xlim = c(0, max(Fo2) * 1.05),
ylim = c(0, max(Fe2) * 1.05)
)
abline(lm(Fe2 ~ Fo2 + 0), col = "red", lwd = 2)
cor2 <- cor(Fo2, Fe2) * 100
cor2
## [1] 97.0866
Aplicamos la prueba de bondad de ajuste Chi-Cuadrado (χ²) para validar estadísticamente el modelo con un 95% de confianza.
x2_2 <- sum((Fo2 - Fe2)^2 / Fe2)
x2_2
## [1] 0.05318196
vc2 <- qchisq(0.95, length(Fo2) - 1)
vc2
## [1] 14.06714
tabla_2 <- data.frame(
Modelo = "Log-Normal",
Pearson = round(cor2, 2),
Chi_Cuadrado = round(x2_2, 4),
Umbral = round(vc2, 4),
Decision = ifelse(x2_2 < vc2, "Modelo aceptado", "Modelo rechazado")
)
gt(tabla_2) %>%
tab_header(title = md("**Tabla N°3: Resumen Bondad de Ajuste Sección 2**")) %>%
tab_source_note(source_note = "Autor: Leonardo Ruiz") %>%
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))
| Tabla N°3: Resumen Bondad de Ajuste Sección 2 | ||||
| Modelo | Pearson | Chi_Cuadrado | Umbral | Decision |
|---|---|---|---|---|
| Log-Normal | 97.09 | 0.0532 | 14.0671 | Modelo aceptado |
| Autor: Leonardo Ruiz | ||||
De cada 1,000 pozos perforados en el tramo profundo (300–3,500 m), ¿cuántos se estimó que se encuentran en el intervalo crítico de ultraprofundidad (2,000–3,500 m)?
p_ultra <- plnorm(3500, meanlog = m_log, sdlog = s_log) - plnorm(2000, meanlog = m_log, sdlog = s_log)
p_ultra
## [1] 0.1138198
cantidad_estimada <- round(p_ultra * 1000, 0)
El modelo Log-Normal estimó que, por cada 1,000 pozos de este periodo, aproximadamente 114 correspondieron al intervalo de ultraprofundidad de 2,000 a 3,500 metros.
El análisis segmentado e inferencial de la variable Lámina de Agua nos permite concluir lo siguiente:
Tramo 0–300 m: La fuerte concentración inicial de pozos terrestres y someros genera un decrecimiento drástico e inmediato de las frecuencias. Este comportamiento se modeló de manera óptima bajo la distribución Exponencial, demostrando que la probabilidad disminuye de forma constante a medida que nos alejamos de la costa hacia la plataforma continental interna.
Tramo 300–3,500 m: Para describir la transición hacia las regiones de talud, aguas profundas y ultraprofundas del Presalt, el modelo Log-Normal resultó ser el más eficiente. Gracias a su capacidad para modelar variables con sesgo positivo, capturó con alta fidelidad la distribución natural de los tirantes de agua, superando con éxito todas las pruebas rigurosas de bondad de ajuste de Chi-Cuadrado y Pearson.