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.8)
title(xlab = "Intervalos de Lámina de Agua (m)", line = 5)
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 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 de la lámina de agua utilizando intervalos de confianza robustos basados en la guía empírica.Los postulados de confianza empírica determinan las siguientes coberturas:\(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 Error Estándar (\(E\)) se define formalmente en la guía como:\[E = \frac{\sigma}{\sqrt{n}}\]
# Estadísticos muestrales reales para la Lámina de Agua
x_bar <- mean(X, na.rm = TRUE)
sigma_muestral <- sd(X, na.rm = TRUE)
n_tlc <- length(X)
# Cálculo del Error Estándar (E de la guía) y Margen de Error al 95% (2*E)
error_est <- sigma_muestral / sqrt(n_tlc)
margen_error_95 <- 2 * error_est
# Intervalo de Confianza dinámico al 95%
lim_inf_tlc <- x_bar - margen_error_95
lim_sup_tlc <- x_bar + margen_error_95
# Construcción de la tabla de resultados del TLC
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 (TLC)"
) %>%
tab_source_note(source_note = "Análisis de Incertidumbre Operacional — Brasil 2018") %>%
cols_label(
Parametro = "Parámetro",
Lim_Inferior = "Límite Inferior (m)",
Media_Muestral = "Media Calculada (m)",
Lim_Superior = "Límite Superior (m)",
Error_Estandar = "Margen de Error (m)",
Confianza = "Nivel de Confianza"
) %>%
cols_align(align = "center", columns = everything()) %>%
fmt_number(
columns = c(Lim_Inferior, Media_Muestral, Lim_Superior),
decimals = 2
) %>%
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()
) %>%
tab_style(
style = list(cell_fill(color = "#E8F8F5"), cell_text(color = "#145A32", weight = "bold")),
locations = cells_body(columns = Media_Muestral)
) %>%
tab_options(
table.border.top.color = "#2E4053",
table.border.bottom.color = "#2E4053",
column_labels.border.bottom.color = "#2E4053",
data_row.padding = px(7)
)
| ESTIMACIÓN DE LA MEDIA POBLACIONAL | |||||
| Aplicación del Teorema del Límite Central (TLC) | |||||
| Parámetro | Límite Inferior (m) | Media Calculada (m) | Límite Superior (m) | Margen de Error (m) | Nivel de Confianza |
|---|---|---|---|---|---|
| Lámina de Agua Promedio | 258.58 | 268.13 | 277.68 | +/- 9.55 | 95% (2*E) |
| Análisis de Incertidumbre Operacional — Brasil 2018 | |||||
La variable Lámina de Agua medida en metros sigue un modelo Exponencial en su tramo inicial con parámetro de tasa \(\lambda =\) 0.04266. Gracias a esto y al Teorema del Límite Central, podemos decir que la media aritmética poblacional de la cota se encuentra entre el valor de \(\mu \in [\) 258.58 \(;\) 277.68 \(]\), lo que afirmamos con un 95% de confianza (\(\mu =\) 268.13 \(\pm\) 9.55 m), y una desviación estándar muestral de 554.17 m.