##### UNIVERSIDAD CENTRAL DEL ECUADOR #####
#### AUTOR: Leonardo Ruiz ####
### CARRERA: INGENIERÍA EN PETROLEOS #####

#### VARIABLE RESERVORIO  ####
## DATOS ###
# 1. CARGAR DATOS
library(readxl)
datos <- read_excel("C:/Users/LEO/Documents/Producción Campo Sacha.csv.xlsx")
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 ...
##  $ 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 ...
# 2. EXTRAER bpd
if(!"bpd" %in% colnames(datos)) {
  col_bpd <- grep("bpd", colnames(datos), ignore.case = TRUE, value = TRUE)[1]
  datos$Bpd <- datos[[col_bpd]]
}

# Extraer variable
Bpd <- datos$Bpd

# Convertir a numérico y eliminar NAs
Bpd <- as.numeric(Bpd)
ValorNulo <- is.na(Bpd)
  Bpd <- na.omit(Bpd)

# 3. CALCULAR INTERVALOS (STURGES - Exacto como tu ejemplo)
n <- length(Bpd)                     # Número de datos
k <- 1 + (3.3 * log10(n))              # Fórmula de Sturges
k <- floor(k)                          # Redondear hacia abajo
min_val <- min(Bpd)                 # Mínimo
max_val <- max(Bpd)                 # Máximo
R <- max_val - min_val                 # Rango
A <- R / k                             # Amplitud

# Redondear valores para mejor presentación
A <- round(A, 2)
min_val <- round(min_val, 2)
max_val <- round(max_val, 2)

# 4. CREAR LÍMITES DE INTERVALOS
Li <- round(seq(from = min_val, to = max_val - A, by = A), 4)  # Límites inferiores
Ls <- round(seq(from = min_val + A, to = max_val, by = A), 4)  # Límites superiores
MC <- round((Li + Ls) / 2, 2)                         # Marcas de clase

# 5. CALCULAR FRECUENCIAS ABSOLUTAS (ni)
ni <- numeric(length(Li))

for (i in 1:length(Li)) {
  if (i < length(Li)) {
    ni[i] <- sum(Bpd >= Li[i] & Bpd < Ls[i])
  } else {
    ni[i] <- sum(Bpd >= Li[i] & Bpd <= max_val)
  }
}

# 6. CALCULAR TODAS LAS FRECUENCIAS
hi <- ni / sum(ni) * 100                # Frecuencia relativa porcentual
Niasc <- cumsum(ni)                    # Frecuencia acumulada ascendente
Nidsc <- rev(cumsum(rev(ni)))          # Frecuencia acumulada descendente
Hiasc <- cumsum(hi)                    # Frecuencia relativa acumulada ascendente
Hidsc <- rev(cumsum(rev(hi)))          # Frecuencia relativa acumulada descendente

TDF_Bpd_es <- data.frame(
  Li = Li,
  Ls = Ls,
  MC = MC,
  "ni (FA)" = ni,
  "hi (FR)" = round(hi, 4),
  "Ni (FAAa)" = Niasc,
  "Hi (FRAa)" = round(Hiasc, 4),
  "Ni (FAAd)" = Nidsc,
  "Hi (FRAd)" = round(Hidsc, 4)
)

# 7. MOSTRAR TABLA DE DISTRIBUCIÓN
cat("\n" , rep("=", 80), "\n", sep = "")
## 
## ================================================================================
cat("TABLA 1: DISTRIBUCIÓN DE FRECUENCIAS - Bpd \n")
## TABLA 1: DISTRIBUCIÓN DE FRECUENCIAS - Bpd
cat(rep("=", 80), "\n\n", sep = "")
## ================================================================================
print(TDF_Bpd_es)
##         Li      Ls      MC ni..FA. hi..FR. Ni..FAAa. Hi..FRAa. Ni..FAAd.
## 1     2.00  160.15   81.08    2730 35.4315      2730   35.4315      7705
## 2   160.15  318.30  239.23    2659 34.5101      5389   69.9416      4975
## 3   318.30  476.45  397.38    1139 14.7826      6528   84.7242      2316
## 4   476.45  634.60  555.52     530  6.8787      7058   91.6029      1177
## 5   634.60  792.75  713.68     330  4.2829      7388   95.8858       647
## 6   792.75  950.90  871.82     103  1.3368      7491   97.2226       317
## 7   950.90 1109.05 1029.97      53  0.6879      7544   97.9104       214
## 8  1109.05 1267.20 1188.12      62  0.8047      7606   98.7151       161
## 9  1267.20 1425.35 1346.28      43  0.5581      7649   99.2732        99
## 10 1425.35 1583.50 1504.42      18  0.2336      7667   99.5068        56
## 11 1583.50 1741.65 1662.58      13  0.1687      7680   99.6755        38
## 12 1741.65 1899.80 1820.72      11  0.1428      7691   99.8183        25
## 13 1899.80 2057.95 1978.88      14  0.1817      7705  100.0000        14
##    Hi..FRAd.
## 1   100.0000
## 2    64.5685
## 3    30.0584
## 4    15.2758
## 5     8.3971
## 6     4.1142
## 7     2.7774
## 8     2.0896
## 9     1.2849
## 10    0.7268
## 11    0.4932
## 12    0.3245
## 13    0.1817
# =============================================================================
# GRÁFICAS CORTAS: LOCAL vs GLOBAL
# =============================================================================

cat("\n" , rep("=", 60), "\n", sep = "")
## 
## ============================================================
cat("GRÁFICAS: LOCAL vs GLOBAL\n")
## GRÁFICAS: LOCAL vs GLOBAL
cat(rep("=", 60), "\n")
## = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
# 1. PREPARAR
if("Pozo" %in% colnames(datos)) {
  pozos <- unique(datos$Pozo)
  local_pozos <- pozos[1:min(9, length(pozos))]
  
  Bpd_Local <- na.omit(as.numeric(datos$Bpd[datos$Pozo %in% local_pozos]))
  Bpd_global <- Bpd
  
  cat("LOCAL:", length(local_pozos), "pozos,", length(Bpd_Local), "datos\n")
  cat("GLOBAL:", length(Bpd), "datos\n\n")
  
  # 2. CREAR 2 GRÁFICAS
  par(mfrow = c(1, 2))
  
  # Gráfica LOCAL
  hist(Bpd_Local, breaks = 10, col = rgb(0.2,0.4,0.8,0.6), border = "white",
       main = paste("LOCAL\n", length(local_pozos), " pozos", sep = ""),
       xlab = "Bpd", ylab = "Frecuencia", las = 1)
  
  # Gráfica GLOBAL  
  hist(Bpd_global, breaks = k, col = rgb(0.8,0.4,0.2,0.6), border = "white",
       main = "GLOBAL\nTodos los pozos", 
       xlab = "Bpd", ylab = "Frecuencia", las = 1)
  
  par(mfrow = c(1, 1))
  
} else {
  cat("Solo GLOBAL (no hay columna Pozo)\n\n")
  hist(Bpd, breaks = k, col = "lightblue", border = "white",
       main = "Bpd (GLOBAL)", xlab = "Bpd", ylab = "Frecuencia", las = 1)
}
## LOCAL: 9 pozos, 300 datos
## GLOBAL: 7705 datos

# =============================================================================
# GRÁFICA OJIVA ASCENDENTE 
# =============================================================================

cat("\n" , rep("=", 60), "\n", sep = "")
## 
## ============================================================
cat("OJIVA ASCENDENTE - Bpd (GLOBAL)\n")
## OJIVA ASCENDENTE - Bpd (GLOBAL)
cat(rep("=", 60), "\n\n", sep = "")
## ============================================================
# Crear puntos para la ojiva
puntos_x <- c(Ls)    # Los límites superiores
puntos_y <- cumsum(ni)  # Frecuencia acumulada

# 1. Configurar márgenes para espacio a la derecha
par(mar = c(5, 4, 4, 8))  # Más espacio a la derecha (8)

# 2. Crear ojiva
plot(puntos_x, puntos_y,
     type = "b",
     pch = 16,
     col = "darkblue",
     lwd = 2,
     main = "OJIVA ASCENDENTE\ Bpd - GLOBAL",
     xlab = "Límite Superior del Intervalo (Bpd)",
     ylab = "Frecuencia Acumulada (Ni)",
     las = 1,
     xlim = c(min_val, max_val),
     ylim = c(0, n * 1.05))

# 3. Grid
grid(col = "gray80", lty = "dotted")

# 4. Eje derecho con porcentajes
porcentajes <- c(0, 25, 50, 75, 100)
axis(4, 
     at = porcentajes/100 * n,
     labels = paste0(porcentajes, "%"),
     las = 1,
     col.axis = "darkred",
     cex.axis = 0.9)

mtext("Porcentaje Acumulado", side = 4, line = 3, col = "darkred", cex = 0.9)

# 5. Puntos importantes (50% y 75%)
# 50%
indice_50 <- which.max(Hiasc >= 50)
if(length(indice_50) > 0) {
  x50 <- puntos_x[indice_50 + 1]
  y50 <- puntos_y[indice_50 + 1]
  points(x50, y50, col = "red", pch = 17, cex = 1.3)  # Triángulo
  segments(x50, 0, x50, y50, col = "red", lty = 2, lwd = 1)
  segments(min_val, y50, x50, y50, col = "red", lty = 2, lwd = 1)
}

# 75%
indice_75 <- which.max(Hiasc >= 75)
if(length(indice_75) > 0) {
  x75 <- puntos_x[indice_75 + 1]
  y75 <- puntos_y[indice_75 + 1]
  points(x75, y75, col = "darkgreen", pch = 15, cex = 1.3)  # Cuadrado
  segments(x75, 0, x75, y75, col = "darkgreen", lty = 2, lwd = 1)
  segments(min_val, y75, x75, y75, col = "darkgreen", lty = 2, lwd = 1)
}

# =============================================================================
# DIAGRAMA DE CAJA 
# =============================================================================

cat("\n" , rep("=", 60), "\n", sep = "")
## 
## ============================================================
cat("4.2 Diagrama de caja\n")
## 4.2 Diagrama de caja
cat(rep("=", 60), "\n\n", sep = "")
## ============================================================
# Exactamente como el ejemplo
boxplot(Bpd, 
        horizontal = TRUE, 
        col = "blue", 
        main = "Gráfica: Distribución de Bpd (Bppd_BE)",
        xlab = "Bpd")

cat("ESTADÍSTICAS:\n")
## ESTADÍSTICAS:
s <- boxplot.stats(Bpd)$stats
cat("• Mín:", round(s[1], 2), "Bpd\n")
## • Mín: 2 Bpd
cat("• Q1: ", round(s[2], 2), "Bpd\n")
## • Q1:  132 Bpd
cat("• Med:", round(s[3], 2), "Bpd\n")
## • Med: 218 Bpd
cat("• Q3: ", round(s[4], 2), "Bpd\n")
## • Q3:  363 Bpd
cat("• Máx:", round(s[5], 2), "Bpd\n")
## • Máx: 709 Bpd
# =============================================================================
# 5. INDICADORES ESTADÍSTICOS - Bpd
# =============================================================================

cat("\n" , rep("=", 70), "\n", sep = "")
## 
## ======================================================================
cat("5. INDICADORES ESTADÍSTICOS\n")
## 5. INDICADORES ESTADÍSTICOS
cat(rep("=", 70), "\n\n", sep = "")
## ======================================================================
# Cargar librería para asimetría y curtosis
if(!require(e1071)) {
  install.packages("e1071")
  library(e1071)
}
## Cargando paquete requerido: e1071
# =============================================================================
# 5.1 MEDIDAS DE POSICIÓN
# =============================================================================

cat("5.1 MEDIDAS DE POSICIÓN:\n")
## 5.1 MEDIDAS DE POSICIÓN:
cat("------------------------\n")
## ------------------------
# Media aritmética
x <- mean(Bpd)
cat("Media aritmética (x̄):", round(x, 4), "Bpd\n")
## Media aritmética (x̄): 291.0955 Bpd
# Mediana (de los datos originales)
Me <- median(Bpd)
cat("Mediana (Me):         ", round(Me, 4), "Bpd\n")
## Mediana (Me):          218 Bpd
# Mediana de las marcas de clase (opcional)
Me_MC <- median(MC)
cat("Mediana de MC:        ", round(Me_MC, 4), "Bpd\n")
## Mediana de MC:         1029.97 Bpd
# Mínimo y máximo
ri <- min(Bpd)
rs <- max(Bpd)
cat("Mínimo (ri):          ", round(ri, 4), "Bpd\n")
## Mínimo (ri):           2 Bpd
cat("Máximo (rs):          ", round(rs, 4), "Bpd\n")
## Máximo (rs):           2058 Bpd
# Moda (aproximada)
calcular_moda <- function(x) {
  freq <- table(round(x, 1))  # Redondear a 1 decimal
  moda_val <- as.numeric(names(freq)[which.max(freq)])
  return(moda_val)
}
Mo <- calcular_moda(Bpd)
cat("Moda aproximada (Mo):  ", round(Mo, 4), "Bpd\n")
## Moda aproximada (Mo):   140 Bpd
# Cuartiles
Q1 <- quantile(Bpd, 0.25)
Q2 <- quantile(Bpd, 0.50)  # Igual que mediana
Q3 <- quantile(Bpd, 0.75)
cat("\nCuartiles:\n")
## 
## Cuartiles:
cat("  Q1 (25%):           ", round(Q1, 4), "Bpd\n")
##   Q1 (25%):            132 Bpd
cat("  Q2 (50% - Mediana): ", round(Q2, 4), "Bpd\n")
##   Q2 (50% - Mediana):  218 Bpd
cat("  Q3 (75%):           ", round(Q3, 4), "Bpd\n")
##   Q3 (75%):            363 Bpd
# Percentiles
percentiles <- quantile(Bpd, probs = c(0.10, 0.25, 0.50, 0.75, 0.90, 0.95, 0.99))
cat("\nPercentiles seleccionados:\n")
## 
## Percentiles seleccionados:
for(i in 1:length(percentiles)) {
  cat("  P", names(percentiles)[i], ": ", 
      round(percentiles[i], 4), "Bpd\n", sep = "")
}
##   P10%: 83Bpd
##   P25%: 132Bpd
##   P50%: 218Bpd
##   P75%: 363Bpd
##   P90%: 599Bpd
##   P95%: 738.8Bpd
##   P99%: 1342.96Bpd
# =============================================================================
# 5.2 MEDIDAS DE DISPERSIÓN
# =============================================================================

cat("\n\n5.2 MEDIDAS DE DISPERSIÓN:\n")
## 
## 
## 5.2 MEDIDAS DE DISPERSIÓN:
cat("---------------------------\n")
## ---------------------------
# Rango
R <- rs - ri
cat("Rango (R):            ", round(R, 4), "Bpd\n")
## Rango (R):             2056 Bpd
# Rango intercuartílico
RIQ <- Q3 - Q1
cat("Rango intercuartílico:", round(RIQ, 4), "Bpd\n")
## Rango intercuartílico: 231 Bpd
# Varianza
varianza <- var(Bpd)
cat("Varianza (s²):        ", round(varianza, 4), "\n")
## Varianza (s²):         65780.69
# Desviación estándar
s <- sd(Bpd)
cat("Desviación estándar (s):", round(s, 4), "Bpd\n")
## Desviación estándar (s): 256.4775 Bpd
# Coeficiente de variación
CV <- (s / x) * 100
cat("Coeficiente de variación (CV):", round(CV, 2), "%\n")
## Coeficiente de variación (CV): 88.11 %
# Error estándar de la media
EE <- s / sqrt(n)
cat("Error estándar de la media:   ", round(EE, 4), "Bpd\n")
## Error estándar de la media:    2.9219 Bpd
# =============================================================================
# 5.3 MEDIDAS DE FORMA
# =============================================================================

cat("\n\n5.3 MEDIDAS DE FORMA:\n")
## 
## 
## 5.3 MEDIDAS DE FORMA:
cat("---------------------\n")
## ---------------------
# Coeficiente de asimetría (skewness)
As <- skewness(Bpd)
cat("Coeficiente de asimetría (As):", round(As, 4), "\n")
## Coeficiente de asimetría (As): 2.5049
# Interpretación de asimetría
if(abs(As) < 0.5) {
  cat("  Interpretación: Distribución aproximadamente simétrica\n")
} else if(As > 0) {
  cat("  Interpretación: Asimetría positiva (cola a la derecha)\n")
} else {
  cat("  Interpretación: Asimetría negativa (cola a la izquierda)\n")
}
##   Interpretación: Asimetría positiva (cola a la derecha)
# Coeficiente de curtosis (kurtosis)
k <- kurtosis(Bpd)
cat("\nCoeficiente de curtosis (k):  ", round(k, 4), "\n")
## 
## Coeficiente de curtosis (k):   9.0535
# Curtosis exceso (comparada con normal = 3)
k_exceso <- k - 3
cat("Curtosis exceso (k-3):       ", round(k_exceso, 4), "\n")
## Curtosis exceso (k-3):        6.0535
# Interpretación de curtosis
if(abs(k_exceso) < 0.5) {
  cat("  Interpretación: Mesocúrtica (similar a normal)\n")
} else if(k_exceso > 0) {
  cat("  Interpretación: Leptocúrtica (más picuda que normal)\n")
} else {
  cat("  Interpretación: Platicúrtica (más aplanada que normal)\n")
}
##   Interpretación: Leptocúrtica (más picuda que normal)
# =============================================================================
# 5.4 RESUMEN EN TABLA
# =============================================================================

cat("\n\n" , rep("-", 70), "\n", sep = "")
## 
## 
## ----------------------------------------------------------------------
cat("RESUMEN DE INDICADORES ESTADÍSTICOS\n")
## RESUMEN DE INDICADORES ESTADÍSTICOS
cat(rep("-", 70), "\n\n", sep = "")
## ----------------------------------------------------------------------
# Crear tabla resumen
resumen_estadisticas <- data.frame(
  "Categoría" = c(
    rep("POSICIÓN", 8),
    rep("DISPERSIÓN", 6),
    rep("FORMA", 3)
  ),
  "Indicador" = c(
    "n (tamaño muestra)",
    "Media aritmética",
    "Mediana",
    "Moda aproximada",
    "Mínimo",
    "Máximo",
    "Q1 (25%)",
    "Q3 (75%)",
    "Rango",
    "Rango intercuartílico",
    "Varianza",
    "Desviación estándar",
    "Coeficiente variación",
    "Error estándar",
    "Asimetría",
    "Curtosis",
    "Curtosis exceso"
  ),
  "Valor" = c(
    n,
    round(x, 4),
    round(Me, 4),
    round(Mo, 4),
    round(ri, 4),
    round(rs, 4),
    round(Q1, 4),
    round(Q3, 4),
    round(R, 4),
    round(RIQ, 4),
    round(varianza, 4),
    round(s, 4),
    paste0(round(CV, 2), "%"),
    round(EE, 4),
    round(As, 4),
    round(k, 4),
    round(k_exceso, 4)
  ),
  "Unidad" = c(
    "observaciones",
    "Bpd",
    "Bpd",
    "Bpd",
    "Bpd",
    "Bpd",
    "Bpd",
    "Bpd",
    "Bpd",
    "Bpd",
    "(Bpd)²",
    "Bpd",
    "%",
    "Bpd",
    "adimensional",
    "adimensional",
    "adimensional"
  )
)

print(resumen_estadisticas)
##     Categoría             Indicador      Valor        Unidad
## 1    POSICIÓN    n (tamaño muestra)       7705 observaciones
## 2    POSICIÓN      Media aritmética   291.0955           Bpd
## 3    POSICIÓN               Mediana        218           Bpd
## 4    POSICIÓN       Moda aproximada        140           Bpd
## 5    POSICIÓN                Mínimo          2           Bpd
## 6    POSICIÓN                Máximo       2058           Bpd
## 7    POSICIÓN              Q1 (25%)        132           Bpd
## 8    POSICIÓN              Q3 (75%)        363           Bpd
## 9  DISPERSIÓN                 Rango       2056           Bpd
## 10 DISPERSIÓN Rango intercuartílico        231           Bpd
## 11 DISPERSIÓN              Varianza 65780.6922        (Bpd)²
## 12 DISPERSIÓN   Desviación estándar   256.4775           Bpd
## 13 DISPERSIÓN Coeficiente variación     88.11%             %
## 14 DISPERSIÓN        Error estándar     2.9219           Bpd
## 15      FORMA             Asimetría     2.5049  adimensional
## 16      FORMA              Curtosis     9.0535  adimensional
## 17      FORMA       Curtosis exceso     6.0535  adimensional
# =============================================================================
# 6. TABLA RESUMEN FINAL
# =============================================================================

cat("\n" , rep("=", 70), "\n", sep = "")
## 
## ======================================================================
cat("6. TABLA RESUMEN\n")
## 6. TABLA RESUMEN
cat(rep("=", 70), "\n\n", sep = "")
## ======================================================================
# Ya tienes resumen_estadisticas, solo decir que es la tabla resumen
cat("La tabla anterior (Resumen de Indicadores Estadísticos) es la tabla resumen.\n")
## La tabla anterior (Resumen de Indicadores Estadísticos) es la tabla resumen.
cat("Contiene todas las medidas calculadas organizadas por categoría.\n")
## Contiene todas las medidas calculadas organizadas por categoría.
# =============================================================================
# 7. CONCLUSIÓN
# =============================================================================

cat("\n" , rep("=", 70), "\n", sep = "")
## 
## ======================================================================
cat("7. CONCLUSIÓN\n")
## 7. CONCLUSIÓN
cat(rep("=", 70), "\n\n", sep = "")
## ======================================================================
cat("ANÁLISIS DE Bpd EN EL CAMPO SACHA:\n\n")
## ANÁLISIS DE Bpd EN EL CAMPO SACHA:
cat("1. El análisis de", n, "observaciones de Bpd muestra:\n")
## 1. El análisis de 7705 observaciones de Bpd muestra:
cat("   • Promedio:", round(x, 1), "Bpd ")
##    • Promedio: 291.1 Bpd
# CORRECCIÓN: Todo en una línea o con llaves
if(x < 10) {
  cat("Producción Muy Baja")
} else if(x < 22) {
  cat("Producción Baja/Media")
} else if(x < 31) {
  cat("Producción Media/Alta")
} else {
  cat("Producción Excepcional")
}
## Producción Excepcional
cat(")\n")
## )
cat("   • Variabilidad:", round(CV, 1), "% (")
##    • Variabilidad: 88.1 % (
# Misma corrección aquí
if(CV > 30) {
  cat("Variabilidad Alta")
} else if(CV > 15) {
  cat("Variabilidad Moderada")
} else {
  cat("Variabilidad Baja")
}
## Variabilidad Alta
cat(")\n")
## )
cat("   • Distribución: ")
##    • Distribución:
# Y aquí
if(abs(As) < 0.5) {
  cat("Cercana a simétrica")
} else if(As > 0) {
  cat("sesgada a la derecha (valores altos)")
} else {
  cat("sesgada a la izquierda (valores bajos)")
}
## sesgada a la derecha (valores altos)
cat("\n\n")
cat("2. El análisis estadístico completo proporciona una caracterización\n")
## 2. El análisis estadístico completo proporciona una caracterización
cat("   detallada de la calidad del petróleo en el campo Sacha.\n")
##    detallada de la calidad del petróleo en el campo Sacha.
cat("\n✓ Análisis estadístico completado exitosamente\n")
## 
## ✓ Análisis estadístico completado exitosamente