El presente informe estadístico analiza la variable Cota Altimétrica (en metros) de pozos petroleros de Brasil, aplicando técnicas descriptivas e inferenciales avanzadas de bondad de ajuste.
Dado que los pozos comerciales en las cuencas brasileñas se extienden a través de complejas trayectorias direccionales para alcanzar horizontes productores profundos, los datos reflejan magnitudes elevadas. Agrupamos las observaciones en intervalos de 500 metros para capturar de manera óptima la distribución global y la densidad de objetivos exploratorios y de desarrollo.
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"
)
# Limpieza: Filtramos el rango de la profundidad del sondador hasta 6,000 metros de control operativo
Datos <- Datos_Brutos %>%
clean_names() %>%
mutate(profundidade_sondador_m = abs(as.numeric(as.character(profundidade_sondador_m)))) %>%
filter(!is.na(profundidade_sondador_m) & profundidade_sondador_m > 0 & profundidade_sondador_m <= 6000)
X <- Datos$profundidade_sondador_m
# TABLA DE FRECUENCIAS GENERAL
breaks_prof <- seq(0, 6000, by = 500)
h_total <- hist(X, breaks = breaks_prof, plot = FALSE)
TDF_General <- data.frame(
Rango = paste(head(breaks_prof, -1), tail(breaks_prof, -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: **Profundidad del Perforador (profundidade_sondador_m)**")
) %>%
tab_source_note(source_note = "Fuente: Tabela de Poços 2018") %>%
cols_label(
Rango = "Profundidad del Sondador (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: Profundidad del Perforador (profundidade_sondador_m) | ||
| Profundidad del Sondador (m) | Frecuencia Absoluta (ni) | Frecuencia Relativa (hi%) |
|---|---|---|
| 0-500 | 5618 | 21.43 |
| 500-1000 | 6792 | 25.91 |
| 1000-1500 | 4041 | 15.42 |
| 1500-2000 | 2338 | 8.92 |
| 2000-2500 | 1517 | 5.79 |
| 2500-3000 | 1853 | 7.07 |
| 3000-3500 | 1828 | 6.97 |
| 3500-4000 | 975 | 3.72 |
| 4000-4500 | 467 | 1.78 |
| 4500-5000 | 336 | 1.28 |
| 5000-5500 | 263 | 1.00 |
| 5500-6000 | 183 | 0.70 |
| TOTAL | 26211 | 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 Profundidad del Sondador de Pozos en 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 Profundidad Sondador (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 profundidad medida por el sondador cuenta con un marcado comportamiento bimodal, condicionado por los límites económicos y tecnológicos de la industria petrolera extractiva:
Fase Somera/Intermedia (0–2,500 m): Agrupa pozos someros terrestres o de cuencas maduras continentales con un incremento progresivo de la densidad de pozos conforme aumenta el desafío operacional.
Fase Profunda/Ultraprofunda (2,500–6,000 m): Representa la masiva inversión en campos marinos profundos, donde las trayectorias direccionales extienden la longitud medida (MD) significativamente, mostrando un marcado repunte de pozos en los horizontes más profundos.
Fijamos el límite de segmentación operacional en los 2,500 metros para aislar e inferir matemáticamente ambos tramos independientes.
En este bloque analizamos si las profundidades menores o iguales a 2,500 metros siguen un comportamiento ajustado a la Distribución Gamma. Este modelo continuo es ideal para modelar variables de ingeniería física que muestran una asimetría positiva moderada y un crecimiento continuo después de un origen controlado.
X1 <- X[!is.na(X) & X <= 2500]
if(length(X1) > 0) {
hist(
X1,
breaks = seq(0, 2500, by = 250),
col = col_barras,
border = "white",
main = "Histograma Sección 1 (0–2,500 m)",
xlab = "Profundidad del Sondador (m)",
ylab = "Frecuencia"
)
} else {
print("¡Cuidado! No hay datos en el rango seleccionado después de la limpieza.")
}
Utilizamos la estimación por máxima verosimilitud para calibrar los parámetros de forma y tasa del modelo Gamma, resguardando la convergencia numérica ante frecuencias bajas en intervalos iniciales.
if(length(X1) > 1) {
fit_gamma1 <- suppressWarnings(fitdistr(X1, "gamma"))
shape_g1 <- fit_gamma1$estimate["shape"]
rate_g1 <- fit_gamma1$estimate["rate"]
breaks_s1 <- seq(0, 2500, by = 250)
h1 <- hist(X1, breaks = breaks_s1, plot = FALSE)
Fo1 <- h1$counts / sum(h1$counts)
Fe1 <- diff(pgamma(breaks_s1, shape = shape_g1, rate = rate_g1))
Fe1 <- Fe1 / sum(Fe1)
barplot(
rbind(Fo1, Fe1),
beside = TRUE,
col = c(col_barras, "#F2F3F4"),
border = "black",
names.arg = paste0(head(breaks_s1, -1), "-", tail(breaks_s1, -1)),
main = "Gráfica N°2: Modelo de Probabilidad Gamma (0–2,500 m)",
cex.main = 1.2,
ylab = "Probabilidad",
xlab = "Rangos de Profundidad (m)",
las = 2,
cex.names = 0.55
)
legend("topright", legend = c("Real", "Modelo Gamma"),
fill = c(col_barras, "#F2F3F4"), border = "white", bty = "n")
} else {
message("No hay datos suficientes en el Tramo 1 para calcular el modelo.")
}
Evaluamos el ajuste calculando el coeficiente de correlación lineal entre las proporciones de frecuencia empíricas observadas y las esperadas analíticamente por el modelo Gamma calibrado.
plot(
Fo1, Fe1,
main = "Gráfica N°3: Correlación de Pearson — Sección 1 (Gamma)",
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] 83.943
Aplicamos la prueba de bondad de ajuste de Chi-Cuadrado (χ²) para comprobar la validez estadística del modelo Gamma adaptado a este tramo con un 95% de confianza.
x2_1 <- sum((Fo1 - Fe1)^2 / Fe1)
x2_1
## [1] 0.1280061
vc1 <- qchisq(0.95, length(Fo1) - 1)
vc1
## [1] 16.91898
tabla_1 <- data.frame(
Modelo = "Gamma",
Pearson = round(cor1, 2),
Chi_Cuadrado = round(x2_1, 4),
Umbral = round(vc1, 4),
Decision = ifelse(x2_1 < vc1, "Modelo aceptado", "Modelo rechazado")
)
tabla_1 %>%
gt() %>%
tab_header(title = md("**Tabla N°2: Resumen Bondad de Ajuste Sección 1 (Gamma)**")) %>%
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 (Gamma) | ||||
| Modelo | Pearson | Chi_Cuadrado | Umbral | Decision |
|---|---|---|---|---|
| Gamma | 83.94 | 0.128 | 16.919 | Modelo aceptado |
| Autor: Leonardo Ruiz | ||||
¿Cuál es la probabilidad matemática estimada de que un pozo perforado en esta sección somera cuente con una profundidad del sondador menor a 1,500 metros?
p_1500 <- pgamma(1500, shape = shape_g1, rate = rate_g1)
p_1500
## [1] 0.8304101
La probabilidad es del 83.04%.
Analizamos la segunda etapa estructural aplicando un ajuste a la Distribución Beta. Debido a que el histograma del tramo profundo presenta fluctuaciones no monotónicas severas (un marcado valle intermedio seguido de un fuerte incremento de la actividad exploratoria pre-sal en profundidades mayores), la distribución Beta parametrizada mediante normalización del intervalo [2500, 6000] resulta indispensable gracias a su versatilidad para adquirir formas cóncavas y asimétricas complejas.
X2 <- X[X > 2500 & X <= 6000]
X2 <- X2[!is.na(X2)]
breaks_seccion2 <- seq(2500, 6000, by = 500)
hist(
X2,
breaks = breaks_seccion2,
col = col_barras,
border = "white",
main = "Histograma Sección 2 (2,500–6,000 m)",
xlab = "Profundidad del Sondador (m)",
ylab = "Frecuencia"
)
Normalizamos estrictamente los datos cinemáticos al rango continuo para estimar matemáticamente los parámetros de forma de la densidad Beta empleando optimización numérica de verosimilitud.
# Escalamos los datos al rango matemático admisible (0, 1) para la función de densidad Beta
X2_norm <- (X2 - 2500) / (6000 - 2500)
X2_norm <- pmax(pmin(X2_norm, 0.999), 0.001)
fit_beta2 <- suppressWarnings(fitdistr(X2_norm, "beta", start = list(shape1 = 1, shape2 = 1)))
s1_b2 <- fit_beta2$estimate["shape1"]
s2_b2 <- fit_beta2$estimate["shape2"]
h2 <- hist(X2, breaks = breaks_seccion2, plot = FALSE)
Fo2 <- h2$counts / sum(h2$counts)
# Mapeamos las marcas de clase y límites a la escala normalizada del modelo Beta
breaks_norm <- (breaks_seccion2 - 2500) / (6000 - 2500)
Fe2 <- diff(pbeta(breaks_norm, shape1 = s1_b2, shape2 = s2_b2))
Fe2 <- Fe2 / sum(Fe2)
etiquetas_prof2 <- 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_prof2,
main = "Gráfica N°5: Modelo Beta de Profundidad del Sondador (2,500–6,000 m)",
cex.main = 0.85,
ylab = "Probabilidad",
las = 2,
cex.names = 0.7
)
legend("topright", legend = c("Real", "Modelo Beta"),
fill = c(col_barras, "#F2F3F4"), border = "white", bty = "n")
Evaluamos la Correlación de Pearson para cuantificar el grado de correspondencia lineal exacta entre las probabilidades modeladas y los datos de campo reales recolectados por el sondador.
plot(
Fo2, Fe2,
main = "Gráfica N°6: Correlación de Pearson — Sección 2 (Beta)",
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] 94.8683
Aplicamos la prueba de bondad de ajuste Chi-Cuadrado (χ²) para comprobar rigurosamente si las discrepancias entre las frecuencias empíricas y teóricas son estadísticamente significativas.
x2_2 <- sum((Fo2 - Fe2)^2 / Fe2)
x2_2
## [1] 0.0787056
vc2 <- qchisq(0.95, length(Fo2) - 1)
vc2
## [1] 12.59159
tabla_2 <- data.frame(
Modelo = "Beta",
Pearson = round(cor2, 2),
Chi_Cuadrado = round(x2_2, 4),
Umbral = round(vc2, 4),
Decision = ifelse(x2_2 < vc2, "Modelo aceptado", "Modelo rechazado")
)
tabla_2 %>%
gt() %>%
tab_header(title = md("**Tabla N°3: Resumen Bondad de Ajuste Sección 2 (Beta)**")) %>%
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 (Beta) | ||||
| Modelo | Pearson | Chi_Cuadrado | Umbral | Decision |
|---|---|---|---|---|
| Beta | 94.87 | 0.0787 | 12.5916 | Modelo aceptado |
| Autor: Leonardo Ruiz | ||||
Considerando un lote hipotético de 1,000 pozos profundos analizados bajo el tramo del perforador, ¿cuántos estima el modelo probabilístico que se finalizarán en el intervalo crítico de alta presión entre los 4,000 y 5,000 metros?
lim_inf_norm <- (4000 - 2500) / (6000 - 2500)
lim_sup_norm <- (5000 - 2500) / (6000 - 2500)
p_critica <- pbeta(lim_sup_norm, shape1 = s1_b2, shape2 = s2_b2) - pbeta(lim_inf_norm, shape1 = s1_b2, shape2 = s2_b2)
p_critica
## [1] 0.2155158
cantidad_estimada <- round(p_critica * 1000, 0)
El modelo Beta estimó que, por cada 1,000 pozos profundos, aproximadamente 216 alcanzarán su profundidad final medibles en este intervalo específico.
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 aproximadamente Normal, independientemente de la naturaleza o distribución original de la variable continua en la población.
En la ingeniería de petróleos, esto resulta fundamental: nos permite estimar con rigurosidad matemática la verdadera Media Poblacional (\(\mu\)) de las trayectorias de perforación en toda la cuenca usando intervalos de confianza, sin importar el comportamiento bimodal que presentan los datos brutos.
Los postulados de confianza empírica (regla heurística) 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\)) para un nivel de confianza del 95% aproximado se define a partir del error estándar de la media: \[E = 2 \times \frac{\sigma}{\sqrt{n}}\] ## Estimación de la Media Poblacional e Intervalo de Confianza
# Estadísticos aritméticos globales sobre la profundidad del sondador (X)
x_bar <- mean(X)
sigma_muestral <- sd(X)
n_tlc <- length(X)
# Cálculo simplificado del error estándar y margen de error (Z ≈ 2 para 95% de confianza)
error_est <- sigma_muestral / sqrt(n_tlc)
margen_error_95 <- 2 * error_est
# Determinación de los límites operativos del intervalo
lim_inf_tlc <- x_bar - margen_error_95
lim_sup_tlc <- x_bar + margen_error_95
# Construcción y diseño de la tabla resumen con gt()
data.frame(
Parametro = "Profundidad del Sondador 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)"
) %>%
gt() %>%
tab_header(
title = md("**ESTIMACIÓN DE LA MEDIA POBLACIONAL**"),
subtitle = md("Aplicación del Teorema del Límite Central ($n > 30$)")
) %>%
tab_source_note(source_note = "Fuente: Inferencia sobre Tabela de Poços") %>%
cols_label(
Parametro = "Parámetro Analizado",
Lim_Inferior = "Límite Inferior (m)",
Media_Muestral = "Media Calculada ($\bar{x}$)",
Lim_Superior = "Límite Superior (m)",
Error_Estandar = "Margen de Error (m)"
) %>%
fmt_number(
columns = c(Lim_Inferior, Media_Muestral, Lim_Superior),
decimals = 2
) %>%
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()
) %>%
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 Analizado | Límite Inferior (m) | Media Calculada ($ar{x}$) | Límite Superior (m) | Margen de Error (m) | Confianza |
|---|---|---|---|---|---|
| Profundidad del Sondador Promedio | 1,522.95 | 1,538.22 | 1,553.50 | +/- 15.27 | 95% (2*E) |
| Fuente: Inferencia sobre Tabela de Poços | |||||
La variable Profundidad del Sondador medida en metros sigue un modelo Bimodal (segmentado en Gamma y Beta). 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 [1522.95; 1553.5]\), lo que afirmamos con un 95% de confianza (\(\mu = 1538.22 \pm 15.27\) m), y una desviación estándar muestral de 1236.4 m.