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 análisis segmentado e inferencial de la variable Profundidad del Perforador nos permite concluir lo siguiente:
Tramo 0–2,500 m: La distribución Gamma demostró un desempeño robusto para representar la transición y el incremento de pozos someros y de complejidad media, ajustándose adecuadamente a la acumulación progresiva de datos observados.
Tramo 2,500–6,000 m: La trayectoria extendida de los pozos con objetivos de alta profundidad requiere un tratamiento analítico avanzado. La distribución Beta probó ser el modelo ideal, ya que su flexibilidad matemática absorbió con precisión la naturaleza bimodal del tramo. Esto garantiza una optimización sustancial de la correlación de Pearson y consolida la viabilidad de las simulaciones y estimaciones mecánicas en la planeación de perforación activa.