# LIBRERÍAS
# -----------------------------
library(knitr)
library(kableExtra)
library(e1071)
library(dplyr)
## 
## Attaching package: '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(gt)

# -----------------------------
# CARGA DE DATOS
# -----------------------------
datos <- read.csv("china_water_pollution_data.csv",
                  header = TRUE, sep = ",", dec = ".")

# Extraer y convertir a numérico (robusto)
Plomo_raw <- datos$Heavy_Metals_Pb_ug_L
Plomo_raw <- as.character(Plomo_raw)
Plomo_raw <- gsub(",", ".", Plomo_raw)

Plomo <- suppressWarnings(as.numeric(Plomo_raw))
Plomo <- na.omit(Plomo)

if (length(Plomo) == 0) {
  stop(paste0(
    "La columna 'Heavy_Metals_Pb_ug_L' no tiene valores numéricos válidos.\n",
    "Ejemplos de valores (primeros 20):\n",
    paste(head(unique(Plomo_raw), 20), collapse = " | ")
  ))
}

# -----------------------------
# TABLA DE FRECUENCIAS (K = 8)
# -----------------------------
K <- 8
Hist_Plomo <- hist(Plomo, breaks = K, plot = FALSE)

Li <- Hist_Plomo$breaks[-length(Hist_Plomo$breaks)]
Ls <- Hist_Plomo$breaks[-1]
ni <- Hist_Plomo$counts
Mc <- Hist_Plomo$mids

n <- sum(ni)
hi <- (ni / n) * 100

Ni_asc  <- cumsum(ni)
Hi_asc  <- cumsum(hi)
Ni_desc <- rev(cumsum(rev(ni)))
Hi_desc <- rev(cumsum(rev(hi)))

TDFPlomo <- data.frame(
  `Lim inf`    = round(Li, 3),
  `Lim sup`    = round(Ls, 3),
  MC           = round(Mc, 3),
  ni           = ni,
  `hi (%)`     = round(hi, 2),
  `Ni asc`     = Ni_asc,
  `Ni desc`    = Ni_desc,
  `Hi asc (%)` = round(Hi_asc, 2),
  `Hi desc (%)`= round(Hi_desc, 2),
  check.names = FALSE
)

# Fila TOTAL (100 exacto)
totales <- as.data.frame(as.list(rep("-", ncol(TDFPlomo))), stringsAsFactors = FALSE)
names(totales) <- names(TDFPlomo)
totales[1, "Lim inf"] <- "TOTAL"
totales[1, "ni"]      <- sum(TDFPlomo$ni)
totales[1, "hi (%)"]  <- 100

TDFPlomo_total <- rbind(TDFPlomo, totales)

# ============================================================
# TABLA N°1
# ============================================================
kable(TDFPlomo_total, align = "c",
      caption = "Tabla N°1: Tabla de distribución de frecuencias de los metales pesados: Plomo (µg/L) en el estudio de contaminación del agua en China en el año 2023") %>%
  kable_styling(full_width = FALSE, position = "center",
                bootstrap_options = c("striped","hover","condensed"))
Tabla N°1: Tabla de distribución de frecuencias de los metales pesados: Plomo (µg/L) en el estudio de contaminación del agua en China en el año 2023
Lim inf Lim sup MC ni hi (%) Ni asc Ni desc Hi asc (%) Hi desc (%)
-4 -2 -3 1 0.03 1 3000 0.03 100
-2 0 -1 26 0.87 27 2999 0.9 99.97
0 2 1 185 6.17 212 2973 7.07 99.1
2 4 3 718 23.93 930 2788 31 92.93
4 6 5 1152 38.4 2082 2070 69.4 69
6 8 7 720 24 2802 918 93.4 30.6
8 10 9 183 6.1 2985 198 99.5 6.6
10 12 11 14 0.47 2999 15 99.97 0.5
12 14 13 1 0.03 3000 1 100 0.03
TOTAL
3000 100
# ============================================================
# GRÁFICA N°1
# ============================================================
hist(Plomo, breaks = Hist_Plomo$breaks,
     main = "Gráfica N°1: Distribución de los metales pesados: Plomo (µg/L)\nen el estudio de contaminación del agua en China en el año 2023",
     xlab = "Concentración de Plomo (µg/L)",
     ylab = "Cantidad de muestras",
     col = "pink",
     xaxt = "n")
axis(1, at = Hist_Plomo$breaks,
     labels = round(Hist_Plomo$breaks, 3), las = 1)

# ============================================================
# TABLA N°2
# ============================================================
kable(TDFPlomo_total, align = "c",
      caption = "Tabla N°2: Tabla de distribución de frecuencias de los metales pesados: Plomo (µg/L) posterior a la representación gráfica en el estudio de contaminación del agua en China en el año 2023") %>%
  kable_styling(full_width = FALSE, position = "center",
                bootstrap_options = c("striped","hover","condensed"))
Tabla N°2: Tabla de distribución de frecuencias de los metales pesados: Plomo (µg/L) posterior a la representación gráfica en el estudio de contaminación del agua en China en el año 2023
Lim inf Lim sup MC ni hi (%) Ni asc Ni desc Hi asc (%) Hi desc (%)
-4 -2 -3 1 0.03 1 3000 0.03 100
-2 0 -1 26 0.87 27 2999 0.9 99.97
0 2 1 185 6.17 212 2973 7.07 99.1
2 4 3 718 23.93 930 2788 31 92.93
4 6 5 1152 38.4 2082 2070 69.4 69
6 8 7 720 24 2802 918 93.4 30.6
8 10 9 183 6.1 2985 198 99.5 6.6
10 12 11 14 0.47 2999 15 99.97 0.5
12 14 13 1 0.03 3000 1 100 0.03
TOTAL
3000 100
# ============================================================
# GRÁFICA N°2
# ============================================================
hist(Plomo, breaks = Hist_Plomo$breaks,
     main = "Gráfica N°2: Distribución global de los metales pesados: Plomo (µg/L)\nen el estudio de contaminación del agua en China en el año 2023",
     xlab = "Concentración de Plomo (µg/L)",
     ylab = "Cantidad de muestras",
     col = "pink",
     xaxt = "n")
axis(1, at = Hist_Plomo$breaks,
     labels = round(Hist_Plomo$breaks, 3), las = 1)

# ============================================================
# GRÁFICA N°3
# ============================================================
hist(Plomo, breaks = Hist_Plomo$breaks,
     main = "Gráfica N°3: Distribución comparativa de los metales pesados: Plomo (µg/L)\nen el estudio de contaminación del agua en China en el año 2023",
     xlab = "Concentración de Plomo (µg/L)",
     ylab = "Cantidad de muestras",
     col = "green",
     xaxt = "n")
axis(1, at = Hist_Plomo$breaks,
     labels = round(Hist_Plomo$breaks, 3), las = 1)

# ============================================================
# GRÁFICA N°4
# ============================================================
hist(Plomo, breaks = Hist_Plomo$breaks,
     main = "Gráfica N°4: Distribución local de frecuencia de los metales pesados: Plomo (µg/L)\nen el estudio de contaminación del agua en China en el año 2023",
     xlab = "Concentración de Plomo (µg/L)",
     ylab = "Cantidad de muestras",
     col = "purple",
     xaxt = "n")
axis(1, at = Hist_Plomo$breaks,
     labels = round(Hist_Plomo$breaks, 3), las = 1)

# ============================================================
# GRÁFICA N°5
# ============================================================
intervalos <- paste0("[", round(Li,3), " - ", round(Ls,3), ")")

barplot(round(hi, 2),
        names.arg = intervalos,
        col = "lightblue",
        main = "Gráfica N°5: Distribución porcentual de los metales pesados: Plomo (µg/L)\nen el estudio de contaminación del agua en China en el año 2023",
        xlab = "Intervalos de concentración de Plomo (µg/L)",
        ylab = "Porcentaje (%)",
        las = 2,
        cex.names = 0.7)

# ============================================================
# GRÁFICA N°6
# ============================================================
plot(Li, Ni_asc, type = "o",
     main = "Gráfica N°6: Distribución de frecuencias acumuladas de los metales pesados: Plomo (µg/L)\nen el estudio de contaminación del agua en China en el año 2023",
     xlab = "Concentración de Plomo (µg/L)",
     ylab = "Frecuencia acumulada",
     col = "orange",
     xaxt = "n")
lines(Ls, Ni_desc, col = "green", type = "o")
axis(1, at = Li, labels = round(Li,3), las = 1)

# ============================================================
# GRÁFICA N°7
# ============================================================
plot(Li, Hi_asc, type = "o",
     main = "Gráfica N°7: Distribución porcentual acumulada de los metales pesados: Plomo (µg/L)\nen el estudio de contaminación del agua en China en el año 2023",
     xlab = "Concentración de Plomo (µg/L)",
     ylab = "Porcentaje acumulado (%)",
     col = "blue",
     xaxt = "n")
lines(Ls, Hi_desc, col = "red", type = "o")
axis(1, at = Li, labels = round(Li,3), las = 1)

# ============================================================
# GRÁFICA N°8
# ============================================================
boxplot(Plomo, horizontal = TRUE,
        main = "Gráfica N°8: Diagrama de caja de los metales pesados: Plomo (µg/L)\nen el estudio de contaminación del agua en China en el año 2023",
        xlab = "Concentración de Plomo (µg/L)",
        col = "purple")

# ============================================================
# TABLA N°3: INDICADORES ESTADÍSTICOS
# ============================================================
media    <- round(mean(Plomo), 3)
mediana  <- round(median(Plomo), 3)
varianza <- round(var(Plomo), 4)
sd_pb    <- round(sd(Plomo), 3)
cv       <- round((sd_pb / mean(Plomo)) * 100, 2)
asim     <- round(skewness(Plomo, type = 2), 2)
curt     <- round(kurtosis(Plomo), 2)

max_frec <- max(TDFPlomo$ni)
moda     <- paste(TDFPlomo$MC[TDFPlomo$ni == max_frec], collapse = ", ")

out <- boxplot.stats(Plomo)$out
val_atip <- ifelse(length(out)==0,
                   "No hay presencia de valores atípicos",
                   paste(length(out), "valores atípicos"))

tabla_indicadores <- data.frame(
  Variable = "Metales pesados: Plomo (µg/L)",
  Rango = paste0("[", round(min(Plomo),3), " ; ", round(max(Plomo),3), "]"),
  X = media,
  Me = mediana,
  Mo = moda,
  V = varianza,
  Sd = sd_pb,
  Cv = cv,
  As = asim,
  K = curt,
  Valores_Atipicos = val_atip
)

tabla_indicadores %>%
  gt() %>%
  tab_header(
    title = md("Tabla N°3"),
    subtitle = md("*Indicadores estadísticos de la variable Metales pesados: Plomo (µg/L)*")
  )
Tabla N°3
Indicadores estadísticos de la variable Metales pesados: Plomo (µg/L)
Variable Rango X Me Mo V Sd Cv As K Valores_Atipicos
Metales pesados: Plomo (µg/L) [-2.94 ; 12.61] 4.979 4.985 5 4.07 2.017 40.51 -0.04 0.07 16 valores atípicos