library(readxl)
# 1. Asegúrate de que la ruta sea la correcta para tu archivo Excel
datos <- read_excel("C:/Users/LEO/Documents/Producción Campo Sacha.csv.xlsx")
Salinidad <- datos$Salinidad_BE
# --- ESTAS SON LAS LÍNEAS DE LIMPIEZA QUE AGREGAMOS A TU CÓDIGO ---
Salinidad <- as.numeric(Salinidad)
# Eliminamos NAs y CEROS (El logaritmo de 0 da error infinito y rompe tu gráfico)
Salinidad <- Salinidad[!is.na(Salinidad) & Salinidad > 0]
# ----------------------------------------------------------------
histograma <- hist(Salinidad, freq = FALSE, main="Gráfica 103.Modelo de probabilidad log-normal",
xlab="Partes por millón (ppm)", ylab="Densidad de probabilidad", col="blue")

# Ajuste del modelo al histograma
histograma <- hist(Salinidad, freq = FALSE, main="Gráfica 104 .Modelo de probabilidad lognormal de Salinidad",
xlab="Partes por millón (ppm)", ylab="Densidad de probabilidad", col="blue")
h <- length(histograma$counts)
Logsalin <- log(Salinidad)
ulog <- mean(Logsalin)
sigmalog <- sd(Logsalin)
# Usamos length.out=100 para que la curva sea suave independientemente del tamaño de los datos
x <- seq(min(Salinidad), max(Salinidad), length.out = 100)
curve(dlnorm(x, ulog, sigmalog), type="l", add=TRUE, lwd=4, col="black")

# Frecuencia simple observada
Fo <- histograma$counts
# Frecuencia simple esperada
P <- c(0)
for (i in 1:h) {
P[i] <- (plnorm(histograma$breaks[i+1], ulog, sigmalog) -
plnorm(histograma$breaks[i], ulog, sigmalog))
}
Fe <- P * length(Salinidad)
# Comparar tamaño real y el modelo
sum(Fe)
## [1] 7055.483
n <- length(Salinidad)
# 2. Test de Pearson
# Grado de correlación entre Fe Y Fo
# Corregimos el error de 'ylim' asegurándonos de que Fe sea finito
plot(Fo, Fe, main="Gráfica 105: Correlación de frecuencias en el modelo lognormal de (ppm)",
xlab="Frecuencia Observada", ylab="Frecuencia esperada", col="blue3", pch=19)
# Dibujar la línea de tendencia
abline(lm(Fe ~ Fo), col="red", lwd=2)

Correlación <- cor(Fo, Fe) * 100
Correlación
## [1] 88.90915
#TEST DE CHI-CUADRADO
#Creación de grados de libertad y nivel de significancia
grados_libertad <- (length(histograma$counts)-1)
grados_libertad
## [1] 15
nivel_significancia <- 0.05
#Frecuencia Observada porcentual
Fo<-(histograma$counts/n)*100
Fo
## [1] 15.4006243 14.1129032 15.7388137 11.0952133 3.8631634 5.3590010
## [7] 6.8938606 8.6368366 3.5379813 6.5556712 2.9656608 2.0421436
## [13] 1.2226847 0.9625390 1.1836629 0.4292404
sum(Fo)
## [1] 100
Fe<-P*100
Fe
## [1] 20.9109527 18.8457112 12.7151678 8.9455270 6.5658874 4.9853525
## [7] 3.8885111 3.0996533 2.5154926 2.0723228 1.7292075 1.4589118
## [13] 1.2427719 1.0676679 0.9241702 0.8053691
sum(Fe)
## [1] 91.77268
x2<-sum((Fe-Fo)^2/Fe)
x2
## [1] 28.72264
#Calcular el umbral de aceptación
umbral_aceptacion <- qchisq(1 - nivel_significancia, grados_libertad)
umbral_aceptacion
## [1] 24.99579
x2<umbral_aceptacion
## [1] FALSE
#3 Tabla resumen de test
Variable<-c("Salinidad")
tabla_resumen<-data.frame(Variable,round(Correlación,2),round(x2,2),round(umbral_aceptacion,2))
colnames(tabla_resumen)<-c("Variable","Test Pearson (%)","Chi Cuadrado","Umbral de aceptación")
library(knitr)
kable(tabla_resumen, format = "markdown", caption = "Tabla.Resumen de test de bondad al modelo de probabilidad")
Tabla.Resumen de test de bondad al modelo de
probabilidad
| Salinidad |
88.91 |
28.72 |
25 |
#todo bien borrar esta línea
# 4. Cálculo de probabilidades corregido
# Usaremos un rango de interés (ejemplo: 10,000 a 20,000 ppm)
limite_inf <- 10000
limite_sup <- 20000
prob_area <- plnorm(limite_sup, ulog, sigmalog) - plnorm(limite_inf, ulog, sigmalog)
# Ajustamos el eje X para que cubra tus ppm (ej. de 0 a 50,000)
x_grafica <- seq(0.1, max(Salinidad) * 1.1, length.out = 1000)
y_grafica <- dlnorm(x_grafica, ulog, sigmalog)
# GRAFICAR
plot(x_grafica, y_grafica, type = "l", col = "skyblue3", lwd = 2,
main="Distribución de Salinidad - Campo Sacha",
ylab="Densidad de Probabilidad", # <--- ETIQUETA CORRECTA
xlab="Salinidad del Agua de Formación (ppm)", # <--- ETIQUETA CORRECTA
xaxt="n")
# Sombreado de la probabilidad
x_sombra <- seq(limite_inf, limite_sup, length.out = 100)
y_sombra <- dlnorm(x_sombra, ulog, sigmalog)
polygon(c(x_sombra, rev(x_sombra)), c(y_sombra, rep(0, length(y_sombra))),
col = rgb(1, 0, 0, 0.4), border = "red")
# Eje X con saltos de 5000 en 5000 ppm
axis(1, at = seq(0, max(Salinidad), by = 5000), las = 2)
# Leyenda explicativa
legend("topright",
legend = c("Modelo Lognormal", paste("Probabilidad:", round(prob_area*100, 2), "%")),
fill = c(NA, rgb(1, 0, 0, 0.4)), border = c("skyblue3", "red"), bty = "n")

# 5. Intervalos de confianza para la Salinidad
# Donde x es la media aritmética y e es el error estándar de la media
# Calculamos la media de la Salinidad
media_sal <- mean(Salinidad)
media_sal
## [1] 22997
# Calculamos la desviación estándar
sigma_sal <- sd(Salinidad)
sigma_sal
## [1] 18357.66
# Calculamos el error estándar (e)
n <- length(Salinidad)
e <- sigma_sal / sqrt(n)
e
## [1] 209.3681
# Cálculo de los límites de confianza (95% de confianza aproximadamente con 2*e)
li <- media_sal - 2 * e
li
## [1] 22578.26
ls <- media_sal + 2 * e
ls
## [1] 23415.74
# 5.1 Tabla resumen de la media poblacional
# Usamos la variable "Variable" que ya definiste antes como "Salinidad"
tabla_media <- data.frame(round(li, 2), media_sal, round(ls, 2), round(e, 2))
colnames(tabla_media) <- c("Límite Inferior (ppm)", "Media Muestral (ppm)", "Límite Superior (ppm)", "Error Estándar")
library(knitr)
kable(tabla_media, format = "markdown",
caption = "Tabla. Estimación de la media poblacional de Salinidad (95% confianza)")
Tabla. Estimación de la media poblacional de Salinidad (95%
confianza)
| 22578.26 |
22997 |
23415.74 |
209.37 |
#6. Conclusión
#La variable Salinidad del agua de formación se explica a través del modelo Log-normal, siendo la media aritmética muestral de 22997 ppm, con una desviación estándar de 18357.66 ppm.
#De esta manera, logramos calcular probabilidades específicas para la operación del campo; por ejemplo, la probabilidad de que al seleccionar aleatoriamente un pozo, este presente una salinidad de entre 10,000 ppm y 20,000 ppm es de 21.66%.
#Finalmente, mediante la aplicación del Teorema del Límite Central, determinamos con un 95% de confianza que la media poblacional de la salinidad en el área de estudio se encuentra en un intervalo definido entre 22578.26 ppm y 23415.74 ppm.