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", "MESA_ROTATIVA"))) %>%
  mutate(Variable_Analisis = as.numeric(gsub(",", ".", as.character(MESA_ROTATIVA))))

Variable <- na.omit(Datos$Variable_Analisis)
Variable <- Variable[Variable >= 0 & Variable < 1000]

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

TDF_Mesa %>%
  gt(rowname_col = "Li") %>% 
  tab_header(
    title = md("**DISTRIBUCIÓN DE FRECUENCIAS: ELEV_MESA_ROT**"),
    subtitle = md("Variable: **elev_mesa_rot**")
  ) %>%
  tab_source_note(source_note = "Fuente: Datos ANP 2018") %>%
  
  grand_summary_rows(
    columns = c(ni, hi),
    fns = list("TOTAL" = ~sum(., na.rm = TRUE))
  ) %>%
  
  fmt_number(
    columns = c(ni, Ni_asc, Ni_desc),
    decimals = 0,
    use_seps = TRUE
  ) %>%
  
  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") %>% 
  
  cols_align(align = "center", columns = everything()) %>%
  
  tab_style(
    style = cell_text(align = "center"),
    locations = cells_stub()
  ) %>%
  
  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: ELEV_MESA_ROT
Variable: elev_mesa_rot
Lím. Inf Lím. Sup Marca Clase (Xi) ni hi (%) Ni (Asc) Ni (Desc) Hi (Asc) Hi (Desc)
0.00 66.27 33.13 20,359 70.60 20,359 28,838 70.60 100.00
66.27 132.53 99.40 6,242 21.65 26,601 8,479 92.24 29.40
132.53 198.80 165.67 1,531 5.31 28,132 2,237 97.55 7.76
198.80 265.07 231.93 403 1.40 28,535 706 98.95 2.45
265.07 331.33 298.20 65 0.23 28,600 303 99.17 1.05
331.33 397.60 364.47 69 0.24 28,669 238 99.41 0.83
397.60 463.87 430.73 22 0.08 28,691 169 99.49 0.59
463.87 530.13 497.00 19 0.07 28,710 147 99.56 0.51
530.13 596.40 563.27 25 0.09 28,735 128 99.64 0.44
596.40 662.67 629.53 21 0.07 28,756 103 99.72 0.36
662.67 728.93 695.80 19 0.07 28,775 82 99.78 0.28
728.93 795.20 762.07 15 0.05 28,790 63 99.83 0.22
795.20 861.47 828.33 27 0.09 28,817 48 99.93 0.17
861.47 927.73 894.60 14 0.05 28,831 21 99.98 0.07
927.73 994.00 960.87 7 0.02 28,838 7 100.00 0.02
TOTAL 28838 100
Fuente: Datos ANP 2018

5.2 Tabla Simplificada

min_val <- 0
max_val <- ceiling(max(Variable) / 100) * 100 
breaks_table <- seq(min_val, max_val, by = 100)
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)))


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

TDF_Mesa %>%
  gt(rowname_col = "Li") %>% 
  tab_header(
    title = md("**DISTRIBUCIÓN DE FRECUENCIAS SIMPLIFICADA: ELEV_MESA_ROT**"),
    subtitle = md("Variable: **elev_mesa_rot**")
  ) %>%
  tab_source_note(source_note = "Fuente: Datos ANP 2018") %>%
  
  grand_summary_rows(
    columns = c(ni, hi),
    fns = list("TOTAL" = ~sum(., na.rm = TRUE))
  ) %>%
  
  fmt_number(
    columns = c(ni, Ni_asc, Ni_desc),
    decimals = 0,
    use_seps = TRUE
  ) %>%
  
  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") %>% 
  cols_align(align = "center", columns = everything()) %>%
  
  tab_style(
    style = cell_text(align = "center"),
    locations = cells_stub()
  ) %>%
  
  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 SIMPLIFICADA: ELEV_MESA_ROT
Variable: elev_mesa_rot
Lím. Inf Lím. Sup Marca Clase (Xi) ni hi (%) Ni (Asc) Ni (Desc) Hi (Asc) Hi (Desc)
0 100 50 24,204 83.93 24,204 28,838 83.93 100.00
100 200 150 3,944 13.68 28,148 4,634 97.61 16.07
200 300 250 425 1.47 28,573 690 99.08 2.39
300 400 350 98 0.34 28,671 265 99.42 0.92
400 500 450 32 0.11 28,703 167 99.53 0.58
500 600 550 33 0.11 28,736 135 99.65 0.47
600 700 650 30 0.10 28,766 102 99.75 0.35
700 800 750 24 0.08 28,790 72 99.83 0.25
800 900 850 31 0.11 28,821 48 99.94 0.17
900 1000 950 17 0.06 28,838 17 100.00 0.06
TOTAL 28838 100
Fuente: Datos ANP 2018

6 Gráficas De Distribución De Frecuencias

col_gris_azulado <- "#5D6D7E"
col_ejes <- "#2E4053"
max_var <- max(Variable)
breaks_50 <- seq(0, max_var + 50, by = 100)
limite_x <- c(0, max(max_var, 100))

6.1 GRÁFICO 1: Histograma Absoluto

par(mar = c(8, 5, 4, 2))  
hist(Variable, 
     breaks = breaks_50,
     main = "Gráfica No.1: Distribución de Mesa Rotatoria (elev_mesa_rot)",
     xlab = "Mesa Rotatoria - elev_mesa_rot (m)", 
     ylab = "Frecuencia Absoluta",
     col = col_gris_azulado, 
     border = "white", 
     axes = FALSE,
     ylim = c(0, max(table(cut(Variable, breaks = breaks_50, include.lowest = TRUE, right = FALSE))) * 1.1),
     xlim = limite_x)  

axis(1, at = seq(0, limite_x[2], by = 100), 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))
hist(Variable, 
     breaks = breaks_50,
     main = "Gráfica N°2: Distribución de Mesa Rotatoria (elev_mesa_rot)l",
     xlab = "Mesa Rotatoria - elev_mesa_rot (m)", 
     ylab = "Total Pozos",
     col = col_gris_azulado, 
     border = "white", 
     axes = FALSE,  
     ylim = c(0, length(Variable)),
     xlim = limite_x)  

axis(1, at = seq(0, limite_x[2], by = 100), 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_base_g3 <- hist(Variable, breaks = breaks_50, plot = FALSE)
h_base_g3$counts <- (h_base_g3$counts / length(Variable)) * 100

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

axis(1, at = seq(0, limite_x[2], by = 100), las = 2, cex.axis = 0.7)
axis(2)

text(x = h_base_g3$mids[h_base_g3$mids <= limite_x[2]], 
     y = h_base_g3$counts[h_base_g3$mids <= limite_x[2]], 
     label = paste0(round(h_base_g3$counts[h_base_g3$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))

# 1. Creamos el histograma base para porcentajes
h_base_g4 <- hist(Variable, breaks = breaks_50, plot = FALSE)
h_base_g4$counts <- (h_base_g4$counts / length(Variable)) * 100

# 2. Dibujamos directamente con hist
plot(h_base_g4,
     main = "Gráfica No.4: Distribución Porcentual de Mesa Rotatoria (elev_mesa_rot)",
     xlab = "Mesa Rotatoria - elev_mesa_rot (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 = 100), las = 2, cex.axis = 0.7)
axis(2)

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

6.5 GRÁFICO 5: Boxplot

col_gris_azulado <- "#5D6D7E"
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 (elev_mesa_rot)",
        xlab = "Mesa Rotatoria - elev_mesa_rot (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 = 100), 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 (elev_mesa_rot)",
     xlab = "Mesa Rotatoria - elev_mesa_rot (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 = 100), 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 = "elev_mesa_rot",
  Rango = paste0("[", round(min(Variable), 2), "; ", round(max(Variable), 2), "]"),
  X = media_val,
  Me = mediana_val,
  Mo = paste(round(TDF_Mesa$MC[TDF_Mesa$hi == max(TDF_Mesa$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: elev_mesa_rot") %>%
  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(110),
    Mo ~ px(100),
    Atipicos ~ px(140),
    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: elev_mesa_rot
Variable Rango X Me Mo Varianza sd CV As K Valores atípicos
elev_mesa_rot [0; 994] 56.16 32.00 50 4,829.68 69.50 123.76 5.4490 49.24 1269 [164.79; 994]

8 Conclusiones

Los valores de elev_mesa_rot fluctúan entre 0 y 994 y giran en torno a 32.00, con una desviación estándar de 69.50, con 1269 valores atípicos en el rango de 164.79 a 994, siendo un conjunto de datos heterogéneo, cuyos valores se agrupan fuertemente en la parte baja de elev_mesa_rot. Por lo anterior, el comportamiento es perjudicial, ya que más del 84% de los pozos se concentran en elevaciones mínimas de la mesa rotatoria, limitando la diversificación operacional en distintas alturas de terreno y reduciendo el rango de cobertura en la perforación.