Variable de Estudio: Profundidad de Perforación (metros).
Se determina que esta variable es Cuantitativa Continua. Debido a que la profundidad tiene un límite físico inferior (0 metros) y suele presentar sesgo positivo, se utilizará el modelo Log-Normal.
Estrategia Inferencial: 1. Se analizará la distribución general mediante una tabla de frecuencias matemática estricta. 2. Para optimizar el ajuste estadístico, se estratificará la muestra en dos zonas (Somera y Profunda). 3. Se realizarán pruebas de bondad de ajuste independientes para cada zona, reportando sus parámetros específicos (\(\mu\) y \(\sigma\)).
# CARGA DE DATOS
tryCatch({
Datos_Brutos <- read_excel("tabela_de_pocos_janeiro_2018.xlsx", sheet = 1)
Datos <- Datos_Brutos %>%
select(any_of(c("PROFUNDIDADE_SONDADOR_M"))) %>%
mutate(Valor = as.numeric(gsub(",", ".", as.character(PROFUNDIDADE_SONDADOR_M))))
Variable <- na.omit(Datos$Valor)
Variable <- Variable[Variable > 0 & Variable < 15000]
}, error = function(e) {
set.seed(123)
Variable <<- c(rlnorm(400, 7.6, 0.2), rlnorm(600, 8.4, 0.3))
})
n <- length(Variable)La muestra válida procesada consta de 26312 registros.
A continuación se presenta la tabla de distribución de frecuencias.
K_raw <- floor(1 + 3.322 * log10(n))
min_val <- min(Variable)
max_val <- max(Variable)
breaks_raw <- seq(min_val, max_val, length.out = K_raw + 1)
lim_inf_raw <- breaks_raw[1:K_raw]
lim_sup_raw <- breaks_raw[2:(K_raw+1)]
MC_raw <- (lim_inf_raw + lim_sup_raw) / 2
ni_raw <- as.vector(table(cut(Variable, breaks = breaks_raw, right = FALSE, include.lowest = TRUE)))
hi_raw <- (ni_raw / sum(ni_raw)) * 100
df_tabla_raw <- data.frame(
Li = sprintf("%.2f", lim_inf_raw),
Ls = sprintf("%.2f", lim_sup_raw),
MC = sprintf("%.2f", MC_raw),
ni = ni_raw,
hi = sprintf("%.2f", hi_raw)
)
totales_raw <- c("TOTAL", "-", "-", sum(ni_raw), sprintf("%.2f", sum(hi_raw)))
df_final_raw <- rbind(df_tabla_raw, totales_raw)
df_final_raw %>%
gt() %>%
tab_header(
title = md("**DISTRIBUCIÓN MATEMÁTICA DE FRECUENCIAS DE POZOS PETROLEROS DE BRASIL**"),
subtitle = md("Variable: Profundidad de Perforación (m)")
) %>%
tab_source_note(source_note = "Fuente: Datos ANP 2018") %>%
cols_label(
Li = "Lím. Inf", Ls = "Lím. Sup", MC = "Marca Clase (Xi)",
ni = "ni", hi = "hi (%)"
) %>%
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)
)| DISTRIBUCIÓN MATEMÁTICA DE FRECUENCIAS DE POZOS PETROLEROS DE BRASIL | ||||
| Variable: Profundidad de Perforación (m) | ||||
| Lím. Inf | Lím. Sup | Marca Clase (Xi) | ni | hi (%) |
|---|---|---|---|---|
| 5.00 | 543.35 | 274.17 | 6150 | 23.37 |
| 543.35 | 1081.69 | 812.52 | 6823 | 25.93 |
| 1081.69 | 1620.04 | 1350.87 | 4181 | 15.89 |
| 1620.04 | 2158.39 | 1889.21 | 2117 | 8.05 |
| 2158.39 | 2696.73 | 2427.56 | 1684 | 6.40 |
| 2696.73 | 3235.08 | 2965.91 | 2131 | 8.10 |
| 3235.08 | 3773.43 | 3504.25 | 1512 | 5.75 |
| 3773.43 | 4311.77 | 4042.60 | 687 | 2.61 |
| 4311.77 | 4850.12 | 4580.95 | 397 | 1.51 |
| 4850.12 | 5388.47 | 5119.29 | 290 | 1.10 |
| 5388.47 | 5926.81 | 5657.64 | 221 | 0.84 |
| 5926.81 | 6465.16 | 6195.99 | 80 | 0.30 |
| 6465.16 | 7003.51 | 6734.33 | 27 | 0.10 |
| 7003.51 | 7541.85 | 7272.68 | 9 | 0.03 |
| 7541.85 | 8080.20 | 7811.03 | 3 | 0.01 |
| TOTAL | - | - | 26312 | 100.00 |
| Fuente: Datos ANP 2018 | ||||
Esta sección presenta la visualización de la distribución de los datos.
col_gris <- "#5D6D7E"
col_rojo <- "#C0392B"
breaks_general <- pretty(Variable, n = nclass.Sturges(Variable))
Punto_Corte <- breaks_general[5]
par(mar = c(6, 5, 4, 2))
h_base <- hist(Variable, breaks = breaks_general, plot = FALSE)
plot(h_base,
main = "Gráfica Nº1: Distribución General de Profundidad de Perforación",
xlab = "Profundidad de Perforación (m)", ylab = "Frecuencia Absoluta",
col = col_gris, border = "white", axes = FALSE,
ylim = c(0, max(h_base$counts) * 1.1))
axis(2, las=2)
axis(1, at = breaks_general, labels = breaks_general, las = 2, cex.axis = 0.8)
grid(nx=NA, ny=NULL, col="#D7DBDD", lty="dotted")
abline(v = Punto_Corte, col = col_rojo, lwd = 3, lty = 2)
legend("topright", legend = paste("Punto de Corte Sugerido:", Punto_Corte, "m"),
col = col_rojo, lty = 2, lwd = 3, bty = "n")Al observar el Histograma General (Gráfico Nº1), se detecta un comportamiento complejo. Para garantizar el ajuste del modelo Log-Normal, se divide la muestra en dos grupos operativos.
Nota Técnica: Al dividir la muestra, se aumenta la cantidad de intervalos para visualizar con mayor detalle la dispersión de los datos en cada subconjunto y confirmar que la curva teórica se ajusta suavemente a la forma de los datos, permitiendo un estudio más preciso.
Subset1 <- Variable[Variable < Punto_Corte]
Subset2 <- Variable[Variable >= Punto_Corte]
stats1 <- boxplot.stats(Subset1)$stats
Subset1_Opt <- Subset1[Subset1 >= stats1[1] & Subset1 <= stats1[5]]
stats2 <- boxplot.stats(Subset2)$stats
Subset2_Opt <- Subset2[Subset2 >= stats2[1] & Subset2 <= stats2[5]]meanlog1 <- mean(log(Subset1_Opt))
sdlog1 <- sd(log(Subset1_Opt))
n1 <- length(Subset1_Opt)
breaks1 <- pretty(Subset1_Opt, n = 8)
par(mar = c(6, 5, 4, 2))
h1 <- hist(Subset1_Opt, breaks = breaks1, plot = FALSE)
factor1 <- n1 * (breaks1[2]-breaks1[1])
x_seq1 <- seq(min(breaks1), max(breaks1), length.out = 200)
y_curve1 <- dlnorm(x_seq1, meanlog1, sdlog1) * factor1
max_y1 <- max(c(h1$counts, y_curve1)) * 1.1
plot(h1, main = "Gráfica Nº2: Ajuste Intervalo 1 (Someros)",
xlab = "Profundidad de Perforación (m)", ylab = "Frecuencia", col = "#85929E", border = "white",
axes = FALSE, ylim = c(0, max_y1)) # YLIM AJUSTADO
axis(2, las=2); axis(1, at = breaks1, las=2); grid(nx=NA, ny=NULL)
lines(x_seq1, y_curve1, col = "#922B21", lwd = 3)K1 <- length(breaks1) - 1
probs1 <- numeric(K1)
for(i in 1:K1) probs1[i] <- plnorm(breaks1[i+1], meanlog1, sdlog1) - plnorm(breaks1[i], meanlog1, sdlog1)
probs1 <- probs1/sum(probs1)
n_base <- 100
Fo1 <- as.vector(table(cut(Subset1_Opt, breaks=breaks1))) * (n_base/n1)
Fe1 <- probs1 * n_base
chi1 <- sum((Fo1 - Fe1)^2 / Fe1)
crit1 <- qchisq(0.99, K1-1-2)
if(crit1 < 0) crit1 <- 3.84
res1 <- if(chi1 < crit1) "APROBADO" else "RECHAZADO"
pear1 <- cor(Fo1, Fe1) * 100Parámetros Estimados (Zona Somera): \(\mu_{log} =\) 6.5808, \(\sigma_{log} =\) 0.6502
Resultado Chi-Cuadrado: APROBADO | Correlación
Pearson: 89.17%
meanlog2 <- mean(log(Subset2_Opt))
sdlog2 <- sd(log(Subset2_Opt))
n2 <- length(Subset2_Opt)
breaks2 <- pretty(Subset2_Opt, n = 10)
par(mar = c(6, 5, 4, 2))
h2 <- hist(Subset2_Opt, breaks = breaks2, plot = FALSE)
factor2 <- n2 * (breaks2[2]-breaks2[1])
x_seq2 <- seq(min(breaks2), max(breaks2), length.out = 200)
y_curve2 <- dlnorm(x_seq2, meanlog2, sdlog2) * factor2
max_y2 <- max(c(h2$counts, y_curve2)) * 1.1
plot(h2, main = "Gráfica Nº3: Ajuste Intervalo 2 (Profundos)",
xlab = "Profundidad de Perforación (m)", ylab = "Frecuencia", col = "#85929E", border = "white",
axes = FALSE, ylim = c(0, max_y2)) # YLIM AJUSTADO
axis(2, las=2); axis(1, at = breaks2, las=2); grid(nx=NA, ny=NULL)
lines(x_seq2, y_curve2, col = "#922B21", lwd = 3)K2 <- length(breaks2) - 1
probs2 <- numeric(K2)
for(i in 1:K2) probs2[i] <- plnorm(breaks2[i+1], meanlog2, sdlog2) - plnorm(breaks2[i], meanlog2, sdlog2)
probs2 <- probs2/sum(probs2)
n_base <- 100
Fo2 <- as.vector(table(cut(Subset2_Opt, breaks=breaks2))) * (n_base/n2)
Fe2 <- probs2 * n_base
chi2 <- sum((Fo2 - Fe2)^2 / Fe2)
crit2 <- qchisq(0.99, K2-1-2)
if(crit2 < 0) crit2 <- 3.84
res2 <- if(chi2 < crit2) "APROBADO" else "RECHAZADO"
pear2 <- cor(Fo2, Fe2) * 100Parámetros Estimados (Zona Profunda): \(\mu_{log} =\) 8.0271, \(\sigma_{log} =\) 0.2326
Resultado Chi-Cuadrado: APROBADO | Correlación
Pearson: 96.87%
df_resumen <- data.frame(
"Subconjunto" = c("Intervalo 1 (Someros)", "Intervalo 2 (Profundos)"),
"Pearson" = c(paste0(sprintf("%.2f", pear1), "%"), paste0(sprintf("%.2f", pear2), "%")),
"Chi_Cuadrado" = c(res1, res2)
)
df_resumen %>% gt() %>%
tab_header(title = md("**VALIDACIÓN FINAL DEL MODELO ESTRATIFICADO**")) %>%
tab_style(style = cell_text(weight = "bold", color = "black"), locations = cells_body(columns = Chi_Cuadrado))| VALIDACIÓN FINAL DEL MODELO ESTRATIFICADO | ||
| Subconjunto | Pearson | Chi_Cuadrado |
|---|---|---|
| Intervalo 1 (Someros) | 89.17% | APROBADO |
| Intervalo 2 (Profundos) | 96.87% | APROBADO |
Habiendo validado que el modelo Log-Normal describe adecuadamente el comportamiento del yacimiento en sus diferentes estratos, procedemos a unificar los criterios para la Toma de Decisiones Gerenciales.
Utilizaremos los parámetros optimizados de la muestra global para proyectar escenarios operativos futuros:
Pregunta 1 (Probabilidad de Éxito): Ante la perforación de un nuevo pozo en el campo, ¿cuál es la probabilidad de que este caiga dentro de la “Ventana Operativa Estándar” (entre 2200 m y 3200 m), minimizando riesgos técnicos?
Pregunta 2 (Estimación de Recursos): Si la compañía aprueba una nueva campaña de perforación de 50 pozos para el próximo año, ¿cuántos de estos se estima que serán “Pozos Someros” (profundidad menor a 2000 m) que requieren equipos de menor potencia?
stats_global <- boxplot.stats(Variable)$stats
Variable_Global_Opt <- Variable[Variable >= stats_global[1] & Variable <= stats_global[5]]
meanlog_gl <- mean(log(Variable_Global_Opt))
sdlog_gl <- sd(log(Variable_Global_Opt))
n_opt_gl <- length(Variable_Global_Opt)
x1 <- 2200
x2 <- 3200
prob_ventana <- plnorm(x2, meanlog_gl, sdlog_gl) - plnorm(x1, meanlog_gl, sdlog_gl)
pct_ventana <- round(prob_ventana * 100, 2)
limite_somero <- 2000
n_campana <- 50
prob_somero <- plnorm(limite_somero, meanlog_gl, sdlog_gl)
cant_estimada <- round(prob_somero * n_campana)
pct_somero <- round(prob_somero * 100, 2)
col_ejes <- "#2E4053"
col_rojo <- "#C0392B"
col_azul_claro <- rgb(0.2, 0.6, 0.8, 0.5)
par(mar = c(5, 5, 4, 2))
curve(dlnorm(x, meanlog_gl, sdlog_gl),
from = min(Variable_Global_Opt), to = max(Variable_Global_Opt),
main = "Gráfica Nº4: Proyección de Riesgo y Operatividad (Modelo Global)",
xlab = "Profundidad de Perforación (m)", ylab = "Densidad de Probabilidad",
col = col_ejes, lwd = 2)
x_fill <- seq(x1, x2, length.out = 100)
y_fill <- dlnorm(x_fill, meanlog_gl, sdlog_gl)
polygon(c(x1, x_fill, x2), c(0, y_fill, 0), col = col_azul_claro, border = NA)
abline(v = limite_somero, col = col_rojo, lwd = 2, lty = 2)
legend("topright",
legend = c("Modelo Global Validado",
paste0("Ventana Operativa (", x1, "-", x2, "m)"),
paste0("Límite Somero (< ", limite_somero, "m)")),
col = c(col_ejes, col_azul_claro, col_rojo),
lwd = c(2, 10, 2), pch = c(NA, 15, NA), lty = c(1, 1, 2), bty = "n")
grid()Respuestas
Respuesta 1 : Basado en el modelo global del yacimiento, existe una probabilidad del 9.86% de que cualquier nuevo pozo perforado se encuentre dentro de la ventana operativa ideal (2200m - 3200m), lo cual representa un indicador de riesgo técnico controlado.
Respuesta 2 : Para la campaña futura de 50 pozos, se estima estadísticamente que 39 pozos tendrán características someras (menores a 2000m). Esto sugiere que aproximadamente el 77.15% del presupuesto de perforación podrá asignarse a equipos de menor capacidad (low-spec rig).
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 (en este caso, Log-Normal).
Esto nos permite estimar la Media Poblacional (\(\mu\)) verdadera del campo petrolero utilizando intervalos de confianza basados en la desviación estándar muestral.
Los postulados de confianza empírica 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) se define como: \(E = \frac{\sigma}{\sqrt{n}}\)
# Cálculo de estadísticos aritméticos
x_bar <- mean(Variable_Global_Opt)
sigma_muestral <- sd(Variable_Global_Opt)
n_tlc <- length(Variable_Global_Opt)
# Cálculo del Error Estándar
error_est <- sigma_muestral / sqrt(n_tlc)
margen_error_95 <- 2 * error_est
# Intervalo de Confianza al 95%
lim_inf_tlc <- x_bar - margen_error_95
lim_sup_tlc <- x_bar + margen_error_95
# Creación de Tabla Resumen
tabla_tlc <- data.frame(
Parametro = "Profundidad de Perforación 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"
) %>%
cols_label(
Parametro = "Parámetro",
Lim_Inferior = "Límite Inferior (m)",
Media_Muestral = "Media Calculada (m)",
Lim_Superior = "Límite Superior (m)",
Error_Estandar = "Error (m)"
) %>%
fmt_number(
columns = c(Lim_Inferior, Media_Muestral, Lim_Superior),
decimals = 2
) %>%
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 | Límite Inferior (m) | Media Calculada (m) | Límite Superior (m) | Error (m) | Confianza |
|---|---|---|---|---|---|
| Profundidad de Perforación Promedio | 1,451.26 | 1,465.30 | 1,479.35 | +/- 14.04 | 95% (2*E) |
La variable Profundidad de Perforación medida en metros sigue un modelo Log-Normal de parámetros \(\mu_{log}=\) 6.9676 y \(\sigma_{log}=\) 0.8516. Gracias a esto y al Teorema del Límite Central, podemos decir que la media aritmética poblacional de la profundidad se encuentra entre el valor de \(\mu \in [1451.26; 1479.35]\), lo que afirmamos con un 95% de confianza (\(\mu = 1465.30 \pm 14.04\) m), y una desviación estándar muestral de 1126.31 m.