1. Carga de Datos

library(dplyr)
## 
## Adjuntando el paquete: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
datos <- read.csv("china_water_pollution_data.csv", header = TRUE, sep = ",", dec = ".")

# Selección de variables
nitratos <- datos$Nitrate_mg_L
calidad_agua <- datos$Water_Quality_Index
datos_sel <- data.frame(nitratos, calidad_agua)

2. Gráfica

plot(
  nitratos,
  calidad_agua,
  main = "Relación entre Nitratos y la calidad del Agua",
  xlab = "Nitratos (mg/L)",
  ylab = "Índice de Calidad del Agua",
  pch = 19,
  col = "lightblue"
)

Esta gráfica muestra todas las observaciones, incluyendo valores atípicos y NA.Se observa dispersión y posibles puntos extremos que podrían distorsionar la regresión.

3. Limpieza de datos y eliminación de valores atípicos

Se eliminan valores faltantes y atípicos para evitar que distorsionen la estimación de la regresión. La limpieza mejora la representación de la tendencia general, manteniendo la variabilidad natural.

# Eliminar NA
datos_sel <- na.omit(datos_sel)

# Función para detectar y eliminar valores atípicos (IQR)
quitar_atipicos_IQR <- function(x) {
  Q1 <- quantile(x, 0.25, na.rm = TRUE)
  Q3 <- quantile(x, 0.75, na.rm = TRUE)
  IQR <- Q3 - Q1
  x >= (Q1 - 1.5 * IQR) & x <= (Q3 + 1.5 * IQR)
}

# Aplicar a ambas variables
datos_limpios <- datos_sel[
  quitar_atipicos_IQR(datos_sel$nitratos) & 
    quitar_atipicos_IQR(datos_sel$calidad_agua),
]

4. Agrupación por intervalos (Bins) y resumen

num_bins <- 4

datos_binned <- datos_limpios %>%
  mutate(
    NO3_BIN = cut(
      nitratos,
      breaks = seq(
        floor(min(nitratos, na.rm = TRUE)),
        ceiling(max(nitratos, na.rm = TRUE)),
        length.out = num_bins + 1
      )
    )
  )

datos_resumen <- datos_binned %>%
  group_by(NO3_BIN) %>%
  summarise(
    NO3_mediana = median(nitratos, na.rm = TRUE),
    Cal_mediana = median(calidad_agua, na.rm = TRUE),
    n = n()
  ) %>%
  filter(!is.na(NO3_mediana) & !is.na(Cal_mediana))

datos_resumen
## # A tibble: 4 × 4
##   NO3_BIN NO3_mediana Cal_mediana     n
##   <fct>         <dbl>       <dbl> <int>
## 1 (0,1]         0.865        49.9    54
## 2 (1,2]         1.66         50.7  1490
## 3 (2,3]         2.32         50.5  1377
## 4 (3,4]         3.1          51.9    57

5. Definir Variable

x <- datos_resumen$NO3_mediana
y <- datos_resumen$Cal_mediana

6. Conjetura

plot(
  x, y,
  pch = 19,
  cex = 1.2,
  col = "darkgreen",
  xlab = "Concentración de nitratos (mg/L)",
  ylab = "Índice de Calidad del Agua",
  main = "Gráfica Nº 3. Relación entre nitratos y el Índice de Calidad del Agua",
  font.main = 2
)

7. Parámetros del modelo

# Modelo de regresión lineal simple
regresion_lineal <- lm(y ~ x)
regresion_lineal
## 
## Call:
## lm(formula = y ~ x)
## 
## Coefficients:
## (Intercept)            x  
##      49.137        0.812
a <- coef(regresion_lineal)[2]  # pendiente
b <- coef(regresion_lineal)[1]  # intercepto

7.1 Ecuación del modelo

plot(1, type = "n", axes = FALSE, xlab = "", ylab = "")
text(
  x = 1, y = 1,
  labels = paste0(
    "Ecuación lineal\n",
    "y = ax + b\n",
    "y = ", round(a, 2), "x + ", round(b, 2)
  ),
  cex = 2,
  col = "blue",
  font = 2
)

### 7.2 Gráfico con recta de regresión

plot(
  x, y,
  col = "deepskyblue",
  pch = 16,
  main = "Gráfica N.º 4: Diagrama de dispersión entre Nitratos y\n el Índice de Calidad del Agua",
  xlab = "Nitratos (mg/L)",
  ylab = "Índice de Calidad del Agua"
)
abline(regresion_lineal, col = "red", lwd = 2)

## 8. Correlación y coeficiente de determinación

r <- cor(x, y, method = "pearson", use = "complete.obs")
r2 <- r^2 * 100

cat("Correlación de Pearson:", round(r, 4), "\n")
## Correlación de Pearson: 0.9189
cat("Coeficiente de determinación:", round(r2, 2), "%\n")
## Coeficiente de determinación: 84.44 %

9. Restricciones del modelo

# Restricciones generales para todo el dominio:
# 1. Concentración de nitratos: x ≥ 0
# 2. Índice de Calidad del Agua: y ≥ 0
# 3. El modelo lineal puede aplicarse para cualquier x ≥ 0, 
# aunque los resultados más confiables se obtienen dentro del rango observado (0.865 ≤ x ≤ 3.10 mg/L)
#Fuera de este rango, el modelo extrapola y puede no reflejar la realidad física o química del agua.

10. Estimación

# Estimación del índice de calidad del agua para nitratos = 2 mg/L
estimacion_NO3_2 <- a * 2 + b
estimacion_NO3_2
##        x 
## 50.76117
plot(1, type = "n", axes = FALSE, xlab = "", ylab = "")
text(
  x = 1, y = 1,
  labels = paste0(
    "Estimación del Índice de Calidad del Agua\n",
    "para nitratos = 2 mg/L\n\n",
    "Resultado = ", round(estimacion_NO3_2, 2)
  ),
  cex = 1.6,
  col = "blue",
  font = 2
)

11. Conclusiones

En la contaminación del agua en China se observa una relación lineal positiva entre la concentración de nitratos y el Índice de Calidad del Agua. El modelo se describe mediante la ecuación:y = 0.81x + 49.14 El modelo explica aproximadamente 84.44 % de la variabilidad del índice de calidad del agua, lo que indica una fuerte asociación entre ambas variables.El porcentaje restante de la variabilidad puede atribuirse a otros factores físicos, químicos y biológicos que no fueron considerados, como la temperatura del agua, oxígeno disuelto o presencia de otros contaminantes.Las restricciones se aplican para todo el dominio natural de la variable: x ≥ 0, y ≥ 0, siendo más confiables dentro del rango observado de los datos. ```