# Librerías
library(kableExtra)
library(knitr)
library(magrittr)
library(dplyr)
##
## Adjuntando el paquete: 'dplyr'
## The following object is masked from 'package:kableExtra':
##
## group_rows
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(e1071)
# Cargar datos
datos <- read.csv("china_water_pollution_data.csv",
header = TRUE,
sep = ",",
dec = ".")
Nitrogeno <- datos$Total_Nitrogen_mg_L
Nitrogeno <- na.omit(Nitrogeno)
Nitrogeno <- Nitrogeno[Nitrogeno >= 0]
n <- length(Nitrogeno)
n
## [1] 3000
minimo <- min(Nitrogeno)
maximo <- max(Nitrogeno)
R <- maximo - minimo
K <- floor(1 + 3.322 * log10(n))
A <- R / K
# Generar límites correctamente
Li <- round(seq(from = minimo, to = maximo, length.out = K), 2)
Ls <- c(Li[-1], round(maximo,2)) # Forzamos que el último límite superior sea el máximo exacto
Mc <- (Li + Ls)/2
ni <- numeric(K)
for (i in 1:K) {
if (i < K) {
ni[i] <- sum(Nitrogeno >= Li[i] & Nitrogeno < Ls[i])
} else {
ni[i] <- sum(Nitrogeno >= Li[i] & Nitrogeno <= Ls[i]) # último intervalo incluye máximo
}
}
hi <- ni/sum(ni)*100
Ni_asc <- cumsum(ni)
Hi_asc <- cumsum(hi)
TDF_Nitrogeno <- data.frame(Li, Ls, Mc, ni, round(hi,2), Ni_asc, round(Hi_asc,2))
colnames(TDF_Nitrogeno) <- c("Lim inf","Lim sup","MC","ni","hi(%)","Ni asc","Hi asc(%)")
kable(TDF_Nitrogeno, align="c",
caption="Tabla de Frecuencias de la Cantidad total de Nitrogeno según la Regla de Sturges") %>%
kable_styling(full_width = FALSE)
| Lim inf | Lim sup | MC | ni | hi(%) | Ni asc | Hi asc(%) |
|---|---|---|---|---|---|---|
| 1.27 | 1.58 | 1.425 | 7 | 0.23 | 7 | 0.23 |
| 1.58 | 1.89 | 1.735 | 24 | 0.80 | 31 | 1.03 |
| 1.89 | 2.21 | 2.050 | 130 | 4.33 | 161 | 5.37 |
| 2.21 | 2.52 | 2.365 | 333 | 11.10 | 494 | 16.47 |
| 2.52 | 2.83 | 2.675 | 593 | 19.77 | 1087 | 36.23 |
| 2.83 | 3.14 | 2.985 | 716 | 23.87 | 1803 | 60.10 |
| 3.14 | 3.45 | 3.295 | 634 | 21.13 | 2437 | 81.23 |
| 3.45 | 3.76 | 3.605 | 363 | 12.10 | 2800 | 93.33 |
| 3.76 | 4.08 | 3.920 | 146 | 4.87 | 2946 | 98.20 |
| 4.08 | 4.39 | 4.235 | 47 | 1.57 | 2993 | 99.77 |
| 4.39 | 4.70 | 4.545 | 6 | 0.20 | 2999 | 99.97 |
| 4.70 | 4.70 | 4.700 | 1 | 0.03 | 3000 | 100.00 |
La tabla de distribución de frecuencias de la Cantidad Total del Nitrogeno fue construida inicialmente aplicando la Regla de Sturges para determinar el número óptimo de clases.
Posteriormente, el procedimiento se simplificó utilizando la función hist(), obteniendo automáticamente los intervalos y frecuencias, confirmando los resultados obtenidos manualmente.
Hist_Nitrogeno <- hist(Nitrogeno,
breaks = K,
plot = FALSE)
Li <- Hist_Nitrogeno$breaks[-length(Hist_Nitrogeno$breaks)]
Ls <- Hist_Nitrogeno$breaks[-1]
ni <- Hist_Nitrogeno$counts
hi <- round((ni/sum(ni))*100,2)
TDF_simplificada <- data.frame(
Lim_inf = round(Li,2),
Lim_sup = round(Ls,2),
ni = ni,
hi = hi
)
kable(TDF_simplificada,
align="c",
caption="Tabla simplificada obtenida mediante hist()")
| Lim_inf | Lim_sup | ni | hi |
|---|---|---|---|
| 1.0 | 1.5 | 3 | 0.10 |
| 1.5 | 2.0 | 57 | 1.90 |
| 2.0 | 2.5 | 421 | 14.03 |
| 2.5 | 3.0 | 1016 | 33.87 |
| 3.0 | 3.5 | 1026 | 34.20 |
| 3.5 | 4.0 | 398 | 13.27 |
| 4.0 | 4.5 | 75 | 2.50 |
| 4.5 | 5.0 | 4 | 0.13 |
hist(Nitrogeno, breaks = 10,
main = "Gráfica N°1: Distribución de la Cantidad Total de Nitrogeno
en el estudio de contaminación del agua
en China en el año 2023",
xlab = "Nitrogeno Total (mg/L)",
ylab = "Cantidad",
ylim = c(0, max(ni)),
col = "lightgreen")
hist(Nitrogeno, breaks = 10,
main = "Gráfica N°2: Distribución general de la Cantidad Total de Nitrogeno
en el estudio de contaminación del agua en China 2023",
xlab = "Nitrogeno Total (mg/L)",
ylab = "Cantidad",
ylim = c(0, max(ni)),
col = "lightgreen")
barplot(
height = TDF_Nitrogeno$`hi(%)`,
space = 0,
col = "skyblue",
main = "Gráfica N°3: Distribución porcentual de la Cantidad Total de Nitrogeno
en el estudio de contaminación del agua en China 2023",
xlab = "Nitrogeno Total (mg/L)",
ylab = "Porcentaje (%)",
names.arg = TDF_Nitrogeno$MC,
ylim = c(0,100)
)
boxplot(Nitrogeno,
horizontal = TRUE,
main = "Gráfica N°6: Diagrama de caja de la Cantidad Total de Nitrogeno
en el estudio de contaminación del agua en China 2023",
xlab = "Nitrogeno Total (mg/L)",
col = "green",
outline = TRUE)
summary(Nitrogeno)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1.270 2.660 3.010 3.007 3.340 4.700
Ni_asc <- cumsum(ni)
Ni_desc <- rev(cumsum(rev(ni)))
plot(Ls, Ni_asc,
type = "o",
col = "orange",
lwd = 3,
xlab = "Nitrogeno Total (mg/L)",
ylab = "Frecuencia acumulada",
main = "Gráfica N°7: Ojiva Ascendente y Descendente")
lines(Li, Ni_desc,
type = "o",
col = "green",
lwd = 3)
Hi_asc <- cumsum(hi)
Hi_desc <- rev(cumsum(rev(hi)))
plot(Ls, Hi_asc,
type = "o",
col = "blue",
lwd = 3,
xlab = "Nitrogeno Total (mg/L)",
ylab = "Porcentaje acumulado (%)",
main = "Gráfica N°8: Ojiva porcentual Ascendente y Descendente")
lines(Li, Hi_desc,
type = "o",
col = "red",
lwd = 3)
media <- round(mean(Nitrogeno),2)
mediana <- median(Nitrogeno)
max_ni <- max(TDF_Nitrogeno$ni)
moda <- TDF_Nitrogeno$MC[TDF_Nitrogeno$ni == max_ni]
media
## [1] 3.01
mediana
## [1] 3.01
moda
## [1] 2.985
varianza <- var(Nitrogeno)
sd <- sd(Nitrogeno)
cv <- round((sd/media)*100,2)
varianza
## [1] 0.2483291
sd
## [1] 0.4983263
cv
## [1] 16.56
library(e1071)
asimetria <- skewness(Nitrogeno, type = 2)
curtosis <- kurtosis(Nitrogeno)
asimetria
## [1] 0.03543315
curtosis
## [1] -0.06616814
tabla_indicadores <- data.frame(
"Variable" = "Nitrogeno Total (mg/L)",
"Rango" = paste0("[",min(Nitrogeno),";",max(Nitrogeno),"]"),
"X" = media,
"Me" = round(mediana,2),
"Mo" = moda,
"V" = round(varianza,2),
"Sd" = round(sd,2),
"Cv" = cv,
"As" = round(asimetria,2),
"K" = round(curtosis,2)
)
kable(tabla_indicadores, align='c',
caption="Conclusiones de la variable Nitrogeno Total (mg/L)")
| Variable | Rango | X | Me | Mo | V | Sd | Cv | As | K |
|---|---|---|---|---|---|---|---|---|---|
| Nitrogeno Total (mg/L) | [1.27;4.7] | 3.01 | 3.01 | 2.985 | 0.25 | 0.5 | 16.56 | 0.04 | -0.07 |
La variable Nitrógeno Total (mg/L) fluctúa entre 1.27 y 4.70 mg/L, y sus valores giran en torno a 3.01 mg/L, con una desviación estándar de 0.50 mg/L, siendo un conjunto de datos con variabilidad moderada (CV = 16.56%). Los valores se distribuyen de manera prácticamente simétrica (As ≈ 0.04), lo que indica que no existe una concentración marcada hacia valores bajos o altos, y presentan una curtosis ligeramente negativa (K = -0.07), evidenciando una distribución muy cercana a la normal. Por lo anterior, el comportamiento de la variable Nitrógeno Total (mg/L) puede considerarse estable y representativo para el análisis de la calidad del agua en China durante el año 2023.