#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 Discreta
Recuento_coliformes<-datos$Coliform_Count_CFU_100mL

3. Tabla de distribución de frecuencia

# Valores mínimos y máximos
min_val <- floor(min(Recuento_coliformes)/10)*10
max_val <- ceiling(max(Recuento_coliformes)/10)*10

# Crear intervalos adecuados
breaks <- seq(min_val, max_val, by = 10)
labels <- paste(head(breaks, -1), tail(breaks, -1), sep = "-")

intervalos <- cut(Recuento_coliformes,
                  breaks = breaks,
                  include.lowest = TRUE,
                  right = FALSE,
                  labels = labels)

# Tabla de frecuencia
TDF <- data.frame(table(intervalos))

ni <- TDF$Freq
hi <- ni / sum(ni)

# Frecuencias acumuladas
Ni_asc  <- cumsum(ni)
Ni_desc <- rev(cumsum(rev(ni)))
Hi_asc  <- round(cumsum(hi) * 100, 2)
Hi_desc <- round(rev(cumsum(rev(hi))) * 100, 2)

# Construcción de la tabla
TDF_Recuento_coliformes <- data.frame(
  "Intervalos_recuento_coliformes" = TDF$intervalos,
  "ni" = ni,
  "`hi (%)`" = round(hi * 100, 2),
  "Niasc" = Ni_asc,
  "Nidesc" = Ni_desc,
  "`Hi asc (%)`" = Hi_asc,
  "`Hi desc (%)`" = Hi_desc
)
colnames(TDF_Recuento_coliformes) <- c(
"Intervalos de recuento de coliformes","ni","hi(%)",
                        "Ni asc","Ni desc","Hi asc(%)","Hi desc(%)")

# Fila de totales (MISMO ORDEN MISMOS NOMBRES)
totales <- data.frame(
  "Intervalos de recuento de coliformes" = "TOTAL",
  "ni" = sum(ni),
  "`hi (%)`" = round(sum(hi*100), 2),
  "Niasc" = "-",
  "Nidesc" = "-",
  "`Hi asc (%)`" = "-",
  "`Hi desc (%)`" = "-"
)
colnames(totales) <- c("Intervalos de recuento de coliformes","ni","hi(%)",
                            "Ni asc","Ni desc","Hi asc(%)","Hi desc(%)")
TDF_Recuento_coliformes <- rbind(TDF_Recuento_coliformes, totales)

# Mostrar tabla
kable(TDF_Recuento_coliformes, align = 'c',
      caption = "Tabla de Distribución de Frecuencias del recuento
      de coliformes (UFC por 100 mL)") %>%
  kable_styling(full_width = FALSE, position = "center",
                bootstrap_options = c("striped", "hover", "condensed"))
Tabla de Distribución de Frecuencias del recuento de coliformes (UFC por 100 mL)
Intervalos de recuento de coliformes ni hi(%) Ni asc Ni desc Hi asc(%) Hi desc(%)
60-70 2 0.07 2 3000 0.07 100
70-80 50 1.67 52 2998 1.73 99.93
80-90 386 12.87 438 2948 14.6 98.27
90-100 1043 34.77 1481 2562 49.37 85.4
100-110 1008 33.60 2489 1519 82.97 50.63
110-120 433 14.43 2922 511 97.4 17.03
120-130 73 2.43 2995 78 99.83 2.6
130-140 5 0.17 3000 5 100 0.17
TOTAL 3000 100.00

4. Gráficas

4.1 Diagrama de barras Local

# GRAFICAS

# Diagrama de barrras local
TDF_sin_total <- TDF_Recuento_coliformes[1:8, ]
grafica <- barplot(
  ni,
  main = "Gráfica N°1: Distribución por intervalos de recuento de coliformes
  de estudio de contaminación del agua en China en el año 2023",
  xlab = "Recuento de coliformes (UFC 100mL)",
  ylab = "Cantidad",
  col = "skyblue",
  ylim = c(0, max(ni)),
  names.arg = TDF_sin_total$`Intervalos de recuento de coliformes`,
  las = 2,
  cex.names = 0.63
)

mtext("*Los límites superiores de los intervalos son abiertos",
      side = 1, line = 5, adj = 0, cex = 0.7)

hi_porcentaje <- TDF_sin_total$`hi(%)`

4.2 Digrama de barras Porcentual Local

# Gráfico
barplot(
  hi_porcentaje,
  main = "Gráfica N°2: Distribución porcentual de recuento de coliformes
  de estudio de contaminación del agua en China en el año 2023",
  xlab = "Recuento de coliformes (UFC 100mL)",
  ylab = "Porcentaje (%)",
  col = "skyblue",
  names.arg = TDF_sin_total$`Intervalos de recuento de coliformes`,
  las = 2,
  cex.names = 0.63
)

4.3 Diagrama de barras Global

# Diagrama de barrras global
TDF_sin_total <- TDF_Recuento_coliformes[1:8, ]
barplot(ni,
        main="Gráfica N°3: Distribución por intervalos de recuento de 
        coliformes de estudio de contaminación del agua 
        en China en el año 2023",
        xlab = "Recuento de coliformes (UFC 100mL) ",
        ylab = "Cantidad",
        col = "skyblue",
        ylim = c(0,3000),
        names.arg = TDF_sin_total$`Intervalos de recuento de coliformes`,
        las=2,
        cex.names=0.63)

4.4 Diagrama de barras Porcentual Global

hi_porcentaje <- TDF_sin_total$`hi(%)`
barplot(hi_porcentaje,
        main="Gráfica N°4: Distribución porcentual de recuento de coliformes
         de estudio de contaminación del agua 
        en China en el año 2023",
        xlab = "Recuento de coliformes (UFC 100mL)",
        ylab = "Porcentaje (%)",
        col = "skyblue",
        ylim = c(0,100),
        names.arg = TDF_sin_total$`Intervalos de recuento de coliformes`,
        las=2,
        cex.names=0.63)

5. Diagrama de Caja

# Diagrama de Caja

boxplot(Recuento_coliformes,
        horizontal = TRUE,
        main = "Gráfica N°5:Distribución del recuento de coliformes 
      en el estudio de contaminación del agua en China en el año 2023 ",
        xlab = "Unidades Formadoras de Colonias (UFC) por cada 100mL de 
      agua",
        col = "orange",
        pch = 1)

summary(Recuento_coliformes)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##      69      93     100     100     107     136

6. Ojivas

6.1 Ojivas Ascendente y Descendente (ni)

# Diagrama de Ojiva Ascendente y Descendente
# Eliminar la fila TOTAL para el gráfico
TDF_sin_total <- TDF_Recuento_coliformes[
  TDF_Recuento_coliformes$`Intervalos de recuento de coliformes` != "TOTAL",
  ]

# Crear posiciones en el eje X
x_pos <- 1:nrow(TDF_sin_total)

# Extraer Ni descendente
Ni_desc <- TDF_sin_total$`Ni desc`
Ni_asc <- TDF_sin_total$`Ni asc`
Hi_desc <- TDF_sin_total$`Hi desc`
Hi_asc <- TDF_sin_total$`Hi asc`

plot(x_pos, Ni_desc,
     main = "Gráfica N°6: Ojiva ascendente y descendente del recuento de 
     coliformes en el estudio de contaminación del agua en China 
     en el año 2023 ",
     xlab = "Unidades Formadoras de Colonias (UFC) por cada 100mL de agua",
     ylab = "Cantidad",
     col = "orange",
     type = "p",
     lwd = 3,
     xaxt="n")
lines(x_pos,Ni_asc,
      col = "green",
      type = "p",
      lwd = 3)

axis(side = 1, at = x_pos, labels = TDF_sin_total$`Intervalos de recuento de
     coliformes`, las = 2, cex.axis = 0.7)

6.2 Ojiva Ascendente y Descendente (hi)

# Diagrama de Ojiva Ascendente y Descendente Porcentual
plot(x_pos, Hi_desc,
     main = "Gráfica N°7:Ojiva ascendente y descendente del recuento de 
     coliformes en el estudio de contaminación del agua en China
     en el año 2023  ",
     xlab = " Unidades Formadoras de Colonias (UFC) por cada 100mL de agua",
     ylab = "Porcentaje (%)",
     col = "red",
     type = "p",
     lwd = 2,
     xaxt="n")
lines(x_pos, Hi_asc,
      col = "blue",
      type = "p",
      lwd = 3)
axis(side = 1, at = x_pos, labels = TDF_sin_total$`Intervalos de recuento de
     coliformes`, las = 2, cex.axis = 0.7)

7. Indicadores Estadísticos

7.1 Indicadores de Tendencia Cental

# Media aritmética
media <- round(mean(Recuento_coliformes), 2)
media
## [1] 100
# Moda
max_ni <- max(TDF_Recuento_coliformes$ni)
moda <- TDF_Recuento_coliformes$MC[TDF_Recuento_coliformes$ni == max_ni]
moda
## NULL
# Mediana
mediana <- median(Recuento_coliformes)
mediana
## [1] 100

7.2 Indicadores de Dispersión

# INDICADORES DE DISPERSIÓN #

# Varianza
varianza <- var(Recuento_coliformes)
varianza
## [1] 99.84261
# Desviación Estándar
sd <- sd(Recuento_coliformes)
sd
## [1] 9.992127
# Coeficiente de Variación
cv <- round((sd / media) * 100, 2)
cv
## [1] 9.99

7.3 Indicadores de Forma

# INDICADORES DE FORMA #

# Asimetría
library(e1071)
asimetria <- skewness(Recuento_coliformes, type = 2)
asimetria
## [1] 0.07865388
#Curtosis
curtosis <- kurtosis(Recuento_coliformes)
curtosis
## [1] -0.0656731

8. Tabla Resumen

tabla_indicadores <- data.frame("Variable" =c("Recuento de coliformes por 
                                              cada 100ml)"),
                                "Rango" = c("[60;140]"),
                                "X" = c(media),
                                "Me" = c(round(mediana,2)),
                                "Mo" = c("No hay 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" = "[69;136]")
library(knitr)
kable(tabla_indicadores, align = 'c', caption = "Conclusiones de la variable
      Recuento de coliformes por cada 100 ml")
Conclusiones de la variable Recuento de coliformes por cada 100 ml
Variable Rango X Me Mo V Sd Cv As K Valores.Atipicos
Recuento de coliformes por
cada 100ml) [60;140] 100 100 No hay moda 99.84 9.99 9.99 0.08 -0.07 [69;136]

9. Conclusión

La variable Recuento de Coliformes (UFC 100ml) fluctua entre 60 y 140, y sus valores giran entorno a 100, con una desviación estandar de 9.99 siendo un conjunto de valores heterogéneo. Los valores se acumulan de manera moderada en la parte baja de la variable. Con valores atípicos que parte de 69 hasta 140, por lo anterior el Recuento de Coliformes (UFC 100ml) es siendo moderadamente bueno para el caso de analisis de contaminación del agua en China en el año 2023.