#Tema: Estadística Inferencial
#Fecha: 07/01/2026
#Autor:Anahi Sosa
#Paso 1: Definir la variable de interés
# La variable Fósforo Total es una variable cuantitativa Continua porque su dominio está formado por todos los números reales positivos.
# D={ x | x ∈ ℝ⁺^0 }
#Carga de librerias
library(knitr)
library(kableExtra)

1. Carga de Datos

getwd()
## [1] "/cloud/project"
setwd("/cloud/project")
datos<- read.csv("china_water_pollution_data.csv",header = TRUE, sep = ",", dec = ".")

2. Extracción de la variable

FósforoT <- datos$Total_Phosphorus_mg_L
FósforoT <- na.omit(FósforoT)
FósforoT<- FósforoT[FósforoT >= 0]
n <- length(FósforoT) 

3. Tabla de distribución de frecuencia

#Paso2: Tabla de distribución de frecuencia
#Manualmente
min <- min(FósforoT)
max <- max(FósforoT)
R <- max - min
K <- floor(1 + 3.33 * log10(length(FósforoT)))
A <-R/K
Li <-round(seq(from=min,to=max-A,by=A),2)
Li[1] <- min(FósforoT)

Ls <-round(seq(from=min+A,to=max,by=A),2)
Mc <-(Li+Ls)/2

tol <- 1e-9
ni <- numeric(K)

for (i in 1:K) {
  
  if (i < K) {
    ni[i] <- sum(FósforoT >= Li[i] & FósforoT < Ls[i])
  } else {
    ni[i] <- sum(FósforoT >= Li[i] & FósforoT <= Ls[i])
  }
}

sum(ni)
## [1] 2932
## [1] 2999
hi <-ni/sum(ni)*100
Ni_asc<-cumsum(ni)
Hi_asc<-cumsum(hi)
Ni_desc<-rev(cumsum(rev(ni)))
Hi_desc<-rev(cumsum(rev(hi)))

TDF_FósforoT <- data.frame(
  Li, Ls, Mc, ni, round(hi, 2), Ni_asc, Ni_desc, round(Hi_asc, 2), round(Hi_desc, 2)
)

colnames(TDF_FósforoT)<- 
  c("Li","Ls","Mc","ni","hi","Ni_asc(%)","Ni_desc(%)","Hi_asc","Hi_desc")

#Crear fila de totales
totales<-c(
  Li="-",
  Ls="-",
  Mc="-",
  ni=sum(ni),
  hi=sum(hi),
  Ni_asc="-",
  Ni_desc="-",
  Hi_asc="-",
  Hi_desc="-")

TDF_FósforoT<-rbind(TDF_FósforoT,totales)
#Simplificación con el histograma
Hist_FósforoT<-hist(FósforoT,breaks = 8,plot = F)
k<-length(Hist_FósforoT$breaks)
Li<-Hist_FósforoT$breaks[1:(length(Hist_FósforoT$breaks)-1)]
Ls<-Hist_FósforoT$breaks[2:length(Hist_FósforoT$breaks)]
ni<-Hist_FósforoT$counts
sum(ni)
## [1] 2933
Mc<-Hist_FósforoT$mids
hi<-(ni/sum(ni))
sum(hi)
## [1] 1
Ni_asc<-cumsum(ni)
Hi_asc<-cumsum(hi)
Ni_desc<-rev(cumsum(rev(ni)))
Hi_desc<-rev(cumsum(rev(hi)))
TDF_FósforoT<-data.frame(Li=round(Li,2),
                        Ls=round(Ls,2),
                        Mc=round(Mc,2),
                        ni=ni,
                        hi=round(hi*100,2),
                        Ni_asc=Ni_asc,
                        Ni_desc=Ni_desc,
                        Hi_asc=round(Hi_asc*100,2),
                        Hi_desc=round(Hi_desc*100,2))
colnames(TDF_FósforoT)<-c("Lim inf","Lim sup","MC","ni","hi(%)","Ni asc",
                         "Ni desc","Hi  asc(%)","Hi desc(%)")

#Crear fila de totales
totales<-c(Li="TOTAL",
           Ls="-",
           Mc="-",
           ni=sum(ni),
           hi=sum(hi*100),
           Ni_asc="-",
           Ni_desc="-",
           Hi_asc="-",
           Hi_desc="-")

TDF_Fósforo_total<-rbind(TDF_FósforoT,totales)

4. Gráficas

4.1 Histograma

#Gráfica
hist(FósforoT,breaks = 10,
     main = "Gráfica N°1: Distribución de la cantidad de fósforo total  
     de estudio de contaminación del agua
     en China en el año 2023",
     xlab = "Fósforo Total (mg/L)",
     ylab = "Cantidad",
     ylim = c(0,max(ni)),
     col = "pink",
     cex.main=1.3,
     cex.lab=1,
     cex.axis=0.9,
     xaxt="n")
axis(1,at=Hist_FósforoT$breaks,labels = Hist_FósforoT$breaks,las=1,
     cex.axis=0.9)

4.2 Conjetura del modelo

#Conjetura del Modelo -Normal - Calculo de parámetros
# Se conjetura que el Fósforo Total se ajusta a un modelo de probabilidad Normal. 
# El gráfico presenta una distribución aproximadamente simétrica, con una mayor concentración de valores alrededor de la media. La probabilidad de ocurrencia disminuye de forma similar hacia ambos extremos, lo que sugiere un comportamiento consistente con una distribución Normal.
# 4.2.1 Calculo de parámetros de modelo Nomal
mu <- mean(FósforoT)
sd <- sd(FósforoT)
#4.2.2 Comparacion de la realidad con el modelo
# Histograma de densidad
hist <- hist(FósforoT,
              breaks = 5,
              freq = FALSE,
              main = "Gráfica N°2: Comparación de la realidad y del modelo Nomal
               de la cantidad de fósforo total de estudio de contaminación
                del agua en China en el año 2023",
              xlab = "Fósforo Total (mg/L)",
              ylab = "Densidad",
              col = "lightblue",
              border = "gray",
              ylim = c(0, 10))
# Curva normal ajustada
curve(dnorm(x, mean = mu, sd = sd),
      from =min(FósforoT), to = max(FósforoT),
      col = "red", lwd = 2, add = TRUE)

5. Test -Pearson y Chi-Cuadrado

#Test
# Obtener frecuencias observadas (FO)
FO <- hist$counts

# Obtener intervalos (breaks) del histograma
breaks <- hist$breaks

# Calcular frecuencias esperadas (FE) según modelo normal
FE <- c()
for (i in 1:(length(breaks) - 1)) {
  P <- pnorm(breaks[i + 1], mean = mu, sd = sd) - 
    pnorm(breaks[i], mean = mu, sd = sd)
  FE[i] <- P * length(FósforoT)
}

# Ver FO y FE
FO
## [1]  421  997 1030  425   59    1
round(FE, 2)
## [1]  333.65 1001.63 1078.98  417.40   57.43    2.77
# 2 Test de Pearson (correlación)
cor_pearson <- cor(FO, FE)
cor_pearson  # Si es > 0.75 → buen ajuste
## [1] 0.9959544
# 2.1Test de Chi-cuadrado
X2 <- sum((FO - FE)^2 / FE)
chi <- qchisq(0.95, df = length(FO) - 1)
X2 > chi
## [1] TRUE
X2
## [1] 26.42513
chi
## [1] 11.0705

6. Calculo de Probabilidades

plot(1, type = "n", axes = FALSE, xlab = "", ylab = "") 
text(x = 1, y = 1, 
     labels = "¿Cuál es la probabilidad de que
          al seleccionar al azar una muestra de
          agua,la cantidad de fósforo esté 
            entre 0.10 y 0.15 mg/L?
                R: 38.78 %",
     cex = 2,  
     col = "blue",  
     font = 6) 

P_normal_1_1.5 <- (pnorm(0.15, mu, sd) - pnorm(0.10, mu, sd)) * 100
P_normal_1_1.5
## [1] 36.78751
# Secuencia de valores de x (Cantidad de fósforo)
x <- seq(0, 0.30, 0.001)

# Densidad de la curva normal
y <- dnorm(x, mean = mu, sd = sd)

# Crear el gráfico de densidad normal
plot(x, y,
     type = "l",
     col = "skyblue3",
     lwd = 2,
     xlab = "Fósforo Total (mg/L)",
     ylab = "Densidad de probabilidad",
     main = "Gráfica. Cálculo de Probabilidad entre 0.10 y 0.15 mg/L")

# Definir el rango de la sección que quieres sombrear
x_sombra <- seq(0.10, 0.15, 0.001)
y_sombra <- dnorm(x_sombra, mean = mu, sd = sd)

# Pintar la curva del área sombreada
lines(x_sombra, y_sombra, col = "red", lwd = 2)

# Sombrear el área bajo la curva entre 0.10 y 0.15
polygon(c(x_sombra, rev(x_sombra)),
        c(y_sombra, rep(0, length(y_sombra))),
        col = rgb(1, 0, 0, 0.5), border = NA)

# Añadir leyenda
legend("topright",
       legend = c("Modelo Normal", "Área de Probabilidad"),
       col = c("skyblue3", "red"),
       lwd = 2,
       bty = "n",
       cex = 0.7)

#7 Conclusiones

tabla_modelos_1 <- data.frame("Fósforo Total" = c("[0, 0.30]", ""),
                              "Modelo" = c("Normal", ""),
                              "Parametros" = c("u = 0.10 ", "sigma= 0.04"),
                              "Test_de_Pearson (%)" = c("99.59",""),
                              "Test_de_Chi_cuadrado" = c("Aprobado", ""))

colnames(tabla_modelos_1) <- c("Fósforo Total", "Modelo",
                               "Parámetros","Test Pearson (%)",
                               "Test Chi-cuadrado")
tabla_modelos_1
##   Fósforo Total Modelo  Parámetros Test Pearson (%) Test Chi-cuadrado
## 1     [0, 0.30] Normal   u = 0.10             99.59          Aprobado
## 2                      sigma= 0.04
library(knitr)
kable(tabla_modelos_1, align = 'c', caption = "Tabla 1.Conclusiones del Modelo Normal para cantidad de Fósforo Total")
Tabla 1.Conclusiones del Modelo Normal para cantidad de Fósforo Total
Fósforo Total Modelo Parámetros Test Pearson (%) Test Chi-cuadrado
[0, 0.30] Normal u = 0.10 99.59 Aprobado
sigma= 0.04
#Intervalos de confianza
x<-mean(FósforoT)
n<-length(FósforoT)
cs<-sd(FósforoT) #cuasidesviación
LiminfIC<-x-(2*(cs/sqrt(n)))
LiminfIC
## [1] 0.1018948
LimsupIC<-x+(2*(cs/sqrt(n)))
LimsupIC
## [1] 0.105379
tabla_confianza <- data.frame("Intervalo_confianza" = c("Limite Inferior", "Limite Superior"),
                              "Grado_confianza" = c("95%",""),
                              "Latitud"=c("0.101","0.105"))
colnames(tabla_confianza) <- c("Intervalo de confianza", "Grado de confianza(%)",
                               "Fósforo Total")
tabla_confianza
##   Intervalo de confianza Grado de confianza(%) Fósforo Total
## 1        Limite Inferior                   95%         0.101
## 2        Limite Superior                               0.105
kable(tabla_confianza, align = 'c', caption = "Tabla 2.Intervalos de Confianza de la Media Poblacional")
Tabla 2.Intervalos de Confianza de la Media Poblacional
Intervalo de confianza Grado de confianza(%) Fósforo Total
Limite Inferior 95% 0.101
Limite Superior 0.105

#Conclusion

#La variable Fósforo Total mg/L en la contaminación del agua en China un comportamiento de tipo normal con parametros μ=0.10 y σ=0.04 y podemos afirmar con un 95% de confianza que la media aritmetica se encuentra entre 0.101 y 0.105 y el modelo expresa en 99,59% la realidad.