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 Selección de 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)

Variable <- Variable[Variable >= 0 & Variable < 4000]

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

4 Frecuencia

N <- length(Variable)
K <- floor(1 + 3.322 * log10(N)) 
breaks_table <- seq(min(Variable), max(Variable), length.out = K + 1)

ni <- as.vector(table(cut(Variable, breaks = breaks_table, include.lowest = TRUE, right = FALSE)))

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 Tabla de Distribución de Frecuencia

Tabla de distribución de frecuencias.

5.1 Tabla General

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

5.2 Tabla Simplificada

# =====================================================================
# BLOQUE 1: CÁLCULO DE FRECUENCIAS (INTERVALOS FIJOS DE 500 EN 500)
# =====================================================================
min_val <- 0
max_val <- ceiling(max(Variable) / 500) * 500 # Redondea al múltiplo de 500 superior
breaks_table <- seq(min_val, max_val, by = 500)
K <- length(breaks_table) - 1

ni      <- as.vector(table(cut(Variable, breaks = breaks_table, include.lowest = TRUE, right = FALSE)))
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)))


# =====================================================================
# BLOQUE 2: CREACIÓN Y ESTILIZADO DE LA TABLA CON gt()
# =====================================================================
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"
max_var <- max(Variable)
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 al centro
  tab_style(
    style = cell_text(align = "center"),
    locations = cells_stub()
  ) %>%
  
  # Estética de los encabezados
  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 500 250 11,035 81.95 11,035 13,466 81.95 100.00
500 1000 750 715 5.31 11,750 2,431 87.26 18.05
1000 1500 1250 887 6.59 12,637 1,716 93.84 12.74
1500 2000 1750 500 3.71 13,137 829 97.56 6.16
2000 2500 2250 287 2.13 13,424 329 99.69 2.44
2500 3000 2750 42 0.31 13,466 42 100.00 0.31
TOTAL 13466 100
Fuente: Datos ANP 2018

6 Gráficas de distribución de frecuencias

6.1 GRÁFICO 1: Histograma Absoluto

par(mar = c(8, 5, 4, 2)) 
h_abs <- hist(
  Variable,
  breaks = breaks_table,
  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(ni) * 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))
h_glob <- hist(
  Variable,
  breaks = breaks_table,
  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(ni)),
  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)

par(mar = c(8, 5, 4, 2))
h_p3 <- hist(Variable, breaks = breaks_table, plot = FALSE)

# Reasignamos los counts para que representen el porcentaje real (0 a 100)
h_p3$counts <- hi

plot(
  h_p3,
  main = "Gráfica N°3: Distribución Porcentual de Lámina de Agua",
  xlab = "Lámina de Agua - col_agua_m (m)", 
  ylab = "Porcentaje (%)",
  col = col_gris_azulado, 
  border = "white", 
  axes = FALSE, 
  ylim = c(0, 60),
  xlim = limite_x,
  freq = TRUE
)

axis(1, at = seq(0, limite_x[2], by = 500), las = 2, cex.axis = 0.7)
axis(2, at = seq(0, 100, by = 20), labels = paste0(seq(0, 100, by = 20), "%"))
grid(nx = NA, ny = NULL, col = "#D7DBDD", lty = "dotted")

text(
  x = h_p3$mids, 
  y = hi, 
  label = paste0(round(hi, 1), "%"), 
  pos = 3, 
  cex = 0.6, 
  col = col_ejes, 
  xpd = TRUE
)
box(bty = "l")

6.4 GRÁFICO 4: Global Porcentual

par(mar = c(8, 5, 4, 2))
h_p4 <- hist(Variable, breaks = breaks_table, plot = FALSE)
h_p4$counts <- hi

plot(
  h_p4,
  main = "Gráfica No.4: Distribución Porcentual de Lámina de Agua",
  xlab = "Lámina de Agua - col_agua_m (m)", 
  ylab = "% del Total", 
  col = col_gris_azulado, 
  border = "white", 
  axes = FALSE, 
  ylim = c(0, 105),
  xlim = limite_x,
  freq = TRUE
)

axis(1, at = seq(0, limite_x[2], by = 500), las = 2, cex.axis = 0.7)
axis(2, at = seq(0, 100, by = 20), labels = paste0(seq(0, 100, by = 20), "%"))
grid(nx = NA, ny = NULL, col = "#D7DBDD", lty = "dotted")

text(
  x = h_p4$mids, 
  y = hi, 
  label = paste0(round(hi, 1), "%"), 
  pos = 3, 
  cex = 0.6, 
  col = col_ejes, 
  xpd = TRUE
)
box(bty = "l")

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 Estadísticos

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), "]"),
  X = media_val,
  Me = mediana_val,
  Mo = paste(round(TDF_Agua$MC[TDF_Agua$hi == max(TDF_Agua$hi)], 2), collapse = ", "),
  Varianza = var(Variable),
  sd = sd_val,
  CV = (sd_val / abs(media_val)) * 100,
  As = skewness(Variable, type = 2),
  K = kurtosis(Variable, type = 2),
  Atipicos = status_atipicos
)

df_resumen %>%
  gt() %>%
  tab_header(title = md("**CONCLUSIONES Y ESTADÍSTICOS**"), subtitle = "Variable: col_agua_m") %>%
  cols_label(
    X = "X",
    Me = "Me",
    Mo = "Mo",
    sd = "sd",
    CV = "CV",
    As = "As",
    K = "K",
    Atipicos = "Valores atípicos"
  ) %>%
  fmt_number(columns = c(X, Me, Varianza, sd, CV, K), decimals = 2) %>%
  fmt_number(columns = As, decimals = 4) %>%
  
  cols_width(
    Variable ~ px(140),
    Rango ~ px(120),
    Mo ~ px(100),
    Atipicos ~ px(220), 
    everything() ~ px(85) 
  ) %>%
  
  tab_options(
    column_labels.background.color = "#2E4053",
    table.border.top.style = "solid",
    table.border.bottom.style = "solid",
    heading.border.bottom.style = "solid",
    column_labels.border.top.style = "solid",
    column_labels.border.bottom.style = "solid",
    data_row.padding = px(8)
  ) %>%
  tab_style(
    style = list(
      cell_text(weight = "bold", color = "white"),
      cell_borders(sides = c("left", "right"), color = "#D3D3D3", weight = px(1))
    ),
    locations = cells_column_labels()
  ) %>%
  tab_style(
    style = cell_borders(sides = c("left", "right"), color = "#D3D3D3", weight = px(1)),
    locations = cells_body()
  )
CONCLUSIONES Y ESTADÍSTICOS
Variable: col_agua_m
Variable Rango X Me Mo Varianza sd CV As K Valores atípicos
col_agua_m [0 ; 2988] 268.13 0.00 250 307,109.51 554.17 206.68 2.2107 3.97 2638 [296; 2988]

8 Conclusiones

Los valores de col_agua_m fluctúan entre 0 y 2988 y giran en torno a 0.00, con una desviación estándar de 554.17, con 2638 valores atípicos en el rango de 296 a 2988, siendo un conjunto de datos heterogéneo, cuyos valores se agrupan fuertemente en la parte baja de col_agua_m; por lo anterior, el comportamiento es perjudicial porque el 81.9% de los pozos se concentran en el primer intervalo, lo que demuestra una alta asimetría y falta de dispersión en mayores profundidades, limitando la variabilidad operativa y de estudios geomecánicos.