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 ...
Tabla de distribución
de frecuencias
Sturges
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 |
Intervalos con R
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() |
Histogramas
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)

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)

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

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)

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

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)

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
Indicadores
estadísticos
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 %
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 |
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.