# 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