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 = ".")
Calidad<- datos$Water_Quality_Index

2. Extracción de la variable

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

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

3. Tabla de distribución de frecuencia

3.1 Construcción manual (Regla de Sturges)

minimo <- min(Calidad)
maximo <- max(Calidad)
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(Calidad, 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_Calidad <- data.frame(
  Lim_inf = Li,
  Lim_sup = Ls,
  MC = Mc,
  ni = ni,
  hi = hi,
  Ni_asc = Ni_asc,
  Hi_asc = Hi_asc
)

kable(TDF_Calidad, 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: 3000
Lím. Inf. Lím. Sup. MC ni hi (%) Ni Asc. Hi Asc. (%)
-0.010 8.321 4.155 257 8.567 257 8.567
8.321 16.652 12.486 251 8.367 508 16.933
16.652 24.983 20.817 253 8.433 761 25.367
24.983 33.313 29.148 228 7.600 989 32.967
33.313 41.644 37.479 232 7.733 1221 40.700
41.644 49.975 45.810 260 8.667 1481 49.367
49.975 58.306 54.140 250 8.333 1731 57.700
58.306 66.637 62.471 266 8.867 1997 66.567
66.637 74.968 70.802 250 8.333 2247 74.900
74.968 83.298 79.133 240 8.000 2487 82.900
83.298 91.629 87.464 257 8.567 2744 91.467
91.629 99.960 95.795 256 8.533 3000 100.000

3.2. Simplificación

La tabla de distribución de frecuencia del Indice de la calidad del agua 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_Calidad <- hist(Calidad, breaks = rango_ajustado, plot = FALSE)

TDF_simplificada <- data.frame(
  Lim_inf = round(Hist_Calidad$breaks[-length(Hist_Calidad$breaks)], 2),
  Lim_sup = round(Hist_Calidad$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.01 8.32 257 8.57
8.32 16.65 251 8.37
16.65 24.98 253 8.43
24.98 33.31 228 7.60
33.31 41.64 232 7.73
41.64 49.98 260 8.67
49.98 58.31 250 8.33
58.31 66.64 266 8.87
66.64 74.97 250 8.33
74.97 83.30 240 8.00
83.30 91.63 257 8.57
91.63 99.96 256 8.53

4. Gráficas

4.1 Histograma

hist(Calidad, breaks = rango_ajustado,
     main = "Gráfica N°1: Distribución del Indice de Calidad del Agua en el estudio de cntaminación del agua en China 2023",
     xlab = "Indice de la calidad del Agua", ylab = "Cantidad",
     col = "lightgreen")

4.2 Histograma general

hist(Calidad, breaks = 10,
     main = "Gráfica N°2: Distribución general del Indice de la Calidad del Agua
     en el estudio de contaminación del agua en China 2023",
     xlab = "Indice de la calidad del Agua",
     ylab = "Cantidad",
     ylim = c(0, max(ni)),
     col = "lightgreen")

4.3 Histograma Porcentual General

barplot(height = TDF_Calidad$hi, space = 0, col = "skyblue",
  main = "Gráfica N°3: Distribución porcentual del Indice de la Calidad del Agua en el estudio de contaminación del agua en China 2023",
  xlab = "Indice de la calidad del Agua", ylab = "Porcentaje (%)",
  names.arg = round(TDF_Calidad$MC, 2))

5. Diagrama de Caja

boxplot(Calidad, horizontal = TRUE, col = "green",
        main = "Gráfica N°6: Diagrama de caja del Indice de la Calidad del Agua en el estudio de contaminación de agua en China 2023",
        xlab = "Indice de la calidad del Agua")

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 = "Indice de la calidad del Agua",
     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 = "Indice de la calidad del Agua",
     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(Calidad),2)
mediana <- median(Calidad)

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

media
## [1] 50.26
mediana
## [1] 50.6
moda
## [1] 62.47125

7.2 Indicadores de Dispersión

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

varianza
## [1] 847.1381
sd
## [1] 29.10564
cv
## [1] 57.91

7.3 Indicadores de Forma

library(e1071)

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

asimetria
## [1] -0.01243507
curtosis
## [1] -1.202119

8. Tabla de Resumen

tabla_indicadores <- data.frame(
  "Variable" = "Indice de la calidad del Agua",
  "Rango" = paste0("[",min(Calidad),";",max(Calidad),"]"),
  "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 Indice de la calidad del Agua")
Conclusiones de la variable Indice de la calidad del Agua
Variable Rango X Me Mo V Sd Cv As K
Indice de la calidad del Agua [0;99.95] 50.26 50.6 62.47125 847.14 29.11 57.91 -0.01 -1.2

9. Conclusión

La variable Índice de la Calidad del Agua fluctúa entre 0 y 99.95, y sus valores giran en torno a 50.26, con una desviación estándar de 29.11, siendo un conjunto de datos con variabilidad alta (CV = 57.91%). Los valores se distribuyen de manera prácticamente simétrica (As ≈ -0.01), indicando que no existe una concentración marcada hacia valores bajos o altos, y presentan una curtosis negativa (K = -1.2), evidenciando una distribución más plana que la normal. Por lo anterior, el comportamiento del Índice de la Calidad del Agua puede considerarse representativo del estado general del agua y útil para la evaluación de la calidad del agua en China durante el año 2023.