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 = ".")
Temperatura <- datos$Water_Temperature_C

2. Extrancción de la variable

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

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

3. Tabla de distribución de frecuencia

3.1 Construcción manual (Regla de Sturges)

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

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

# Generar límites correctamente
Li <- round(seq(from = minimo, to = maximo, length.out = K), 2)
Ls <- c(Li[-1], round(maximo,2))  # Forzamos que el último límite superior sea el máximo exacto

Mc <- (Li + Ls)/2

ni <- numeric(K)

for (i in 1:K) {
  if (i < K) {
    ni[i] <- sum(Temperatura >= Li[i] & Temperatura < Ls[i])
  } else {
    ni[i] <- sum(Temperatura >= Li[i] & Temperatura <= Ls[i])  # último intervalo incluye máximo
  }
}

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

TDF_Temperatura <- data.frame(Li, Ls, Mc, ni, round(hi,2), Ni_asc, round(Hi_asc,2))
colnames(TDF_Temperatura) <- c("Lim inf","Lim sup","MC","ni","hi(%)","Ni asc","Hi asc(%)")

kable(TDF_Temperatura, align="c",
      caption="Tabla de Frecuencias de la Temperatura del Agua según la Regla de Sturges") %>%
  kable_styling(full_width = FALSE)
Tabla de Frecuencias de la Temperatura del Agua según la Regla de Sturges
Lim inf Lim sup MC ni hi(%) Ni asc Hi asc(%)
3.39 6.42 4.905 11 0.37 11 0.37
6.42 9.46 7.940 31 1.03 42 1.40
9.46 12.49 10.975 136 4.53 178 5.93
12.49 15.53 14.010 359 11.97 537 17.90
15.53 18.56 17.045 619 20.63 1156 38.53
18.56 21.60 20.080 748 24.93 1904 63.47
21.60 24.63 23.115 562 18.73 2466 82.20
24.63 27.67 26.150 353 11.77 2819 93.97
27.67 30.70 29.185 136 4.53 2955 98.50
30.70 33.74 32.220 37 1.23 2992 99.73
33.74 36.77 35.255 7 0.23 2999 99.97
36.77 36.77 36.770 1 0.03 3000 100.00

3.2. Simplificación

La tabla de distribución de frecuencias de la Temperatura 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.

Hist_Temperatura <- hist(Temperatura,
                     breaks = K,
                     plot = FALSE)

Li <- Hist_Temperatura$breaks[-length(Hist_Temperatura$breaks)]
Ls <- Hist_Temperatura$breaks[-1]
ni <- Hist_Temperatura$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
2 4 1 0.03
4 6 9 0.30
6 8 11 0.37
8 10 36 1.20
10 12 84 2.80
12 14 173 5.77
14 16 301 10.03
16 18 400 13.33
18 20 495 16.50
20 22 473 15.77
22 24 386 12.87
24 26 277 9.23
26 28 196 6.53
28 30 87 2.90
30 32 47 1.57
32 34 16 0.53
34 36 5 0.17
36 38 3 0.10

4. Gráficas

4.1 Histograma

hist(Temperatura, breaks = 10,
     main = "Gráfica N°1: Distribución de la Temperatura del Agua
     en el estudio de contaminación del agua
     en China en el año 2023",
     xlab = "Temperatura del Agua (°C)",
     ylab = "Cantidad",
     ylim = c(0, max(ni)),
     col = "lightgreen")

4.2 Histograma general

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

4.3 Histograma Porcentual General

barplot(
  height = TDF_Temperatura$`hi(%)`,
  space = 0,
  col = "skyblue",
  main = "Gráfica N°3: Distribución porcentual de la Temperatura del Agua
  en el estudio de contaminación del agua en China 2023",
  xlab = "Temperatura del Agua (°C)",
  ylab = "Porcentaje (%)",
  names.arg = TDF_Temperatura$MC,
  ylim = c(0,100)
)

5. Diagrama de Caja

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

summary(Temperatura)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    3.39   16.71   19.98   20.05   23.31   36.77

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 = "Temperatura del Agua (°C)",
     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 = "Temperatura del agua (°C)",
     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(Temperatura),2)
mediana <- median(Temperatura)

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

media
## [1] 20.05
mediana
## [1] 19.98
moda
## [1] 20.08

7.2 Indicadores de Dispersión

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

varianza
## [1] 24.23895
sd
## [1] 4.923307
cv
## [1] 24.56

7.3 Indicadores de Forma

library(e1071)

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

asimetria
## [1] 0.03541246
curtosis
## [1] 0.03852477

8. Tabla de Resumen

tabla_indicadores <- data.frame(
  "Variable" = "Temperatura del Agua (°C)",
  "Rango" = paste0("[",min(Temperatura),";",max(Temperatura),"]"),
  "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 Temperatura del Agua (°C)")
Conclusiones de la variable Temperatura del Agua (°C)
Variable Rango X Me Mo V Sd Cv As K
Temperatura del Agua (°C) [3.39;36.77] 20.05 19.98 20.08 24.24 4.92 24.56 0.04 0.04

9. Conclusión

La variable Temperatura del Agua (°C) fluctúa entre 3.39 y 36.77 °C, y sus valores giran en torno a 20.05 °C, con una desviación estándar de 4.92 °C, siendo un conjunto de datos con variabilidad moderada (CV = 24.56%). Los valores se distribuyen de manera prácticamente simétrica (As ≈ 0.04), lo que indica que no existe una concentración marcada hacia temperaturas bajas o altas, y presentan una curtosis cercana a cero (K = 0.04), evidenciando una distribución aproximadamente normal. Por lo anterior, el comportamiento de la variable Temperatura del Agua (°C) puede considerarse estable y representativo para el análisis de la calidad del agua en China durante el año 2023.