El presente informe estadístico analiza la variable Mesa Rotativa (en metros) de pozos petroleros de Brasil, aplicando técnicas descriptivas e inferenciales avanzadas de bondad de ajuste.
Dado que los valores de la mesa rotativa representan la altura estructural de la plataforma y se concentran principalmente en magnitudes bajas, agrupamos los datos en intervalos de 50 metros para visualizar de manera óptima la tendencia y facilitar el cálculo de probabilidades en los modelos continuos.
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"
)
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 <= 500)
X <- Datos$mesa_rotativa
# TABLA DE FRECUENCIAS GENERAL
breaks_mesa <- seq(0, 500, by = 50)
h_total <- hist(X, breaks = breaks_mesa, plot = FALSE)
TDF_General <- data.frame(
Rango = paste(head(breaks_mesa, -1), tail(breaks_mesa, -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: **Mesa Rotativa (m)**")
) %>%
tab_source_note(source_note = "Fuente: Tabela de Poços 2018") %>%
cols_label(
Rango = "Mesa Rotativa (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: Mesa Rotativa (m) | ||
| Mesa Rotativa (m) | Frecuencia Absoluta (ni) | Frecuencia Relativa (hi%) |
|---|---|---|
| 0-50 | 18063 | 62.95 |
| 50-100 | 6183 | 21.55 |
| 100-150 | 3000 | 10.45 |
| 150-200 | 902 | 3.14 |
| 200-250 | 361 | 1.26 |
| 250-300 | 60 | 0.21 |
| 300-350 | 39 | 0.14 |
| 350-400 | 56 | 0.20 |
| 400-450 | 18 | 0.06 |
| 450-500 | 14 | 0.05 |
| TOTAL | 28696 | 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 Mesa Rotativa de Pozos Petroleros de 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.9)
title(xlab = "Intervalos de Mesa Rotativa (m)", line = 4)
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 variable Mesa Rotativa posee una distribución concentrada en magnitudes bajas debido a la estandarización operacional:
Fase Base o Convencional (0–50 m): Reúne la mayor concentración de pozos con alturas de mesa de rotación mínimas y estándar sobre el nivel base.
Fase de Estructuras Elevadas (50–500 m): Una distribución asimétrica continua que decae rápidamente hacia la derecha, representando taladros con requerimientos de elevación estructural superior.
Por lo tanto, segmentamos fijando el umbral de transición en los 50 metros para aislar las estructuras convencionales y analizar de manera óptima el comportamiento inferencial.
En este bloque analizamos si los valores de mesa rotativa menores o iguales a 50 metros siguen un comportamiento ajustado a la Distribución Gamma, la cual permite modelar variables con un crecimiento inicial antes de iniciar su decaimiento asimétrico.
X1 <- X[!is.na(X) & X <= 50]
if(length(X1) > 0) {
hist(
X1,
breaks = seq(0, 50, by = 10),
col = col_barras,
border = "white",
main = "Histograma Sección 1 (0–50 m)",
xlab = "Mesa Rotativa (m)",
ylab = "Frecuencia"
)
} else {
print("¡Cuidado! No hay datos en el rango de 0 a 50 después de la limpieza.")
}
Utilizamos la estimación por máxima verosimilitud para calibrar los parámetros de forma (shape) y tasa (rate) de la distribución Gamma. Esto nos permitirá generar una curva teórica que reconozca el pico intermedio observado en los datos reales de la mesa rotativa.
if(length(X1) > 1) {
fit_gamma1 <- suppressWarnings(fitdistr(X1, "gamma"))
shape_g1 <- fit_gamma1$estimate["shape"]
rate_g1 <- fit_gamma1$estimate["rate"]
h1 <- hist(X1, breaks = seq(0, 50, by = 10), plot = FALSE)
Fo1 <- h1$counts / sum(h1$counts)
Fe1 <- diff(pgamma(seq(0, 50, by = 10), 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(seq(0, 50, by = 10), -1), "-", tail(seq(0, 50, by = 10), -1)),
main = "Gráfica N°2: Modelo de Probabilidad Gamma (0–50 m)",
cex.main = 0.85,
ylab = "Probabilidad",
xlab = "Rangos (m)"
)
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 midiendo la correlación lineal entre las frecuencias empíricas observadas y las frecuencias esperadas teóricamente por la distribución Gamma.
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] 84.81735
Aplicamos la prueba de bondad de ajuste de Chi-Cuadrado (χ²) para comprobar la validez estadística del modelo Gamma adaptado a este tramo.
x2_1 <- sum((Fo1 - Fe1)^2 / Fe1)
x2_1
## [1] 0.0889237
vc1 <- qchisq(0.95, length(Fo1) - 1)
vc1
## [1] 9.487729
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")
)
gt(tabla_1) %>%
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 | 84.82 | 0.0889 | 9.4877 | Modelo aceptado |
| Autor: Leonardo Ruiz | ||||
¿Cuál fue la probabilidad calculada de que un pozo tenga una altura de mesa rotativa menor a 25 metros en este primer tramo usando el modelo Gamma?
p_25 <- pgamma(25, shape = shape_g1, rate = rate_g1)
p_25
## [1] 0.6460511
La probabilidad es del 64.61%.
Analizamos la segunda etapa probando un ajuste a la Distribución Log-Normal para evaluar el comportamiento de los taladros con mayor elevación base.
X2 <- X[X > 50 & X <= 500]
X2 <- X2[!is.na(X2)]
breaks_seccion2 <- seq(50, 500, by = 50)
hist(
X2,
breaks = breaks_seccion2,
col = col_barras,
border = "white",
main = "Histograma Sección 2 (50–500 m)",
xlab = "Mesa Rotativa (m)",
ylab = "Frecuencia"
)
Estimamos los parámetros (meanlog, sdlog) mediante máxima verosimilitud para el tramo elevado de la variable.
fit_ln <- fitdistr(X2, "lognormal")
m_log <- fit_ln$estimate["meanlog"]
s_log <- fit_ln$estimate["sdlog"]
h2 <- hist(X2, breaks = breaks_seccion2, plot = FALSE)
Fo2 <- h2$counts / sum(h2$counts)
Fe2 <- diff(plnorm(breaks_seccion2, meanlog = m_log, sdlog = s_log))
Fe2 <- Fe2 / sum(Fe2)
etiquetas_mesa <- 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_mesa,
main = "Gráfica N°5: Modelo Log-Normal de Mesa Rotativa (50–500 m)",
cex.main = 0.85,
ylab = "Probabilidad",
las = 2,
cex.names = 0.7
)
legend("topright", legend = c("Real", "Modelo Log-Normal"),
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 Log-Normal.
plot(
Fo2, Fe2,
main = "Gráfica N°6: Correlación de Pearson — Sección 2 (Log-Normal)",
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] 98.77886
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.1079384
vc2 <- qchisq(0.95, length(Fo2) - 1)
vc2
## [1] 15.50731
tabla_2 <- data.frame(
Modelo = "Log-Normal",
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**")) %>%
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 | ||||
| Modelo | Pearson | Chi_Cuadrado | Umbral | Decision |
|---|---|---|---|---|
| Log-Normal | 98.78 | 0.1079 | 15.5073 | Modelo aceptado |
| Autor: Leonardo Ruiz | ||||
De cada 1,000 pozos analizados en este tramo de elevación estructural superior (50–500 m), ¿cuántos se estimó matemáticamente que se encuentran en el intervalo crítico superior de 150 a 300 metros?
p_critica <- plnorm(300, meanlog = m_log, sdlog = s_log) - plnorm(150, meanlog = m_log, sdlog = s_log)
p_critica
## [1] 0.1332902
cantidad_estimada <- round(p_critica * 1000, 0)
El modelo Log-Normal estimó que, por cada 1,000 pozos de este periodo, aproximadamente 133 pertenecieron al intervalo de altura estructural de 150 a 300 metros.
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.Esto nos permite estimar la Media Poblacional (\(\mu\)) verdadera de la mesa rotativa de las plataformas utilizando intervalos de confianza robustos basados en la guía empírica.Los postulados de confianza empírica determinan las siguientes coberturas:\(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 Error Estándar (\(E\)) se define formalmente en la guía como:\[E = \frac{\sigma}{\sqrt{n}}\]
# Estadísticos muestrales reales para la Mesa Rotativa
x_bar <- mean(X, na.rm = TRUE)
sigma_muestral <- sd(X, na.rm = TRUE)
n_tlc <- length(X)
# Cálculo del Error Estándar (E de la guía) y Margen de Error al 95% (2*E)
error_est <- sigma_muestral / sqrt(n_tlc)
margen_error_95 <- 2 * error_est
# Intervalo de Confianza dinámico al 95%
lim_inf_tlc <- x_bar - margen_error_95
lim_sup_tlc <- x_bar + margen_error_95
# Construcción de la tabla de resultados del TLC
tabla_tlc <- data.frame(
Parametro = "Mesa Rotativa 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 (TLC)"
) %>%
tab_source_note(source_note = "Análisis de Incertidumbre Operacional — Brasil 2018") %>%
cols_label(
Parametro = "Parámetro",
Lim_Inferior = "Límite Inferior (m)",
Media_Muestral = "Media Calculada (m)",
Lim_Superior = "Límite Superior (m)",
Error_Estandar = "Margen de Error (m)",
Confianza = "Nivel de Confianza"
) %>%
cols_align(align = "center", columns = everything()) %>%
fmt_number(
columns = c(Lim_Inferior, Media_Muestral, Lim_Superior),
decimals = 2
) %>%
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 = "#E8F8F5"), cell_text(color = "#145A32", weight = "bold")),
locations = cells_body(columns = Media_Muestral)
) %>%
tab_options(
table.border.top.color = "#2E4053",
table.border.bottom.color = "#2E4053",
column_labels.border.bottom.color = "#2E4053",
data_row.padding = px(7)
)
| ESTIMACIÓN DE LA MEDIA POBLACIONAL | |||||
| Aplicación del Teorema del Límite Central (TLC) | |||||
| Parámetro | Límite Inferior (m) | Media Calculada (m) | Límite Superior (m) | Margen de Error (m) | Nivel de Confianza |
|---|---|---|---|---|---|
| Mesa Rotativa Promedio | 52.44 | 53.06 | 53.67 | +/- 0.61 | 95% (2*E) |
| Análisis de Incertidumbre Operacional — Brasil 2018 | |||||
La variable Mesa Rotativa medida en metros sigue un modelo de distribución Gamma en su tramo inicial con parámetros calculados de forma y tasa. Gracias a esto y a la correcta aplicación del Teorema del Límite Central, podemos inferir que la verdadera media aritmética poblacional de la altura estructural se encuentra contenida en el intervalo de \(\mu \in [\) 52.44 \(;\) 53.67 \(]\), lo que podemos asegurar firmemente con un nivel de confianza del 95% (\(\mu =\) 53.06 \(\pm\) 0.61 m), registrando además una desviación estándar muestral total de 51.8 m.