1.Carga de datos

# 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

2. Extrancción de la variable

Nitrogeno <- na.omit(Nitrogeno)
Nitrogeno <- Nitrogeno[Nitrogeno >= 0]

n <- length(Nitrogeno)
n
## [1] 3000

3. Tabla de distribución de frecuencia

3.1 Construcción manual (Regla de Sturges)

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)
Tabla de Frecuencias de la Cantidad total de Nitrogeno según la Regla de Sturges
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

3.2. Simplificación

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()")
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

4. Gráficas

4.1 Histograma

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")

4.2 Histograma general

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")

4.3 Histograma Porcentual General

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)
)

5. Diagrama de Caja

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

6. Ojivas

6.1 Ojivas Ascendentes y Descendentes (ni)

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)

6.2 Ojivas Ascendentes y Descendentes (hi)

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)

7. Indicadores Estadísticos

7.1 Indicadores de Tendencia Central

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

7.2 Indicadores de Dispersión

varianza <- var(Nitrogeno)
sd <- sd(Nitrogeno)
cv <- round((sd/media)*100,2)

varianza
## [1] 0.2483291
sd
## [1] 0.4983263
cv
## [1] 16.56

7.3 Indicadores de Forma

library(e1071)

asimetria <- skewness(Nitrogeno, type = 2)
curtosis <- kurtosis(Nitrogeno)

asimetria
## [1] 0.03543315
curtosis
## [1] -0.06616814

8. Tabla de Resumen

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)")
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

9. Conclusión

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.