#Tema: Estadística Descriptiva
#Fecha: 23/11/2025
#Autor:Anahi Sosa

#Carga de librerias
library(knitr)
library(kableExtra)

1. Carga de Datos

#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

#Extracción Variable Cuantitativa Continua
Nitrato<-datos$Nitrate_mg_L
Nitrato <- na.omit(Nitrato)

3. Tabla de distribución de frecuencia

#Tabla de distribución de frecuencia

#Manualmente
min <-min(Nitrato)
max <-max(Nitrato)
R <-max-min
K <- floor(1+3.33*log10(length(Nitrato)))
A <-R/K
Li <-round(seq(from=min,to=max-A,by=A),2)
Li[1] <- min(Nitrato)

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(Nitrato >= Li[i] & Nitrato < Ls[i])
  } else {
    ni[i] <- sum(Nitrato >= Li[i] & Nitrato <= Ls[i])
  }
}


sum(ni)
## [1] 3000
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)))

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

colnames(TDFnitrato)<-  
  c("Li","Ls","Mc","ni","hi","Ni_asc(%)","Ni_desc(%)","H
    i_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="-")

TDFnitrato<-rbind(TDFnitrato,totales)

#Simplificación con el histograma
Hist_Nitrato<-hist(Nitrato,breaks = 8,plot = F)
k<-length(Hist_Nitrato$breaks)
Li<-Hist_Nitrato$breaks[1:(length(Hist_Nitrato$breaks)-1
                           )]
Ls<-Hist_Nitrato$breaks[2:length(Hist_Nitrato$breaks)]
ni<-Hist_Nitrato$counts
sum(ni)
## [1] 3000
Mc<-Hist_Nitrato$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)))
TDFnitrato<-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(TDFnitrato)<-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="-")

TDFnitrato_total<-rbind(TDFnitrato,totales)


library(knitr)
library(kableExtra)
kable(TDFnitrato_total, align = 'c', caption = "Tabla de
Frecuencias de NitratoNitrato 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 NitratoNitrato de estudio de contaminación del agua en China en el año 2023
Lim inf Lim sup
 MC
0 0.5 0.25 4 0.13 4 3000 0.13 100
0.5 1 0.75 58 1.93 62 2996 2.07 99.87
1 1.5 1.25 464 15.47 526 2938 17.53 97.93
1.5 2 1.75 1026 34.2 1552 2474 51.73 82.47
2 2.5 2.25 998 33.27 2550 1448 85 48.27
2.5 3 2.75 379 12.63 2929 450 97.63 15
3 3.5 3.25 63 2.1 2992 71 99.73 2.37
3.5 4 3.75 8 0.27 3000 8 100 0.27
TOTAL
3000 100

4. Gráficas

4.1 Histograma

# GRAFICAS
#Histograma
hist(Nitrato,breaks = 10,
     main = 
     "Gráfica N°1: Distribución de la cantidad de Nitrato de estudio
     de contaminación del agua en China en el año 2023",
     xlab = " Nitrato (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_Nitrato$breaks,labels = 
       Hist_Nitrato$breaks,las=1,
     cex.axis=0.9)

4.2 Histograma Globlal

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

4.3 Histograma Porcentual Global

barplot(
  height = round(TDFnitrato$hi,0),
        space=0,
        col = "skyblue",
        main =
        "Gráfica N°3: Distribución porcentual del Nitrato de estudio
        de contaminación del agua en China en el año 2023 ",
        xlab="Nitrato (mg/L)",
        ylab="Porcentaje (%)",
        names.arg =round(TDFnitrato$MC,1),
        ylim = c(0,100))

4.4 Histograma Local

# Local
hist(Nitrato, breaks = 10,
     main =
     "Gráfica N°4:Distribución porcentual para el Nitrato de estudio
     de contaminación del agua en China en el año 2023",
     xlab = "Nitrato (mg/L)",
     ylab = "Cantidad",
     ylim = c(0,max(ni)),
     col = "purple",
     cex.main = 1.3,
     cex.lab = 1,
     cex.axis = 0.9,
     xaxt = "n")
axis(1, at = Hist_Nitrato$breaks,
     labels = Hist_Nitrato$breaks, las = 1,
     cex.axis = 0.9)

4.5 Histograma Porcentual Local

barplot(TDFnitrato$hi,space=0,
        col = "lightblue",
        main ="Gráfica N°5: Distribución porcentual para el Nitrato de estudio
        de contaminación del agua en China en el año 2023",
        xlab="Nitrato (mg/L)",
        ylab="Porcentaje (%)",
        ylim = c(0,40),
        names.arg = TDFnitrato$MC)

5. Diagrama de Caja

# Diagrama de Caja

boxplot(Nitrato,
        horizontal = TRUE,
        main = "Gráfica N°6:Distribución de frecuencia para el Nitrato 
        de estudio de contaminación del agua en China en el año 2023 ",
        xlab = " Nitrato (mg/L) ",
        col = "purple",
        outline = TRUE,
        pch = 1)

summary(Nitrato)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   0.230   1.630   1.980   1.983   2.320   3.840

6. Ojivas

6.1 Ojivas Ascendente y Descendente (ni)

# Diagrama de Ojiva Ascendente y Descendente
plot(Li, Ni_asc,
     main = 
     "Gráfica N°7: Distribución de frecuencias acumuladas Ascendente y 
     Descendente para el Nitrato de estudio de contaminación del 
     agua en China en el año 2023",
     xlab = "Nitrato (mg/L)",
     ylab = "Cantidad",
     xlim = c(min(Li), max(Ls)),
     col = "orange",
     cex.axis = 0.8,
     type = "o",
     lwd = 3,
     las = 1,
     xaxt = "n")

lines(Ls, Ni_desc,
      col = "green",
      type = "o",
      lwd = 3)

axis(1, at = Li, las = 1)

6.2 Ojiva Ascendente y Descendente (hi)

# Diagrama de Ojiva Ascendente y Descendente Porcentual

plot(Li, Hi_desc *100,
     main = 
     "Gráfica N°8: Distribución porcentual acumulada Ascendente y 
     Descendente para el Nitrato de estudio de contaminación del
     agua en China en el año 2023",
     xlab = "Nitrato (mg/L)",
     ylab = "Cantidad",
     xlim = c(min(Li), max(Ls)),
     col = "red",
     cex.axis = 0.8,
     type = "o",
     lwd = 3,
     las = 1,
     xaxt = "n")

lines(Ls, Hi_asc *100,
      col = "blue",
      type = "o",
      lwd = 3)

axis(1, at = Li, las = 1)

7. Indicadores Estadísticos

7.1 Indicadores de Tendencia Cental

# Media aritmética
media <- round(mean(Nitrato), 2)
media
## [1] 1.98
# Moda
max_ni <- max(TDFnitrato$ni)
moda <- TDFnitrato$MC[TDFnitrato$ni == max_ni]
moda
## [1] 1.75
# Mediana
mediana <- median(Nitrato)
mediana
## [1] 1.98

7.2 Indicadores de Dispersión

# Varianza
varianza <- var(Nitrato)
varianza
## [1] 0.2579445
# Desviación Estándar
sd <- sd(Nitrato)
sd
## [1] 0.5078824
# Coeficiente de Variación
cv <- round((sd / media) * 100, 2)
cv
## [1] 25.65

7.3 Indicadores de Forma

# Asimetría
library(e1071)
asimetria <- skewness(Nitrato, type = 2)
asimetria
## [1] 0.06061787
#Curtosis
curtosis <- kurtosis(Nitrato)
curtosis
## [1] -0.0163758

8. Tabla Resumen

tabla_indicadores <- data.frame("Variable" =c("Nitrato 
                                              (mg/L)"),
                                "Rango" = 
                                  c("[0.23;3.84]"),
                                "X" = c(media),
                                "Me" = 
                                  c(round(mediana,2)),
                                "Mo" = c(moda),
                                "V" = 
                                  c(round(varianza,2)),
                                "Sd" = c(round(sd,2)),
                                "Cv" = c(cv),
                                "As" = 
                                  c(round(asimetria,2)),
                                "K" = 
                                  c(round(curtosis,2)),
                                "Valores Atipicos" = 
                                  "[0.230;3.480]")
library(knitr)
kable(tabla_indicadores, align = 'c', caption = 
"Conclusiones de la variable
      Nitrato (mg/L)")
Conclusiones de la variable Nitrato (mg/L)
Variable Rango X Me Mo V Sd Cv As K Valores.Atipicos
Nitrato
(mg/L) [0.23;3.84] 1.98 1.98 1.75 0.26 0.51 25.65 0.06 -0.02 [0.230;3.480]

9. Conclusión