Este informe analiza la variable Longitud Base (longitude_base_dd) en pozos petroleros de Brasil (2018). La muestra se dividió en sector continental (Tramo 1: -55° a -41°) y marítimo (Tramo 2: -41° a -35°). Utilizando los test de Pearson y Chi-cuadrado, se demuestra que la Distribución Beta es el modelo ideal para describir con precisión la densidad de pozos en ambos tramos.
Dado que las cuencas sedimentarias de Brasil abarcan una vasta extensión geográfica, los datos reflejan una dispersión longitudinal considerable. Agrupamos los datos en intervalos de 2 grados para capturar de manera óptima la distribución global de la infraestructura petrolera del país según los datos oficiales.
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: Reemplazamos la coma por el punto para la conversión numérica y filtramos el rango real de Brasil en el dataset
Datos <- Datos_Brutos %>%
clean_names() %>%
mutate(longitude_base_dd = as.numeric(gsub(",", ".", as.character(longitude_base_dd)))) %>%
filter(!is.na(longitude_base_dd) & longitude_base_dd >= -55 & longitude_base_dd <= -35)
X <- Datos$longitude_base_dd
# TABLA DE FRECUENCIAS GENERAL
breaks_long <- seq(-55, -35, by = 2)
h_total <- hist(X, breaks = breaks_long, plot = FALSE)
TDF_General <- data.frame(
Rango = paste(head(breaks_long, -1), tail(breaks_long, -1), sep = " a "),
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: **Longitud Base (Grados Decimales)**")
) %>%
tab_source_note(source_note = "Fuente: Tabela de Poços 2018") %>%
cols_label(
Rango = "Longitud Base (DD)",
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: Longitud Base (Grados Decimales) | ||
| Longitud Base (DD) | Frecuencia Absoluta (ni) | Frecuencia Relativa (hi%) |
|---|---|---|
| -55 a -53 | 25 | 0.09 |
| -53 a -51 | 92 | 0.32 |
| -51 a -49 | 100 | 0.35 |
| -49 a -47 | 77 | 0.27 |
| -47 a -45 | 256 | 0.88 |
| -45 a -43 | 426 | 1.47 |
| -43 a -41 | 678 | 2.34 |
| -41 a -39 | 5294 | 18.26 |
| -39 a -37 | 14283 | 49.28 |
| -37 a -35 | 7754 | 26.75 |
| TOTAL | 28985 | 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 Geográfica 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 Longitud Base (DD)", 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 longitud geográfica cuenta con una distribución bimodal o desplazada, reflejando las dos grandes realidades geológicas y de explotación de la industria brasileña:
Fase Continental / Interior (-55° a -41°): Concentra pozos de menor dispersión ubicados en las cuencas terrestres históricas del país.
Fase Marítima / Margen Atlántico (-41° a -35°): Representa un volumen masivo de pozos perforados costa afuera (offshore), concentrados fuertemente en las plataformas continentales más productivas de las cuencas del sureste.
Fijamos el límite de segmentación operacional e industrial en los -41° de longitud para aislar ambos comportamientos espaciales.
En este bloque analizamos si las longitudes geográficas de pozos terrestres siguen un comportamiento ajustado a la Distribución Beta. Debido a la fluctuación bimodal interna que presenta la muestra continental en este rango, se aprovecha la altísima versatilidad matemática de la distribución Beta, aplicada mediante la normalización del intervalo [-55, -41], logrando moldear de forma óptima los picos de frecuencia del bloque.
X1 <- X[!is.na(X) & X <= -41]
if(length(X1) > 0) {
hist(
X1,
breaks = seq(-55, -41, by = 2),
col = col_barras,
border = "white",
main = "Histograma Sección 1 (-55° a -41°)",
xlab = "Longitud Base (DD)",
ylab = "Frecuencia"
)
} else {
print("¡Cuidado! No hay datos en el rango seleccionado después de la limpieza.")
}
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 en este primer tramo estructural.
if(length(X1) > 1) {
# Escalamos los datos al rango estricto (0, 1) para evitar indeterminaciones matemáticas
X1_norm <- (X1 - (-55)) / (-41 - (-55))
X1_norm <- pmax(pmin(X1_norm, 0.999), 0.001)
fit_beta1 <- suppressWarnings(fitdistr(X1_norm, "beta", start = list(shape1 = 1, shape2 = 1)))
s1_b1 <- fit_beta1$estimate["shape1"]
s2_b1 <- fit_beta1$estimate["shape2"]
breaks_s1 <- seq(-55, -41, by = 2)
h1 <- hist(X1, breaks = breaks_s1, plot = FALSE)
Fo1 <- h1$counts / sum(h1$counts)
# Calculamos las probabilidades teóricas usando los límites normalizados del Tramo 1
breaks_norm1 <- (breaks_s1 - (-55)) / (-41 - (-55))
Fe1 <- diff(pbeta(breaks_norm1, shape1 = s1_b1, shape2 = s2_b1))
Fe1 <- Fe1 / sum(Fe1)
barplot(
rbind(Fo1, Fe1),
beside = TRUE,
col = c(col_barras, "#F2F3F4"),
border = "black",
names.arg = paste0(head(breaks_s1, -1), " a ", tail(breaks_s1, -1)),
main = "Gráfica N°2: Modelo Beta de Longitud Continental (-55° a -41°)",
cex.main = 1.2,
ylab = "Probabilidad",
xlab = "Rangos de Longitud (DD)",
las = 2,
cex.names = 0.55
)
legend("topleft", legend = c("Real", "Modelo Beta"),
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 Beta calibrado.
plot(
Fo1, Fe1,
main = "Gráfica N°3: Correlación de Pearson — Sección 1 (Beta)",
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] 97.60914
Aplicamos la prueba de bondad de ajuste de Chi-Cuadrado (χ²) para comprobar la validez estadística del modelo Gamma adaptado a este tramo terrestre.
x2_1 <- sum((Fo1 - Fe1)^2 / Fe1)
x2_1
## [1] 0.05690925
vc1 <- qchisq(0.95, length(Fo1) - 1)
vc1
## [1] 12.59159
tabla_1 <- data.frame(
Modelo = "Beta",
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 (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°2: Resumen Bondad de Ajuste Sección 1 (Beta) | ||||
| Modelo | Pearson | Chi_Cuadrado | Umbral | Decision |
|---|---|---|---|---|
| Beta | 97.61 | 0.0569 | 12.5916 | Modelo aceptado |
| Autor: Leonardo Ruiz | ||||
¿Cuál es la probabilidad matemática estimada de que un pozo de esta sección continental cuente con una longitud base menor (más al oeste) a los -45°?
lim_45_norm <- (-45 - (-55)) / (-41 - (-55))
p_45 <- pbeta(lim_45_norm, shape1 = s1_b1, shape2 = s2_b1)
p_45
## [1] 0.4077357
La probabilidad es del 40.77%.
Analizamos la segunda etapa estructural aplicando un ajuste a la Distribución Beta. Debido a que la muestra costera y marina presenta un fuerte repunte y sesgo hacia el este debido a la forma geográfica de la plataforma brasileña, se requiere la flexibilidad de la distribución Beta, aplicada mediante la normalización del intervalo [-41, -35], para modelar con precisión esta marcada asimetría costera.
X2 <- X[X > -41 & X <= -35]
X2 <- X2[!is.na(X2)]
breaks_seccion2 <- seq(-41, -35, by = 1)
hist(
X2,
breaks = breaks_seccion2,
col = col_barras,
border = "white",
main = "Histograma Sección 2 (-41° a -35°)",
xlab = "Longitud Base (DD)",
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 el fuerte sesgo del tramo marítimo profundo.
X2_norm <- (X2 - (-41)) / (-35 - (-41))
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 - (-41)) / (-35 - (-41))
Fe2 <- diff(pbeta(breaks_norm, shape1 = s1_b2, shape2 = s2_b2))
Fe2 <- Fe2 / sum(Fe2)
etiquetas_prof2 <- paste0(head(breaks_seccion2, -1), " a ", 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 Longitud Base (-41° a -35°)",
cex.main = 0.85,
ylab = "Probabilidad",
las = 2,
cex.names = 0.7
)
legend("topleft", 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] 85.64989
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.1110824
vc2 <- qchisq(0.95, length(Fo2) - 1)
vc2
## [1] 11.0705
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 | 85.65 | 0.1111 | 11.0705 | Modelo aceptado |
| Autor: Leonardo Ruiz | ||||
De cada 1,000 pozos marítimos analizados en este segundo tramo estructural (-41° a -35°), ¿cuántos se estimó matemáticamente que pertenecen al intervalo geográfico crítico entre los -40° y -38° de longitud base?
lim_inf_norm <- (-40 - (-41)) / (-35 - (-41))
lim_sup_norm <- (-38 - (-41)) / (-35 - (-41))
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.4428549
cantidad_estimada <- round(p_critica * 1000, 0)
El modelo Beta estimó que, por cada 1,000 pozos marinos, aproximadamente 443 se encuentran en el intervalo geográfico de alta densidad operativa entre los -40° y -38° de longitud.
El análisis segmentado e inferencial de la variable Longitud Base de pozos petroleros nos permite concluir lo siguiente:
Tramo -55° a -41°: Al implementar la distribución Beta mediante normalización previa de rango, el modelo matemático asimiló con éxito la naturaleza fluctuante y bimodal de los pozos en el bloque continental. La plasticidad de sus parámetros permitió trazar los picos operacionales en tierra, optimizando drásticamente la correlación lineal de Pearson por encima del umbral de control exigido.
Tramo -41° a -35°: Para describir la muestra orientada a los grandes yacimientos del margen atlántico, la distribución Beta (aplicada igualmente mediante normalización de rango) demostró ser el modelo idóneo. Al poseer una estructura matemática flexible, asimiló la naturaleza asimétrica de la distribución costera caracterizada por la drástica densidad de pozos en las proximidades de las cuencas del sureste y su posterior dispersión en aguas profundas, optimizando sustancialmente el coeficiente de Pearson y la validez del ajuste estadístico.