#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])
  }
}

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))
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)
library(knitr)
library(kableExtra)
kable(TDF_Fósforo_total, align = 'c', caption = "Tabla de Frecuencias de Fósforo
      de estudio de contaminación del agua en China en el año 2023 ") %>%
  kable_styling(full_width = FALSE, position = "center", bootstrap_options = c("striped", "hover", "condensed"))
Tabla de Frecuencias de Fósforo de estudio de contaminación del agua en China en el año 2023
Lim inf Lim sup MC ni hi(%) Ni asc Ni desc Hi asc(%) Hi desc(%)
0 0.05 0.03 421 14.35 421 2933 14.35 100
0.05 0.1 0.08 997 33.99 1418 2512 48.35 85.65
0.1 0.15 0.13 1030 35.12 2448 1515 83.46 51.65
0.15 0.2 0.18 425 14.49 2873 485 97.95 16.54
0.2 0.25 0.23 59 2.01 2932 60 99.97 2.05
0.25 0.3 0.28 1 0.03 2933 1 100 0.03
TOTAL
2933 100

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)*100
cor_pearson  # Si es > 0.75 → buen ajuste
## [1] 99.59544
# 2.1Test de Chi-cuadrado
x2 <- sum((FO - FE)^2 / FE)

gl <- length(FO) - 1 - 1   # k - 1 - parámetros
VC <- qchisq(0.99999, gl)

x2
## [1] 26.42513
VC
## [1] 28.47326
x2 < VC
## [1] TRUE

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: 36.79 %",
     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.05"),
                              "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.05
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.05
#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%","95%"),
                              "Fósforo Total"=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                   95%         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 95% 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.05 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.