1 Carga de datos

library(readxl)
Produccio_n_Campo_Sacha_csv <- read_excel("Producción Campo Sacha.csv.xlsx")
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 ...
##  $ Gas_BE                : 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 ...

1.1 Extraer la variable continua

voltaje <- Produccio_n_Campo_Sacha_csv$Voltaje 
voltaje <- as.numeric(voltaje)
voltaje <- na.omit(voltaje)

2 Tabla de distribución de frecuencias

2.1 Sturges

2.1.1 Creación de la tabla de distribución de frecuencia

k <- 1 + (3.3 * log10(length(voltaje)))  
k <- floor(k)

min <- min(voltaje)  
max <- max(voltaje)  
R <- max - min
A <- R / k

# Líneas EXACTAS del ejemplo del enlace:
Li <- round(seq(from = min, to = max - A, by = A), 4)
Ls <- round(seq(from = min + A, to = max, by = A), 4)

MC <- round((Li + Ls) / 2, 2)

ni <- numeric(length(Li))
for (i in 1:length(Li)) {
  ni[i] <- sum(voltaje >= Li[i] & voltaje < Ls[i])  
}
ni[length(Li)] <- sum(voltaje >= Li[length(Li)] & voltaje <= max)  

cat("Suma de ni =", sum(ni), "\n")
## Suma de ni = 7704
hi <- ni / sum(ni) * 100
cat("Suma de hi =", sum(hi), "\n")
## Suma de hi = 100
Niasc <- cumsum(ni)
Nidsc <- rev(cumsum(rev(ni)))
Hiasc <- round(cumsum(hi))
Hidsc <- round(rev(cumsum(rev(hi))))

TDFVoltaje <- data.frame(Li, Ls, MC, ni, hi, Niasc, Nidsc, Hiasc, Hidsc)  # ← CAMBIADO

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
tabla1_sturges <- TDFVoltaje %>%  
  gt() %>%
  tab_header(
    title = md("*Tabla 1: Distribución de Frecuencias*"),
    subtitle = md("**Método Sturges - Variable: Voltaje**")  
    
  ) %>%
  tab_source_note(
    source_note = md("Campo Sacha")
  ) %>%
  cols_label(
    Li = "L. Inferior",
    Ls = "L. Superior",
    MC = "Marca Clase",
    ni = "Frec. Abs.",
    hi = "Frec. Rel. %",
    Niasc = "Ni Asc.",
    Nidsc = "Ni Desc.",
    Hiasc = "Hi Asc. %",
    Hidsc = "Hi Desc. %"
  ) %>%
  fmt_number(
    columns = c(Li, Ls, MC),
    decimals = 2
  ) %>%
  fmt_number(
    columns = c(hi),
    decimals = 2,
    pattern = "{x}%"
  )

cat("\n=== TABLA 1: MÉTODO STURGES ===\n")
## 
## === TABLA 1: MÉTODO STURGES ===
tabla1_sturges
Tabla 1: Distribución de Frecuencias
Método Sturges - Variable: Voltaje
L. Inferior L. Superior Marca Clase Frec. Abs. Frec. Rel. % Ni Asc. Ni Desc. Hi Asc. % Hi Desc. %
0.00 65.15 32.58 16 0.21% 16 7704 0 100
65.15 130.31 97.73 0 0.00% 16 7688 0 100
130.31 195.46 162.88 0 0.00% 16 7688 0 100
195.46 260.62 228.04 0 0.00% 16 7688 0 100
260.62 325.77 293.19 108 1.40% 124 7688 2 100
325.77 390.92 358.35 1174 15.24% 1298 7580 17 98
390.92 456.08 423.50 4874 63.27% 6172 6406 80 83
456.08 521.23 488.65 1523 19.77% 7695 1532 100 20
521.23 586.38 553.81 8 0.10% 7703 9 100 0
586.38 651.54 618.96 0 0.00% 7703 1 100 0
651.54 716.69 684.12 0 0.00% 7703 1 100 0
716.69 781.85 749.27 0 0.00% 7703 1 100 0
781.85 847.00 814.42 1 0.01% 7704 1 100 0
Campo Sacha

2.2 Intervalos con R

2.2.1 Histograma de la variable

histo_Voltaje <- hist(voltaje, 
                      main = "Gráfica: Distribución del Voltaje\nCampo Sacha",  
                      xlab = "Voltaje",  
                      ylab = "Cantidad", 
                      col = "lightblue",
                      border = "darkblue",
                      las = 1)

#### Creación de la tabla de distribución de frecuencia

Limites <- histo_Voltaje$breaks  
LimInf <- Limites[1:(length(Limites)-1)]
LimSup <- Limites[2:length(Limites)]
Mc <- histo_Voltaje$mids  
ni_R <- histo_Voltaje$counts  

cat("\nSuma de ni (R automático) =", sum(ni_R), "\n")
## 
## Suma de ni (R automático) = 7704
hi_R <- ni_R / sum(ni_R) * 100
cat("Suma de hi (R automático) =", sum(hi_R), "\n")
## Suma de hi (R automático) = 100
Ni_asc <- cumsum(ni_R)
Ni_dsc <- rev(cumsum(rev(ni_R)))
Hi_asc <- round(cumsum(hi_R), 2) 
Hi_dsc <- round(rev(cumsum(rev(hi_R))), 2)

TDF_Voltaje_R <- data.frame(LimInf, LimSup, Mc, ni_R, hi_R,  
                            Ni_asc, Ni_dsc, Hi_asc, Hi_dsc)
tabla3_R_auto <- TDF_Voltaje_R %>%  
  gt() %>%
  tab_header(
    title = md("*Tabla 3: Distribución - Intervalos R*"),
    subtitle = md("**Método Automático de R - Variable: Voltaje**")  
  ) %>%
  tab_source_note(
    source_note = md("Intervalos generados automáticamente por hist()")
  ) %>%
  cols_label(
    LimInf = "L. Inferior",
    LimSup = "L. Superior",
    Mc = "Marca Clase",
    ni_R = "Frec. Abs.",
    hi_R = "Frec. Rel. %",
    Ni_asc = "Ni Asc.",
    Ni_dsc = "Ni Desc.",
    Hi_asc = "Hi Asc. %",
    Hi_dsc = "Hi Desc. %"
  ) %>%
  fmt_number(
    columns = c(hi_R, Hi_asc, Hi_dsc),
    decimals = 2,
    pattern = "{x}%"
  )

cat("\n=== TABLA 3: INTERVALOS AUTOMÁTICOS DE R ===\n")
## 
## === TABLA 3: INTERVALOS AUTOMÁTICOS DE R ===
tabla3_R_auto
Tabla 3: Distribución - Intervalos R
Método Automático de R - Variable: Voltaje
L. Inferior L. Superior Marca Clase Frec. Abs. Frec. Rel. % Ni Asc. Ni Desc. Hi Asc. % Hi Desc. %
0 50 25 16 0.21% 16 7704 0.21% 100.00%
50 100 75 0 0.00% 16 7688 0.21% 99.79%
100 150 125 0 0.00% 16 7688 0.21% 99.79%
150 200 175 0 0.00% 16 7688 0.21% 99.79%
200 250 225 0 0.00% 16 7688 0.21% 99.79%
250 300 275 28 0.36% 44 7688 0.57% 99.79%
300 350 325 383 4.97% 427 7660 5.54% 99.43%
350 400 375 1400 18.17% 1827 7277 23.71% 94.46%
400 450 425 3996 51.87% 5823 5877 75.58% 76.29%
450 500 475 1860 24.14% 7683 1881 99.73% 24.42%
500 550 525 20 0.26% 7703 21 99.99% 0.27%
550 600 575 0 0.00% 7703 1 99.99% 0.01%
600 650 625 0 0.00% 7703 1 99.99% 0.01%
650 700 675 0 0.00% 7703 1 99.99% 0.01%
700 750 725 0 0.00% 7703 1 99.99% 0.01%
750 800 775 0 0.00% 7703 1 99.99% 0.01%
800 850 825 1 0.01% 7704 1 100.00% 0.01%
Intervalos generados automáticamente por hist()

3 Histogramas

3.1 Histograma de frecuencia absoluta local (ni)

barplot(TDFVoltaje$ni,  # Frecuencias absolutas
        space = 0,
        main = "Gráfica: Frecuencia del Voltaje\n(Campo Sacha - Local)", 
        col = "blue", 
        xlab = "Voltaje (Marca de Clase)",  
        ylab = "Cantidad (ni)",
        names.arg = TDFVoltaje$MC,  # Marcas de clase como etiquetas
        border = "darkblue")

# Opcional: agregar líneas de separación entre barras
abline(v = seq(0.5, length(TDFVoltaje$ni)-0.5, 1), col = "gray", lty = 3)

3.2 Histograma de frecuencia absoluta global (Ni)

# Debe mostrar frecuencias ACUMULADAS, no las mismas frecuencias
barplot(TDFVoltaje$Niasc,  # ¡Usar Niasc, no ni!
        space = 0,
        main = "Gráfica: Frecuencia Absoluta GLOBAL\n(Campo Sacha)",  
        col = "steelblue", 
        xlab = "",
        ylab = "Frecuencia Acumulada (Ni)", 
        names.arg = round(TDFVoltaje$MC, 2),
        las = 2)

3.3 Histograma de porcentaje local (hi)

barplot(TDFVoltaje$hi,  # Tus frecuencias relativas (%)
        space = 0,  # Sin espacio entre barras
        col = "blue", 
        xlab = "Marca de Clase (MC)", 
        ylab = "Porcentaje (%)", 
        names.arg = TDFVoltaje$MC)  # Nombres = Marcas de clase

3.4 Histograma de porcentaje global (Hi)

### 3.4 Alternativa: Barras acumuladas SOLAS

barplot(TDFVoltaje$Hiasc,  # Hiasc en lugar de hi
        space = 0,
        main = "Gráfica: Porcentaje Acumulado\n(Campo Sacha)",  
        col = "lightblue", 
        border = "darkblue",
        xlab = "", 
        ylab = "Porcentaje Acumulado (%)",
        names.arg = round(TDFVoltaje$MC, 2),  
        ylim = c(0, 100),
        las = 2)

4 Ojivas

4.1 Ojivas combinadas (ni)

# Calcular el máximo para el eje X
x_max <- max(TDFVoltaje$Ls)

# Crear gráfico VACÍO con dimensiones correctas
plot(NA,  # Plot vacío
     xlim = c(min(TDFVoltaje$Li), x_max),
     ylim = c(0, max(TDFVoltaje$Niasc)),  # De 0 al máximo acumulado
     main = "Ojivas Combinadas: Frecuencias Absolutas\nVoltaje - Campo Sacha",
     xlab = "Voltaje",
     ylab = "Frecuencia Acumulada (Ni)",
     type = "n")  # Solo crea el marco

# Ojiva ASCENDENTE (Niasc) - Usar Ls como puntos X
lines(TDFVoltaje$Ls, TDFVoltaje$Niasc,
      type = "o",  # Puntos con líneas
      col = "blue",
      lwd = 2,
      pch = 16)

# Ojiva DESCENDENTE (Nidsc) - Usar Li como puntos X
lines(TDFVoltaje$Li, TDFVoltaje$Nidsc,
      type = "o",
      col = "red",
      lwd = 2,
      pch = 17)

# Leyenda
legend("right",
       legend = c("Ojiva Ascendente (Niasc)", "Ojiva Descendente (Nidsc)"),
       col = c("blue", "red"),
       pch = c(16, 17),
       lty = 1,
       lwd = 2,
       cex = 0.8)

# Líneas verticales en los límites de clase (opcional)
abline(v = TDFVoltaje$Li, col = "gray", lty = 3, lwd = 0.5)

4.2 Ojivas combinadas (hi) - Porcentajes

# Gráfico principal (ojiva descendente - porcentajes)
par(mar = c(5, 4, 4, 2) + 0.1)

# Crear gráfico base VACÍO
plot(NA,
     xlim = c(0, max(TDFVoltaje$Ls)),  # Eje X desde 0 hasta máximo voltaje
     ylim = c(0, 100),  # Porcentajes de 0% a 100%
     main = "Ojivas Combinadas: Porcentajes Acumulados\nVoltaje - Campo Sacha",
     xlab = "Voltaje",
     ylab = "Porcentaje Acumulado (%)",
     type = "n",
     las = 1)

# Cuadrícula cada 10%
grid(col = "lightgray", lty = 3)
abline(h = seq(0, 100, 10), col = "lightgray", lty = 3)

# OJIVA ASCENDENTE de porcentajes (Hiasc)
lines(TDFVoltaje$Ls, TDFVoltaje$Hiasc,
      type = "o",  # Línea con puntos
      col = "darkgreen",
      lwd = 2,
      pch = 16,  # Punto sólido
      cex = 1.2)

# OJIVA DESCENDENTE de porcentajes (Hidsc)
lines(TDFVoltaje$Li, TDFVoltaje$Hidsc,
      type = "o",
      col = "orange",
      lwd = 2,
      pch = 17,  # Punto triangular
      cex = 1.2)

# Línea horizontal en 50% (para posible mediana)
abline(h = 50, col = "red", lty = 2, lwd = 1.5)

# Leyenda
legend("right",
       legend = c("Ojiva Ascendente (Hiasc)", "Ojiva Descendente (Hidsc)", "50% (Mediana)"),
       col = c("darkgreen", "orange", "red"),
       pch = c(16, 17, NA),  # NA = sin punto para la línea
       lty = c(1, 1, 2),     # 2 = línea discontinua para 50%
       lwd = c(2, 2, 1.5),
       cex = 0.8,
       bg = "white")


# Puntos donde cruza el 50% (si aplica)
if(any(TDFVoltaje$Hiasc >= 50)) {
  idx_50 <- min(which(TDFVoltaje$Hiasc >= 50))
  points(x = TDFVoltaje$Ls[idx_50],
         y = TDFVoltaje$Hiasc[idx_50],
         col = "red",
         pch = 1,  # Círculo
         cex = 2.5,
         lwd = 2)
  
  # Etiqueta con el voltaje en el 50%
  text(x = TDFVoltaje$Ls[idx_50],
       y = TDFVoltaje$Hiasc[idx_50],
       labels = paste0(round(TDFVoltaje$Ls[idx_50], 1), "V\n(50%)"),
       pos = ifelse(idx_50 > length(TDFVoltaje$Hiasc)/2, 2, 4),
       col = "red",
       cex = 0.7)
}

# Etiqueta de "100%" en la esquina
text(x = max(TDFVoltaje$Ls) * 0.95,
     y = 95,
     labels = "100%",
     col = "darkgreen",
     font = 2)

5 Diagrama de caja

boxplot(voltaje,
        horizontal = TRUE,  # Horizontal (como el ejemplo)
        col = "blue", 
        main = "Gráfica: Distribución del Voltaje\n(Campo Sacha)",  
        xlab = "Voltaje", 
        notch = FALSE)

Resumen y outliers

# Identificar outliers
outliers <- boxplot.stats(voltaje)$out  
num_outliers <- length(outliers) 
min_outliers <- min(outliers)
max_outliers <- max(outliers)

cat("Número de outliers:", num_outliers, "\n")
## Número de outliers: 206
if(num_outliers > 0) {
  cat("Mínimo outlier:", min_outliers, "\n")
  cat("Máximo outlier:", max_outliers, "\n")
}
## Mínimo outlier: 0 
## Máximo outlier: 847

6 Indicadores estadísticos

6.1 Extraer la variable continua

# MEDIA 
x <- mean(voltaje)  

# MEDIANA 
Me <- median(voltaje) 

# MODA - Para variable continua: INTERVALO MODAL
# Buscar intervalo con mayor frecuencia
intervalo_modal <- which.max(TDFVoltaje$ni)
li_modal <- TDFVoltaje$Li[intervalo_modal]
ls_modal <- TDFVoltaje$Ls[intervalo_modal]
mc_modal <- TDFVoltaje$MC[intervalo_modal]
frec_modal <- TDFVoltaje$ni[intervalo_modal]
porc_modal <- round(TDFVoltaje$hi[intervalo_modal], 2)

# Mínimo y máximo (valores exactos)
ri <- min(voltaje)  
rs <- max(voltaje)  

6.2 Dispersión

# Varianza
varianza <- var(voltaje)  

# Desviación estándar
s <- sd(voltaje) 

# Coeficiente de variación
CV <- (s / x) * 100  # x debe estar calculado en 6.1

# Opcional: verificación rápida
cat("Cálculos de dispersión completos ✓\n")
## Cálculos de dispersión completos ✓
cat("Varianza:", round(varianza, 4), "\n")
## Varianza: 1823.892
cat("Desv. estándar:", round(s, 4), "\n")
## Desv. estándar: 42.707
cat("CV:", round(CV, 2), "%\n")
## CV: 10.11 %

6.3 5.3 Forma

# install.packages("e1071")
library(e1071)

# Coeficiente de asimetría
As <- skewness(voltaje)  

# Coeficiente de kurtosis  
k <- kurtosis(voltaje) 

# Opcional: verificación
cat("Asimetría:", round(As, 4), "\n")
## Asimetría: -2.2183
cat("Kurtosis:", round(k, 4), "\n")
## Kurtosis: 19.4388

7 Tabla resumen

TablaIndicadores <- data.frame(
  Variable = "Voltaje",
  minimo = round(ri, 2),
  maximo = round(rs, 2),  
  x = round(x, 2),
  Me = round(Me, 2),
  Moda = paste0("[", round(li_modal, 2), ", ", round(ls_modal, 2), "]"),
  sd = round(s, 2),
  Cv = round(CV, 2),          
  As = round(As, 2),
  K = round(k, 2),
  Outliers = num_outliers
)

# Mostrar tabla
library(gt)

tabla_resumen_gt <- TablaIndicadores %>%
  gt() %>%
  tab_header(
    title = md("*Tabla: Indicadores estadísticos*"),
    subtitle = md("**Variable: Voltaje**")  
  ) %>%
  tab_source_note(
    source_note = md("Campo Sacha")
  ) %>%
  tab_options(
    table.border.top.color = "black",
    table.border.bottom.color = "black",
    heading.border.bottom.color = "black",
    heading.border.bottom.width = px(2)
  ) %>%
  # Formatear (usar nombres SIMPLES del data.frame)
  fmt_number(
    columns = c("minimo", "maximo", "x", "Me", "sd", "Cv", "As", "K"),
    decimals = 2
  ) %>%
 
  fmt_number(
    columns = "Cv",
    pattern = "{x}%"  
  ) %>%
  # Etiquetas (aquí SÍ pueden tener formato bonito)
  cols_label(
    Variable = "Variable",
    minimo = "minimo",
    maximo = "máximo",
    x = "x",
    Me = "Me",
    Moda = "Mo",
    sd = "sd",
    Cv = "Cv (%)",     
    As = "As",
    K = "K",
    Outliers = "Outliers"
  )

# Mostrar tabla principal
tabla_resumen_gt
Tabla: Indicadores estadísticos
Variable: Voltaje
Variable minimo máximo x Me Mo sd Cv (%) As K Outliers
Voltaje 0.00 847.00 422.53 428.00 [390.92, 456.08] 42.71 10.11% −2.22 19.44 206
Campo Sacha

8 CONCLUSIÓN

# La variable "Voltaje" fluctúa entre 0.00 y 847.00 voltios y sus valores se encuentran alrededor de 428.00 (mediana) con una desviación estándar de 42.71 voltios, siendo una variable homogénea. Los valores se concentran en la parte media-alta de la variable (intervalo modal: 390.92-456.08 voltios) con distribución leptocúrtica (curtosis = 19.44), asimetría negativa (-2.22) y la presencia de 206 valores atípicos. Por todo lo anterior, el comportamiento de la variable indica un proceso mayoritariamente estable con mediciones consistentes, aunque con lecturas extremas que requieren análisis.