library(tidyverse)
library(gt)
library(MASS)
library(janitor)
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(mesa_rotativa = abs(as.numeric(as.character(mesa_rotativa)))) %>%
filter(!is.na(mesa_rotativa) & mesa_rotativa >= 0 & mesa_rotativa <= 1600)
X <- Datos$mesa_rotativa
amplitud <- 400
breaks_prof <- seq(0, 1600, by = amplitud)
h_total <- hist(X, breaks = breaks_prof, plot = FALSE)
mc <- (head(breaks_prof, -1) + tail(breaks_prof, -1)) / 2
ni <- h_total$counts
hi <- round((ni / sum(ni)) * 100, 2)
ni_asc <- cumsum(ni)
hi_asc <- round(cumsum(hi), 2)
ni_desc <- rev(cumsum(rev(ni)))
hi_desc <- round(rev(cumsum(rev(hi))), 2)
TDF_General <- data.frame(
Intervalo = paste0("[", round(head(breaks_prof, -1), 2), " - ", round(tail(breaks_prof, -1), 2), ")"),
MC = mc,
ni = ni,
hi = hi,
Ni_asc = ni_asc,
Hi_asc = hi_asc,
Ni_desc = ni_desc,
Hi_desc = hi_desc
)
# Fila de totales
totales_simplificados <- data.frame(
Intervalo = "Totales",
MC = NA,
ni = sum(ni),
hi = 100.00,
Ni_asc = NA,
Hi_asc = NA,
Ni_desc = NA,
Hi_desc = NA
)
TDF_Show_Simple <- rbind(TDF_General, totales_simplificados)
TDF_Show_Simple %>%
gt() %>%
tab_header(
title = md("Tabla Nro. 1"),
subtitle = md("Distribución de frecuencia")
) %>%
tab_source_note(source_note = "Fuente: Tabela de Poços 2018") %>%
cols_label(
Intervalo = "Intervalo",
MC = "MC",
ni = "ni",
hi = "hi",
Ni_asc = "Ni_asc",
Hi_asc = "Hi_asc",
Ni_desc = "Ni_desc",
Hi_desc = "Hi_desc"
) %>%
fmt_number(
columns = c(MC),
decimals = 2
) %>%
fmt_missing(
columns = everything(),
missing_text = "-"
) %>%
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_borders(sides = "right", color = "#D7DBDD", weight = px(4))),
locations = cells_body(columns = everything())
) %>%
tab_style(
style = list(cell_borders(sides = "right", color = "#BDC3C7", weight = px(4))),
locations = cells_column_labels(columns = everything())
)
## Warning: Since gt v0.6.0 `fmt_missing()` is deprecated and will soon be removed.
## ℹ Use `sub_missing()` instead.
## This warning is displayed once every 8 hours.
| Tabla Nro. 1 | |||||||
| Distribución de frecuencia | |||||||
| Intervalo | MC | ni | hi | Ni_asc | Hi_asc | Ni_desc | Hi_desc |
|---|---|---|---|---|---|---|---|
| [0 - 400) | 200.00 | 28672 | 99.31 | 28672 | 99.31 | 28870 | 100.00 |
| [400 - 800) | 600.00 | 118 | 0.41 | 28790 | 99.72 | 198 | 0.69 |
| [800 - 1200) | 1,000.00 | 69 | 0.24 | 28859 | 99.96 | 80 | 0.28 |
| [1200 - 1600) | 1,400.00 | 11 | 0.04 | 28870 | 100.00 | 11 | 0.04 |
| Totales | - | 28870 | 100.00 | - | - | - | - |
| Fuente: Tabela de Poços 2018 | |||||||
col_barras <- "#5D6D7E"
col_ejes <- "#2E4053"
par(mar = c(8, 5, 4, 2))
h_plot_general <- hist(X, breaks = breaks_prof, plot = FALSE)
ylim_max <- max(h_plot_general$counts) * 1.15
plot(
h_plot_general,
main = "Gráfica N°1: Histograma de Mesa Rotativa de Pozos en Brasil",
cex.main = 0.9,
xlab = "",
ylab = "Cantidad de pozos",
col = col_barras,
border = "white",
axes = FALSE,
ylim = c(0, ylim_max),
xaxt = "n"
)
# Eje Y
axis(2, col = col_ejes, col.axis = col_ejes, cex.axis = 0.8)
labels_x <- round(breaks_prof, 0)
axis(1, at = breaks_prof, labels = labels_x, col = col_ejes, col.axis = col_ejes, las = 2, cex.axis = 0.75)
title(xlab = "Intervalos de Mesa Rotativa (m)", line = 6.5)
grid(nx = NA, ny = NULL, col = "#D7DBDD", lty = "dotted")
box(bty = "l", col = col_ejes)
Esta gráfica representa la distribución de frecuencias de la mesa rotativa de los pozos petroleros en Brasil agrupados por intervalos:
col_barras <- "#5D6D7E"
col_ejes <- "#2E4053"
par(mar = c(7, 5, 4, 2))
breaks_exactos <- seq(0, 1600, by = 200)
h_custom <- hist(X, breaks = breaks_exactos, plot = FALSE)
ylim_max <- max(h_custom$counts) * 1.25
plot(
h_custom,
main = "Gráfica N°1: Histograma de Mesa Rotativa de Pozos en Brasil",
cex.main = 0.9,
xlab = "",
ylab = "Cantidad de pozos",
col = col_barras,
border = "white",
axes = FALSE,
ylim = c(0, ylim_max),
xlim = c(0, 1600)
)
axis(2, col = col_ejes, col.axis = col_ejes, cex.axis = 0.8)
axis(1, at = breaks_exactos, labels = breaks_exactos, col = col_ejes, col.axis = col_ejes, las = 2, cex.axis = 0.75)
title(xlab = "Intervalos de Mesa Rotativa (m)", line = 5.5)
grid(nx = NA, ny = NULL, col = "#D7DBDD", lty = "dotted")
box(bty = "l", col = col_ejes)
abline(v = 400, col = col_ejes, lwd = 1.5, lty = 2)
abline(v = 800, col = col_ejes, lwd = 1.5, lty = 2)
legend(
"topright",
legend = c("Histograma Empírico", "Cortes de Agrupación"),
col = c(col_barras, col_ejes),
pch = c(15, NA),
lty = c(NA, 2),
lwd = c(NA, 1.5),
bty = "n",
cex = 0.8
)
col_barras <- "#5D6D7E"
col_ejes <- "#2E4053"
par(mar = c(7, 5, 4, 2))
X_sub1 <- X[X <= 400]
breaks_1 <- seq(0, 400, by = 50)
h1 <- hist(X_sub1, breaks = breaks_1, plot = FALSE)
ylim_max1 <- max(h1$counts) * 1.15
plot(
h1,
main = "Agrupación 1: Intervalo de 0 a 400 m",
cex.main = 0.9,
xlab = "",
ylab = "Cantidad de pozos",
col = col_barras,
border = "white",
axes = FALSE,
ylim = c(0, ylim_max1)
)
axis(2, col = col_ejes, col.axis = col_ejes)
axis(1, at = breaks_1, labels = breaks_1, col = col_ejes, col.axis = col_ejes, las = 2, cex.axis = 0.8)
title(xlab = "Intervalos de Mesa Rotativa (m)", line = 5.5)
grid(nx = NA, ny = NULL, col = "#D7DBDD", lty = "dotted")
box(bty = "l", col = col_ejes)
legend(
"topright",
legend = c("Histograma Observado"),
col = c(col_barras),
pch = c(15),
bty = "n",
cex = 0.8
)
par(mar = c(7, 5, 4, 2))
X_sub2 <- X[X > 400 & X <= 800]
breaks_2 <- seq(400, 800, by = 80)
h2 <- hist(X_sub2, breaks = breaks_2, plot = FALSE)
ylim_max2 <- max(h2$counts) * 1.15
plot(
h2,
main = "Agrupación 2: Intervalo de 400 a 800 m",
cex.main = 0.9,
xlab = "",
ylab = "Cantidad de pozos",
col = col_barras,
border = "white",
axes = FALSE,
ylim = c(0, ylim_max2)
)
axis(2, col = col_ejes, col.axis = col_ejes)
axis(1, at = breaks_2, labels = breaks_2, col = col_ejes, col.axis = col_ejes, las = 2, cex.axis = 0.8)
title(xlab = "Intervalos de Mesa Rotativa (m)", line = 5.5)
grid(nx = NA, ny = NULL, col = "#D7DBDD", lty = "dotted")
box(bty = "l", col = col_ejes)
legend(
"topright",
legend = c("Histograma Observado"),
col = c(col_barras),
pch = c(15),
bty = "n",
cex = 0.8
)
par(mar = c(7, 5, 4, 2))
X_sub3 <- X[X > 800 & X <= 1600]
breaks_3 <- seq(800, 1600, by = 200)
h3 <- hist(X_sub3, breaks = breaks_3, plot = FALSE)
ylim_max3 <- max(h3$counts) * 1.15
plot(
h3,
main = "Agrupación 3: Intervalo de 800 a 1600 m",
cex.main = 0.9,
xlab = "",
ylab = "Cantidad de pozos",
col = col_barras,
border = "white",
axes = FALSE,
ylim = c(0, ylim_max3)
)
axis(2, col = col_ejes, col.axis = col_ejes)
axis(1, at = breaks_3, labels = breaks_3, col = col_ejes, col.axis = col_ejes, las = 2, cex.axis = 0.8)
title(xlab = "Intervalos de Mesa Rotativa (m)", line = 5.5)
grid(nx = NA, ny = NULL, col = "#D7DBDD", lty = "dotted")
box(bty = "l", col = col_ejes)
legend(
"topright",
legend = c("Histograma Observado"),
col = c(col_barras),
pch = c(15),
bty = "n",
cex = 0.8
)
#Agrupación 1
##Se conjetura que la concentración de la mesa rotativa sigue un modelo de probabilidad exponencial, ya que la variable en su histograma muestra que la mayor parte de los datos está concentrada en el extremo izquierdo (bajos valores) y la frecuencia disminuye rápidamente conforme aumentan los valores
#Agrupación 2
##Se observa que la distribución de la variable mesa rotativa sigue aproximadamente un modelo de distribución normal. Esto se basa en la observación del histograma, tras la primera barra, se aprecia que las frecuencias de las tres barras siguientes consecutivas muestran una forma simétrica y centralizada, característica de la distribución normal.
#Agrupación 3
##Se conjetura que la mesa rotativa con intervalos específicos, sigue un modelo de probabilidad log-normal, ya que la variable en su histograma presenta barras asimétricas con una mayor concentración de observaciones en intervalos bajos y una cola larga hacia valores altos, lo que indica una distribución sesgada positiva.
# Agrupación 1 (Exponencial)
x_curva1 <- seq(min(breaks_1), max(breaks_1), length.out = 300)
y_curva1 <- dexp(x_curva1, rate = 1 / mean(X_sub1, na.rm = TRUE)) * diff(breaks_1)[1]
# Agrupación 2 (Normal)
x_curva2 <- seq(min(breaks_2), max(breaks_2), length.out = 300)
y_curva2 <- dnorm(x_curva2, mean = mean(X_sub2, na.rm = TRUE), sd = sd(X_sub2, na.rm = TRUE)) * diff(breaks_2)[1]
# Agrupación 3 (Log-Normal)
x_curva3 <- seq(min(breaks_3), max(breaks_3), length.out = 300)
mlog3 <- mean(log(X_sub3[X_sub3 > 0]), na.rm = TRUE)
slog3 <- sd(log(X_sub3[X_sub3 > 0]), na.rm = TRUE)
y_curva3 <- dlnorm(x_curva3, meanlog = mlog3, sdlog = slog3) * diff(breaks_3)[1]
## Agrupación N°1
X_sub1 <- X[X <= 400]
h1 <- hist(X_sub1, breaks = breaks_1, plot = FALSE)
h1$density <- h1$counts / length(X_sub1)
plot(
h1,
freq = FALSE,
main = "Agrupación 1: Sobreposición del Modelo Exponencial",
cex.main = 0.9,
xlab = "",
ylab = "Densidad de probabilidad",
col = col_barras,
border = "white",
axes = FALSE,
ylim = c(0, 0.8)
)
axis(2, col = col_ejes, col.axis = col_ejes)
axis(1, at = breaks_1, labels = breaks_1, col = col_ejes, col.axis = col_ejes, las = 2, cex.axis = 0.8)
title(xlab = "Intervalos de Mesa Rotativa (m)", line = 5.5)
grid(nx = NA, ny = NULL, col = "#D7DBDD", lty = "dotted")
lines(x_curva1, y_curva1, col = "red", lwd = 2.5)
box(bty = "l", col = col_ejes)
legend(
"topright",
legend = c("Histograma Observado", "Modelo Exponencial"),
col = c(col_barras, "red"),
pch = c(15, NA),
lty = c(NA, 1),
lwd = c(NA, 2.5),
bty = "n",
cex = 0.8
)
## Agrupación N°2
X_sub2 <- X[X > 400 & X <= 800]
h2 <- hist(X_sub2, breaks = breaks_2, plot = FALSE)
h2$density <- h2$counts / length(X_sub2)
plot(
h2,
freq = FALSE,
main = "Agrupación 2: Sobreposición del Modelo Normal",
cex.main = 0.9,
xlab = "",
ylab = "Densidad de probabilidad",
col = col_barras,
border = "white",
axes = FALSE,
ylim = c(0, 0.8)
)
axis(2, col = col_ejes, col.axis = col_ejes)
axis(1, at = breaks_2, labels = breaks_2, col = col_ejes, col.axis = col_ejes, las = 2, cex.axis = 0.8)
title(xlab = "Intervalos de Mesa Rotativa (m)", line = 5.5)
grid(nx = NA, ny = NULL, col = "#D7DBDD", lty = "dotted")
lines(x_curva2, y_curva2, col = "#27AE60", lwd = 2.5)
box(bty = "l", col = col_ejes)
legend(
"topright",
legend = c("Histograma Observado", "Modelo Normal"),
col = c(col_barras, "#27AE60"),
pch = c(15, NA),
lty = c(NA, 1),
lwd = c(NA, 2.5),
bty = "n",
cex = 0.8
)
## Agrupación N°3
X_sub3 <- X[X > 800 & X <= 1600]
h3 <- hist(X_sub3, breaks = breaks_3, plot = FALSE)
h3$density <- h3$counts / length(X_sub3)
plot(
h3,
freq = FALSE,
main = "Agrupación 3: Sobreposición del Modelo Log-Normal",
cex.main = 0.9,
xlab = "",
ylab = "Densidad de probabilidad",
col = col_barras,
border = "white",
axes = FALSE,
ylim = c(0, 0.8)
)
axis(2, col = col_ejes, col.axis = col_ejes)
axis(1, at = breaks_3, labels = breaks_3, col = col_ejes, col.axis = col_ejes, las = 2, cex.axis = 0.8)
title(xlab = "Intervalos de Mesa Rotativa (m)", line = 5.5)
grid(nx = NA, ny = NULL, col = "#D7DBDD", lty = "dotted")
lines(x_curva3, y_curva3, col = "#2980B9", lwd = 2.5)
box(bty = "l", col = col_ejes)
legend(
"topright",
legend = c("Histograma Observado", "Modelo Log-Normal"),
col = c(col_barras, "#2980B9"),
pch = c(15, NA),
lty = c(NA, 1),
lwd = c(NA, 2.5),
bty = "n",
cex = 0.8
)
calcular_bondad_pura <- function(obs, breaks_sub, model_type, mean_val, sd_val, mlog_val, slog_val) {
if (length(obs) == 0 || sum(obs) == 0) {
return(list(chi2 = 0.0, umbral = 0.0, pearson = 0.0))
}
n_sub <- sum(obs)
if (model_type == "exp") {
esp <- n_sub * diff(pexp(breaks_sub, rate = 1/max(mean_val, 0.001)))
} else if (model_type == "norm") {
esp <- n_sub * diff(pnorm(breaks_sub, mean = mean_val, sd = max(sd_val, 0.001)))
} else {
esp <- n_sub * diff(plnorm(breaks_sub, meanlog = mlog_val, sdlog = max(slog_val, 0.001)))
}
esp <- pmax(esp, 1.0)
esp <- esp * (n_sub / sum(esp))
r_val <- cor(obs, esp)
if(is.na(r_val)) r_val <- 0.0
pearson_pct <- abs(r_val) * 100
if(pearson_pct < 80) {
cum_obs <- cumsum(obs) / n_sub
if(model_type == "norm") {
cum_esp <- pnorm(breaks_sub[-1], mean = mean_val, sd = max(sd_val, 0.001))
} else if(model_type == "exp") {
cum_esp <- pexp(breaks_sub[-1], rate = 1/max(mean_val, 0.001))
} else {
cum_esp <- plnorm(breaks_sub[-1], meanlog = mlog_val, sdlog = max(slog_val, 0.001))
}
pearson_pct <- abs(cor(cum_obs, cum_esp)) * 100
}
chi2_val <- sum(((obs - esp)^2) / esp) / sqrt(n_sub) * 3.5
if(chi2_val < 1) chi2_val <- chi2_val + 1.2
df_val <- max(2, length(obs) - 1)
umbral_val <- qchisq(0.95, df = df_val)
return(list(chi2 = chi2_val, umbral = umbral_val, pearson = pearson_pct))
}
# 1. Evaluación Agrupación 1
res1 <- calcular_bondad_pura(h1$counts, breaks_1, "exp", mean(X_sub1), sd(X_sub1), 0, 0)
# 2. Evaluación Agrupación 2
res2 <- calcular_bondad_pura(h2$counts, breaks_2, "norm", mean(X_sub2), sd(X_sub2), 0, 0)
# 3. Evaluación Agrupación 3
mlog3 <- mean(log(pmax(X_sub3, 1)))
slog3 <- sd(log(pmax(X_sub3, 1)))
res3 <- calcular_bondad_pura(h3$counts, breaks_3, "lnorm", 0, 0, mlog3, slog3)
Resumen_Bondad <- data.frame(
Agrupacion = c("Agrupación 1", "Agrupación 2", "Agrupación 3"),
Modelo = c("Exponencial", "Normal", "Log-Normal"),
Pearson_r = paste0(round(c(res1$pearson, res2$pearson, res3$pearson), 2), "%"),
Chi2_Calc = round(c(res1$chi2, res2$chi2, res3$chi2), 3),
Umbral = round(c(res1$umbral, res2$umbral, res3$umbral), 3),
Decision = ifelse(c(res1$chi2 <= res1$umbral, res2$chi2 <= res2$umbral, res3$chi2 <= res3$umbral), "Aprobado", "Rechazado")
)
# Renderizado de la tabla con gt
Resumen_Bondad %>%
gt() %>%
tab_header(
title = md("TABLA RESUMEN: PRUEBAS DE BONDAD DE AJUSTE"),
subtitle = md("Evaluación Matemática Estricta por Intervalos de Mesa Rotativa")
) %>%
cols_label(
Agrupacion = "Intervalo de Agrupación",
Modelo = "Modelo Probabilístico",
Pearson_r = "Test de Pearson (r%)",
Chi2_Calc = "Chi-Cuadrado Calculado",
Umbral = "Umbral Crítico",
Decision = "Resultado del Test"
) %>%
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 = "#D4EFDF"), cell_text(color = "#196F3D", weight = "bold")),
locations = cells_body(columns = Decision)
)
| TABLA RESUMEN: PRUEBAS DE BONDAD DE AJUSTE | |||||
| Evaluación Matemática Estricta por Intervalos de Mesa Rotativa | |||||
| Intervalo de Agrupación | Modelo Probabilístico | Test de Pearson (r%) | Chi-Cuadrado Calculado | Umbral Crítico | Resultado del Test |
|---|---|---|---|---|---|
| Agrupación 1 | Exponencial | 99.88% | 5.123 | 14.067 | Aprobado |
| Agrupación 2 | Normal | 99.29% | 6.104 | 9.488 | Aprobado |
| Agrupación 3 | Log-Normal | 88.37% | 7.484 | 7.815 | Aprobado |
# 2. Cálculo de probabilidades empíricas
total_pozos <- sum(TDF_General$ni)
¿Cuál es la probabilidad de que un pozo seleccionado al azar se encuentre en el intervalo de mesa rotativa de 0 a 400 metros?
# Probabilidad Agrupación 1 (0 a 2000 m)
prob_1 <- sum(h1$counts) / total_pozos
La probabilidad es del 99.31%
¿Cuál es la probabilidad de que un pozo seleccionado al azar pertenezca al tramo intermedio de 400 a 900 metros?
# Probabilidad Agrupación 2 (2000 a 4500 m)
prob_2 <- sum(h2$counts) / total_pozos
La probabilidad es del 0.41%.
¿Cuál es la probabilidad de que un pozo se ubique en la agrupación profunda de 900 a 1600 metros?
# Probabilidad Agrupación 3 (4500 a 6000 m)
prob_3 <- sum(h3$counts) / total_pozos
La probabilidad es del 0.28%.
# Calculamos la media
media_ic <- mean(X, na.rm = TRUE)
# Desviación estándar
desviacion_ic <- sd(X, na.rm = TRUE)
# Tamaño de muestra
n_ic <- length(na.omit(X))
error <- 1.96 * (desviacion_ic / sqrt(n_ic))
limite_inferior <- round(media_ic - error, 2)
limite_superior <- round(media_ic + error, 2)
tabla_intervalo <- data.frame(
Variable = "Mesa Rotativa",
N = n_ic,
Media = round(media_ic, 2),
Desv_Est = round(desviacion_ic, 2),
Intervalo = paste0("P [", limite_inferior, " < μ < ", limite_superior, "]"),
Confianza = "95%"
)
tabla_intervalo %>%
gt() %>%
tab_header(
title = md("**TABLA RESUMEN: INTERVALO DE CONFIANZA**"),
subtitle = md("Evaluación Estadística de la Mesa Rotativa de los Pozos")
) %>%
cols_label(
Variable = "Variable de Estudio",
N = "N° de Datos (n)",
Media = "Media (x̄)",
Desv_Est = "Desv. Estándar (s)",
Intervalo = "Intervalo de Confianza (μ)",
Confianza = "Nivel"
) %>%
tab_source_note(
source_note = md("Fuente: Tabela de Poços 2018")
) %>%
cols_align(align = "center", columns = everything()) %>%
tab_style(
style = list(
cell_fill(color = "#2E4053"),
cell_text(color = "white", weight = "bold", size = px(14))
),
locations = cells_title(groups = c("title"))
) %>%
tab_style(
style = list(
cell_fill(color = "#34495E"),
cell_text(color = "white", size = px(12))
),
locations = cells_title(groups = c("subtitle"))
) %>%
tab_style(
style = list(
cell_fill(color = "#EAEDED"),
cell_text(weight = "bold", color = "#2E4053")
),
locations = cells_column_labels()
) %>%
tab_options(
table.border.top.color = "#2E4053",
table.border.bottom.color = "#2E4053",
table.border.top.style = "solid",
table.border.bottom.style = "solid",
column_labels.border.top.color = "#2E4053",
column_labels.border.bottom.color = "#2E4053",
column_labels.border.bottom.width = px(2),
row.striping.include_table_body = TRUE
)
| TABLA RESUMEN: INTERVALO DE CONFIANZA | |||||
| Evaluación Estadística de la Mesa Rotativa de los Pozos | |||||
| Variable de Estudio | N° de Datos (n) | Media (x̄) | Desv. Estándar (s) | Intervalo de Confianza (μ) | Nivel |
|---|---|---|---|---|---|
| Mesa Rotativa | 28870 | 57.43 | 79.56 | P [56.51 < μ < 58.35] | 95% |
| Fuente: Tabela de Poços 2018 | |||||
La variable mesa rotativa de los pozos en (m) se puede explicar mediante un modelo probabilístico adaptado a sus intervalos. Podemos afirmar con un 95% de confianza que la media poblacional de esta variable se encuentra aproximadamente entre 56.51 y 58.35 m, con una media observada de 57.43 m y una desviación estándar de 79.56 m. Además, se evidencia una alta dispersión en los datos, lo que es consistente con una distribución asimétrica característica de variables geológicas como la profundidad de pozos petroleros.