1 Introducción y Metodología

El presente informe estadístico analiza la variable Cota Altimétrica de pozos petroleros de Brasil.

# 1. LIBRERÍAS Y CARGA DE DATOS

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

# Carga de datos
Datos_Brutos <- read_excel("tabela_de_pocos_janeiro_2018.xlsx", sheet = 1)

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

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

Variable <- na.omit(Datos$COTA_ALTIMETRICA_M)
Variable <- Variable[Variable > 0 & Variable < 500]

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_Cota <- 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_Cota %>% 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: **Cota Altimétrica (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: Cota Altimétrica (m)
Lím. Inf Lím. Sup Marca Clase (Xi) ni hi (%) Ni (Asc) Ni (Desc) Hi (Asc) Hi (Desc)
0.8 38.57 19.68 3294 48.39 3294 6807 48.39 100
38.57 76.34 57.45 1852 27.21 5146 3513 75.6 51.61
76.34 114.11 95.22 1004 14.75 6150 1661 90.35 24.4
114.11 151.88 132.99 397 5.83 6547 657 96.18 9.65
151.88 189.65 170.76 138 2.03 6685 260 98.21 3.82
189.65 227.42 208.53 91 1.34 6776 122 99.54 1.79
227.42 265.18 246.3 17 0.25 6793 31 99.79 0.46
265.18 302.95 284.07 5 0.07 6798 14 99.87 0.21
302.95 340.72 321.84 2 0.03 6800 9 99.9 0.13
340.72 378.49 359.61 3 0.04 6803 7 99.94 0.1
378.49 416.26 397.38 1 0.01 6804 4 99.96 0.06
416.26 454.03 435.15 0 0 6804 3 99.96 0.04
454.03 491.8 472.92 3 0.04 6807 3 100 0.04
TOTAL - - 6807 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 Cota Altimétrica de Pozos Petroleros de Brasil",
     xlab = "Cota Altimétrica (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 Cota Altimétrica de Pozos Petroleros de Brasil",
     xlab = "Cota Altimétrica (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 Cota Altimétrica de Pozos Petroleros de Brasil",
     xlab = "Cota Altimétrica (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 Cota Altimétrica de Pozos Petroleros de Brasil",
     xlab = "Cota Altimétrica (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 Cota Altimétrica de Pozos Petroleros de Brasil (Boxplot)",
        xlab = "Cota Altimétrica (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 Cota Altimétrica de Pozos Petroleros de Brasil",
     xlab = "Cota Altimétrica (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_Cota$ni)
modas_calc <- TDF_Cota$MC[TDF_Cota$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" = "Cota Altimétrica (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 Cota Altimétrica 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 Cota Altimétrica 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]
Cota Altimétrica (m) [0.8; 491.8] 51.69 40.00 19.68 2,186.44 46.76 90.46 1.7566 6.03 198 [165.4; 491.8]
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 (menor altitud)" else "parte media alta (mayor altitud)"

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_topografico <- if(cv_calc > 150) {
  "geográficamente disperso, abarcando una mezcla operativa compleja de ubicaciones a nivel del mar (Offshore/Costeras) y zonas continentales elevadas (Onshore). Esta heterogeneidad implica retos logísticos duales: gestión naval para cota cero y transporte terrestre pesado para las ubicaciones en altura"
} else if (valor_referencia < 30) {
  "característico de operaciones en cuencas sedimentarias costeras o marinas (Offshore), donde la topografía plana y cercana al nivel del mar facilita el acceso vial o requiere logística naval, minimizando la necesidad de grandes movimientos de tierra para la nivelación de la locación (Planchada)"
} else {
  "típico de un entorno continental (Onshore), donde la elevación del terreno sugiere operaciones en el interior. Esto conlleva desafíos logísticos terrestres asociados a la orografía, requiriendo mayor inversión en obra civil para la construcción de accesos y la estabilización de las locaciones de perforación"
}

cat(paste0(
  "## Análisis Topográfico y Logístico\n\n",
  
  "La variable **Cota Altimétrica** fluctúa entre **", min_txt, "** y **", max_txt, "** metros sobre el nivel del mar, ",
  "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 lo tanto, el escenario topográfico se clasifica como ", juicio_topografico, ".**"
))

5.1 Análisis Topográfico y Logístico

La variable Cota Altimétrica fluctúa entre 0.8 y 491.8 metros sobre el nivel del mar, y sus valores se encuentran alrededor de 40 metros (Mediana). Presenta una desviación estándar de 46.7593, siendo una variable heterogénea (CV: 90.46%), cuyos valores se concentran en la parte media baja (menor altitud) de la distribución con la presencia de 198 valores atípicos; por lo tanto, el escenario topográfico se clasifica como típico de un entorno continental (Onshore), donde la elevación del terreno sugiere operaciones en el interior. Esto conlleva desafíos logísticos terrestres asociados a la orografía, requiriendo mayor inversión en obra civil para la construcción de accesos y la estabilización de las locaciones de perforación.