# 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 = ".")

DBO <- na.omit(datos$BOD_mg_L)

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

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

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

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

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

totales <- data.frame(
  `Lim inf`    = "TOTAL",
  `Lim sup`    = "-",
  MC           = "-",
  ni           = sum(ni),
  `hi (%)`     = 100,
  `Ni asc`     = "-",
  `Ni desc`    = "-",
  `Hi asc (%)` = "-",
  `Hi desc (%)`= "-"
)

TDFDBO_total <- rbind(TDFDBO, totales)

# ============================================================
# TABLA N°1
# ============================================================
kable(TDFDBO_total, align = "c",
      caption = "Tabla N°1: Tabla de distribución de frecuencias de la Demanda bioquímica de oxígeno (mg/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 la Demanda bioquímica de oxígeno (mg/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….
0 1 0.5 4 0.13 4 3000 0.13 100
1 2 1.5 58 1.93 62 2996 2.07 99.87
2 3 2.5 430 14.33 492 2938 16.4 97.93
3 4 3.5 977 32.57 1469 2508 48.97 83.6
4 5 4.5 1010 33.67 2479 1531 82.63 51.03
5 6 5.5 446 14.87 2925 521 97.5 17.37
6 7 6.5 75 2.50 3000 75 100 2.5
TOTAL
3000 100.00
# ============================================================
# GRÁFICA N°1
# ============================================================
hist(DBO, breaks = Hist_DBO$breaks,
     main = "Gráfica N°1: Distribución de la Demanda bioquímica de oxígeno (mg/L)
en el estudio de contaminación del agua en China en el año 2023",
     xlab = "Demanda bioquímica de oxígeno (mg/L)",
     ylab = "Cantidad de muestras",
     col = "pink",
     xaxt = "n")
axis(1, at = Hist_DBO$breaks,
     labels = round(Hist_DBO$breaks, 3), las = 1)

# ============================================================
# TABLA N°2
# ============================================================
kable(TDFDBO_total, align = "c",
      caption = "Tabla N°2: Tabla de distribución de frecuencias de la Demanda bioquímica de oxígeno (mg/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 la Demanda bioquímica de oxígeno (mg/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….
0 1 0.5 4 0.13 4 3000 0.13 100
1 2 1.5 58 1.93 62 2996 2.07 99.87
2 3 2.5 430 14.33 492 2938 16.4 97.93
3 4 3.5 977 32.57 1469 2508 48.97 83.6
4 5 4.5 1010 33.67 2479 1531 82.63 51.03
5 6 5.5 446 14.87 2925 521 97.5 17.37
6 7 6.5 75 2.50 3000 75 100 2.5
TOTAL
3000 100.00
# ============================================================
# GRÁFICA N°2
# ============================================================
hist(DBO, breaks = Hist_DBO$breaks,
     main = "Gráfica N°2: Distribución global de la Demanda bioquímica de oxígeno (mg/L)
en el estudio de contaminación del agua en China en el año 2023",
     xlab = "Demanda bioquímica de oxígeno (mg/L)",
     ylab = "Cantidad de muestras",
     col = "pink",
     xaxt = "n")
axis(1, at = Hist_DBO$breaks,
     labels = round(Hist_DBO$breaks, 3), las = 1)

# ============================================================
# GRÁFICA N°3
# ============================================================
hist(DBO, breaks = Hist_DBO$breaks,
     main = "Gráfica N°3: Distribución comparativa de la Demanda bioquímica de oxígeno (mg/L)
en el estudio de contaminación del agua en China en el año 2023",
     xlab = "Demanda bioquímica de oxígeno (mg/L)",
     ylab = "Cantidad de muestras",
     col = "green",
     xaxt = "n")
axis(1, at = Hist_DBO$breaks,
     labels = round(Hist_DBO$breaks, 3), las = 1)

# ============================================================
# GRÁFICA N°4
# ============================================================
hist(DBO, breaks = Hist_DBO$breaks,
     main = "Gráfica N°4: Distribución local de frecuencia de la Demanda bioquímica de oxígeno (mg/L)
en el estudio de contaminación del agua en China en el año 2023",
     xlab = "Demanda bioquímica de oxígeno (mg/L)",
     ylab = "Cantidad de muestras",
     col = "purple",
     xaxt = "n")
axis(1, at = Hist_DBO$breaks,
     labels = round(Hist_DBO$breaks, 3), las = 1)

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

barplot(round(hi * 100, 2),
        names.arg = intervalos,
        col = "lightblue",
        main = "Gráfica N°5: Distribución porcentual de la Demanda bioquímica de oxígeno (mg/L)
en el estudio de contaminación del agua en China en el año 2023",
        xlab = "Intervalos de demanda bioquímica de oxígeno (mg/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 la Demanda bioquímica de oxígeno (mg/L)
en el estudio de contaminación del agua en China en el año 2023",
     xlab = "Demanda bioquímica de oxígeno (mg/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 * 100, type = "o",
     main = "Gráfica N°7: Distribución porcentual acumulada de la Demanda bioquímica de oxígeno (mg/L)
en el estudio de contaminación del agua en China en el año 2023",
     xlab = "Demanda bioquímica de oxígeno (mg/L)",
     ylab = "Porcentaje acumulado (%)",
     col = "blue",
     xaxt = "n")
lines(Ls, Hi_desc * 100, col = "red", type = "o")
axis(1, at = Li, labels = round(Li,3), las = 1)

# ============================================================
# GRÁFICA N°8
# ============================================================
boxplot(DBO, horizontal = TRUE,
        main = "Gráfica N°8: Diagrama de caja de la Demanda bioquímica de oxígeno (mg/L)
en el estudio de contaminación del agua en China en el año 2023",
        xlab = "Demanda bioquímica de oxígeno (mg/L)",
        col = "purple")

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

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

out <- boxplot.stats(DBO)$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 = "Demanda bioquímica de oxígeno (mg/L)",
  Rango = paste0("[",round(min(DBO),3)," ; ",round(max(DBO),3),"]"),
  X = media,
  Me = mediana,
  Mo = moda,
  V = varianza,
  Sd = sd_dbo,
  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 Demanda bioquímica de oxígeno (mg/L)*")
  )
Tabla N°3
Indicadores estadísticos de la variable Demanda bioquímica de oxígeno (mg/L)
Variable Rango X Me Mo V Sd Cv As K Valores_Atipicos
Demanda bioquímica de oxígeno (mg/L) [0.68 ; 6.97] 4.015 4.03 4.5 1.0118 1.006 25.06 -0.04 -0.16 13 valores atípicos