##### UNIVERSIDAD CENTRAL DEL ECUADOR #####
#### AUTOR: Liss Murillo ####
### CARRERA: INGENIERÍA EN PETROLEOS #####

#1. Carga de Datos
library(readxl)
Produccio_n_Campo_Sacha_csv <- read_excel("r-graficas/Producción Campo Sacha.csv.xlsx")
## New names:
## • `` -> `...16`
View(Produccio_n_Campo_Sacha_csv)
str(Produccio_n_Campo_Sacha_csv)
## tibble [8,344 × 31] (S3: tbl_df/tbl/data.frame)
##  $ mes                   : chr [1:8344] "Ene" "Ene" "Ene" "Ene" ...
##  $ día                   : num [1:8344] 1 1 1 1 1 1 1 1 1 1 ...
##  $ Pozo                  : chr [1:8344] "SACHA-001A" "SACHA-019A" "SACHA-052B" "SACHA-083A" ...
##  $ Campo                 : chr [1:8344] "SACHA" "SACHA" "SACHA" "SACHA" ...
##  $ Reservorio            : chr [1:8344] "U" "U" "U INFERIOR" "HOLLIN INFERIOR" ...
##  $ Bpd                   : num [1:8344] NA 53 249 139 186 136 NA 456 161 164 ...
##  $ Bppd_BH               : num [1:8344] 159 NA NA NA NA NA 155 NA NA NA ...
##  $ Bfpd_BE               : num [1:8344] NA 534 346 1158 1163 ...
##  $ Bfpd_BH               : num [1:8344] 695 NA NA NA NA NA 441 NA NA NA ...
##  $ Bapd_BE               : num [1:8344] NA 481 97 1019 977 ...
##  $ Bapd_BH               : num [1:8344] 536 NA NA NA NA NA 286 NA NA NA ...
##  $ Bsw_BE                : num [1:8344] NA 90.1 28 88 84 ...
##  $ Bsw_BH                : num [1:8344] 77.1 NA NA NA NA ...
##  $ Api_BE                : num [1:8344] NA 26.7 27.8 27.7 24 20.5 NA 28.5 29.9 26.3 ...
##  $ Api_BH                : num [1:8344] 27.8 NA NA NA NA NA 23.2 NA NA NA ...
##  $ ...16                 : num [1:8344] NA 10.76 50.55 1.11 27.9 ...
##  $ Gas_BH                : num [1:8344] 32.3 NA NA NA NA ...
##  $ Salinidad_BE          : num [1:8344] NA 15920 30227 1600 13000 ...
##  $ Salinidad_BH          : num [1:8344] 10800 NA NA NA NA NA 3800 NA NA NA ...
##  $ Rgl_BE                : num [1:8344] NA 20.15 146.1 0.96 23.99 ...
##  $ Rgl_BH                : num [1:8344] 46.5 NA NA NA NA ...
##  $ Gor_BE                : num [1:8344] NA 203.02 203.01 7.99 150 ...
##  $ Gor_BH                : num [1:8344] 203 NA NA NA NA ...
##  $ Horas_BE              : num [1:8344] NA 4 5 4 4 10 NA 4 10 10 ...
##  $ Horas_BH              : num [1:8344] 4 NA NA NA NA NA 4 NA NA NA ...
##  $ Bomba_BE              : chr [1:8344] NA "SF-320|SF-320|SF-900|SFGH2500/520/180/9259" "RC 1000|RC 1000|RC 1000/300/120/9250" "P23/68/30/7000" ...
##  $ Bomba_BH              : chr [1:8344] "JET  12K/0//0" NA NA NA ...
##  $ Frecuencia Operaciones: num [1:8344] NA 65 62 46 59 52 NA 58.5 57 54 ...
##  $ Voltaje               : num [1:8344] NA 479 457 364 440 452 NA 475 455 439 ...
##  $ Amperaje              : num [1:8344] NA 29 35 14 59 30 NA 23 35 34 ...
##  $ Presión Intake        : num [1:8344] NA 484 406 0 345 162 NA 546 338 0 ...
##2.Extraer la variable continua 
Bpd <- Produccio_n_Campo_Sacha_csv$Bpd
Bpd <- as.numeric(Bpd)
Bpd <- na.omit(Bpd)

##3. Cálculo de intervalos (sturges)
R <- max(Bpd) - min(Bpd)
k <- floor(1 + (3.3 * log10(length(Bpd))))
A <- R / k

liminf <- seq(from = min(Bpd), 
              by = A, 
              length.out = k)

limsup <- liminf + A
limsup[k] <- max(Bpd)

MC <- (liminf + limsup) / 2

##4.Tabla de distribución de frecuencias
##4.1 Frecuencia absoluta
ni <- numeric(k)
for (i in 1:k) {
  if (i == k) {
    ni[i] <- sum(Bpd >= liminf[i] &Bpd <= limsup[i])
  } else {
    ni[i] <- sum(Bpd >= liminf[i] & Bpd < limsup[i])
  }
}

##4.2 Frecuencias relativas y acumuladas
hi <- (ni / length(Bpd)) * 100
Niasc <- cumsum(ni)
Nidsc <- rev(cumsum(rev(ni)))
Hiasc <- cumsum(hi)
Hidsc <- rev(cumsum(rev(hi)))

##4.3 Tabla de frecuencias
tabla_Bpd<- data.frame(
  Límite_Inferior = round(liminf, 2),
  Límite_Superior = round(limsup, 2),
  Marca_Clase = round(MC, 2),
  ni = ni,
  hi_porc = round(hi, 2),
  Ni_asc = Niasc,
  Ni_dsc = Nidsc,
  Hiasc_porc = round(Hiasc, 2),
  Hidsc_porc = round(Hidsc, 2))

# TABLA 1 CON GT()
library(gt)
library(dplyr)
## 
## Adjuntando el paquete: 'dplyr'
## 
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## 
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(e1071)
tabla_Bpd %>%
  gt() %>%
  tab_header(
    title = md("**Tabla 1: Distribución de Frecuencias de Bpd"),
    subtitle = md("Campo Sacha | Método Sturges")  
  ) %>%
  tab_source_note(
    source_note = md("**Campo Sacha**")
  ) %>%  # ¡SOLO UN PARÉNTESIS AQUÍ!
  cols_label(
    Límite_Inferior = "L. Inferior",
    Límite_Superior = "L. Superior", 
    Marca_Clase = "Marca Clase",
    hi_porc = "hi %",
    Ni_asc = "Ni Asc.",
    Ni_dsc = "Ni Desc.",
    Hiasc_porc = "Hi Asc. %",
    Hidsc_porc = "Hi Desc. %"
  ) %>%
  fmt_number(
    columns = c(Límite_Inferior, Límite_Superior, Marca_Clase),
    decimals = 2
  ) %>%
  fmt_number(
    columns = c(hi_porc, Hiasc_porc, Hidsc_porc),
    decimals = 2,
    pattern = "{x}%"
  )
**Tabla 1: Distribución de Frecuencias de Bpd
Campo Sacha | Método Sturges
L. Inferior L. Superior Marca Clase ni hi % Ni Asc. Ni Desc. Hi Asc. % Hi Desc. %
2.00 160.15 81.08 2730 35.43% 2730 7705 35.43% 100.00%
160.15 318.31 239.23 2659 34.51% 5389 4975 69.94% 64.57%
318.31 476.46 397.38 1139 14.78% 6528 2316 84.72% 30.06%
476.46 634.62 555.54 530 6.88% 7058 1177 91.60% 15.28%
634.62 792.77 713.69 330 4.28% 7388 647 95.89% 8.40%
792.77 950.92 871.85 103 1.34% 7491 317 97.22% 4.11%
950.92 1,109.08 1,030.00 53 0.69% 7544 214 97.91% 2.78%
1,109.08 1,267.23 1,188.15 62 0.80% 7606 161 98.72% 2.09%
1,267.23 1,425.38 1,346.31 43 0.56% 7649 99 99.27% 1.28%
1,425.38 1,583.54 1,504.46 18 0.23% 7667 56 99.51% 0.73%
1,583.54 1,741.69 1,662.62 13 0.17% 7680 38 99.68% 0.49%
1,741.69 1,899.85 1,820.77 11 0.14% 7691 25 99.82% 0.32%
1,899.85 2,058.00 1,978.92 14 0.18% 7705 14 100.00% 0.18%
Campo Sacha
##5. Gráficos
##5.1 Histograma
hist(Bpd,
     main = "Gráfica No.1: Distribución de Bpd - Campo Sacha",
     breaks = seq(min(Bpd), max(Bpd) + A, by = A),
     xlab = "Bpd",
     ylab = "Cantidad",
     col = "lightblue",
     border = "darkblue",
     xaxt = "n")  # IMPORTANTE: Suprimir eje X automático

# Eje X personalizado con MARCAS DE CLASE
axis(1, at = MC,  # Posiciones: Marcas de Clase
     labels = round(MC, 2),  # Etiquetas: valores redondeados
     las = 1)  # Etiquetas horizontales

##5.2 Ojivas
x_asc <- c(min(liminf), limsup)
y_asc <- c(0, Niasc)
x_desc <- c(liminf, max(limsup))
y_desc <- c(Nidsc, 0)
x_range <- range(c(x_asc, x_desc))
y_range <- c(0, max(c(y_asc, y_desc)))

plot(x_asc, y_asc, type = "o", col = "skyblue",
     main = "Gráfica No.2: Ojivas Ascendente y Descendente de Bpd",
     xlab = "Bpd",
     ylab = "Frecuencia acumulada",
     xlim = x_range, ylim = y_range,
     xaxt = "n", pch = 16, lwd = 2)

axis(1, at = pretty(x_range), 
     labels = format(pretty(x_range), scientific = FALSE))
axis(2, at = pretty(y_range))

lines(x_desc, y_desc, type = "o", col = "steelblue4", pch = 17, lwd = 2)

legend("right", 
       legend = c("Ojiva Ascendente", "Ojiva Descendente"),
       col = c("skyblue", "steelblue4"), 
       pch = c(16, 17), 
       lty = 1, 
       lwd = 2,
       cex = 0.8)

##5.3 Diagramas de cajas
boxplot(Bpd, 
        horizontal = TRUE, 
        col = "steelblue",
        main = "Gráfica No.3: Distribución de Bpd - Campo Sacha",
        xlab = "Bpd",
        xaxt = "n")

axis(1, at = pretty(Bpd), 
     labels = format(pretty(Bpd), scientific = FALSE))

# Outliers

outliers <- boxplot.stats(Bpd)$out
cat("\nNúmero de outliers:", length(outliers), "\n")
## 
## Número de outliers: 453
if(length(outliers) > 0) {
  cat("Outliers:", round(outliers, 2), "\n")
}
## Outliers: 792 1219 721 739 737 719 1499 1153 738 795 746 1322 739 724 736 1498 739 739 1156 796 892 850 721 1224 755 722 1153 1322 737 1265 742 1231 890 740 1499 723 739 850 792 732 894 1494 1112 732 753 1112 1265 1231 752 739 929 1069 1265 735 1495 1233 1361 1107 792 850 737 746 1107 1640 826 892 865 785 735 1640 1104 1495 1644 1732 830 1265 1233 890 735 866 840 1025 1048 1027 786 1077 1499 1107 1737 1239 734 1236 1109 929 1133 778 1259 864 737 1494 1106 1732 1113 1109 1118 805 850 785 917 734 786 867 1107 786 929 1235 1737 1236 785 814 732 1737 1494 1112 885 823 828 885 1193 933 1242 876 790 1137 1741 890 850 713 1114 786 911 1495 1241 732 786 933 1115 1737 931 1107 1737 917 890 1136 710 888 931 1115 732 911 1495 790 1739 1114 1119 764 710 1136 732 1121 1494 933 1112 715 914 1759 850 786 1241 1107 1141 1856 732 938 1246 790 908 1136 933 1364 1146 1906 732 1107 1121 732 764 792 1242 1903 909 1114 1115 1903 885 1139 1319 1242 726 1364 770 766 1406 726 907 885 1903 1139 888 1333 1244 1051 1114 1903 726 906 885 1112 889 1338 1113 1890 725 1048 1406 1107 882 733 1506 1553 792 894 790 764 907 1338 727 769 782 1890 834 1246 1553 836 727 1046 908 1246 1112 753 891 1894 764 1242 1105 1107 790 899 747 889 851 756 1241 764 1338 1553 1338 732 729 726 784 1107 727 1553 1894 784 899 889 1344 787 835 727 1046 1107 830 1043 1026 797 795 783 836 1344 729 787 720 784 888 781 1569 1342 1347 794 1671 1348 1768 732 1026 1795 797 830 1798 836 832 838 832 899 1017 1017 899 837 1342 770 711 974 1008 1017 1266 1269 770 1777 784 748 1347 787 1013 799 725 1777 2058 1053 800 800 1347 953 1299 1345 835 899 1101 716 799 1054 727 1968 1348 1270 723 1053 1344 1340 716 785 900 1344 725 784 830 1251 716 723 1342 1013 717 828 1270 1968 1060 1091 716 727 1011 899 1344 732 717 1342 1963 1965 721 1093 1270 716 729 1056 830 717 784 1083 1345 785 897 732 922 743 1343 821.3 1270 1089 1963 1214 1341 1959 731 892 750 1053 828 1091 1344 719 826 746 821.3 784 1343 785 890 1214 750 1959 1350 873 826 748 1956 967 736 1083 1056 1056 749 1343 1342
##6. Indicadores estadísticos 
get_mode_interval <- function() {
  idx <- which.max(ni)
  return(paste0("[", round(liminf[idx], 2), ", ", round(limsup[idx], 2), "]"))
}

media <- mean(Bpd)
mediana <- median(Bpd)
moda_intervalo <- get_mode_interval()
desv <- sd(Bpd)
varianza <- var(Bpd)
cv <- (desv / media) * 100
asim <- skewness(Bpd)
curt <- kurtosis(Bpd)     

# CREAR DATA.FRAME DE INDICADORES (¡ESTA PARTE FALTABA!)
indicadores <- data.frame(
  Indicador = c("Mínimo", "Máximo", "Media", "Mediana", "Moda (intervalo)",
                "Desviación Estándar", "Varianza", "Coef. Variación (%)",
                "Asimetría", "Curtosis", "N° Outliers"),
  Valor = c(round(min(Bpd), 2), round(max(Bpd), 2),
            round(media, 2), round(mediana, 2), moda_intervalo,
            round(desv, 2), round(varianza, 2), round(cv, 2),
            round(asim, 2), round(curt, 2), length(outliers))
)

# TABLA 2 CON GT()
indicadores %>%
  gt() %>%
  tab_header(
    title = md("**Tabla 2: Indicadores Estadísticos de Bpd**")
  ) %>%
  tab_source_note(
    source_note = md("**Campo Sacha**")
  ) %>%
  cols_label(
    Indicador = "Indicador",
    Valor = "Valor"
  ) %>%
  tab_style(
    style = cell_text(weight = "bold"),
    locations = cells_body(columns = Indicador)
  )
Tabla 2: Indicadores Estadísticos de Bpd
Indicador Valor
Mínimo 2
Máximo 2058
Media 291.1
Mediana 218
Moda (intervalo) [2, 160.15]
Desviación Estándar 256.48
Varianza 65780.69
Coef. Variación (%) 88.11
Asimetría 2.5
Curtosis 9.05
N° Outliers 453
Campo Sacha
##7. Conclusión 
#La variable Bpd fluctúa entre 2 y 2 058 y sus valores están en torno a los 218 (media = 291.1), con una desviación estándar de 256.48 siendo un conjunto de valores heterogéneos (CV = 88.11 %) cuyos valores se concentran en el intervalo modal [2, 160.15] y con distribución leptocúrtica (K = 9.05) y sesgo pronunciado hacia la derecha (As = 2.5) a excepción de los 453 valores atípicos identificados, por lo tanto el comportamiento de la variable indica un proceso mayoritariamente inestable con alta dispersión en las mediciones, aunque con un rango principal de concentración que permite identificar tendencias operativas relevantes en el Campo Sacha.