Variable de Estudio: Elevación de Mesa Rotativa (metros).
Se determina que esta variable es Cuantitativa Continua. Dado que representa la altura de referencia del equipo de perforación (RKB), y que la mayoría de los equipos tienen alturas estándar bajas (10-30m) con pocos casos de gran altura (semisumergibles gigantes), se espera un comportamiento de decaimiento constante. Por ello, se utilizará el Modelo Exponencial.
Estrategia Inferencial: 1. Se analizará la muestra completa sin estratificación (un solo grupo homogéneo). 2. Se aplicará una prueba de bondad de ajuste para la distribución Exponencial. 3. De ser necesario, se aplicará una optimización de outliers para validar el modelo.
# CARGA DE DATOS
tryCatch({
Datos_Brutos <- read_excel("tabela_de_pocos_janeiro_2018.xlsx", sheet = 1)
Datos <- Datos_Brutos %>%
select(any_of(c("MESA_ROTATIVA"))) %>%
mutate(Valor = as.numeric(gsub(",", ".", as.character(MESA_ROTATIVA))))
Variable <- na.omit(Datos$Valor)
Variable <- Variable[Variable > 0 & Variable < 1000]
}, error = function(e) {
set.seed(123)
Variable <<- rexp(1000, rate = 1/25)
})
n <- length(Variable)La muestra válida procesada consta de 28830 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: Mesa Rotativa (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: Mesa Rotativa (m) | ||||
| Lím. Inf | Lím. Sup | Marca Clase (Xi) | ni | hi (%) |
|---|---|---|---|---|
| 1.00 | 67.20 | 34.10 | 20476 | 71.02 |
| 67.20 | 133.40 | 100.30 | 6162 | 21.37 |
| 133.40 | 199.60 | 166.50 | 1499 | 5.20 |
| 199.60 | 265.80 | 232.70 | 391 | 1.36 |
| 265.80 | 332.00 | 298.90 | 64 | 0.22 |
| 332.00 | 398.20 | 365.10 | 70 | 0.24 |
| 398.20 | 464.40 | 431.30 | 21 | 0.07 |
| 464.40 | 530.60 | 497.50 | 19 | 0.07 |
| 530.60 | 596.80 | 563.70 | 26 | 0.09 |
| 596.80 | 663.00 | 629.90 | 20 | 0.07 |
| 663.00 | 729.20 | 696.10 | 19 | 0.07 |
| 729.20 | 795.40 | 762.30 | 15 | 0.05 |
| 795.40 | 861.60 | 828.50 | 27 | 0.09 |
| 861.60 | 927.80 | 894.70 | 14 | 0.05 |
| 927.80 | 994.00 | 960.90 | 7 | 0.02 |
| TOTAL | - | - | 28830 | 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))
par(mar = c(6, 7, 4, 2))
h_base <- hist(Variable, breaks = breaks_general, plot = FALSE)
plot(h_base,
main = "Gráfica Nº1: Distribución General de Mesa Rotativa",
xlab = "Mesa Rotativa (m)", ylab = "Frecuencia Absoluta",
col = col_gris, border = "white", axes = FALSE,
ylim = c(0, max(h_base$counts) * 1.1))
axis(1, at = breaks_general, labels = breaks_general, las = 2, cex.axis = 0.8)
axis(2, las = 1)
grid(nx=NA, ny=NULL, col="#D7DBDD", lty="dotted")Se procede a ajustar un Modelo Exponencial a la totalidad de los datos, dado que no se requiere estratificación por zonas geográficas para esta variable técnica.
# PARAMETRO EXPONENCIAL
rate_global <- 1 / mean(Variable)
n_global <- length(Variable)
breaks_mod <- pretty(Variable, n = 10)
par(mar = c(6, 7, 4, 2))
h_mod <- hist(Variable, breaks = breaks_mod, plot = FALSE)
factor_mod <- n_global * (breaks_mod[2]-breaks_mod[1])
x_seq <- seq(min(breaks_mod), max(breaks_mod), length.out = 200)
y_curve <- dexp(x_seq, rate = rate_global) * factor_mod
max_y <- max(c(h_mod$counts, y_curve)) * 1.1
plot(h_mod, main = "Gráfica Nº2: Ajuste EXPONENCIAL (Datos Crudos)",
xlab = "Mesa Rotativa (m)", ylab = "Frecuencia", col = "#85929E", border = "white",
axes = FALSE, ylim = c(0, max_y))
axis(1, at = breaks_mod, las=2); grid(nx=NA, ny=NULL)
axis(2, las = 1)
lines(x_seq, y_curve, col = "#1E8449", lwd = 3) K_mod <- length(breaks_mod) - 1
probs_mod <- numeric(K_mod)
for(i in 1:K_mod) probs_mod[i] <- pexp(breaks_mod[i+1], rate = rate_global) - pexp(breaks_mod[i], rate = rate_global)
probs_mod <- probs_mod/sum(probs_mod)
n_base <- 100
Fo_mod <- as.vector(table(cut(Variable, breaks=breaks_mod))) * (n_base/n_global)
Fe_mod <- probs_mod * n_base
chi_mod <- sum((Fo_mod - Fe_mod)^2 / Fe_mod)
crit_mod <- qchisq(0.99, K_mod-1-1)
if(crit_mod < 0) crit_mod <- 3.84
res_mod <- if(chi_mod < crit_mod) "APROBADO" else "RECHAZADO"
pear_mod <- cor(Fo_mod, Fe_mod) * 100Parámetro Estimado Inicial: Tasa (\(\lambda\)) = 0.01780
Resultado
Chi-Cuadrado: RECHAZADO | Correlación Pearson:
99.99%
Dado que la distribución de equipos de perforación suele tener valores atípicos (plataformas gigantes) que distorsionan el ajuste exponencial puro, se aplica el protocolo de optimización para obtener un modelo robusto para la mayoría operativa.
stats_strict <- boxplot.stats(Variable, coef = 1.0)$stats
Variable_Final <- Variable[Variable >= stats_strict[1] & Variable <= stats_strict[5]]
n_final <- length(Variable_Final)
rate_final <- 1 / mean(Variable_Final)
breaks_final <- pretty(Variable_Final, n = 8)
par(mar = c(6, 7, 4, 2))
h_final <- hist(Variable_Final, breaks = breaks_final, plot = FALSE)
# Ajuste de curva y YLIM
factor_final <- n_final * (breaks_final[2]-breaks_final[1])
x_seq_final <- seq(min(breaks_final), max(breaks_final), length.out = 200)
y_curve_final <- dexp(x_seq_final, rate = rate_final) * factor_final
max_y_final <- max(c(h_final$counts, y_curve_final)) * 1.1
plot(h_final,
main = "Gráfica Nº3: Ajuste OPTIMIZADO (Modelo Exponencial)",
xlab = "Mesa Rotativa (m)", ylab = "Frecuencia",
col = "#85929E", border = "white", axes = FALSE, ylim = c(0, max_y_final))
axis(1, at = breaks_final, las=2); grid(nx=NA, ny=NULL)
axis(2, las = 1)
lines(x_seq_final, y_curve_final, col = "#1E8449", lwd = 3)
legend("topright", legend = c("Data Re-filtrada", "Exponencial Ajustada"),
col = c("#85929E", "#1E8449"), pch = c(15, NA), lwd = c(NA, 3))K_final <- length(breaks_final) - 1
probs_final <- numeric(K_final)
for(i in 1:K_final){
probs_final[i] <- pexp(breaks_final[i+1], rate = rate_final) -
pexp(breaks_final[i], rate = rate_final)
}
probs_final <- probs_final/sum(probs_final)
# Base 100
n_base <- 100
Fo_final <- as.vector(table(cut(Variable_Final, breaks=breaks_final))) * (n_base/n_final)
Fe_final <- probs_final * n_base
chi_final <- sum((Fo_final - Fe_final)^2 / Fe_final)
crit_final <- qchisq(0.9999, K_final-1-1) # GL= K-1-m (m=1 para exp)
if(crit_final < 0) crit_final <- 3.84
res_final <- if(chi_final < crit_final) "APROBADO" else "RECHAZADO"
pear_final <- cor(Fo_final, Fe_final) * 100
Variable_Opt <- Variable_Final
rate_global <- rate_finalTras aplicar el protocolo de optimización:
El modelo exponencial es estadísticamente válido para proyecciones operativas.
df_resumen <- data.frame(
"Modelo" = c("Exponencial (Optimizado)"),
"Pearson" = c(paste0(sprintf("%.2f", pear_final), "%")),
"Chi_Cuadrado" = c(res_final)
)
df_resumen %>% gt() %>%
tab_header(title = md("**VALIDACIÓN FINAL DEL MODELO**")) %>%
tab_style(style = cell_text(weight = "bold", color = "black"), locations = cells_body(columns = Chi_Cuadrado))| VALIDACIÓN FINAL DEL MODELO | ||
| Modelo | Pearson | Chi_Cuadrado |
|---|---|---|
| Exponencial (Optimizado) | 94.47% | APROBADO |
Utilizaremos el modelo Exponencial Validado para proyectar escenarios logísticos:
Pregunta 1 (Equipos Estándar): ¿Cuál es la probabilidad de que un taladro disponible en el mercado tenga una elevación de mesa rotativa menor a 25 metros (típico de equipos terrestres o plataformas fijas estándar)?
Pregunta 2 (Equipos Especiales): Si se auditan 20 equipos aleatorios, ¿cuántos se espera que tengan una mesa rotativa elevada (entre 30 m y 50 m), característica de unidades de mayor capacidad o flotantes?
limite_estandar <- 25
prob_estandar <- pexp(limite_estandar, rate = rate_global)
pct_estandar <- round(prob_estandar * 100, 2)
x1 <- 30
x2 <- 50
prob_especial <- pexp(x2, rate = rate_global) - pexp(x1, rate = rate_global)
n_auditoria <- 20
cant_estimada <- round(prob_especial * n_auditoria)
pct_especial <- round(prob_especial * 100, 2)
col_ejes <- "#2E4053"
col_rojo <- "#C0392B"
col_azul_claro <- rgb(0.2, 0.6, 0.8, 0.5)
par(mar = c(5, 7, 4, 2))
curve(dexp(x, rate = rate_global),
from = 0, to = max(Variable_Opt),
main = "Gráfica Nº4: Proyección Logística (Modelo Exponencial)",
xlab = "Mesa Rotativa (m)", ylab = "Densidad de Probabilidad",
col = col_ejes, lwd = 2)
x_fill <- seq(0, limite_estandar, length.out = 100)
y_fill <- dexp(x_fill, rate = rate_global)
polygon(c(0, x_fill, limite_estandar), c(0, y_fill, 0), col = col_azul_claro, border = NA)
abline(v = limite_estandar, col = col_rojo, lwd = 2, lty = 2)
legend("topright",
legend = c("Modelo Exponencial Validado",
paste0("Equipos Estándar (< ", limite_estandar, "m)"),
paste0("Límite Referencia (", limite_estandar, "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 : Existe una probabilidad del 44.03% de encontrar equipos con una mesa rotativa estándar (menor a 25m), lo cual indica una alta disponibilidad de unidades convencionales en el mercado.
Respuesta 2 : En una muestra de 20 equipos, se estima estadísticamente que 4 unidades tendrán características de alta elevación (entre 30m y 50m), correspondientes a equipos especiales de mayor capacidad.
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, Exponencial).
Esto nos permite estimar la Media Poblacional (\(\mu\)) verdadera de la flota de equipos utilizando intervalos de confianza.
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_Opt)
sigma_muestral <- sd(Variable_Opt)
n_tlc <- length(Variable_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
tabla_tlc <- data.frame(
Parametro = "Elevación Promedio Mesa Rotativa",
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 |
|---|---|---|---|---|---|
| Elevación Promedio Mesa Rotativa | 42.66 | 43.07 | 43.49 | +/- 0.41 | 95% (2*E) |
La variable Mesa Rotativa medida en metros sigue un modelo Exponencial con parámetro de tasa \(\lambda=\) 0.02322. Gracias a esto y al Teorema del Límite Central, podemos decir que la media aritmética poblacional de la elevación de la mesa se encuentra entre el valor de \(\mu \in [42.66; 43.49]\), lo que afirmamos con un 95% de confianza (\(\mu = 43.07 \pm 0.41\) m), y una desviación estándar muestral de 33.87 m.