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 = ".")
Plomo <- datos$Heavy_Metals_Pb_ug_L

2. Extracción de la variable

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

n <- length(Plomo)
n
## [1] 2973

3. Tabla de distribución de frecuencia

3.1 Construcción manual (Regla de Sturges)

minimo <- min(Plomo)
maximo <- max(Plomo)
K <- floor(1 + 3.322 * log10(n))

# Creamos el rango y lo guardamos bien
rango_ajustado <- seq(from = minimo - 0.01, to = maximo + 0.01, length.out = K + 1)

intervalos <- cut(Plomo, breaks = rango_ajustado, include.lowest = TRUE, right = TRUE)
ni <- as.numeric(table(intervalos))

# Parche para asegurar los 3000
if(sum(ni) != n){
  ni[which.max(ni)] <- ni[which.max(ni)] + (n - sum(ni))
}

Li <- rango_ajustado[-length(rango_ajustado)]
Ls <- rango_ajustado[-1]
Mc <- (Li + Ls)/2
hi <- (ni / sum(ni)) * 100
Ni_asc <- cumsum(ni)
Hi_asc <- cumsum(hi)

TDF_Plomo <- data.frame(
  Lim_inf = Li,
  Lim_sup = Ls,
  MC = Mc,
  ni = ni,
  hi = hi,
  Ni_asc = Ni_asc,
  Hi_asc = Hi_asc
)

kable(TDF_Plomo, digits = 3, align = "c",
      col.names = c("Lím. Inf.", "Lím. Sup.", "MC", "ni", "hi (%)", "Ni Asc.", "Hi Asc. (%)"),
      caption = paste("TABLA FINAL - TOTAL DATOS:", sum(ni))) %>%
  kable_styling(full_width = FALSE, bootstrap_options = c("striped", "hover"))
TABLA FINAL - TOTAL DATOS: 2973
Lím. Inf. Lím. Sup. MC ni hi (%) Ni Asc. Hi Asc. (%)
0.000 1.052 0.526 56 1.884 56 1.884
1.052 2.103 1.577 147 4.945 203 6.828
2.103 3.155 2.629 298 10.024 501 16.852
3.155 4.207 3.681 502 16.885 1003 33.737
4.207 5.258 4.732 637 21.426 1640 55.163
5.258 6.310 5.784 563 18.937 2203 74.100
6.310 7.362 6.836 424 14.262 2627 88.362
7.362 8.413 7.887 208 6.996 2835 95.358
8.413 9.465 8.939 95 3.195 2930 98.554
9.465 10.517 9.991 36 1.211 2966 99.765
10.517 11.568 11.042 6 0.202 2972 99.966
11.568 12.620 12.094 1 0.034 2973 100.000

3.2. Simplificación

La tabla de distribución de frecuencia de los Metales Pesados Plomo 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.

# Usamos el objeto ni del bloque anterior para que coincida perfectamente
Hist_Plomo <- hist(Plomo, breaks = rango_ajustado, plot = FALSE)

TDF_simplificada <- data.frame(
  Lim_inf = round(Hist_Plomo$breaks[-length(Hist_Plomo$breaks)], 2),
  Lim_sup = round(Hist_Plomo$breaks[-1], 2),
  ni = ni, 
  hi = round((ni/sum(ni))*100, 2)
)

kable(TDF_simplificada, align="c", 
      caption="Tabla simplificada obtenida mediante hist()") %>%
  kable_styling(full_width = FALSE)
Tabla simplificada obtenida mediante hist()
Lim_inf Lim_sup ni hi
0.00 1.05 56 1.88
1.05 2.10 147 4.94
2.10 3.15 298 10.02
3.15 4.21 502 16.89
4.21 5.26 637 21.43
5.26 6.31 563 18.94
6.31 7.36 424 14.26
7.36 8.41 208 7.00
8.41 9.46 95 3.20
9.46 10.52 36 1.21
10.52 11.57 6 0.20
11.57 12.62 1 0.03

4. Gráficas

4.1 Histograma

hist(Plomo, breaks = rango_ajustado,
     main = "Gráfica N°1: Distribución de los Metales Pesados Plomo en el estudio de cntaminación del agua en China 2023",
     xlab = "MP_Plomo (µg/L)", ylab = "Cantidad",
     col = "lightgreen")

4.2 Histograma general

hist(Plomo, breaks = 10,
     main = "Gráfica N°2: Distribución general de los Metales Pesados Plomo
     en el estudio de contaminación del agua en China 2023",
     xlab = "MP Plomo (µg/L)",
     ylab = "Cantidad",
     ylim = c(0, max(ni)),
     col = "lightgreen")

4.3 Histograma Porcentual General

barplot(height = TDF_Plomo$hi, space = 0, col = "skyblue",
  main = "Gráfica N°3: Distribución porcentual de los Metales Pesados Plomo en el estudio de contaminación del agua en China 2023",
  xlab = "MP Plomo (µg/L)", ylab = "Porcentaje (%)",
  names.arg = round(TDF_Plomo$MC, 2))

5. Diagrama de Caja

boxplot(Plomo, horizontal = TRUE, col = "green",
        main = "Gráfica N°6: Diagrama de caja de los Metales Pesados Plomo en el estudio de contaminación de agua en China 2023",
        xlab = "MP Plomo (µg/L)")

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 = " MP Plomo (µg/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 = "MP Plomo (µg/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(Plomo),2)
mediana <- median(Plomo)

max_ni <- max(TDF_Plomo$ni)
moda <- TDF_Plomo$MC[TDF_Plomo$ni == max_ni]

media
## [1] 5.03
mediana
## [1] 5.01
moda
## [1] 4.7325

7.2 Indicadores de Dispersión

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

varianza
## [1] 3.82069
sd
## [1] 1.954658
cv
## [1] 38.86

7.3 Indicadores de Forma

library(e1071)

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

asimetria
## [1] 0.09947783
curtosis
## [1] -0.140917

8. Tabla de Resumen

tabla_indicadores <- data.frame(
  "Variable" = "MP Plomo (µg/L)",
  "Rango" = paste0("[",min(Plomo),";",max(Plomo),"]"),
  "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 Metales Pesados Plomo (µg/L)")
Conclusiones de la variable Metales Pesados Plomo (µg/L)
Variable Rango X Me Mo V Sd Cv As K
MP Plomo (µg/L) [0.01;12.61] 5.03 5.01 4.7325 3.82 1.95 38.86 0.1 -0.14

9. Conclusión

La variable Metales Pesados Plomo (µg/L) fluctúa entre 0.01 y 12.61 µg/L, y sus valores giran en torno a 5.03 µg/L, con una desviación estándar de 1.95 µg/L, siendo un conjunto de datos con variabilidad moderada (CV = 38.86%). Los valores se distribuyen de manera prácticamente simétrica (As ≈ 0.1), indicando que no existe una concentración marcada hacia valores bajos o altos, y presentan una curtosis ligeramente negativa (K = -0.14), evidenciando una distribución un poco más plana que la normal. Por lo anterior, el comportamiento de la variable Metales Pesados Plomo (µg/L) puede considerarse estable y dentro de rangos adecuados para el análisis de la calidad del agua en China durante el año 2023.