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 = ".")
Oxigeno_Disuelto <- datos$Dissolved_Oxygen_mg_L

2. Extrancción de la variable

Oxigeno_disuelto <- datos$Dissolved_Oxygen_mg_L
Oxigeno_disuelto <- na.omit(Oxigeno_disuelto)
Oxigeno_disuelto <- Oxigeno_disuelto[Oxigeno_disuelto >= 0]

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

3. Tabla de distribución de frecuencia

3.1 Construcción manual (Regla de Sturges)

minimo <- min(Oxigeno_disuelto)
maximo <- max(Oxigeno_disuelto)

R <- maximo - minimo
K <- floor(1 + 3.322 * log10(n))
A <- R / K

Li <- round(seq(from = minimo, to = maximo - A, by = A),2)
Ls <- round(seq(from = minimo + A, to = maximo, by = A),2)
Mc <- (Li + Ls)/2

ni <- numeric(K)

for (i in 1:K) {
  if (i < K) {
    ni[i] <- sum(Oxigeno_disuelto >= Li[i] & Oxigeno_disuelto < Ls[i])
  } else {
    ni[i] <- sum(Oxigeno_disuelto >= Li[i] & Oxigeno_disuelto <= Ls[i])
  }
}

hi <- ni/sum(ni)*100
Ni_asc <- cumsum(ni)
Hi_asc <- cumsum(hi)

TDF_Oxigeno <- data.frame(Li, Ls, Mc, ni, round(hi,2), Ni_asc, round(Hi_asc,2))

colnames(TDF_Oxigeno) <- c("Lim inf","Lim sup","MC","ni","hi(%)","Ni asc","Hi asc(%)")

kable(TDF_Oxigeno, align="c",
      caption="Tabla de Frecuencias del Oxígeno Disuelto (mg/L) según la Regla de Sturges") %>%
  kable_styling(full_width = FALSE)
Tabla de Frecuencias del Oxígeno Disuelto (mg/L) según la Regla de Sturges
Lim inf Lim sup MC ni hi(%) Ni asc Hi asc(%)
1.47 2.55 2.010 6 0.20 6 0.20
2.55 3.64 3.095 30 1.00 36 1.20
3.64 4.72 4.180 114 3.80 150 5.01
4.72 5.81 5.265 247 8.24 397 13.25
5.81 6.89 6.350 470 15.68 867 28.93
6.89 7.98 7.435 608 20.29 1475 49.22
7.98 9.06 8.520 629 20.99 2104 70.20
9.06 10.15 9.605 467 15.58 2571 85.79
10.15 11.23 10.690 274 9.14 2845 94.93
11.24 12.32 11.780 110 3.67 2955 98.60
12.32 13.40 12.860 33 1.10 2988 99.70
13.40 14.49 13.945 9 0.30 2997 100.00

3.2. Simplificación

La tabla de distribución de frecuencias del Oxígeno Disuelto (mg/L) 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.

#Para realizar esta simplificación se utiliza hist()
Hist_Oxigeno <- hist(Oxigeno_disuelto,
                     breaks = K,
                     plot = FALSE)

Li <- Hist_Oxigeno$breaks[-length(Hist_Oxigeno$breaks)]
Ls <- Hist_Oxigeno$breaks[-1]
ni <- Hist_Oxigeno$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 2 4 0.13
2 3 8 0.27
3 4 47 1.57
4 5 144 4.80
5 6 269 8.97
6 7 458 15.27
7 8 559 18.63
8 9 589 19.63
9 10 453 15.10
10 11 276 9.20
11 12 136 4.53
12 13 43 1.43
13 14 11 0.37
14 15 3 0.10

4. Gráficas

4.1 Histograma

# Histograma
hist(Oxigeno_Disuelto, breaks = 10,
     main = "Gráfica N°1: Distribución del Oxígeno Disuelto
     en el estudio de contaminación del agua
     en China en el año 2023",
     xlab = "Oxígeno Disuelto (mg/L)",
     ylab = "Cantidad",
     ylim = c(0, max(ni)),
     col = "lightblue",
     cex.main = 1.3,
     cex.lab = 1,
     cex.axis = 0.9,
     xaxt = "n")

axis(1,
     at = Hist_Oxigeno$breaks,
     labels = round(Hist_Oxigeno$breaks,2),
     las = 1,
     cex.axis = 0.9)

4.2 Histograma general

hist(Oxigeno_Disuelto, breaks = 10,
     main = "Gráfica N°2: Distribución general del Oxígeno Disuelto
     en el estudio de contaminación del agua en China 2023",
     xlab = "Oxígeno Disuelto (mg/L)",
     ylab = "Cantidad",
     ylim = c(0, max(ni)),
     col = "lightblue",
     cex.main = 1.3,
     cex.lab = 1,
     cex.axis = 0.9,
     xaxt = "n",
     yaxt = "n")

axis(1,
     at = Hist_Oxigeno$breaks,
     labels = round(Hist_Oxigeno$breaks,2),
     las = 1)

axis(2,
     at = seq(0, max(ni), by = 500),
     las = 1)

4.3 Histograma Porcentual General

barplot(
  height = TDF_Oxigeno$hi,
  space = 0,
  col = "skyblue",
  main = "Gráfica N°3: Distribución porcentual del Oxígeno Disuelto
  en el estudio de contaminación del agua en China 2023",
  xlab = "Oxígeno Disuelto (mg/L)",
  ylab = "Porcentaje (%)",
  names.arg = TDF_Oxigeno$MC,
  ylim = c(0,100)
)

4.4 Histograma por sector de estudio

hist(Oxigeno_Disuelto, breaks = 10,
     main = "Gráfica N°4: Distribución del Oxígeno Disuelto
     por sector de estudio en China 2023",
     xlab = "Oxígeno Disuelto (mg/L)",
     ylab = "Cantidad",
     ylim = c(0,max(ni)),
     col = "purple",
     cex.main = 1.3,
     cex.lab = 1,
     cex.axis = 0.9,
     xaxt = "n")

axis(1,
     at = Hist_Oxigeno$breaks,
     labels = round(Hist_Oxigeno$breaks,2),
     las = 1)

4.5 Histograma Porcentual por sector de estudio

barplot(
  height = TDF_Oxigeno$hi,
  space = 0,
  col = "skyblue",
  main = "Gráfica N°5: Distribución porcentual del Oxígeno Disuelto
  por sector de estudio en China 2023",
  xlab = "Oxígeno Disuelto (mg/L)",
  ylab = "Porcentaje (%)",
  names.arg = TDF_Oxigeno$MC,
  ylim = c(0,40)
)

5. Diagrama de Caja

boxplot(Oxigeno_Disuelto,
        horizontal = TRUE,
        main = "Gráfica N°6: Diagrama de caja del Oxígeno Disuelto
        en el estudio de contaminación del agua en China 2023",
        xlab = "Oxígeno Disuelto (mg/L)",
        col = "purple",
        outline = TRUE,
        pch = 1)

summary(Oxigeno_Disuelto)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   1.470   6.657   8.030   8.007   9.352  14.490

6. Ojivas

6.1 Ojivas Ascendentes y Descendentes (ni)

# Usamos la frecuencia ni ya creada
Ni_asc <- cumsum(ni)
Ni_desc <- rev(cumsum(rev(ni)))

plot(Ls, Ni_asc,
     type = "o",
     col = "orange",
     lwd = 3,
     xlab = "Oxígeno Disuelto (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 Descentes (hi)

Hi_asc <- cumsum(hi)
Hi_desc <- rev(cumsum(rev(hi)))

plot(Ls, Hi_asc,
     type = "o",
     col = "blue",
     lwd = 3,
     xlab = "Oxígeno Disuelto (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(Oxigeno_Disuelto),2)
mediana <- median(Oxigeno_Disuelto)

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

media
## [1] 8.01
mediana
## [1] 8.03
moda
## [1] 8.52

7.2 Indicadores de Dispersión

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

varianza
## [1] 3.898718
sd
## [1] 1.974517
cv
## [1] 24.65

7.3 Indicadores de Forma

library(e1071)

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

asimetria
## [1] 0.005597006
curtosis
## [1] -0.1355801

8. Tabla de Resumen

tabla_indicadores <- data.frame(
  "Variable" = "Oxígeno Disuelto (mg/L)",
  "Rango" = paste0("[",min(Oxigeno_Disuelto),";",max(Oxigeno_Disuelto),"]"),
  "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)
)

library(knitr)
kable(tabla_indicadores, align='c',
      caption="Conclusiones de la variable Oxígeno Disuelto (mg/L)")
Conclusiones de la variable Oxígeno Disuelto (mg/L)
Variable Rango X Me Mo V Sd Cv As K
Oxígeno Disuelto (mg/L) [1.47;14.49] 8.01 8.03 8.52 3.9 1.97 24.65 0.01 -0.14

9. Conclusión

La variable Oxígeno Disuelto (mg/L) fluctúa entre 1.47 y 14.49, y sus valores giran en torno a 8.01 mg/L, con una desviación estándar de 1.97, siendo un conjunto de datos con variabilidad moderada (CV = 24.65%).Los valores se distribuyen de manera prácticamente simétrica (As ≈ 0.01), lo que indica que no existe una concentración marcada hacia valores altos o bajos, y presentan una curtosis ligeramente negativa (K = -0.14), evidenciando una distribución ligeramente más plana que la normal.Por lo anterior, el comportamiento del Oxígeno Disuelto (mg/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.