# UNIVERSIDAD CENTRAL DEL ECUADOR 
# Facultad de Ingeniería en Geología, Minas, Petróleos y Ambiental
# Ingeniería Ambiental
# Autor: Grupo 1
# Fecha: 08/12/2025

#======================================
#    CARGA DE DATOS
#======================================

datos <- datasets::airquality

# Extracción de variable cuantitativa continua
Ozono <- datos$Ozone
Ozono <- subset(Ozono, Ozono >= 0)

#======================================
#    TABLA DE FRECUENCIAS MANUAL
#======================================

min <- min(Ozono)
max <- max(Ozono)
R <- max - min
K <- floor(1 + 3.33 * log10(length(Ozono)))  # número de clases
A <- R / K                                   # amplitud

lim_inf <- round(seq(from = min, to = max - A, by = A), 2)
lim_sup <- round(seq(from = min + A, to = max, by = A), 2)
MC <- (lim_inf + lim_sup) / 2

ni <- c()
for (i in 1:K) {
  if (i < K) {
    ni[i] <- length(subset(Ozono, Ozono >= lim_inf[i] & Ozono < lim_sup[i]))
  } else {
    ni[i] <- length(subset(Ozono, Ozono >= lim_inf[i] & Ozono <= lim_sup[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_Ozono <- data.frame(
  lim_inf,
  lim_sup,
  MC,
  ni,
  round(hi, 2),
  Ni_asc,
  Ni_desc,
  round(Hi_asc, 2),
  round(Hi_desc, 2)
)

colnames(TDF_Ozono) <- c(
  "Lim inf","Lim sup","MC","ni","hi(%)",
  "Ni asc","Ni desc","Hi asc(%)","Hi desc(%)"
)

# Fila de totales
totales <- c(
  lim_inf="TOTAL",
  lim_sup="-",
  MC="-",
  ni=sum(ni),
  hi=sum(hi),
  Ni_asc="-",
  Ni_desc="-",
  Hi_asc="-",
  Hi_desc="-"
)

TDF_Ozono_total <- rbind(TDF_Ozono, totales)

#======================================
#       MOSTRAR TABLA BONITA
#======================================

library(knitr)
## Warning: package 'knitr' was built under R version 4.5.2
library(kableExtra)
## Warning: package 'kableExtra' was built under R version 4.5.2
kable(TDF_Ozono_total, align='c',
      caption="Tabla de Distribución de Frecuencias de la Concentración de Ozono en el Aire") %>%
  kable_styling(full_width=FALSE, position="center",
                bootstrap_options=c("striped","hover","condensed"))
Tabla de Distribución de Frecuencias de la Concentración de Ozono en el Aire
Lim inf Lim sup MC ni hi(%) Ni asc Ni desc Hi asc(%) Hi desc(%)
1 24.86 12.93 50 43.1 50 116 43.1 100
24.86 48.71 36.785 30 25.86 80 66 68.97 56.9
48.71 72.57 60.64 12 10.34 92 36 79.31 31.03
72.57 96.43 84.5 15 12.93 107 24 92.24 20.69
96.43 120.29 108.36 6 5.17 113 9 97.41 7.76
120.29 144.14 132.215 2 1.72 115 3 99.14 2.59
144.14 168 156.07 1 0.86 116 1 100 0.86
TOTAL
116 100
#======================================
#     #Simplificación con el histograma
#======================================
Hist_Ozono <- hist(Ozono,breaks = 10,plot=F)
k <- length(Hist_Ozono$breaks)
Li <- Hist_Ozono$breaks[1:(length(Hist_Ozono$breaks)-1)]
Ls <- Hist_Ozono$breaks[2:length(Hist_Ozono$breaks)]
ni <- Hist_Ozono$counts

sum(ni)
## [1] 116
MC <- Hist_Ozono$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_Ozono <- 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_Ozono) <- c("Lim inf","Lim sup","MC","ni","hi(%)",
                         "Ni asc","Ni desc","Hi asc(%)","Hi desc(%)")

# crear de fila de totales
totales <- c( lim_inf= "TOTAL",
              lim_sup= "-",
              MC= "-",
              ni= sum(ni),
              hi= sum(hi*100),
              Ni_asc= "-",
              Ni_des= "-",
              Hi_asc= "-",
              Hi_des= "-")

TDF_Ozono_total <- rbind(TDF_Ozono, totales)

kable(TDF_Ozono_total, align = 'c', 
      caption = "Tabla de Distribución de Frecuencias de la Concentración de 
      Ozono en el Aire") %>%
  kable_styling(full_width = FALSE, position = "center", 
                bootstrap_options = c("striped", "hover", "condensed"))
Tabla de Distribución de Frecuencias de la Concentración de Ozono en el Aire
Lim inf Lim sup MC ni hi(%) Ni asc Ni desc Hi asc(%) Hi desc(%)
0 20 10 37 31.9 37 116 31.9 100
20 40 30 34 29.31 71 79 61.21 68.1
40 60 50 14 12.07 85 45 73.28 38.79
60 80 70 15 12.93 100 31 86.21 26.72
80 100 90 9 7.76 109 16 93.97 13.79
100 120 110 4 3.45 113 7 97.41 6.03
120 140 130 2 1.72 115 3 99.14 2.59
140 160 150 0 0 115 1 99.14 0.86
160 180 170 1 0.86 116 1 100 0.86
TOTAL
116 100
# GRAFICAS

# Histograma
hist(Ozono, breaks = 11,
     main = "Gráfica N°1: Distribución de la Concentración de 
                   Ozono Presente en el Aire",
     ylab = "Cantidad",
     ylim = c(0, max(ni)),
     col = "purple",
     cex.main = 0.9,
     cex.lab = 1,
     cex.axis = 0.9,
     xaxt = "n")
axis(1, at = Hist_Ozono$breaks,
     labels = Hist_Ozono$breaks, las = 1,
     cex.axis = 0.9)

# Global
hist(Ozono, breaks = 11,
     main = "Gráfica N°2:Gráfica N°1: Distribución de la Concentración de 
                   Ozono Presente en el Aire",
     ylab = "Cantidad",
     ylim = c(0, length(Ozono)),
     col = "purple",
     cex.main = 1,
     cex.lab = 1,
     cex.axis = 0.9,
     xaxt = "n")
axis(1, at = Hist_Ozono$breaks,
     labels = Hist_Ozono$breaks, las = 1,
     cex.axis = 0.9)

barplot(TDF_Ozono[["hi(%)"]],
        space=0,
        col = "skyblue",
        main ="Gráfica N°3: Distribución de la Concentración de Ozono 
        Presente en el Aire",
        ylab="Porcentaje (%)",
        names.arg= TDF_Ozono$MC,
        ylim = c(0,100))

# Local
hist(Ozono, breaks = 11,
     main = "Gráfica N°4:Distribución de la Concentración de Ozono 
        Presente en el Aire",
     ylab = "Cantidad",
     ylim = c(0,max(ni)),
     col = "purple",
     cex.main = 0.9,
     cex.lab = 1,
     cex.axis = 0.9,
     xaxt = "n")
axis(1, at = Hist_Ozono$breaks,
     labels = Hist_Ozono$breaks, las = 1,
     cex.axis = 0.9)

barplot(TDF_Ozono$'hi(%)',space=0,
        col = "lightblue",
        main ="Gráfica N°5:Distribución de la Concentración de Ozono 
        Presente en el Aire",
        ylab="Porcentaje (%)",
        ylim = c(0,30),
        cex.main = 0.9,
        cex.lab = 1,
        cex.axis = 0.9,
        names.arg = TDF_Ozono$MC)

# Diagrama de Caja
boxplot(Ozono,
        horizontal = TRUE,
        main = "Gráfica N°6: Distribución de la Concentración de Ozono 
        Presente en el Aire",
        col = "purple",
        outline = TRUE,
        pch = 1)

# Diagrama de Ojiva Ascendente y Descendente
plot(Li ,Ni_desc,
     main = "Gráfica N°7:Ojiva Ascendente y Descendente de la Distribución de 
     la Concentración de Ozono",
     ylab = "Cantidad",
     xlim = c(0,120),
     col = "orange",
     cex.axis=0.8,
     type = "o",
     lwd = 3,
     las=1,
     xaxt="n")
lines(Ls,Ni_asc,
      col = "green",
      type = "o",
      lwd = 3)
axis(1, at = unique(round(c(Li, Ls), 2)))

# Diagrama de Ojiva Ascendente y Descendente Porcentual
plot(Li, Hi_desc * 100,
     main = "Gráfica N°8:Ojiva Ascendente y Descendente Porcentual de 
     la Concentración de Ozono",
     ylab = "Porcentaje (%)",
     xlim = c(0,120),
     col = "red",
     type = "o",
     lwd = 2,
     xaxt="n")
lines(Ls, Hi_asc * 100,
      col = "blue",
      type = "o",
      lwd = 3)
axis(1, at = unique(round(c(Li, Ls), 2)))

# INDICADORES ESTADISTICOS

# Indicadores de Tendencia Central

# Media aritmética
media <- round(mean(Ozono), 2)
media
## [1] 42.13
# Moda
max_frecuencia <- max(TDF_Ozono$ni)
moda <- TDF_Ozono$MC[TDF_Ozono$ni == max_frecuencia]
moda
## [1] 10
# Mediana
mediana <- median(Ozono)
mediana
## [1] 31.5
# INDICADORES DE DISPERSIÓN #
# Varianza
varianza <- var(Ozono)
varianza
## [1] 1088.201