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)
)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 | ||||||||
Esta sección presenta la visualización de la distribución de los datos.
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")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")# 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()# 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 | ||||||||||
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, ".**"
))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.