# 1. CARGAR 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 ...
# 2. EXTRAER Api_BE
if(!"Api_BE" %in% colnames(Produccio_n_Campo_Sacha_csv)) {
col_api <- grep("api", colnames(Produccio_n_Campo_Sacha_csv), ignore.case = TRUE, value = TRUE)[1]
datos$Api_BE <- Produccio_n_Campo_Sacha_csv[[col_api]]
}
# Extraer variable
Api_BE <- Produccio_n_Campo_Sacha_csv$Api_BE
# Convertir a numérico y eliminar NAs
Api_BE <- as.numeric(Api_BE)
ValorNulo <- is.na(Api_BE)
Api_BE <- na.omit(Api_BE)
# 3. CALCULAR INTERVALOS (STURGES - Exacto como tu ejemplo)
n <- length(Api_BE) # Número de datos
k <- 1 + (3.3 * log10(n)) # Fórmula de Sturges
k <- floor(k) # Redondear hacia abajo
min_val <- min(Api_BE) # Mínimo
max_val <- max(Api_BE) # 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(Api_BE >= Li[i] & Api_BE < Ls[i])
} else {
ni[i] <- sum(Api_BE >= Li[i] & Api_BE <= 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_Api_BE_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 - Api_BE (Gravedad API)\n")
## TABLA 1: DISTRIBUCIÓN DE FRECUENCIAS - Api_BE (Gravedad API)
cat(rep("=", 80), "\n\n", sep = "")
## ================================================================================
print(TDF_Api_BE_es)
## Li Ls MC ni..FA. hi..FR. Ni..FAAa. Hi..FRAa. Ni..FAAd. Hi..FRAd.
## 1 0.00 2.89 1.45 5 0.0649 5 0.0649 7705 100.0000
## 2 2.89 5.78 4.34 1 0.0130 6 0.0779 7700 99.9351
## 3 5.78 8.67 7.22 0 0.0000 6 0.0779 7699 99.9221
## 4 8.67 11.56 10.12 0 0.0000 6 0.0779 7699 99.9221
## 5 11.56 14.45 13.00 11 0.1428 17 0.2206 7699 99.9221
## 6 14.45 17.34 15.89 104 1.3498 121 1.5704 7688 99.7794
## 7 17.34 20.23 18.78 1564 20.2985 1685 21.8689 7584 98.4296
## 8 20.23 23.12 21.68 788 10.2271 2473 32.0960 6020 78.1311
## 9 23.12 26.01 24.57 2176 28.2414 4649 60.3374 5232 67.9040
## 10 26.01 28.90 27.45 1749 22.6995 6398 83.0370 3056 39.6626
## 11 28.90 31.79 30.34 1072 13.9130 7470 96.9500 1307 16.9630
## 12 31.79 34.68 33.24 205 2.6606 7675 99.6106 235 3.0500
## 13 34.68 37.57 36.12 30 0.3894 7705 100.0000 30 0.3894
# 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(Produccio_n_Campo_Sacha_csv)) {
pozos <- unique(Produccio_n_Campo_Sacha_csv$Pozo)
local_pozos <- pozos[1:min(9, length(pozos))]
Api_local <- na.omit(as.numeric(Produccio_n_Campo_Sacha_csv$Api_BE[Produccio_n_Campo_Sacha_csv$Pozo %in% local_pozos]))
Api_global <- Api_BE
cat("LOCAL:", length(local_pozos), "pozos,", length(Api_local), "datos\n")
cat("GLOBAL:", length(Api_global), "datos\n\n")
# 2. CREAR GRÁFICAS
par(mfrow = c(1, 2))
# Gráfica LOCAL
hist(Api_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 = "°API", ylab = "cantidad", las = 1)
# Gráfica GLOBAL
hist(Api_global, breaks = k, col = rgb(0.8,0.4,0.2,0.6), border = "white",
main = "GLOBAL\nTodos los pozos",
xlab = "°API", ylab = "cantidad", las = 1)
par(mfrow = c(1, 1))
} else {
cat("Solo GLOBAL (no hay columna Pozo)\n\n")
hist(Api_BE, breaks = k, col = "lightblue", border = "white",
main = "Api_BE (GLOBAL)", xlab = "°API", ylab = "cantitad", las = 1)
}
## LOCAL: 9 pozos, 300 datos
## GLOBAL: 7705 datos

# GRÁFICA OJIVA ASCENDENTE
cat("\n" , rep("=", 60), "\n", sep = "")
##
## ============================================================
cat("OJIVA ASCENDENTE - Api_BE (GLOBAL)\n")
## OJIVA ASCENDENTE - Api_BE (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\nGravedad API - GLOBAL",
xlab = "Límite Superior del Intervalo (°API)",
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%
if(exists("Hiasc") && length(Hiasc) > 0) {
indice_50 <- which.max(Hiasc >= 50)
if(length(indice_50) > 0 && indice_50 < length(puntos_x)) {
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%
if(exists("Hiasc") && length(Hiasc) > 0) {
indice_75 <- which.max(Hiasc >= 75)
if(length(indice_75) > 0 && indice_75 < length(puntos_x)) {
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(Api_BE,
horizontal = TRUE,
col = "blue",
main = "Gráfica: Distribución de Gravedad API (Api_BE)",
xlab = "Gravedad API (°API)")

cat("ESTADÍSTICAS:\n")
## ESTADÍSTICAS:
s <- boxplot.stats(Api_BE)$stats
cat("• Mín:", round(s[1], 2), "°API\n")
## • Mín: 13.9 °API
cat("• Q1: ", round(s[2], 2), "°API\n")
## • Q1: 20.7 °API
cat("• Med:", round(s[3], 2), "°API\n")
## • Med: 25.1 °API
cat("• Q3: ", round(s[4], 2), "°API\n")
## • Q3: 27.9 °API
cat("• Máx:", round(s[5], 2), "°API\n")
## • Máx: 37.6 °API
# 5. INDICADORES ESTADÍSTICOS - Api_BE
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(Api_BE)
cat("Media aritmética (x̄):", round(x, 4), "°API\n")
## Media aritmética (x̄): 24.7249 °API
# Mediana (de los datos originales)
Me <- median(Api_BE)
cat("Mediana (Me): ", round(Me, 4), "°API\n")
## Mediana (Me): 25.1 °API
# Mediana de las marcas de clase (opcional)
Me_MC <- median(MC)
cat("Mediana de MC: ", round(Me_MC, 4), "°API\n")
## Mediana de MC: 18.78 °API
# Mínimo y máximo
ri <- min(Api_BE)
rs <- max(Api_BE)
cat("Mínimo (ri): ", round(ri, 4), "°API\n")
## Mínimo (ri): 0 °API
cat("Máximo (rs): ", round(rs, 4), "°API\n")
## Máximo (rs): 37.6 °API
# 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(Api_BE)
cat("Moda aproximada (Mo): ", round(Mo, 4), "°API\n")
## Moda aproximada (Mo): 24 °API
# Cuartiles
Q1 <- quantile(Api_BE, 0.25)
Q2 <- quantile(Api_BE, 0.50) # Igual que mediana
Q3 <- quantile(Api_BE, 0.75)
cat("\nCuartiles:\n")
##
## Cuartiles:
cat(" Q1 (25%): ", round(Q1, 4), "°API\n")
## Q1 (25%): 20.7 °API
cat(" Q2 (50% - Mediana): ", round(Q2, 4), "°API\n")
## Q2 (50% - Mediana): 25.1 °API
cat(" Q3 (75%): ", round(Q3, 4), "°API\n")
## Q3 (75%): 27.9 °API
# Percentiles
percentiles <- quantile(Api_BE, 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), "°API\n", sep = "")
}
## P10%: 18.9°API
## P25%: 20.7°API
## P50%: 25.1°API
## P75%: 27.9°API
## P90%: 30°API
## P95%: 31°API
## P99%: 33.9°API
# 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), "°API\n")
## Rango (R): 37.6 °API
# Rango intercuartílico
RIQ <- Q3 - Q1
cat("Rango intercuartílico:", round(RIQ, 4), "°API\n")
## Rango intercuartílico: 7.2 °API
# Varianza
varianza <- var(Api_BE)
cat("Varianza (s²): ", round(varianza, 4), "\n")
## Varianza (s²): 18.0739
# Desviación estándar
s <- sd(Api_BE)
cat("Desviación estándar (s):", round(s, 4), "°API\n")
## Desviación estándar (s): 4.2513 °API
# Coeficiente de variación
CV <- (s / x) * 100
cat("Coeficiente de variación (CV):", round(CV, 2), "%\n")
## Coeficiente de variación (CV): 17.19 %
# Error estándar de la media
EE <- s / sqrt(n)
cat("Error estándar de la media: ", round(EE, 4), "°API\n")
## Error estándar de la media: 0.0484 °API
# 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(Api_BE)
cat("Coeficiente de asimetría (As):", round(As, 4), "\n")
## Coeficiente de asimetría (As): -0.1675
# 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: Distribución aproximadamente simétrica
# Coeficiente de curtosis (kurtosis)
k <- kurtosis(Api_BE)
cat("\nCoeficiente de curtosis (k): ", round(k, 4), "\n")
##
## Coeficiente de curtosis (k): -0.0763
# Curtosis exceso (comparada con normal = 3)
k_exceso <- k - 3
cat("Curtosis exceso (k-3): ", round(k_exceso, 4), "\n")
## Curtosis exceso (k-3): -3.0763
# 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: Platicúrtica (más aplanada 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",
"°API",
"°API",
"°API",
"°API",
"°API",
"°API",
"°API",
"°API",
"°API",
"(°API)²",
"°API",
"%",
"°API",
"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 24.7249 °API
## 3 POSICIÓN Mediana 25.1 °API
## 4 POSICIÓN Moda aproximada 24 °API
## 5 POSICIÓN Mínimo 0 °API
## 6 POSICIÓN Máximo 37.6 °API
## 7 POSICIÓN Q1 (25%) 20.7 °API
## 8 POSICIÓN Q3 (75%) 27.9 °API
## 9 DISPERSIÓN Rango 37.6 °API
## 10 DISPERSIÓN Rango intercuartílico 7.2 °API
## 11 DISPERSIÓN Varianza 18.0739 (°API)²
## 12 DISPERSIÓN Desviación estándar 4.2513 °API
## 13 DISPERSIÓN Coeficiente variación 17.19% %
## 14 DISPERSIÓN Error estándar 0.0484 °API
## 15 FORMA Asimetría -0.1675 adimensional
## 16 FORMA Curtosis -0.0763 adimensional
## 17 FORMA Curtosis exceso -3.0763 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 LA GRAVEDAD API EN EL CAMPO SACHA:\n\n")
## ANÁLISIS DE LA GRAVEDAD API EN EL CAMPO SACHA:
cat("1. El análisis de", n, "observaciones de gravedad API muestra:\n")
## 1. El análisis de 7705 observaciones de gravedad API muestra:
cat(" • Promedio:", round(x, 1), "°API (petróleo ")
## • Promedio: 24.7 °API (petróleo
# CORRECCIÓN: Todo en una línea o con llaves
if(x < 10) {
cat("pesado")
} else if(x < 22) {
cat("medio")
} else if(x < 31) {
cat("ligero")
} else {
cat("condensado")
}
## ligero
cat(")\n")
## )
cat(" • Variabilidad:", round(CV, 1), "% (")
## • Variabilidad: 17.2 % (
# Misma corrección aquí
if(CV > 30) {
cat("alta")
} else if(CV > 15) {
cat("moderada")
} else {
cat("baja")
}
## moderada
cat(")\n")
## )
cat(" • Distribución: ")
## • Distribución:
# Y aquí
if(abs(As) < 0.5) {
cat("aproximadamente simétrica")
} else if(As > 0) {
cat("sesgo positivo")
} else {
cat("sesgo negativo")
}
## aproximadamente simétrica
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