# 1. CARGAR DATOS
library(readxl)
datos <- read_excel("r-graficas/Producción Campo Sacha.csv.xlsx")
## New names:
## • `` -> `...16`
View(datos)
str(datos)
## 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 ...
# Ver todas las columnas
cat("📋 COLUMNAS DISPONIBLES:\n")
## 📋 COLUMNAS DISPONIBLES:
print(colnames(datos))
## [1] "mes" "día" "Pozo"
## [4] "Campo" "Reservorio" "Bpd"
## [7] "Bppd_BH" "Bfpd_BE" "Bfpd_BH"
## [10] "Bapd_BE" "Bapd_BH" "Bsw_BE"
## [13] "Bsw_BH" "Api_BE" "Api_BH"
## [16] "...16" "Gas_BH" "Salinidad_BE"
## [19] "Salinidad_BH" "Rgl_BE" "Rgl_BH"
## [22] "Gor_BE" "Gor_BH" "Horas_BE"
## [25] "Horas_BH" "Bomba_BE" "Bomba_BH"
## [28] "Frecuencia Operaciones" "Voltaje" "Amperaje"
## [31] "Presión Intake"
# Buscar columnas relacionadas con PRESIÓN
cat("\n🔍 BUSCANDO COLUMNAS DE PRESIÓN:\n")
##
## 🔍 BUSCANDO COLUMNAS DE PRESIÓN:
columnas_presion <- grep("presion|pressure|intake|psi|PRESION|PRESSURE",
colnames(datos),
ignore.case = TRUE,
value = TRUE)
print(columnas_presion)
## [1] "Presión Intake"
## EXTRAER PRESIÓN INTAKE
cat("\n", rep("=", 60), "\n", sep = "")
##
## ============================================================
cat("EXTRAYENDO VARIABLE: PRESIÓN INTAKE\n")
## EXTRAYENDO VARIABLE: PRESIÓN INTAKE
cat(rep("=", 60), "\n\n", sep = "")
## ============================================================
# OPCIÓN 1: Si existe "Presión Intake" exactamente
if("Presión Intake" %in% colnames(datos)) {
cat("✅ Columna encontrada: 'Presión Intake'\n")
# EXTRAER DIRECTAMENTE así:
Presion_Intake <- as.numeric(datos[["Presión Intake"]])
} else if(length(columnas_presion) > 0) {
# OPCIÓN 2: Usar la primera columna encontrada
col_name <- columnas_presion[1]
cat("✅ Usando columna:", col_name, "\n")
Presion_Intake <- as.numeric(datos[[col_name]])
} else {
cat("❌ ERROR: No se encontró columna de presión\n")
stop("Verifica el nombre de la columna")
}
## ✅ Columna encontrada: 'Presión Intake'
# =============================================================================
# LIMPIAR DATOS
# =============================================================================
cat("\n🧹 LIMPIANDO DATOS...\n")
##
## 🧹 LIMPIANDO DATOS...
# Guardar longitud original
valores_originales <- length(Presion_Intake)
cat(" • Valores originales:", valores_originales, "\n")
## • Valores originales: 8344
# 1. Quitar NAs
Presion_Intake <- Presion_Intake[!is.na(Presion_Intake)]
cat(" • Después de quitar NA:", length(Presion_Intake), "\n")
## • Después de quitar NA: 7705
# 2. Quitar valores infinitos
Presion_Intake <- Presion_Intake[is.finite(Presion_Intake)]
cat(" • Después de quitar Inf:", length(Presion_Intake), "\n")
## • Después de quitar Inf: 7705
# 3. Quitar valores imposibles (0 o negativos para presión)
Presion_Intake <- Presion_Intake[Presion_Intake > 0]
cat(" • Después de quitar ≤ 0:", length(Presion_Intake), "\n")
## • Después de quitar ≤ 0: 6826
# 4. Quitar valores muy grandes (más de 1000 psi poco común)
Presion_Intake <- Presion_Intake[Presion_Intake < 1000]
n <- length(Presion_Intake)
cat(" • Valores finales válidos:", n, "\n")
## • Valores finales válidos: 6131
cat(" • % retenido:", round(100 * n / valores_originales, 1), "%\n")
## • % retenido: 73.5 %
# =============================================================================
# MOSTRAR RESUMEN
# =============================================================================
if(n > 0) {
cat("\n📊 RESUMEN - PRESIÓN INTAKE:\n")
cat("• Muestra (n):", n, "observaciones\n")
cat("• Mínimo:", round(min(Presion_Intake), 2), "psi\n")
cat("• Máximo:", round(max(Presion_Intake), 2), "psi\n")
cat("• Media:", round(mean(Presion_Intake), 2), "psi\n")
cat("• Mediana:", round(median(Presion_Intake), 2), "psi\n")
cat("• Desviación estándar:", round(sd(Presion_Intake), 2), "psi\n")
cat("\n🔍 RANGO TÍPICO:\n")
cat("• Q1 (25%):", round(quantile(Presion_Intake, 0.25), 2), "psi\n")
cat("• Q3 (75%):", round(quantile(Presion_Intake, 0.75), 2), "psi\n")
cat("• IQR:", round(IQR(Presion_Intake), 2), "psi\n")
cat("\n✅ Presión Intake lista para análisis\n")
} else {
cat("❌ ERROR: No quedaron datos válidos después de la limpieza\n")
cat(" Revisa la columna 'Presión Intake' en tu archivo Excel\n")
}
##
## 📊 RESUMEN - PRESIÓN INTAKE:
## • Muestra (n): 6131 observaciones
## • Mínimo: 82 psi
## • Máximo: 998 psi
## • Media: 328.35 psi
## • Mediana: 285 psi
## • Desviación estándar: 170.58 psi
##
## 🔍 RANGO TÍPICO:
## • Q1 (25%): 200 psi
## • Q3 (75%): 392 psi
## • IQR: 192 psi
##
## ✅ Presión Intake lista para análisis
TABLA DE DISTRIBUCION DE FRECUENCIAS PARA PRESION INTAKE
cat("\n🎯 CREANDO TABLA DEFINITIVA (12 INTERVALOS EXACTOS)\n")
##
## 🎯 CREANDO TABLA DEFINITIVA (12 INTERVALOS EXACTOS)
# 1. Forzar 12 intervalos CON amplitud fija
k_definitivo <- 12
# 2. Usar amplitud de 80 psi para cubrir mejor
amplitud_definitiva <- 80 # 80 psi por intervalo
# 3. Calcular inicio desde múltiplo de 80
inicio_definitivo <- floor(min(Presion_Intake) / 80) * 80
# 4. Crear EXACTAMENTE 13 puntos (12 intervalos)
lim_inf_definitivo <- seq(from = inicio_definitivo,
by = amplitud_definitiva,
length.out = k_definitivo + 1)
cat("* Intervalos:", k_definitivo, "\n")
## * Intervalos: 12
cat("* Amplitud:", amplitud_definitiva, "psi\n")
## * Amplitud: 80 psi
cat("* Rango:", lim_inf_definitivo[1], "-",
lim_inf_definitivo[k_definitivo + 1], "psi\n")
## * Rango: 80 - 1040 psi
# 5. Recalcular
intervalos_definitivos <- cut(Presion_Intake,
breaks = lim_inf_definitivo,
include.lowest = TRUE,
right = FALSE)
frecuencia_definitiva <- table(intervalos_definitivos)
frecuencia_rel_definitiva <- frecuencia_definitiva / n
frecuencia_acum_definitiva <- cumsum(frecuencia_definitiva)
frecuencia_rel_acum_definitiva <- cumsum(frecuencia_rel_definitiva)
marca_clase_definitiva <- (lim_inf_definitivo[1:k_definitivo] +
lim_inf_definitivo[2:(k_definitivo+1)]) / 2
# 6. Tabla DEFINITIVA
TDF_Presion_Definitiva <- data.frame(
Li = round(lim_inf_definitivo[1:k_definitivo], 0),
Ls = round(lim_inf_definitivo[2:(k_definitivo+1)], 0),
MC = round(marca_clase_definitiva, 0),
"ni (FA)" = as.numeric(frecuencia_definitiva),
"hi (FR)" = round(as.numeric(frecuencia_rel_definitiva), 4),
"Ni (FAA)" = as.numeric(frecuencia_acum_definitiva),
"Hi (FRA)" = round(as.numeric(frecuencia_rel_acum_definitiva), 4)
)
# 7. Mostrar
cat("\n", rep("=", 70), "\n", sep = "")
##
## ======================================================================
cat("TABLA DEFINITIVA (12 INTERVALOS DE 80 psi)\n")
## TABLA DEFINITIVA (12 INTERVALOS DE 80 psi)
cat(rep("=", 70), "\n\n", sep = "")
## ======================================================================
print(TDF_Presion_Definitiva)
## Li Ls MC ni..FA. hi..FR. Ni..FAA. Hi..FRA.
## 1 80 160 120 482 0.0786 482 0.0786
## 2 160 240 200 1823 0.2973 2305 0.3760
## 3 240 320 280 1273 0.2076 3578 0.5836
## 4 320 400 360 1052 0.1716 4630 0.7552
## 5 400 480 440 509 0.0830 5139 0.8382
## 6 480 560 520 312 0.0509 5451 0.8891
## 7 560 640 600 242 0.0395 5693 0.9286
## 8 640 720 680 183 0.0298 5876 0.9584
## 9 720 800 760 104 0.0170 5980 0.9754
## 10 800 880 840 70 0.0114 6050 0.9868
## 11 880 960 920 53 0.0086 6103 0.9954
## 12 960 1040 1000 28 0.0046 6131 1.0000
# 8. Verificar
cat("\n✅ VERIFICACIÓN:\n")
##
## ✅ VERIFICACIÓN:
cat("* Intervalos:", nrow(TDF_Presion_Definitiva), "\n")
## * Intervalos: 12
cat("* Suma ni:", sum(TDF_Presion_Definitiva$ni..FA.), "\n")
## * Suma ni: 6131
cat("* Último Hi:", tail(TDF_Presion_Definitiva$Hi..FRA., 1), "\n")
## * Último Hi: 1
# 9. Actualizar TODO
frec_acum <- as.numeric(frecuencia_acum_definitiva)
marca_clase <- marca_clase_definitiva
lim_inf <- lim_inf_definitivo
k <- k_definitivo
TDF_Presion <- TDF_Presion_Definitiva
cat("\n🎯 TABLA LISTA PARA GRÁFICAS\n")
##
## 🎯 TABLA LISTA PARA GRÁFICAS
4. Gráficas de Análisis
4.1 Histograma
hist(Presion_Intake,
breaks = 12,
col = "lightblue",
main = "Histograma de Presion Intake",
xlab = "Presion (psi)",
ylab = "cantidad")

4.2. DIAGRAMA DE CAJA
boxplot(Presion_Intake,
horizontal = TRUE,
col = "lightgreen",
main = "Diagrama de Caja",
xlab = "Presion (psi)",
ylab = "")

4.3. BARRAS POR CUARTILES
categorias <- cut(Presion_Intake,
breaks = quantile(Presion_Intake, probs = seq(0, 1, 0.25)),
include.lowest = TRUE)
barplot(table(categorias),
col = "lightcoral",
main = "Distribucion por Cuartiles",
xlab = "Cuartiles",
ylab = "cantidad",
las = 2)

4.4. OJIVA
# Configurar márgenes
par(mar = c(4, 4, 3, 1))
# Crear ojiva con puntos y líneas
plot(marca_clase, frec_acum,
type = "b",
pch = 19,
col = "#2E7D32",
lwd = 2,
cex = 0.8,
main = "Ojiva de Frecuencias Acumuladas",
xlab = "Marca de Clase (psi)",
ylab = "cantidad",
las = 1,
xlim = c(min(marca_clase), max(marca_clase) * 1.05),
ylim = c(0, max(frec_acum) * 1.05))
# Cuadrícula sutil
grid(col = "gray90", lty = "dotted")
# Línea del 50%
abline(h = n/2, col = "#D32F2F", lty = 2, lwd = 1.5)
# Línea del 80%
abline(h = n * 0.8, col = "#1976D2", lty = 2, lwd = 1.5)
# Puntos en las líneas importantes
points(marca_clase[which.min(abs(frec_acum - n/2))], n/2,
col = "#D32F2F", pch = 17, cex = 1.2)
points(marca_clase[which.min(abs(frec_acum - n * 0.8))], n * 0.8,
col = "#1976D2", pch = 17, cex = 1.2)
# Etiquetas con fondo
text(max(marca_clase) * 0.7, n/2,
paste("50% (", round(n/2, 0), ")", sep = ""),
col = "#D32F2F",
cex = 0.8,
font = 2,
pos = 3)
text(max(marca_clase) * 0.7, n * 0.8,
paste("80% (", round(n * 0.8, 0), ")", sep = ""),
col = "#1976D2",
cex = 0.8,
font = 2,
pos = 3)
# Leyenda
legend("topleft",
legend = c("Frecuencia Acumulada", "50% de los datos", "80% de los datos"),
col = c("#2E7D32", "#D32F2F", "#1976D2"),
lwd = c(2, 1.5, 1.5),
lty = c(1, 2, 2),
pch = c(19, 17, 17),
cex = 0.7,
bg = "white",
box.lty = 1)

# Restaurar márgenes
par(mar = c(5, 4, 4, 2) + 0.1)
cat("✅ Ojiva profesional creada\n")
## ✅ Ojiva profesional creada
4. ESTADÍSTICOS DESCRIPTIVOS COMPLETOS
cat("\n", rep("=", 60), "\n", sep = "")
##
## ============================================================
cat("ESTADISTICOS DESCRIPTIVOS - PRESION INTAKE\n")
## ESTADISTICOS DESCRIPTIVOS - PRESION INTAKE
cat(rep("=", 60), "\n\n", sep = "")
## ============================================================
# Instalar e1071 si es necesario
if(!require(e1071)) {
install.packages("e1071", quiet = TRUE)
library(e1071)
}
## Cargando paquete requerido: e1071
# Calcular todos los estadísticos
estadisticos <- list(
"Tamaño de muestra" = n,
"Media" = mean(Presion_Intake),
"Mediana" = median(Presion_Intake),
"Moda aproximada" = as.numeric(names(sort(table(round(Presion_Intake, 0)), decreasing = TRUE)[1])),
"Desviacion estandar" = sd(Presion_Intake),
"Varianza" = var(Presion_Intake),
"Coeficiente de variacion" = (sd(Presion_Intake)/mean(Presion_Intake)) * 100,
"Minimo" = min(Presion_Intake),
"Maximo" = max(Presion_Intake),
"Rango" = max(Presion_Intake) - min(Presion_Intake),
"Primer cuartil (Q1)" = quantile(Presion_Intake, 0.25),
"Tercer cuartil (Q3)" = quantile(Presion_Intake, 0.75),
"Rango intercuartilico (IQR)" = IQR(Presion_Intake),
"Asimetria (Skewness)" = skewness(Presion_Intake),
"Curtosis (Kurtosis)" = kurtosis(Presion_Intake)
)
# Mostrar tabla de estadísticos
cat("TABLA DE ESTADISTICOS:\n")
## TABLA DE ESTADISTICOS:
cat(rep("-", 60), "\n", sep = "")
## ------------------------------------------------------------
for(i in seq_along(estadisticos)) {
nombre <- names(estadisticos)[i]
valor <- estadisticos[[i]]
if(nombre == "Coeficiente de variacion") {
cat(sprintf("%-30s: %6.1f %%\n", nombre, valor))
} else if(nombre == "Tamaño de muestra") {
cat(sprintf("%-30s: %6.0f\n", nombre, valor))
} else if(nombre %in% c("Asimetria (Skewness)", "Curtosis (Kurtosis)")) {
cat(sprintf("%-30s: %6.3f\n", nombre, valor))
} else if(nombre %in% c("Varianza")) {
cat(sprintf("%-30s: %6.1f psi²\n", nombre, valor))
} else {
cat(sprintf("%-30s: %6.1f psi\n", nombre, valor))
}
}
## Tamaño de muestra : 6131
## Media : 328.3 psi
## Mediana : 285.0 psi
## Moda aproximada : 200.0 psi
## Desviacion estandar : 170.6 psi
## Varianza : 29096.9 psi²
## Coeficiente de variacion : 52.0 %
## Minimo : 82.0 psi
## Maximo : 998.0 psi
## Rango : 916.0 psi
## Primer cuartil (Q1) : 200.0 psi
## Tercer cuartil (Q3) : 392.0 psi
## Rango intercuartilico (IQR) : 192.0 psi
## Asimetria (Skewness) : 1.409
## Curtosis (Kurtosis) : 1.867
cat(rep("-", 60), "\n\n", sep = "")
## ------------------------------------------------------------
5. CONCLUSIONES Y RECOMENDACIONES
cat("\n", rep("=", 60), "\n", sep = "")
##
## ============================================================
cat("CONCLUSIONES Y RECOMENDACIONES\n")
## CONCLUSIONES Y RECOMENDACIONES
cat(rep("=", 60), "\n\n", sep = "")
## ============================================================
promedio_p <- mean(Presion_Intake)
cv_p <- sd(Presion_Intake)/mean(Presion_Intake) * 100
asimetria_p <- skewness(Presion_Intake)
cat("1. NIVEL DE PRESION OPERATIVA:\n")
## 1. NIVEL DE PRESION OPERATIVA:
cat(" * Presion promedio:", round(promedio_p, 0), "psi\n")
## * Presion promedio: 328 psi
cat(" * Rango operativo tipico (IQR):",
round(quantile(Presion_Intake, 0.25), 0), "-",
round(quantile(Presion_Intake, 0.75), 0), "psi\n")
## * Rango operativo tipico (IQR): 200 - 392 psi
cat(" * Este rango contiene el 50% central de las mediciones\n\n")
## * Este rango contiene el 50% central de las mediciones
cat("2. ESTABILIDAD DEL SISTEMA:\n")
## 2. ESTABILIDAD DEL SISTEMA:
cat(" * Coeficiente de variacion (CV):", round(cv_p, 1), "%\n")
## * Coeficiente de variacion (CV): 52 %
if(cv_p > 25) {
cat(" * Clasificacion: ALTA VARIABILIDAD\n")
cat(" * Implicacion: Fluctuaciones significativas en la presion\n")
cat(" * Recomendacion: Investigar causas de inestabilidad\n")
} else if(cv_p > 15) {
cat(" * Clasificacion: VARIABILIDAD MODERADA\n")
cat(" * Implicacion: Fluctuaciones dentro de parametros aceptables\n")
cat(" * Accion: Monitoreo continuo recomendado\n")
} else {
cat(" * Clasificacion: BAJA VARIABILIDAD\n")
cat(" * Implicacion: Sistema de presion estable\n")
cat(" * Situacion: Condiciones operativas optimas\n")
}
## * Clasificacion: ALTA VARIABILIDAD
## * Implicacion: Fluctuaciones significativas en la presion
## * Recomendacion: Investigar causas de inestabilidad
cat("\n3. ANALISIS DE LA DISTRIBUCION:\n")
##
## 3. ANALISIS DE LA DISTRIBUCION:
cat(" * Asimetria:", round(asimetria_p, 3), "\n")
## * Asimetria: 1.409
if(asimetria_p > 0.5) {
cat(" * Tipo: Distribucion asimetrica positiva\n")
cat(" * Interpretacion: Mas valores concentrados en el rango bajo\n")
} else if(asimetria_p < -0.5) {
cat(" * Tipo: Distribucion asimetrica negativa\n")
cat(" * Interpretacion: Mas valores concentrados en el rango alto\n")
} else {
cat(" * Tipo: Distribucion aproximadamente simetrica\n")
cat(" * Interpretacion: Valores bien distribuidos alrededor de la media\n")
}
## * Tipo: Distribucion asimetrica positiva
## * Interpretacion: Mas valores concentrados en el rango bajo
cat("\n4. CONCENTRACION DE LOS DATOS:\n")
##
## 4. CONCENTRACION DE LOS DATOS:
cat(" * Intervalo modal: 160-240 psi\n")
## * Intervalo modal: 160-240 psi
cat(" * % de datos en intervalo modal: 29.7%\n")
## * % de datos en intervalo modal: 29.7%
cat(" * Nivel de concentracion: MODERADA-ALTA\n")
## * Nivel de concentracion: MODERADA-ALTA
cat("\n5. RECOMENDACIONES OPERATIVAS:\n")
##
## 5. RECOMENDACIONES OPERATIVAS:
cat(" * Mantener presion dentro del rango: 200-400 psi\n")
## * Mantener presion dentro del rango: 200-400 psi
cat(" * Monitorear valores por encima de 600 psi\n")
## * Monitorear valores por encima de 600 psi
cat(" * Revisar sistema cuando CV supere 20%\n")
## * Revisar sistema cuando CV supere 20%
cat("\n", rep("-", 60), "\n", sep = "")
##
## ------------------------------------------------------------
cat("ANALISIS COMPLETADO\n", sep = "")
## ANALISIS COMPLETADO
cat(rep("-", 60), "\n", sep = "")
## ------------------------------------------------------------