# 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
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
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)
| 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 |
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()")
| 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 |
# 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)
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)
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)
)
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)
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)
)
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
# 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)
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)
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
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
library(e1071)
asimetria <- skewness(Oxigeno_Disuelto, type = 2)
curtosis <- kurtosis(Oxigeno_Disuelto)
asimetria
## [1] 0.005597006
curtosis
## [1] -0.1355801
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)")
| 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 |
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.