1 Introducción y Metodología

El presente informe estadístico analiza la variable Mesa Rotativa de pozos petroleros de Brasil.

# 1. LIBRERÍAS Y CARGA DE DATOS

library(readxl)
library(dplyr)
library(gt)
library(e1071)

Datos_Brutos <- read_excel("tabela_de_pocos_janeiro_2018.xlsx", sheet = 1)

vars_to_keep <- c("POCO", "OPERADOR", "ESTADO", "BACIA", "DIRECAO", 
                  "TIPO", "SITUACAO", "MESA_ROTATIVA", "COTA_ALTIMETRICA_M")

Datos <- Datos_Brutos %>%
  select(any_of(vars_to_keep)) %>%
  mutate(MESA_ROTATIVA = as.numeric(gsub(",", ".", as.character(MESA_ROTATIVA))))

Variable <- na.omit(Datos$MESA_ROTATIVA)
Variable <- Variable[Variable > 0 & Variable < 1000]

if(length(Variable) == 0) stop("ERROR")

# 2. CÁLCULOS MATEMÁTICOS (STURGES)

N <- length(Variable)

min_val <- min(Variable)
max_val <- max(Variable)
Rango <- max_val - min_val
K <- floor(1 + 3.322 * log10(N)) 
Amplitud <- Rango / K

breaks_raw <- seq(min_val, max_val, length.out = K + 1)
breaks_raw[length(breaks_raw)] <- max_val + 0.0001 

lim_inf_raw <- breaks_raw[1:K]
lim_sup_raw <- breaks_raw[2:(K+1)]
MC <- (lim_inf_raw + lim_sup_raw) / 2

ni <- numeric(K)
for (i in 1:K) {
  if (i < K) {
    ni[i] <- length(Variable[Variable >= lim_inf_raw[i] & Variable < lim_sup_raw[i]])
  } else {
    ni[i] <- length(Variable[Variable >= lim_inf_raw[i] & Variable <= lim_sup_raw[i]])
  }
}

hi <- (ni / sum(ni)) * 100 
Ni_asc <- cumsum(ni)
Ni_desc <- rev(cumsum(rev(ni)))
Hi_asc <- cumsum(hi)
Hi_desc <- rev(cumsum(rev(hi)))

TDF_Mesa <- data.frame(
  Li = round(lim_inf_raw, 2), 
  Ls = round(lim_sup_raw, 2), 
  MC = round(MC, 2),            
  ni = ni, 
  hi = round(hi, 2),
  Ni_asc = Ni_asc, 
  Ni_desc = Ni_desc, 
  Hi_asc = round(Hi_asc, 2), 
  Hi_desc = round(Hi_desc, 2)
)

2 Distribución de Frecuencias

A continuación se presenta la tabla de distribución de frecuencias obtenida.

# Totales
totales <- c("TOTAL", "-", "-", sum(ni), round(sum(hi), 2), "-", "-", "-", "-")
TDF_Char <- TDF_Mesa %>% mutate(across(everything(), as.character))
TDF_Final <- rbind(TDF_Char, totales)

TDF_Final %>%
  gt() %>%
  tab_header(
    title = md("**DISTRIBUCIÓN 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 (%)", 
    Ni_asc = "Ni (Asc)", Ni_desc = "Ni (Desc)",
    Hi_asc = "Hi (Asc)", Hi_desc = "Hi (Desc)"
  ) %>%
  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 DE FRECUENCIAS DE POZOS PETROLEROS DE BRASIL
Variable: Mesa Rotativa (m)
Lím. Inf Lím. Sup Marca Clase (Xi) ni hi (%) Ni (Asc) Ni (Desc) Hi (Asc) Hi (Desc)
1 67.2 34.1 20476 71.02 20476 28830 71.02 100
67.2 133.4 100.3 6162 21.37 26638 8354 92.4 28.98
133.4 199.6 166.5 1499 5.2 28137 2192 97.6 7.6
199.6 265.8 232.7 391 1.36 28528 693 98.95 2.4
265.8 332 298.9 64 0.22 28592 302 99.17 1.05
332 398.2 365.1 70 0.24 28662 238 99.42 0.83
398.2 464.4 431.3 21 0.07 28683 168 99.49 0.58
464.4 530.6 497.5 19 0.07 28702 147 99.56 0.51
530.6 596.8 563.7 26 0.09 28728 128 99.65 0.44
596.8 663 629.9 20 0.07 28748 102 99.72 0.35
663 729.2 696.1 19 0.07 28767 82 99.78 0.28
729.2 795.4 762.3 15 0.05 28782 63 99.83 0.22
795.4 861.6 828.5 27 0.09 28809 48 99.93 0.17
861.6 927.8 894.7 14 0.05 28823 21 99.98 0.07
927.8 994 960.9 7 0.02 28830 7 100 0.02
TOTAL - - 28830 100 - - - -
Fuente: Datos ANP 2018

3 Análisis Gráfico

Esta sección presenta la visualización de la distribución de los datos.

3.1 Histogramas de Frecuencia

col_gris_azulado <- "#5D6D7E"
col_ejes <- "#2E4053"

h_base <- hist(Variable, breaks = "Sturges", plot = FALSE)
ylim_max <- max(h_base$counts) * 1.1

# GRÁFICO 1: Histograma Absoluto (Local)
par(mar = c(8, 5, 4, 2)) 
plot(h_base, 
     main = "Gráfica No.1: Distribución de Mesa Rotativa de Pozos Petroleros de Brasil",
     xlab = "Mesa Rotativa (m)",
     ylab = "Frecuencia Absoluta",
     col = col_gris_azulado, border = "white", axes = FALSE,  
     ylim = c(0, ylim_max))
axis(1, at = round(h_base$breaks, 0), labels = format(round(h_base$breaks, 0), scientific = FALSE), las = 2, cex.axis = 0.7)
axis(2)
grid(nx=NA, ny=NULL, col="#D7DBDD", lty="dotted") 

# GRÁFICO 2: Histograma Global
par(mar = c(8, 5, 4, 2))
plot(h_base, 
     main = "Gráfica N°2: Distribución de Mesa Rotativa de Pozos Petroleros de Brasil",
     xlab = "Mesa Rotativa (m)",
     ylab = "Total Pozos",
     col = col_gris_azulado, border = "white", axes = FALSE, 
     ylim = c(0, sum(h_base$counts))) 
axis(1, at = round(h_base$breaks, 0), labels = format(round(h_base$breaks, 0), scientific = FALSE), las = 2, cex.axis = 0.7)
axis(2)
grid(nx=NA, ny=NULL, col="#D7DBDD", lty="dotted")

3.2 Gráficos Porcentuales

h_porc <- h_base
h_porc$counts <- (h_porc$counts / sum(h_porc$counts)) * 100
h_porc$density <- h_porc$counts
ylim_porc <- max(h_porc$counts) * 1.2

# GRÁFICO 3: Porcentajes (Local)
par(mar = c(8, 5, 4, 2))
plot(h_porc,
     main = "Gráfica N°3: Distribución Porcentual de Mesa Rotativa de Pozos Petroleros de Brasil",
     xlab = "Mesa Rotativa (m)",
     ylab = "Porcentaje (%)",
     col = col_gris_azulado, border = "white", axes = FALSE, freq = TRUE,
     ylim = c(0, ylim_porc))
axis(1, at = round(h_base$breaks, 0), labels = format(round(h_base$breaks, 0), scientific = FALSE), las = 2, cex.axis = 0.7)
axis(2)
text(x = h_base$mids, y = h_porc$counts, label = paste0(round(h_porc$counts, 1), "%"), pos = 3, cex = 0.6, col = col_ejes)
grid(nx=NA, ny=NULL, col="#D7DBDD", lty="dotted") 

# GRÁFICO 4: Global Porcentual
par(mar = c(8, 5, 4, 2))
plot(h_porc,
     main = "Gráfica No.4: Distribución Porcentual de Mesa Rotativa de Pozos Petroleros de Brasil",
     xlab = "Mesa Rotativa (m)",
     ylab = "% del Total", 
     col = col_gris_azulado, border = "white", axes = FALSE, freq = TRUE,
     ylim = c(0, 100))
axis(1, at = round(h_base$breaks, 0), labels = format(round(h_base$breaks, 0), scientific = FALSE), las = 2, cex.axis = 0.7)
axis(2)
text(x = h_base$mids, y = h_porc$counts, label = paste0(round(h_porc$counts, 1), "%"), pos = 3, cex = 0.6, col = col_ejes)
abline(h=seq(0,100,20), col="#D7DBDD", lty="dotted")

3.3 Diagrama de Caja y Ojivas

# GRÁFICO 5: Boxplot 
par(mar = c(5, 5, 4, 2))
boxplot(Variable, horizontal = TRUE, col = col_gris_azulado, 
        main = "Gráfica No.5: Diagrama de Caja de Mesa Rotativa de Pozos Petroleros de Brasil (Boxplot)",
        xlab = "Mesa Rotativa (m)", outline = TRUE, outpch = 19, outcol = "#C0392B", 
        boxwex = 0.5, frame.plot = FALSE, xaxt = "n") 
eje_x_detallado <- pretty(Variable, n = 20) 
axis(1, at = eje_x_detallado, labels = format(eje_x_detallado, scientific = FALSE), cex.axis=0.7, las=2)
grid(nx=NULL, ny=NA, col="lightgray", lty="dotted")

# GRÁFICO 6: Ojivas 
par(mar = c(5, 5, 4, 8), xpd = TRUE) 
x_asc <- c(min(breaks_raw), breaks_raw[2:length(breaks_raw)])
y_asc <- c(0, Ni_asc)
x_desc <- c(min(breaks_raw), breaks_raw[2:length(breaks_raw)])
y_desc <- c(Ni_desc, 0)

x_range <- range(c(x_asc, x_desc))
y_range <- c(0, max(c(y_asc, y_desc)))
col_azul <- "#2E4053"
col_rojo <- "#C0392B"

plot(x_asc, y_asc, type = "o", col = col_azul, lwd=2, pch=19,
     main = "Gráfica No.6: Ojivas Ascendente y Descendente de Mesa Rotativa de Pozos Petroleros de Brasil",
     xlab = "Mesa Rotativa (m)", ylab = "Frecuencia acumulada",
     xlim = x_range, ylim = y_range, axes = FALSE, frame.plot = FALSE)

axis(1, at = round(breaks_raw,0), labels = format(round(breaks_raw,0), scientific = FALSE), las=2, cex.axis=0.6)
axis(2, at = pretty(y_asc), labels = format(pretty(y_asc), scientific = FALSE))
lines(x_desc, y_desc, type = "o", col = col_rojo, lwd=2, pch=19)
legend("right", legend = c("Ascendente", "Descendente"),
       col = c(col_azul, col_rojo), lty = 1, pch = 19, cex = 0.7, lwd=2,
       inset = c(-0.15, 0), bty="n")
grid()

4 Resumen Estadístico

# CÁLCULO DE INDICADORES 

media_val <- mean(Variable)
mediana_val <- median(Variable)

freq_max <- max(TDF_Mesa$ni)
modas_calc <- TDF_Mesa$MC[TDF_Mesa$ni == freq_max]
moda_txt <- paste(round(modas_calc, 2), collapse = ", ")

rango_txt <- paste0("[", round(min(Variable), 2), "; ", round(max(Variable), 2), "]")
varianza_val <- var(Variable)
sd_val <- sd(Variable)
cv_val <- (sd_val / abs(media_val)) * 100

asimetria_val <- skewness(Variable, type = 2)
curtosis_val <- kurtosis(Variable, type = 2)

vals_atipicos <- boxplot.stats(Variable)$out
num_atipicos <- length(vals_atipicos)

status_atipicos <- if(num_atipicos > 0) {
  min_out <- min(vals_atipicos)
  max_out <- max(vals_atipicos)
  paste0(num_atipicos, " [", round(min_out, 2), "; ", round(max_out, 2), "]")
} else {
  "0 (Sin atípicos)"
}

df_resumen <- data.frame(
  "Variable" = "Mesa Rotativa (m)",
  "Rango" = rango_txt,
  "Media" = media_val,
  "Mediana" = mediana_val,
  "Moda" = moda_txt,
  "Varianza" = varianza_val,
  "Desv_Std" = sd_val,
  "CV_Porc" = cv_val,
  "Asimetria" = asimetria_val,
  "Curtosis" = curtosis_val,
  "Atipicos" = status_atipicos
)

df_resumen %>%
  gt() %>%
  tab_header(
    title = md("**CONCLUSIONES Y ESTADÍSTICOS**"),
    subtitle = "Resumen de Indicadores de Mesa Rotativa de Pozos Petroleros de Brasil"
  ) %>%
  tab_source_note(source_note = "Autor: Grupo 3") %>%
  fmt_number(columns = c(Media, Mediana, Varianza, Desv_Std, CV_Porc, Curtosis), decimals = 2) %>%
  fmt_number(columns = c(Asimetria), decimals = 4) %>%
  cols_label(
    Variable = "Variable",
    Rango = "Rango [Min; Max]",
    Media = "Media (X̄)",
    Mediana = "Mediana (Me)",
    Moda = "Moda (Mo)",
    Varianza = "Varianza (S²)",
    Desv_Std = "Desv. Est. (S)",
    CV_Porc = "C.V. (%)",
    Asimetria = "Asimetría (As)",
    Curtosis = "Curtosis (K)",
    Atipicos = "Outliers [Intervalo]"
  ) %>%
  tab_options(
    column_labels.background.color = "#2E4053",
    table.border.top.color = "black",
    table.border.bottom.color = "#2E4053",
    column_labels.border.bottom.color = "#2E4053",
    data_row.padding = px(8)
  ) %>%
  tab_style(
    style = list(cell_text(weight = "bold", color = "white")),
    locations = cells_column_labels()
  )
CONCLUSIONES Y ESTADÍSTICOS
Resumen de Indicadores de Mesa Rotativa de Pozos Petroleros de Brasil
Variable Rango [Min; Max] Media (X̄) Mediana (Me) Moda (Mo) Varianza (S²) Desv. Est. (S) C.V. (%) Asimetría (As) Curtosis (K) Outliers [Intervalo]
Mesa Rotativa (m) [1; 994] 56.17 32.00 34.1 4,830.15 69.50 123.73 5.4492 49.24 1264 [165; 994]
Autor: Grupo 3

5 Conclusiones

min_txt <- format(min(Variable), scientific = FALSE)
max_txt <- format(max(Variable), scientific = FALSE)

asimetria_val <- skewness(Variable, type = 2)

if (abs(asimetria_val) <= 1.0) {
  valor_referencia <- mean(Variable)
  centro_valor <- format(round(valor_referencia, 2), scientific = FALSE)
  tipo_centro <- "Media" 
} else {
  valor_referencia <- median(Variable)
  centro_valor <- format(round(valor_referencia, 2), scientific = FALSE)
  tipo_centro <- "Mediana"
}

sd_txt <- format(round(sd(Variable), 4), scientific = FALSE)
cv_calc <- (sd(Variable) / abs(mean(Variable))) * 100
tipo_homogeneidad <- if(cv_calc > 30) "heterogénea" else "homogénea"

donde_se_concentra <- if(asimetria_val > 0) "parte media baja (elevaciones menores)" else "parte media alta (elevaciones mayores)"

outliers_lista <- boxplot.stats(Variable)$out
num_outliers <- length(outliers_lista)

texto_outliers <- if(num_outliers > 0) {
  paste0("con la presencia de **", num_outliers, " valores atípicos**")
} else {
  "sin valores atípicos significativos"
}

juicio_logistico <- if(cv_calc > 40) {
  "operativamente diverso, reflejando el uso de una flota heterogénea de equipos de perforación (desde unidades terrestres/fijas con subestructuras bajas hasta grandes navíos con mesas rotativas elevadas). Esta dispersión es natural en campañas que abarcan diferentes entornos geográficos"
} else if (valor_referencia > 20) {
  "característico de unidades de perforación de gran porte (Semisumergibles o Drillships), donde la elevación de la mesa rotativa es considerable para compensar el 'air gap' y la dinámica marina, sugiriendo una campaña estandarizada en entorno offshore"
} else {
  "típico de operaciones con equipos convencionales (Onshore o Plataformas Fijas), donde la subestructura de perforación mantiene una elevación moderada y estandarizada respecto al nivel de referencia, indicando consistencia en el tipo de taladro utilizado"
}

cat(paste0(
  "## Análisis de Referencia Vertical (Datum)\n\n",
  
  "La variable **Elevación de Mesa Rotativa** fluctúa entre **", min_txt, "** y **", max_txt, "** metros, ",
  "y sus valores se encuentran alrededor de **", centro_valor, "** metros (", tipo_centro, "). ",
  "Presenta una desviación estándar de **", sd_txt, "**, siendo una variable **", tipo_homogeneidad, "** ",
  "(CV: ", round(cv_calc, 2), "%), ",
  "cuyos valores se concentran en la **", donde_se_concentra, "** de la distribución ",
  texto_outliers, "; ",
  "**por consiguiente, el perfil logístico de los equipos se considera ", juicio_logistico, ".**"
))

5.1 Análisis de Referencia Vertical (Datum)

La variable Elevación de Mesa Rotativa fluctúa entre 1 y 994 metros, y sus valores se encuentran alrededor de 32 metros (Mediana). Presenta una desviación estándar de 69.4992, siendo una variable heterogénea (CV: 123.73%), cuyos valores se concentran en la parte media baja (elevaciones menores) de la distribución con la presencia de 1264 valores atípicos; por consiguiente, el perfil logístico de los equipos se considera operativamente diverso, reflejando el uso de una flota heterogénea de equipos de perforación (desde unidades terrestres/fijas con subestructuras bajas hasta grandes navíos con mesas rotativas elevadas). Esta dispersión es natural en campañas que abarcan diferentes entornos geográficos.