#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
Cod<-datos$COD_mg_L

3. Tabla de distribución de frecuencia

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

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


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

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

colnames(TDFCod)<- c("Li","Ls","Mc","ni","hi","Ni_asc(%)","Ni_desc(%)","Hi_asc","Hi_d
                     esc")

#Crear fila de totales

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

TDFCod<-rbind(TDFCod,totales)

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

TDFCod_total<-rbind(TDFCod,totales)


library(knitr)
library(kableExtra)
kable(TDFCod_total, align = 'c', caption = "Tabla de Frecuencias del Carbono
Orgánico Disuelto 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 del Carbono Orgánico Disuelto 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 5 2.5 3 0.1 3 3000 0.1 100
5 10 7.5 64 2.13 67 2997 2.23 99.9
10 15 12.5 426 14.2 493 2933 16.43 97.77
15 20 17.5 1026 34.2 1519 2507 50.63 83.57
20 25 22.5 998 33.27 2517 1481 83.9 49.37
25 30 27.5 422 14.07 2939 483 97.97 16.1
30 35 32.5 56 1.87 2995 61 99.83 2.03
35 40 37.5 5 0.17 3000 5 100 0.17
TOTAL
3000 100

4. Gráficas

4.1 Histograma

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

4.2 Histograma Globlal

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

4.3 Histograma Porcentual Global

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

4.4 Histograma Local

# Local
hist(Cod, breaks = 10,
     main ="Gráfica N°4:Distribución porcentual para el Carbono Orgánico
     Disuelto de estudio de contaminación del agua 
     en China en el año 2023",
     xlab = "Carbono Orgánico Disuelto (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_Cod$breaks,
     labels = Hist_Cod$breaks, las = 1,
     cex.axis = 0.9)

4.5 Histograma Porcentual Local

barplot(
  height = round(TDFCod$hi, 0),     # porcentajes enteros
  space = 0,
  col = "skyblue",
  main = "Gráfica N°5: Distribución porcentual del Carbono Orgánico Disuelto
  de estudio de contaminación del agua en China en el año 2023",
  xlab = "Carbono Orgánico Disuelto (mg/L)",
  ylab = "Porcentaje (%)",
  names.arg = round(TDFCod$MC, 0),   # clases en enteros
  ylim = c(0, 40)
)

5. Diagrama de Caja

# Diagrama de Caja

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

summary(Cod)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    2.09   16.59   19.94   19.99   23.36   37.78

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 Carbono Orgánico Disuelto de estudio 
     de contaminación del agua en China en el año 2023",
     xlab = "Carbono Orgánico Disuelto (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 Carbono Orgánico Disuelto de estudio 
     de contaminación del agua en China en el año 2023",
     xlab = "Carbono Orgánico Disuelto (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(Cod), 2)
media
## [1] 19.99
# Moda
max_ni <- max(TDFCod$ni)
moda <- TDFCod$MC[TDFCod$ni == max_ni]
moda
## [1] 17.5
# Mediana
mediana <- median(Cod)
mediana
## [1] 19.94

7.2 Indicadores de Dispersión

# Varianza
varianza <- var(Cod)
varianza
## [1] 25.08409
# Desviación Estándar
sd <- sd(Cod)
sd
## [1] 5.008402
# Coeficiente de Variación
cv <- round((sd / media) * 100, 2)
cv
## [1] 25.05

7.3 Indicadores de Forma

# INDICADORES DE FORMA #

# Asimetría
library(e1071)
asimetria <- skewness(Cod, type = 2)
asimetria
## [1] 0.02124703
#Curtosis
curtosis <- kurtosis(Cod)
curtosis
## [1] -0.03511734

8. Tabla Resumen

tabla_indicadores <- data.frame("Variable" =c("COD (mg/L)"),
                                "Rango" = c("[2.09;37.78]"),
                                "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" = "[2.09;37.78]")
library(knitr)
kable(tabla_indicadores, align = 'c', caption = "Conclusiones de la variable
      COD (mg/L)")
Conclusiones de la variable COD (mg/L)
Variable Rango X Me Mo V Sd Cv As K Valores.Atipicos
COD (mg/L) [2.09;37.78] 19.99 19.94 17.5 25.08 5.01 25.05 0.02 -0.04 [2.09;37.78]

9. Conclusión