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 = ".")
Fosforo<- datos$Total_Phosphorus_mg_L

2. Extracción de la variable

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

n <- length(Fosforo)
n
## [1] 2933

3. Tabla de distribución de frecuencia

3.1 Construcción manual (Regla de Sturges)

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

kable(TDF_Fosforo, 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: 2933
Lím. Inf. Lím. Sup. MC ni hi (%) Ni Asc. Hi Asc. (%)
-0.010 0.015 0.002 58 1.977 58 1.977
0.015 0.039 0.027 209 7.126 267 9.103
0.039 0.064 0.051 356 12.138 623 21.241
0.064 0.088 0.076 544 18.548 1167 39.789
0.088 0.113 0.100 525 17.900 1692 57.688
0.113 0.137 0.125 507 17.286 2199 74.974
0.137 0.162 0.149 407 13.877 2606 88.851
0.162 0.186 0.174 196 6.683 2802 95.534
0.186 0.211 0.198 96 3.273 2898 98.807
0.211 0.235 0.223 30 1.023 2928 99.830
0.235 0.260 0.247 4 0.136 2932 99.966
0.260 0.284 0.272 1 0.034 2933 100.000

3.2. Simplificación

La tabla de distribución de frecuencia de la Cantidad de Fosforo 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_Fosforo <- hist(Fosforo, breaks = rango_ajustado, plot = FALSE)

TDF_simplificada <- data.frame(
  Lim_inf = round(Hist_Fosforo$breaks[-length(Hist_Fosforo$breaks)], 2),
  Lim_sup = round(Hist_Fosforo$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 0.01 58 1.98
0.01 0.04 209 7.13
0.04 0.06 356 12.14
0.06 0.09 544 18.55
0.09 0.11 525 17.90
0.11 0.14 507 17.29
0.14 0.16 407 13.88
0.16 0.19 196 6.68
0.19 0.21 96 3.27
0.21 0.24 30 1.02
0.24 0.26 4 0.14
0.26 0.28 1 0.03

4. Gráficas

4.1 Histograma

hist(Fosforo, breaks = rango_ajustado,
     main = "Gráfica N°1: Distribución del Fosforo Total en el estudio de cntaminación del agua en China 2023",
     xlab = "Fosforo Total (mg/L)", ylab = "Cantidad",
     col = "lightgreen")

4.2 Histograma general

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

4.3 Histograma Porcentual General

barplot(height = TDF_Fosforo$hi, space = 0, col = "skyblue",
  main = "Gráfica N°3: Distribución porcentual del Fosforo Total en el estudio de contaminación del agua en China 2023",
  xlab = "Fosforo Total (mg/L)", ylab = "Porcentaje (%)",
  names.arg = round(TDF_Fosforo$MC, 2))

5. Diagrama de Caja

boxplot(Fosforo, horizontal = TRUE, col = "green",
        main = "Gráfica N°6: Diagrama de caja del Fosforo Total en el estudio de contaminación de agua en China 2023",
        xlab = "Fosforo Total (mg/L)")

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 = "Fosoforo Total (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 Descendentes (hi)

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

plot(Ls, Hi_asc,
     type = "o",
     col = "blue",
     lwd = 3,
     xlab = "Fosforo Total (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(Fosforo),2)
mediana <- median(Fosforo)

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

media
## [1] 0.1
mediana
## [1] 0.103
moda
## [1] 0.07575

7.2 Indicadores de Dispersión

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

varianza
## [1] 0.002225398
sd
## [1] 0.04717412
cv
## [1] 47.17

7.3 Indicadores de Forma

library(e1071)

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

asimetria
## [1] 0.1526563
curtosis
## [1] -0.4317485

8. Tabla de Resumen

tabla_indicadores <- data.frame(
  "Variable" = "Fosforo Total (mg/L)",
  "Rango" = paste0("[",min(Fosforo),";",max(Fosforo),"]"),
  "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 Fosforo Total")
Conclusiones de la variable Fosforo Total
Variable Rango X Me Mo V Sd Cv As K
Fosforo Total (mg/L) [0;0.274] 0.1 0.1 0.07575 0 0.05 47.17 0.15 -0.43

9. Conclusión

La variable Fósforo Total (mg/L) fluctúa entre 0 y 0.274 mg/L, y sus valores giran en torno a 0.1 mg/L, con una desviación estándar de 0.05 mg/L, siendo un conjunto de datos con variabilidad moderada-alta (CV = 47.17%). Los valores se distribuyen de manera ligeramente asimétrica hacia valores mayores (As ≈ 0.15), indicando que existen algunos registros más altos en comparación con la media, y presentan una curtosis negativa (K = -0.43), evidenciando una distribución más plana que la normal. Por lo anterior, el comportamiento de la variable Fósforo Total (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.