library(dplyr)
## Warning: package 'dplyr' was built under R version 4.5.2
## 
## 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
# ================================
# 1. Cargar datos
# ================================
setwd("C:/Users/LENOVO/OneDrive/Escritorio/ESTADISTICA")
datos <- read.csv("china_water_pollution_data.csv")

nitratos <- datos$Nitrate_mg_L
calidad_agua <- datos$Water_Quality_Index

datos_sel <- data.frame(nitratos, calidad_agua)


# 2.
datos_sel <- na.omit(datos_sel)
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)
}

datos_limpios <- datos_sel[
  quitar_atipicos_IQR(datos_sel$nitratos) &
    quitar_atipicos_IQR(datos_sel$calidad_agua),
]

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
      )
    )
  )

#  Calcular medianas por bin y filtrar NA
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))

# 3. Definir variables para análisis

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

# 4. Mostrar Tabla de resumen
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. Conjetura
#Se observa una tendencia aproximadamente lineal entre los nitratos y el índice de calidad de agua, por lo que se justifica el uso de una regresión lineal simple.
plot(
  x, y,
  pch = 19,      # puntos sólidos
  col = "purple",
  xlab = "Nitratos (mg/L)",
  ylab = "Índice de Calidad de Agua",
  main = "Relación Nitratos vs Calidad de Agua (6 puntos por bin)"
)

# Regresio lineal
regresion_lineal <- lm(y~x)
regresion_lineal  
## 
## Call:
## lm(formula = y ~ x)
## 
## Coefficients:
## (Intercept)            x  
##      49.137        0.812
# 6. Cálculo de parámetros
# Cálculo de parámetros
a <- regresion_lineal$coefficients[2]  # pendiente
b <- regresion_lineal$coefficients[1]  # intercepto


# Crear gráfico vacío
plot(1, type = "n", axes = FALSE, xlab = "", ylab = "")

# Mostrar ecuación
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
)

plot(
  x, y,
  col = "deepskyblue",
  main = "Diagrama de dispersión con la línea de regresión",
  xlab = "Nitratos (mg/L)",
  ylab = "Índice de Calidad del Agua",
  pch = 16
)

abline(regresion_lineal, col = "red", lwd = 2)

# 7.  Test
#Test de correlación de Pearson
r <- cor(x, y, method = "pearson", use = "complete.obs")
cat("Correlación de Pearson:", round(r, 4), "\n")
## Correlación de Pearson: 0.9189
# Coeficiente de determinación
r2 <- r^2 * 100
cat("Coeficiente de determinación:", round(r2, 2), "%\n")
## Coeficiente de determinación: 84.44 %
# 8. RESTRICCIONES DEL MODELO LINEAL

# Los nitratos (x) no pueden tomar valores negativos
# x ≥ 0
# El índice de calidad del agua (y) no puede ser negativo
# y ≥ 0
# El modelo es válido únicamente dentro del rango observado de los datos
# 0.86 ≤ x ≤ 3.10  (mg/L de nitratos)
# Corte con el eje X (y = 0)
# 0 = 0.81*x + 49.14
# x ≈ -60.51 mg/L
# Este valor no tiene significado físico ni ambiental,
# por lo que el modelo no debe extrapolarse fuera del rango observado.


# 9. ESTIMACIÓN

# ¿Qué valor del Índice de Calidad del Agua se espera
# cuando la concentración de nitratos es de 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(
    "¿Qué valor del Índice de Calidad del Agua\n",
    "se espera cuando la concentración de\n",
    "nitratos es de 2 mg/L?\n\n",
    "R = ", round(estimacion_NO3_2, 2)
  ),
  cex = 1.6,
  col = "blue",
  font = 2
)

# 10. CONCLUSIONES

# En el intervalo analizado entre la concentración de nitratos (mg/L) y el Índice de
# Calidad del Agua en China, se observa una relación de tipo lineal, representada por la ecuación:

# y =  0.81x + 49.14 

# donde x corresponde a la concentración de nitratos (mg/L) y y al Índice de Calidad
# del Agua. El modelo es válido únicamente dentro del rango observado de los datos
# (0.86 ≤ x ≤ 3.10 mg/L).

# No existen restricciones adicionales dentro de este intervalo, salvo la condición
# de no negatividad de las variables y la no extrapolación del modelo fuera del rango
# analizado.
# Además, el Índice de Calidad del Agua está influenciado en un 84.44 % por la
# concentración de nitratos, mientras que el 15.56 % restante se debe a otros
# factores físicos, químicos y biológicos no considerados en el presente análisis.