##Modelo Log-normal COD

# ============================================
# 3.X MODELO LOG-NORMAL (BASE CHINA - COD)
# Variable: COD_mg_L
# ============================================
library(gt)
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
# 1. Carga de datos (CSV)
datos <- read.csv("china_water_pollution_data.csv", header = TRUE, sep = ",")

# 1. Extracción de la variable y justificación
# Justificación: La DQO (COD, mg/L) es una variable cuantitativa continua porque representa una concentración que puede tomar valores reales positivos dentro de un rango y no está limitada a valores enteros específicos.Es decir r, Su dominio se asocia al conjunto de los números reales.

COD <- as.numeric(datos$COD_mg_L)

# Limpieza básica (lognormal requiere valores positivos y finitos)
COD <- COD[is.finite(COD)]
COD <- COD[COD > 0]

# 2. TDF simplificada (como tu ejemplo)
Histograma_COD <- hist(COD, plot = FALSE)

breaks <- Histograma_COD$breaks
Li <- breaks[1:(length(breaks)-1)]
Ls <- breaks[2:length(breaks)]
ni <- Histograma_COD$counts

n <- length(COD)
hi <- (ni / n) * 100

TDF_COD <- data.frame(
  Intervalo = paste0("[", round(Li, 2), " - ", round(Ls, 2), ")"),
  ni = ni,
  hi = round(hi, 2)
)

colnames(TDF_COD) <- c("Intervalo", "ni", "hi(%)")

totaless <- data.frame(
  Intervalo = "Totales",
  ni = sum(ni),
  hi = round(sum(hi), 2)
)

colnames(totaless) <- c("Intervalo", "ni", "hi(%)")

# Agregar al final de la tabla
TDF_COD <- rbind(TDF_COD, totaless)

# TABLA CREACIÓN (igual estilo)
TDF_COD %>%
  gt() %>%
  tab_header(
    title = md("*Tabla Nro. 1*"),
    subtitle = md("**Distribución de frecuencia simplificada de la DQO (COD) en la base de contaminación de agua**")
  ) %>%
  tab_source_note(
    source_note = md("Autor: Grupo 1")
  ) %>%
  tab_options(
    table.border.top.color = "black",
    table.border.bottom.color = "black",
    table.border.top.style = "solid",
    table.border.bottom.style = "solid",
    column_labels.border.top.color = "black",
    column_labels.border.bottom.color = "black",
    column_labels.border.bottom.width = px(2),
    row.striping.include_table_body = TRUE,
    heading.border.bottom.color = "black",
    heading.border.bottom.width = px(2),
    table_body.hlines.color = "gray",
    table_body.border.bottom.color = "black"
  )
Tabla Nro. 1
Distribución de frecuencia simplificada de la DQO (COD) en la base de contaminación de agua
Intervalo ni hi(%)
[2 - 4) 1 0.03
[4 - 6) 8 0.27
[6 - 8) 17 0.57
[8 - 10) 41 1.37
[10 - 12) 106 3.53
[12 - 14) 169 5.63
[14 - 16) 296 9.87
[16 - 18) 407 13.57
[18 - 20) 474 15.80
[20 - 22) 462 15.40
[22 - 24) 362 12.07
[24 - 26) 310 10.33
[26 - 28) 183 6.10
[28 - 30) 103 3.43
[30 - 32) 35 1.17
[32 - 34) 17 0.57
[34 - 36) 7 0.23
[36 - 38) 2 0.07
Totales 3000 100.00
Autor: Grupo 1
# 3. GDF - Histograma porcentual (barplot hi%)
TDF_COD_graf <- TDF_COD[TDF_COD$Intervalo != "Totales", ]

par(mar = c(9, 5, 4, 2))

post <- barplot(
  TDF_COD_graf$`hi(%)`,
  space = 0,
  col = "salmon",
  main = "Gráfica N°1: Distribución porcentual de DQO (COD),\nEstudio de contaminación de agua en China en 2023",
  xlab = "COD (mg/L)",
  ylab = "Porcentaje (%)",
  ylim = c(0, 100),
  xaxt = "n"
)

# Eje x con cortes (breaks) 
limites <- c(post[1] - diff(post)[1]/2, post + diff(post)[1]/2)

axis(
  side = 1,
  at = limites,
  labels = round(breaks, 2),
  las = 2,
  cex.axis = 0.8,
  tck = -0.02
)

# 4. CONJETURA
# Al observar el histograma porcentual, se aprecia que los valores de COD se concentran
# en rangos bajos y se extienden hacia valores altos con una cola a la derecha.
# Esta asimetría positiva y el hecho de que COD sea estrictamente positivo sugieren
# que la variable puede aproximarse a un modelo Log-normal.

# 5. CÁLCULO DE PARÁMETROS DISTRIBUCIÓN LOG-NORMAL
min(COD)
## [1] 2.09
log_COD <- log(COD)
mulog <- mean(log_COD)
sigmalog <- sd(log_COD)

mulog
## [1] 2.960155
sigmalog
## [1] 0.2762394
# 6. GDF - HISTOGRAMA DENSIDAD DE PROBABILIDAD + CURVA LOGNORMAL
Histograma_COD2 <- hist(
  COD,
  breaks = breaks,
  col = "salmon",
  freq = FALSE,
  main = "Gráfica N°2: Comparación de la Realidad y el Modelo Log-normal\nde la DQO(COD) en el estudio de la contaminacion del agua en China 2023",
  xlab = "COD (mg/L)",
  ylab = "Densidad de probabilidad",
  cex.main = 0.9,
  xaxt = "n"
)

axis(1, at = breaks)

x <- seq(min(COD), max(COD), by = 0.001)

curve(
  dlnorm(x, meanlog = mulog, sdlog = sigmalog),
  col = "darkblue",
  lwd = 3,
  add = TRUE
)

# 7. TEST DE BONDAD

# 7.1 "Test de Pearson" 
fo <- hist(COD, breaks = breaks, plot = FALSE)$counts

fe <- numeric(length(fo))
for(i in 1:length(fo)){
  fe[i] <- n * (plnorm(breaks[i+1], meanlog = mulog, sdlog = sigmalog) -
                  plnorm(breaks[i], meanlog = mulog, sdlog = sigmalog))
}

Correlación <- cor(fo, fe) * 100
Correlación
## [1] 96.70084
# 7.2 Test Chi-cuadrado
fe_frac <- fe / n
fo_frac <- fo / n

x2 <- sum((fo_frac - fe_frac)^2 / fe_frac)
x2
## [1] 18.96594
k <- length(fo_frac)
gl <- k - 1 - 2  # -2 por estimar mulog y sigmalog
gl
## [1] 15
# Umbral de aceptación 
umbral_aceptacion <- qchisq(0.95, df = gl)
umbral_aceptacion
## [1] 24.99579
x2 < umbral_aceptacion  # TRUE = aprueba
## [1] TRUE
# 8. CÁLCULO DE PROBABILIDAD 
# Ejemplo 1: Probabilidad de que COD esté entre 20 y 30 mg/L
plnorm(30, mulog, sigmalog) - plnorm(20, mulog, sigmalog)
## [1] 0.3935829
# Ejemplo 2: Probabilidad de que COD supere 40 mg/L
1 - plnorm(40, mulog, sigmalog)
## [1] 0.004169585
# Demostración gráfica: cálculo de probabilidad (Lognormal)

x <- seq(min(COD), max(COD), by=0.001)
plot(x, dlnorm(x, mulog, sigmalog), col = "blue", lwd = 2, xaxt = "n",
     main="Gráfica N°3: Cálculo de probabilidad (COD - Lognormal)\nen el estudio de contaminación de agua en China, 2023",
     ylab="Densidad de probabilidad", xlab="COD (mg/L)")

axis(1, at = pretty(range(COD), 10))

# Área roja: COD entre 20 y 30
x_red <- seq(20, 30, by = 0.001)
y_red <- dlnorm(x_red, mulog, sigmalog)
lines(x_red, y_red, col = "red", lwd = 2)
polygon(c(x_red, rev(x_red)), c(y_red, rep(0, length(y_red))),
        col = rgb(1, 0, 0, 0.5), border = NA)

# Área verde: cola alta (automática, percentil 90)
umbral_verde <- as.numeric(quantile(COD, 0.90))

if(max(COD) > umbral_verde){
  x_green <- seq(umbral_verde, max(COD), by = 0.001)
  y_green <- dlnorm(x_green, mulog, sigmalog)
  lines(x_green, y_green, col = "green", lwd = 2)
  polygon(c(x_green, rev(x_green)), c(y_green, rep(0, length(y_green))),
          col = rgb(0, 1, 0, 0.4), border = NA)
}

legend("topright",
       legend = c("Modelo", "P(20 < COD < 30)", paste0("P(COD ≥ P90 = ", round(umbral_verde,2), ")")),
       col = c("blue", "red", "green"),
       lwd = 2,
       pch = c(NA, 15, 15),
       cex = 0.8,
       pt.cex = 1)

# 9. INTERVALO DE CONFIANZA 
media <- mean(COD)
sigma <- sd(COD)
n <- length(COD)

error <- 2 * (sigma / sqrt(n))  # aproximación 

limite_inferior <- round(media - error, 2)
limite_superior <- round(media + error, 2)

limite_inferior
## [1] 19.81
limite_superior
## [1] 20.17
tabla_intervalo <- data.frame(
  Intervalo = paste0("P [", limite_inferior, " < µ < ", limite_superior, "] = 95%")
)

tabla_intervalo %>%
  gt() %>%
  tab_header(
    title = md("*Tabla Nro. 2*"),
    subtitle = md("**Intervalo de confianza de la media de COD (DQO)**")
  ) %>%
  tab_source_note(
    source_note = md("Autor: Grupo 1")
  ) %>%
  tab_options(
    table.border.top.color = "black",
    table.border.bottom.color = "black",
    table.border.top.style = "solid",
    table.border.bottom.style = "solid",
    column_labels.border.top.color = "black",
    column_labels.border.bottom.color = "black",
    column_labels.border.bottom.width = px(2),
    row.striping.include_table_body = TRUE,
    heading.border.bottom.color = "black",
    heading.border.bottom.width = px(2),
    table_body.hlines.color = "gray",
    table_body.border.bottom.color = "black"
  )
Tabla Nro. 2
Intervalo de confianza de la media de COD (DQO)
Intervalo
P [19.81 < µ < 20.17] = 95%
Autor: Grupo 1
# 10. CONCLUSIÓN COD (LOGNORMAL)
# La variable DQO (COD, mg/L) sigue o se explica   con un modelo Log-normal estandar con parámetros µlog = 2.96 y σlog = 0.276 y podemos afirmar con un 95% de confianza que  la media aritmetica de esta variable se encuentra entre 19.81 y 20.17 (mg/L) con una   desviación estandar 5.01 (mg/L).