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

datos_sel <- datos %>%
  select(pH, Dissolved_Oxygen_mg_L)

# 2. Depuración de datos: eliminación de atípicos (IQR) y agrupación por bins.
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$pH) &
    quitar_atipicos_IQR(datos_sel$Dissolved_Oxygen_mg_L),
]

datos_binned <- datos_limpios %>%
  mutate(
    PH_BIN = cut(
      pH,
      breaks = seq(
        floor(min(pH)),
        ceiling(max(pH)),
        by = 0.5   # tamaño del bin (puedes cambiarlo)
      )
    )
  )

# Calcular medianas por bin
datos_resumen <- datos_binned %>%
  group_by(PH_BIN) %>%
  summarise(
    pH_mediana = median(pH, na.rm = TRUE),
    Oxigeno_mediana = median(Dissolved_Oxygen_mg_L, na.rm = TRUE),
    n = n()
  ) %>%
  filter(n >= 3)   
# 3. Definir variables de análisis: pH (x) y oxígeno disuelto (y)
x <- datos_resumen$pH_mediana
y <- datos_resumen$Oxigeno_mediana
# 3. Resumen de datos agrupados por bins de pH con medianas y frecuencias.
datos_resumen
## # A tibble: 6 × 4
##   PH_BIN  pH_mediana Oxigeno_mediana     n
##   <fct>        <dbl>           <dbl> <int>
## 1 (5.5,6]       5.88            8.22    38
## 2 (6,6.5]       6.34            8.08   385
## 3 (6.5,7]       6.79            8.00  1010
## 4 (7,7.5]       7.23            8.05  1033
## 5 (7.5,8]       7.67            7.90   428
## 6 (8,8.5]       8.14            8.1     65
# 4. # Conjetura: A partir del diagrama de dispersión se observa una
# tendencia curvilínea entre el pH y el oxígeno disuelto,
# lo que sugiere el uso de un ajuste polinómico.
plot(
  datos_resumen$pH_mediana,
  datos_resumen$Oxigeno_mediana,
  pch = 19,
  xlab = "pH",
  ylab = "Oxígeno disuelto (mg/L)",
  main = "Relación pH vs Oxígeno (datos agrupados)"
)

# 5. Parámetros 
xcuad <- x^2
regrespoli <- lm(y ~ x + xcuad)
summary(regrespoli)
## 
## Call:
## lm(formula = y ~ x + xcuad)
## 
## Residuals:
##         1         2         3         4         5         6 
## -0.000857 -0.006247 -0.009816  0.075091 -0.089157  0.030986 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)  
## (Intercept) 14.69854    2.73445   5.375   0.0126 *
## x           -1.84781    0.78668  -2.349   0.1004  
## xcuad        0.12695    0.05604   2.265   0.1084  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.06996 on 3 degrees of freedom
## Multiple R-squared:  0.7375, Adjusted R-squared:  0.5625 
## F-statistic: 4.214 on 2 and 3 DF,  p-value: 0.1345
# Extraer coeficientes reales del modelo grado 2
beta0 <- regrespoli$coefficients[1]  # intercepto
beta1 <- regrespoli$coefficients[2]  # x
beta2 <- regrespoli$coefficients[3]  # x^2

# Renombrar si quieres usar notación a, b, c
a <- beta0
b <- beta1
c <- beta2

a
## (Intercept) 
##    14.69854
b
##         x 
## -1.847812
c
##     xcuad 
## 0.1269502
plot(
  x, y,
  col = "deepskyblue",
  main = "Gráfica: Diagrama de dispersión con regresión polinómica",
  xlab = "pH",
  ylab = "Oxígeno disuelto (mg/L)",
  pch = 16
)

curve(
  a + b*x + c*x^2,
  from = min(x),
  to = max(x),
  add = TRUE,
  col = "blue",
  lwd = 2
)

# 6. Test
r2 <- summary(regrespoli)$r.squared * 100
cat("R² polinómico grado 2 =", round(r2, 2), "%\n")
## R² polinómico grado 2 = 73.75 %
coef_pol <- c(c, b, a)
raices <- polyroot(coef_pol)
raices_reales <- Re(raices[abs(Im(raices)) < 1e-6])
raices_reales
## numeric(0)
# 7. Restricciones del modelo
# El modelo solo es válido para valores de pH entre 5.9 y 8.1.
# No se recomienda extrapolar fuera de este intervalo.
# Dentro del intervalo no existen restricciones adicionales.

# Estimación puntual de calidad del agua
# ================================

ph_objetivo <- 7.2

ox_est <- a + b*ph_objetivo + c*ph_objetivo^2

plot(1, type = "n", axes = FALSE, xlab = "", ylab = "")
text(
  x = 1, y = 1,
  labels = paste(
    "¿Cuál es la concentración esperada de oxígeno disuelto\n",
    "cuando el pH del agua es", ph_objetivo, "?\n\n",
    "Resultado estimado:",
    round(ox_est,3), "mg/L"
  ),
  cex = 1.4,
  col = "blue",
  font = 2
)

# 8. Conclusión
# "En el intervalo entre el pH y la concentración de oxígeno disuelto en los
# cuerpos de agua monitoreados en China existe una relación de tipo polinómica,
# representada por:

#       ŷ = 14.69854 − 1.84781 * pH + 0.12695 * pH^2

# Siendo pH el nivel de acidez/alcalinidad del agua y ŷ el oxígeno disuelto
# en mg/L.

# Dentro del intervalo seleccionado no existen restricciones.
# Se espera que, cuando el pH sea 7.2, se obtenga una concentración de
# oxígeno disuelto de aproximadamente 8.00 mg/L."