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 Carga de librerias

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

2 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))

3 Extraer variable

Datos <- Datos_Brutos %>%
  select(any_of(c("POCO", "LAMINA_D_AGUA_M"))) %>%
  mutate(Variable_Analisis = as.numeric(gsub(",", ".", as.character(LAMINA_D_AGUA_M))))

Variable <- na.omit(Datos$Variable_Analisis)

# Filtro para valores razonables de lámina de agua (0 a 4000 metros)
Variable <- Variable[Variable >= 0 & Variable < 4000]

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

4 Conteo

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)))

5 Distribución de Frecuencias

Tabla de distribución de frecuencias.

# Creación de la Tabla de Distribución de Frecuencias (TDF)
TDF_Agua <- 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"
max_var <- max(Variable)
breaks_auto <- hist(Variable, plot = FALSE)$breaks
h_base <- hist(Variable, breaks = breaks_auto, plot = FALSE)
limite_x <- c(0, max(max_var, 100))

TDF_Agua %>%
  gt(rowname_col = "Li") %>% 
  tab_header(
    title = md("**DISTRIBUCIÓN DE FRECUENCIAS: LÁMINA DE AGUA**"),
    subtitle = md("Variable: **col_agua_m**")
  ) %>%
  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: LÁMINA DE AGUA
Variable: col_agua_m
Lím. Inf Lím. Sup Marca Clase (Xi) ni hi (%) Ni (Asc) Ni (Desc) Hi (Asc) Hi (Desc)
0.00 213.43 106.71 10,682 79.33 10,682 13,466 79.33 100.00
213.43 426.86 320.14 263 1.95 10,945 2,784 81.28 20.67
426.86 640.29 533.57 233 1.73 11,178 2,521 83.01 18.72
640.29 853.71 747.00 275 2.04 11,453 2,288 85.05 16.99
853.71 1067.14 960.43 416 3.09 11,869 2,013 88.14 14.95
1067.14 1280.57 1173.86 377 2.80 12,246 1,597 90.94 11.86
1280.57 1494.00 1387.29 380 2.82 12,626 1,220 93.76 9.06
1494.00 1707.43 1600.71 239 1.77 12,865 840 95.54 6.24
1707.43 1920.86 1814.14 241 1.79 13,106 601 97.33 4.46
1920.86 2134.29 2027.57 133 0.99 13,239 360 98.31 2.67
2134.29 2347.71 2241.00 160 1.19 13,399 227 99.50 1.69
2347.71 2561.14 2454.43 28 0.21 13,427 67 99.71 0.50
2561.14 2774.57 2667.86 22 0.16 13,449 39 99.87 0.29
2774.57 2988.00 2881.29 17 0.13 13,466 17 100.00 0.13
TOTAL 13466 100
Fuente: Datos ANP 2018

6 Gráficas

6.1 GRÁFICO 1: Histograma Absoluto

par(mar = c(8, 5, 4, 2)) 
plot(h_base, 
     main = "Gráfica No.1: Distribución de col_agua_m de Pozos Petroleros de Brasil",
     xlab = "Lámina de Agua - col_agua_m (m)", 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 = seq(0, limite_x[2], by = 500), las = 2, cex.axis = 0.7)
axis(2)
grid(nx = NA, ny = NULL, col = "#D7DBDD", lty = "dotted") 

6.2 GRÁFICO 2: Histograma Global

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

6.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 col_agua_m de Pozos Petroleros de Brasil",
     xlab = "Lámina de Agua - col_agua_m (m)", 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 = seq(0, limite_x[2], by = 500), las = 2, cex.axis = 0.7)
axis(2)

text(x = h_base$mids[h_base$mids <= limite_x[2]], 
     y = h_porc$counts[h_base$mids <= limite_x[2]], 
     label = paste0(round(h_porc$counts[h_base$mids <= limite_x[2]], 1), "%"), 
     pos = 3, cex = 0.6, col = col_ejes)

6.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 col_agua_m de Pozos Petroleros de Brasil",
     xlab = "Lámina de Agua - col_agua_m (m)", ylab = "% del Total", 
     col = col_gris_azulado, border = "white", axes = FALSE, freq = TRUE,
     ylim = c(0, 100),
     xlim = limite_x)
axis(1, at = seq(0, limite_x[2], by = 500), las = 2, cex.axis = 0.7)
axis(2)
text(x = h_base$mids[h_base$mids <= limite_x[2]], 
     y = h_porc$counts[h_base$mids <= limite_x[2]], 
     label = paste0(round(h_porc$counts[h_base$mids <= limite_x[2]], 1), "%"), 
     pos = 3, cex = 0.6, col = col_ejes)

6.5 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 (col_agua_m)",
        xlab = "Lámina de Agua - col_agua_m (m)", outline = TRUE, outpch = 19, 
        outcol = col_acento, axes = FALSE, xlim = c(0.7, 1.3),
        ylim = limite_x)
axis(1, at = seq(0, limite_x[2], by = 500), las = 2, cex.axis = 0.7)
box()

6.6 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 (col_agua_m)",
     xlab = "Lámina de Agua - col_agua_m (m)", ylab = "Frecuencia acumulada")

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

axis(1, at = seq(0, max(breaks_table), by = 500), 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()

7 Indicadores

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 = "col_agua_m",
  Rango = paste0("[", round(min(Variable), 2), " ; ", round(max(Variable), 2), "]"),
  Media = media_val,
  Mediana = mediana_val,
  Moda = paste(round(TDF_Agua$MC[TDF_Agua$hi == max(TDF_Agua$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: col_agua_m") %>%
  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: col_agua_m
Variable Rango Media Mediana Moda Varianza Desv_Std CV_Porc Asimetria Curtosis Atipicos
col_agua_m [0 ; 2988] 268.13 0.00 106.71 307,109.51 554.17 206.68 2.2107 3.97 2638 [296; 2988]

8 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(
  "La variable **col_agua_m** 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."
))

La variable col_agua_m oscila entre 0 y 2988 metros. El centro de la distribución se localiza en 0 metros. La muestra se define como una variable heterogénea (CV: 206.68%), presentando una mayor densidad en los valores bajos 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.