El presente informe estadístico analiza la variable Profundidad Vertical (profundidade_vertical_m) de pozos petroleros de Brasil, aplicando técnicas descriptivas e inferenciales avanzadas de bondad de ajuste. Esta variable es crítica en la ingeniería de petróleos, ya que determina la presión y temperatura de fondo de pozo, influyendo directamente en el diseño mecánico y de completación.
Dado que los pozos petroleros se perforan con objetivos comerciales ubicados a miles de metros bajo el suelo o el lecho marino, los datos reflejan magnitudes elevadas. Agrupamos los datos en intervalos de 500 metros para capturar de manera óptima la distribución global de los horizontes productores de la cuenca.
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 real de la profundidad vertical (hasta 6,000 metros de control operativo)
Datos <- Datos_Brutos %>%
clean_names() %>%
mutate(profundidade_vertical_m = abs(as.numeric(as.character(profundidade_vertical_m)))) %>%
filter(!is.na(profundidade_vertical_m) & profundidade_vertical_m > 0 & profundidade_vertical_m <= 6000)
X <- Datos$profundidade_vertical_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 Vertical Total (m)**")
) %>%
tab_source_note(source_note = "Fuente: Tabela de Poços 2018") %>%
cols_label(
Rango = "Profundidad Vertical (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 Vertical Total (m) | ||
| Profundidad Vertical (m) | Frecuencia Absoluta (ni) | Frecuencia Relativa (hi%) |
|---|---|---|
| 0-500 | 1456 | 23.52 |
| 500-1000 | 1521 | 24.57 |
| 1000-1500 | 635 | 10.26 |
| 1500-2000 | 406 | 6.56 |
| 2000-2500 | 460 | 7.43 |
| 2500-3000 | 657 | 10.61 |
| 3000-3500 | 373 | 6.02 |
| 3500-4000 | 114 | 1.84 |
| 4000-4500 | 111 | 1.79 |
| 4500-5000 | 155 | 2.50 |
| 5000-5500 | 188 | 3.04 |
| 5500-6000 | 115 | 1.86 |
| TOTAL | 6191 | 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 Vertical 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 Vertical (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 vertical cuenta con una distribución bimodal o desplazada, reflejando dos grandes metodologías de explotación de la industria:
Fase Somera/Intermedia (0–2,500 m): Concentra pozos de menor complejidad técnica dirigidos a formaciones someras continentales o de aguas someras.
Fase Profunda/Ultraprofunda (2,500–6,000 m): Representa un volumen masivo de pozos perforados con alta tecnología para alcanzar yacimientos profundos marinos.
Fijamos el límite de segmentación operacional en los 2,500 metros para aislar ambos comportamientos industriales.
En este bloque analizamos si las profundidades menores o iguales a 2,500 metros siguen un comportamiento ajustado a la Distribución Weibull. Este modelo es altamente flexible y adecuado para variables de ingeniería mecánica y geológica que registran un crecimiento gradual tras un umbral inicial nulo.
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 Vertical (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 (shape) y escala (scale) del modelo Weibull, silenciando los avisos numéricos secundarios del optimizador.
if(length(X1) > 1) {
fit_weibull1 <- suppressWarnings(fitdistr(X1, "weibull"))
shape_w1 <- fit_weibull1$estimate["shape"]
scale_w1 <- fit_weibull1$estimate["scale"]
breaks_s1 <- seq(0, 2500, by = 250)
h1 <- hist(X1, breaks = breaks_s1, plot = FALSE)
Fo1 <- h1$counts / sum(h1$counts)
Fe1 <- diff(pweibull(breaks_s1, shape = shape_w1, scale = scale_w1))
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 Weibull (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 Weibull"),
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 Weibull calibrado.
plot(
Fo1, Fe1,
main = "Gráfica N°3: Correlación de Pearson — Sección 1 (Weibull)",
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] 90.31033
Aplicamos la prueba de bondad de ajuste de Chi-Cuadrado (χ²) para comprobar la validez estadística del modelo Weibull adaptado a este tramo.
x2_1 <- sum((Fo1 - Fe1)^2 / Fe1)
x2_1
## [1] 0.1631023
vc1 <- qchisq(0.95, length(Fo1) - 1)
vc1
## [1] 16.91898
tabla_1 <- data.frame(
Modelo = "Weibull",
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 (Weibull)**")) %>%
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 (Weibull) | ||||
| Modelo | Pearson | Chi_Cuadrado | Umbral | Decision |
|---|---|---|---|---|
| Weibull | 90.31 | 0.1631 | 16.919 | Modelo aceptado |
| Autor: Leonardo Ruiz | ||||
¿Cuál es la probabilidad matemática estimada de que un pozo de esta sección intermedia cuente con una profundidad vertical menor a 1,500 metros?
p_1500 <- pweibull(1500, shape = shape_w1, scale = scale_w1)
p_1500
## [1] 0.8321347
La probabilidad es del 83.21%.
Analizamos la segunda etapa estructural aplicando un ajuste a la Distribución Beta. Debido a que el histograma presenta un comportamiento no monotónico (un fuerte decaimiento seguido de un repunte en profundidades mayores), se requiere la alta flexibilidad de la distribución Beta, aplicada mediante la normalización del intervalo [2500, 6000], para modelar con precisión esta tendencia bimodal latente.
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 Vertical (m)",
ylab = "Frecuencia"
)
Normalizamos los datos al rango [0,1] para estimar los parámetros de forma (shape1, shape2) de la distribución Beta mediante máxima verosimilitud, permitiendo capturar las fluctuaciones del tramo profundo.
# Escalamos los datos al rango estricto (0, 1) para evitar problemas en los límites con la distribución 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)
# Calculamos las probabilidades teóricas usando los límites normalizados
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 Vertical (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 la relación lineal entre las frecuencias observadas y las probabilidades teóricas generadas por la distribución Beta.
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] 92.35169
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.1039482
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")
)
gt(tabla_2) %>%
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 | 92.35 | 0.1039 | 12.5916 | Modelo aceptado |
| Autor: Leonardo Ruiz | ||||
De cada 1,000 pozos profundos analizados en este segundo tramo estructural (2,500–6,000 m), ¿cuántos se estimó matemáticamente que pertenecen al intervalo entre los 4,000 y 5,000 metros de profundidad vertical?
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.2246839
cantidad_estimada <- round(p_critica * 1000, 0)
El modelo Beta estimó que, por cada 1,000 pozos profundos, aproximadamente 225 se encuentran en el intervalo entre 4,000 y 5,000 metros.
El análisis segmentado e inferencial de la variable Profundidad Vertical de pozos petroleros nos permite concluir lo siguiente:
Tramo 0–2,500 m: La escasez de pozos terminados en cotas sumamente someras y su incremento progresivo se modeló de forma satisfactoria mediante la distribución Weibull.
Tramo 2,500–6,000 m: Para describir la muestra orientada a yacimientos profundos, la distribución Beta (aplicada mediante normalización de rango) demostró ser el modelo idóneo. Al poseer una estructura matemática flexible, asimiló la naturaleza no monótona de las frecuencias operativas caracterizada por un fuerte descenso intermedio y un posterior repunte de objetivos profundos, optimizando sustancialmente el coeficiente de Pearson y la validez del ajuste estadístico.