#UNIVERSIDAD CENTRAL DEL ECUADOR
#Facultad de Ingeniería en Geología, Minas, Petroleos y Ambiental
#Ingeniería Ambiental
#Autor: Grupo 4
#fecha:
#Cargar datos
setwd("C:/Users/LENOVO/OneDrive/Escritorio/ESTADISTICA")
datos <- read.csv("water_pollution_disease.csv")
#extraccion variable cuantitativa continua
Nivel_nitrato <- datos$Nitrate.Level..mg.L.
#Tabla de distribución de frecuencia
#Manualmente
min <- min(Nivel_nitrato)
max <- max(Nivel_nitrato)
R <- max-min
K <- floor(1+3.33*log10(length(Nivel_nitrato)))
A <- R/K
lim_inf <- round(seq(from=min,to=max-A,by=A),2)
lim_sup <- round(seq(from=min+A,to=max,by=A),2)
MC <- (lim_inf+lim_sup)/2
ni <- c()
for (i in 1:K) {
if (i < K) {
ni[i] <- length(subset(Nivel_nitrato, Nivel_nitrato >= lim_inf[i] & Nivel_nitrato < lim_sup[i]))
} else {
ni[i] <- length(subset(Nivel_nitrato, Nivel_nitrato >= lim_inf[i] & Nivel_nitrato <= lim_sup[i]))
}
}
sum(ni)
## [1] 3000
hi <- ni/sum(ni)*100
sum(hi)
## [1] 100
Ni_asc <- cumsum(ni)
Hi_asc <- cumsum(hi)
Ni_desc <- rev(cumsum(rev(ni)))
Hi_desc <- rev(cumsum(rev(hi)))
TDF_nitrato <- data.frame(lim_inf,
lim_sup,
MC,ni,
round(hi,2),
Ni_asc,
Ni_desc,
round(Hi_asc,2),
round(Hi_desc,2))
colnames(TDF_nitrato) <- c("Lim inf","Lim sup","MC","ni","hi(%)",
"Ni asc","Ni desc","Hi asc(%)","Hi desc(%)")
# crear de fila de totales
totales <- c( lim_inf= "TOTAL",
lim_sup= "-",
MC= "-",
ni= sum(ni),
hi= sum(hi),
Ni_asc= "-",
Ni_des= "-",
Hi_asc= "-",
Hi_des= "-")
TDF_nitrato_total <- rbind(TDF_nitrato, totales)
# Tabla mas estetica
library(knitr)
## Warning: package 'knitr' was built under R version 4.5.1
library(kableExtra)
## Warning: package 'kableExtra' was built under R version 4.5.1
kable(TDF_nitrato_total, align = 'c',
caption = "Tabla de Distribucion de Frecuencia del Nivel de Concentración
de Nitrato (mg/L) en los países analizados") %>%
kable_styling(full_width = FALSE, position = "center",
bootstrap_options = c("striped", "hover", "condensed"))
Tabla de Distribucion de Frecuencia del Nivel de Concentración de
Nitrato (mg/L) en los países analizados
|
Lim inf
|
Lim sup
|
MC
|
ni
|
hi(%)
|
Ni asc
|
Ni desc
|
Hi asc(%)
|
Hi desc(%)
|
|
0.05
|
4.21
|
2.13
|
235
|
7.83
|
235
|
3000
|
7.83
|
100
|
|
4.21
|
8.37
|
6.29
|
248
|
8.27
|
483
|
2765
|
16.1
|
92.17
|
|
8.37
|
12.54
|
10.455
|
268
|
8.93
|
751
|
2517
|
25.03
|
83.9
|
|
12.54
|
16.7
|
14.62
|
271
|
9.03
|
1022
|
2249
|
34.07
|
74.97
|
|
16.7
|
20.86
|
18.78
|
239
|
7.97
|
1261
|
1978
|
42.03
|
65.93
|
|
20.86
|
25.02
|
22.94
|
251
|
8.37
|
1512
|
1739
|
50.4
|
57.97
|
|
25.02
|
29.18
|
27.1
|
237
|
7.9
|
1749
|
1488
|
58.3
|
49.6
|
|
29.18
|
33.34
|
31.26
|
248
|
8.27
|
1997
|
1251
|
66.57
|
41.7
|
|
33.34
|
37.51
|
35.425
|
234
|
7.8
|
2231
|
1003
|
74.37
|
33.43
|
|
37.51
|
41.67
|
39.59
|
250
|
8.33
|
2481
|
769
|
82.7
|
25.63
|
|
41.67
|
45.83
|
43.75
|
252
|
8.4
|
2733
|
519
|
91.1
|
17.3
|
|
45.83
|
49.99
|
47.91
|
267
|
8.9
|
3000
|
267
|
100
|
8.9
|
|
TOTAL
|
|
|
3000
|
100
|
|
|
|
|
#Simplificación con el histograma
Hist_Nitrato <- hist(Nivel_nitrato,breaks = 10,plot=F)
k <- length(Hist_Nitrato$breaks)
Li <- Hist_Nitrato$breaks[1:(length(Hist_Nitrato$breaks)-1)]
Ls <- Hist_Nitrato$breaks[2:length(Hist_Nitrato$breaks)]
ni <- Hist_Nitrato$counts
sum(ni)
## [1] 3000
MC <- Hist_Nitrato$mids
hi <- (ni/sum(ni))
sum(hi)
## [1] 1
Ni_asc <- cumsum(ni)
Hi_asc <- cumsum(hi)
Ni_desc <- rev(cumsum(rev(ni)))
Hi_desc <- rev(cumsum(rev(hi)))
TDF_nitrato <- data.frame(Li = round(Li, 2),
Ls = round(Ls, 2),
MC = round(MC, 2),
ni = ni,
hi = round(hi * 100, 2),
Ni_asc = Ni_asc,
Ni_desc = Ni_desc,
Hi_asc = round(Hi_asc * 100, 2),
Hi_desc = round(Hi_desc * 100, 2))
colnames(TDF_nitrato) <- c("Lim inf","Lim sup","MC","ni","hi(%)",
"Ni asc","Ni desc","Hi asc(%)","Hi desc(%)")
# crear de fila de totales
totales <- c( lim_inf= "TOTAL",
lim_sup= "-",
MC= "-",
ni= sum(ni),
hi= sum(hi*100),
Ni_asc= "-",
Ni_des= "-",
Hi_asc= "-",
Hi_des= "-")
library(knitr)
library(kableExtra)
kable(TDF_nitrato_total, align = 'c',
caption = "Tabla de Distribución de frecuencias del nivel de concentración
de nitrato (mg/L) en los países analizados") %>%
kable_styling(full_width = FALSE, position = "center",
bootstrap_options = c("striped", "hover", "condensed"))
Tabla de Distribución de frecuencias del nivel de concentración de
nitrato (mg/L) en los países analizados
|
Lim inf
|
Lim sup
|
MC
|
ni
|
hi(%)
|
Ni asc
|
Ni desc
|
Hi asc(%)
|
Hi desc(%)
|
|
0.05
|
4.21
|
2.13
|
235
|
7.83
|
235
|
3000
|
7.83
|
100
|
|
4.21
|
8.37
|
6.29
|
248
|
8.27
|
483
|
2765
|
16.1
|
92.17
|
|
8.37
|
12.54
|
10.455
|
268
|
8.93
|
751
|
2517
|
25.03
|
83.9
|
|
12.54
|
16.7
|
14.62
|
271
|
9.03
|
1022
|
2249
|
34.07
|
74.97
|
|
16.7
|
20.86
|
18.78
|
239
|
7.97
|
1261
|
1978
|
42.03
|
65.93
|
|
20.86
|
25.02
|
22.94
|
251
|
8.37
|
1512
|
1739
|
50.4
|
57.97
|
|
25.02
|
29.18
|
27.1
|
237
|
7.9
|
1749
|
1488
|
58.3
|
49.6
|
|
29.18
|
33.34
|
31.26
|
248
|
8.27
|
1997
|
1251
|
66.57
|
41.7
|
|
33.34
|
37.51
|
35.425
|
234
|
7.8
|
2231
|
1003
|
74.37
|
33.43
|
|
37.51
|
41.67
|
39.59
|
250
|
8.33
|
2481
|
769
|
82.7
|
25.63
|
|
41.67
|
45.83
|
43.75
|
252
|
8.4
|
2733
|
519
|
91.1
|
17.3
|
|
45.83
|
49.99
|
47.91
|
267
|
8.9
|
3000
|
267
|
100
|
8.9
|
|
TOTAL
|
|
|
3000
|
100
|
|
|
|
|
# GRAFICAS
# Histograma
hist(Nivel_nitrato, breaks = 11,
main = "Gráfica N°1: Distribución de la concentración de nitratos (mg/L)
presente en el estudio sobre contaminación del agua y enfermedades asociadas",
xlab = "Niveles de Nitrato (mg/L)",
ylab = "Cantidad",
ylim = c(0, max(ni)),
col = "purple",
cex.main = 0.9,
cex.lab = 1,
cex.axis = 0.9,
xaxt = "n")
axis(1, at = Hist_Nitrato$breaks,
labels = Hist_Nitrato$breaks, las = 1,
cex.axis = 0.9)

# Cargar librerías necesarias
library(fitdistrplus)
## Warning: package 'fitdistrplus' was built under R version 4.5.1
## Cargando paquete requerido: MASS
## Cargando paquete requerido: survival
# Supón que ya tienes tus datos de nitrato:
# Nivel_nitrato <- tus datos aquí
# Filtrar valores positivos
Nivel_nitrato_pos <- Nivel_nitrato[Nivel_nitrato > 0]
# Puntos del centro de las barras que quieres usar (de la 3 a la 7 aprox)
x_puntos <- TDF_nitrato$MC[3:7]
y_puntos <- TDF_nitrato$ni[3:7] + 10 # un poco más arriba de la parte superior de las barras
# Generamos una secuencia suave para el eje x
x_vals <- seq(min(x_puntos), max(x_puntos), length.out = 200)
# Ajustamos curva suave (loess) a los puntos elegidos
modelo_loess <- loess(y_puntos ~ x_puntos, span = 1) # puedes ajustar span para más o menos suavidad
y_suave <- predict(modelo_loess, newdata = data.frame(x_puntos = x_vals))
# Obtener posiciones reales del gráfico
bp <- barplot(
TDF_nitrato$ni,
space = 0,
col = "purple",
border = "black",
names.arg = TDF_nitrato$MC,
main = "Gráfica N°1: Distribución de la concentración de nitratos (mg/L)\npresente en el estudio sobre contaminación del agua y enfermedades asociadas",
xlab = "Niveles de Nitrato (mg/L)",
ylab = "Cantidad",
ylim = c(0, max(TDF_nitrato$ni) + 50)
)
# Interpolamos las posiciones para el eje x
interp <- approxfun(TDF_nitrato$MC, bp)
x_grafico <- interp(x_vals)
# Dibujamos la curva suavizada
lines(x_grafico, y_suave, col = "gold", lwd = 4)

# Subconjunto de la curva (de la barra 3 a la 7)
Nivel_nitrato_pos <- Nivel_nitrato[Nivel_nitrato > 0]
Histograma <- hist(Nivel_nitrato_pos, breaks = 10, plot = FALSE)
lambda <- 1 / mean(Nivel_nitrato_pos) # parámetro del modelo exponencial
# Frecuencias observadas y esperadas SOLO de la barra 3 a la 7
indices <- 3:7
FO <- Histograma$counts[indices]
FE <- c()
for (i in indices) {
P <- pexp(Histograma$breaks[i + 1], rate = lambda) - pexp(Histograma$breaks[i], rate = lambda)
FE <- c(FE, P * length(Nivel_nitrato_pos))
}
# Test de Pearson
pearson <- cor(FO, FE)
pearson
## [1] 0.9870695
# Test de Chi-cuadrado (aprueba si X2 < chi)
X2 <- sum((FO - FE)^2 / FE)
X2
## [1] 133.0127
gl <- length(FO) - 1 # grados de libertad
chi <- qchisq(0.99, df = gl)
X2 > chi # TRUE = no pasa
## [1] TRUE
# Probabilidad entre 5 y 8 mg/L
P_5_8 <- (pexp(8, rate = lambda) - pexp(5, rate = lambda)) * 100
P_5_8
## [1] 9.236193
# Gráfico con curva y área sombreada entre 5 y 8
x <- seq(0, max(Nivel_nitrato_pos), length.out = 1000)
plot(x, dexp(x, rate = lambda), type = "l", col = "red", lwd = 2,
main = "Distribución Exponencial Ajustada: Nivel de Nitrato (mg/L)",
xlab = "Nivel de Nitrato (mg/L)", ylab = "Densidad de Probabilidad",
ylim = c(0, max(dexp(x, rate = lambda)) * 1.1))
x_area <- seq(5, 8, length.out = 100)
polygon(c(5, x_area, 8), c(0, dexp(x_area, rate = lambda), 0),
col = rgb(0, 0, 1, 0.3), border = NA)
legend("topright",
legend = c("Modelo Exponencial", "Área entre 5 y 8 mg/L"),
col = c("red", rgb(0, 0, 1, 0.3)),
lwd = 2,
pch = c(NA, 15),
pt.cex = 2,
bty = "n")

# Intervalo de confianza (95%) de la media
media <- mean(Nivel_nitrato_pos)
error <- sd(Nivel_nitrato_pos) / sqrt(length(Nivel_nitrato_pos))
lim_inf <- media - 2 * error
lim_sup <- media + 2 * error
# Mostrar resultados
cat("Test de Pearson:", round(pearson, 3), "\n")
## Test de Pearson: 0.987
cat("Test Chi-cuadrado:", round(X2, 2), "vs", round(chi, 2), "→ Aprobado?", X2 < chi, "\n")
## Test Chi-cuadrado: 133.01 vs 13.28 → Aprobado? FALSE
cat("Probabilidad entre 5 y 8 mg/L:", round(P_5_8, 2), "%\n")
## Probabilidad entre 5 y 8 mg/L: 9.24 %
cat("Intervalo de Confianza (95%) de la media:", round(lim_inf, 2), "-", round(lim_sup, 2), "mg/L\n")
## Intervalo de Confianza (95%) de la media: 24.55 - 25.61 mg/L
# Parámetro lambda
lambda <- 1 / mean(Nivel_nitrato)
# Rango de interés
a <- 3
b <- 5
# Probabilidad de que Nivel_nitrato esté entre a y b
P1 <- (pexp(b, rate = lambda) - pexp(a, rate = lambda)) * 100
P1 # Esto da la probabilidad en porcentaje
## [1] 6.800619
# Estadísticos
media <- mean(Nivel_nitrato)
desviacion <- sd(Nivel_nitrato)
n <- length(Nivel_nitrato)
# Intervalo 95%
error <- 2 * (desviacion / sqrt(n))
lim_inf <- round(media - error, 3)
lim_sup <- round(media + error, 3)
plot(1, type = "n", axes = FALSE, xlab = "", ylab = "") # Gráfico vacío para texto
text(x = 1, y = 1,
labels = paste(
"Cálculos de Probabilidad y Estimación de Parámetros\n",
"\n• Probabilidad de que el nivel de nitrato esté entre 3 y 5 mg/L:",
sprintf("%.2f %%", P1),
"\n\n• Intervalo de confianza del 95%% para la media poblacional del
Nivel de Nitrato:",
sprintf("\nEntre %.2f mg/L y %.2f mg/L", lim_inf, lim_sup),
"\n\nInterpretación:\nCon un 95%% de confianza, se espera que la media
real del nivel de nitrato en los países analizados esté dentro de este
rango.\nTambién, hay aproximadamente un",
sprintf(" %.2f %%", P1),
"de probabilidad de que un valor observado esté entre 3 y 5 mg/L, según
el modelo exponencial ajustado."),
cex = 1.3,
col = "blue",
font = 6)

# Crear un resumen del test de bondad de ajuste
resumen_test <- data.frame(
Test = c("Coeficiente de Pearson", "Chi-cuadrado"),
Estadístico = c(round(pearson, 3), round(X2, 2)),
Valor_critico = c(NA, round(chi, 2)),
Aprobado = c("Sí", ifelse(X2 < chi, "Sí", "No"))
)
# Mostrar resumen con kable
library(knitr)
library(kableExtra)
kable(resumen_test,
caption = "Resumen del Test de Bondad de Ajuste para el Modelo Exponencial") %>%
kable_styling(bootstrap_options = c("striped", "hover"),
full_width = FALSE, position = "center")
Resumen del Test de Bondad de Ajuste para el Modelo Exponencial
|
Test
|
Estadístico
|
Valor_critico
|
Aprobado
|
|
Coeficiente de Pearson
|
0.987
|
NA
|
Sí
|
|
Chi-cuadrado
|
133.010
|
13.28
|
No
|