# 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
Fosforo <- na.omit(Fosforo)
Fosforo <- Fosforo[Fosforo >= 0]
n <- length(Fosforo)
n
## [1] 2933
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"))
| 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 |
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)
| 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 |
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")
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")
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))
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)")
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)
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)
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
varianza <- var(Fosforo)
sd <- sd(Fosforo)
cv <- round((sd/media)*100,2)
varianza
## [1] 0.002225398
sd
## [1] 0.04717412
cv
## [1] 47.17
library(e1071)
asimetria <- skewness(Fosforo, type = 2)
curtosis <- kurtosis(Fosforo)
asimetria
## [1] 0.1526563
curtosis
## [1] -0.4317485
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")
| 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 |
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.