knitr::opts_chunk$set(echo = TRUE)
setwd("C:/Users/LEO/Documents/ESTA")
Datos <- read.csv("tabela_de_pocos_janeiro_2018.csv", header = TRUE, sep = ";" , dec = ".", fileEncoding = "Latin1")

1 Introducción y Metodología

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

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

# Carga de datos
Datos_Brutos <- read_xlsx("C:/Users/LEO/Documents/ESTA/tabela_de_pocos_janeiro_2018.xlsx", sheet = 1)
colnames(Datos_Brutos) <- trimws(colnames(Datos_Brutos))

# Selección y cambio de la variable LATITUDE_BASE_DD renombrada como lat_base_gd
Datos <- Datos_Brutos %>%
  select(any_of(c("POCO", "LATITUDE_BASE_DD"))) %>%
  mutate(lat_base_gd = as.numeric(gsub(",", ".", as.character(LATITUDE_BASE_DD))))

Variable <- na.omit(Datos$lat_base_gd)

# Filtro para valores razonables de latitud en el territorio de Brasil (entre -35 y 5 grados)
Variable <- Variable[Variable >= -35 & Variable <= 5]

if(length(Variable) == 0) {
  stop("ERROR: No hay datos válidos para la variable seleccionada.")
}

# 2. CÁLCULOS MATEMÁTICOS PARA LA TABLA
N <- length(Variable)
K <- floor(1 + 3.322 * log10(N)) 
breaks_table <- seq(min(Variable), max(Variable), length.out = K + 1)

# Cálculo de ni usando cut
ni <- as.vector(table(cut(Variable, breaks = breaks_table, include.lowest = TRUE, right = FALSE)))

# Cálculo de vectores estadísticos (Mantenemos los valores reales sin redondear para la tabla)
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)))

# Creación de la Tabla de Distribución de Frecuencias (TDF)
TDF_Latitud <- data.frame(
  Li      = round(breaks_table[1:K], 2), 
  Ls      = round(breaks_table[2:(K+1)], 2), 
  MC      = round((breaks_table[1:K] + breaks_table[2:(K+1)]) / 2, 2),            
  ni      = ni, 
  hi      = hi, 
  Ni_asc  = Ni_asc, 
  Ni_desc = Ni_desc, 
  Hi_asc  = Hi_asc, 
  Hi_desc = Hi_desc
)

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

# Configuración de los breaks automáticos e histograma base para distribución geográfica
breaks_auto <- seq(min(Variable), max(Variable), length.out = K + 1)
h_base <- hist(Variable, breaks = breaks_auto, plot = FALSE)
limite_x <- c(min(breaks_auto), max(breaks_auto))

2 Distribución de Frecuencias

Tabla de distribución de frecuencias para la Cota Altimétrica.

TDF_Latitud %>%
  gt(rowname_col = "Li") %>% 
  tab_header(
    title = md("**DISTRIBUCIÓN DE FRECUENCIAS: LATITUD BASE**"),
    subtitle = md("Variable: **lat_base_gd**")
  ) %>%
  tab_source_note(source_note = "Fuente: Datos ANP 2018") %>%
  
  grand_summary_rows(
    columns = c(ni, hi),
    fns = list("TOTAL" = ~sum(., na.rm = TRUE))
  ) %>%
  
  # Formateamos números enteros 
  fmt_number(
    columns = c(ni, Ni_asc, Ni_desc),
    decimals = 0,
    use_seps = TRUE
  ) %>%
  
  # Formateamos los porcentajes a 2 decimales 
  fmt_number(
    columns = c(hi, Hi_asc, Hi_desc),
    decimals = 2
  ) %>%
  
  cols_label(
    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)"
  ) %>%
  
  tab_stubhead(label = "Lím. Inf") %>% 
  
  # Alineación de datos al centro
  cols_align(align = "center", columns = everything()) %>%
  
  # Alineación del Stub (Lím. Inf y la palabra TOTAL) al centro
  tab_style(
    style = cell_text(align = "center"),
    locations = cells_stub()
  ) %>%
  
  # Estética de los encabezados (Azul oscuro / Verde petróleo con texto blanco)
  tab_style(
    style = list(cell_fill(color = "#1F4E5B"), cell_text(color = "white", weight = "bold")), 
    locations = list(cells_title(), cells_column_labels(), cells_stubhead())
  ) %>%
  
  tab_options(
    table.border.top.style = "none",
    table.border.bottom.color = "#2E4053",
    column_labels.border.bottom.color = "#2E4053",
    data_row.padding = px(6)
  )
DISTRIBUCIÓN DE FRECUENCIAS: LATITUD BASE
Variable: lat_base_gd
Lím. Inf Lím. Sup Marca Clase (Xi) ni hi (%) Ni (Asc) Ni (Desc) Hi (Asc) Hi (Desc)
-32.93 -30.43 -31.68 12 0.04 12 29,575 0.04 100.00
-30.43 -27.93 -29.18 18 0.06 30 29,563 0.10 99.96
-27.93 -25.44 -26.68 303 1.02 333 29,545 1.13 99.90
-25.44 -22.94 -24.19 877 2.97 1,210 29,242 4.09 98.87
-22.94 -20.44 -21.69 3,079 10.41 4,289 28,365 14.50 95.91
-20.44 -17.94 -19.19 2,029 6.86 6,318 25,286 21.36 85.50
-17.94 -15.45 -16.70 135 0.46 6,453 23,257 21.82 78.64
-15.45 -12.95 -14.20 163 0.55 6,616 23,122 22.37 78.18
-12.95 -10.45 -11.70 11,444 38.69 18,060 22,959 61.07 77.63
-10.45 -7.96 -9.21 1,051 3.55 19,111 11,515 64.62 38.93
-7.96 -5.46 -6.71 611 2.07 19,722 10,464 66.68 35.38
-5.46 -2.96 -4.21 9,444 31.93 29,166 9,853 98.62 33.32
-2.96 -0.47 -1.71 274 0.93 29,440 409 99.54 1.38
-0.47 2.03 0.78 52 0.18 29,492 135 99.72 0.46
2.03 4.53 3.28 83 0.28 29,575 83 100.00 0.28
TOTAL 29575 100
Fuente: Datos ANP 2018

3 Análisis Gráfico

3.1 GRÁFICO 1: Histograma Absoluto

par(mar = c(8, 5, 4, 2)) 
plot(h_base, 
     main = "Gráfica No.1: Distribución de lat_base_gd de Pozos Petroleros de Brasil",
     xlab = "Latitud Base - lat_base_gd (Grados)", ylab = "Frecuencia Absoluta",
     col = col_gris_azulado, border = "white", axes = FALSE,
     ylim = c(0, max(h_base$counts) * 1.1),
     xlim = limite_x) 

axis(1, at = round(seq(limite_x[1], limite_x[2], length.out = 10), 2), las = 2, cex.axis = 0.7)
axis(2)
grid(nx = NA, ny = NULL, col = "#D7DBDD", lty = "dotted") 

3.2 GRÁFICO 2: Histograma Global

par(mar = c(8, 5, 4, 2))
plot(h_base, 
     main = "Gráfica N°2: Distribución de lat_base_gd de Pozos Petroleros de Brasil",
     xlab = "Latitud Base - lat_base_gd (Grados)", ylab = "Total Pozos",
     col = col_gris_azulado, border = "white", axes = FALSE, 
     ylim = c(0, sum(h_base$counts)),
     xlim = limite_x) 
axis(1, at = round(seq(limite_x[1], limite_x[2], length.out = 10), 2), las = 2, cex.axis = 0.7)
axis(2)
grid(nx = NA, ny = NULL, col = "#D7DBDD", lty = "dotted")

3.3 GRÁFICO 3: Porcentajes (Local)

h_porc <- h_base
h_porc$counts <- (h_porc$counts / sum(h_porc$counts)) * 100
par(mar = c(8, 5, 4, 2))
plot(h_porc,
     main = "Gráfica N°3: Distribución Porcentual de lat_base_gd de Pozos Petroleros de Brasil",
     xlab = "Latitud Base - lat_base_gd (Grados)", ylab = "Porcentaje (%)",
     col = col_gris_azulado, border = "white", axes = FALSE, freq = TRUE,
     ylim = c(0, max(h_porc$counts)*1.2),
     xlim = limite_x)
axis(1, at = round(seq(limite_x[1], limite_x[2], length.out = 10), 2), 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)

3.4 GRÁFICO 4: Global Porcentual

par(mar = c(8, 5, 4, 2))
plot(h_porc,
     main = "Gráfica No.4: Distribución Porcentual de lat_base_gd de Pozos Petroleros de Brasil",
     xlab = "Latitud Base - lat_base_gd (Grados)", ylab = "% del Total", 
     col = col_gris_azulado, border = "white", axes = FALSE, freq = TRUE,
     ylim = c(0, 100),
     xlim = limite_x)
axis(1, at = round(seq(limite_x[1], limite_x[2], length.out = 10), 2), 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)

4 Diagrama de Caja y Ojivas

4.1 GRÁFICO 5: Boxplot

col_acento <- "#C0392B"
par(mar = c(8, 5, 4, 2))
boxplot(Variable, horizontal = TRUE, col = col_gris_azulado, 
        main = "Gráfica No.5: Diagrama de Caja (lat_base_gd)",
        xlab = "Latitud Base - lat_base_gd (Grados)", outline = TRUE, outpch = 19, 
        outcol = col_acento, axes = FALSE, xlim = c(0.7, 1.3),
        ylim = limite_x)
axis(1, at = round(seq(limite_x[1], limite_x[2], length.out = 10), 2), las = 2, cex.axis = 0.7)
box()

4.2 GRÁFICO 6: Ojivas

col_azul_oscuro <- "#2E4053"
col_rojo_fuerte <- "#C0392B"
par(mar = c(8, 5, 4, 8), xpd = TRUE) 
x_vals_ojiva <- breaks_table

plot(x_vals_ojiva, c(0, Ni_asc), type = "o", col = col_azul_oscuro, 
     lwd=2, pch=19, axes=F,
     main = "Gráfica No.6: Ojivas Ascendente y Descendente (lat_base_gd)",
     xlab = "Latitud Base - lat_base_gd (Grados)", ylab = "Frecuencia acumulada")

lines(x_vals_ojiva, c(Ni_desc, 0), type = "o", col = col_rojo_fuerte, 
      lwd=2, pch=19)

axis(1, at = round(seq(min(breaks_table), max(breaks_table), length.out = 10), 2), las = 2, cex.axis = 0.6)
axis(2)

legend("right", legend = c("Ascendente", "Descendente"), 
       col = c(col_azul_oscuro, col_rojo_fuerte), 
       lty = 1, pch = 19, cex = 0.7, lwd=2,
       inset = c(-0.15, 0), bty="n")
grid()

5 Resumen Estadístico

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

status_atipicos <- if(length(boxplot.stats(Variable)$out) > 0) {
  paste0(length(boxplot.stats(Variable)$out), " [", round(min(boxplot.stats(Variable)$out), 2), "; ", round(max(boxplot.stats(Variable)$out), 2), "]")
} else { "0 (Sin atípicos)" }

df_resumen <- data.frame(
  Variable = "lat_base_gd",
  Rango = paste0("[", round(min(Variable), 2), " ; ", round(max(Variable), 2), "]"),
  Media = media_val,
  Mediana = mediana_val,
  Moda = paste(round(TDF_Latitud$MC[TDF_Latitud$hi == max(TDF_Latitud$hi)], 2), collapse = ", "),
  Varianza = var(Variable),
  Desv_Std = sd_val,
  CV_Porc = (sd_val / abs(media_val)) * 100,
  Asimetria = skewness(Variable, type = 2),
  Curtosis = kurtosis(Variable, type = 2),
  Atipicos = status_atipicos
)

df_resumen %>%
  gt() %>%
  tab_header(title = md("**CONCLUSIONES Y ESTADÍSTICOS**"), subtitle = "Variable: lat_base_gd") %>%
  fmt_number(columns = c(Media, Mediana, Varianza, Desv_Std, CV_Porc, Curtosis), decimals = 2) %>%
  fmt_number(columns = Asimetria, decimals = 4) %>%

  cols_width(
    Variable ~ px(140),
    Rango ~ px(120),
    Moda ~ px(100),
    Atipicos ~ px(220), 
    everything() ~ px(85) 
  ) %>%
  
  tab_options(column_labels.background.color = "#2E4053") %>%
  tab_style(style = list(cell_text(weight = "bold", color = "white")), locations = cells_column_labels())
CONCLUSIONES Y ESTADÍSTICOS
Variable: lat_base_gd
Variable Rango Media Mediana Moda Varianza Desv_Std CV_Porc Asimetria Curtosis Atipicos
lat_base_gd [-32.93 ; 4.53] −11.41 −10.71 -11.7 39.50 6.28 55.06 −0.6504 −0.51 810 [-32.93; -23.71]

6 Conclusiones

min_txt <- format(min(Variable), scientific = FALSE)
max_txt <- format(max(Variable), scientific = FALSE)
asimetria_val <- skewness(Variable, type = 2)
centro_valor <- format(round(if(abs(asimetria_val) > 0.5) median(Variable) else mean(Variable), 2), 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) "valores bajos" else "valores altos"
juicio_operativo <- if(median(Variable) > 500) "aguas profundas / ultraprofundas" else "aguas someras"

cat(paste0(
  "## Análisis de lat_base_gd\n\n",
  "La variable **lat_base_gd** oscila entre **", min_txt, "** y **", max_txt, "** metros. ",
  "El centro de la distribución se localiza en **", centro_valor, "** metros. ",
  "La muestra se define como una variable **", tipo_homogeneidad, "** (CV: ", round(cv_calc, 2), "%), ",
  "presentando una mayor densidad en los **", donde_se_concentra, "** de la escala. ",
  "Desde el punto de vista de ingeniería, estos valores se consideran **", juicio_operativo, "** para el diseño de los sistemas de producción submarinos."
))

6.1 Análisis de lat_base_gd

La variable lat_base_gd oscila entre -32.92657 y 4.528003 metros. El centro de la distribución se localiza en -10.71 metros. La muestra se define como una variable heterogénea (CV: 55.06%), presentando una mayor densidad en los valores altos de la escala. Desde el punto de vista de ingeniería, estos valores se consideran aguas someras para el diseño de los sistemas de producción submarinos.