# Tema: Estadística Descriptiva
# Autor: Camila Zambrano
# Fecha: 26/05/2026
1.Carga de librerías
library(knitr)
library(kableExtra)
library(readr)
library(gt)
library(dplyr)
##
## Adjuntando el paquete: 'dplyr'
## The following object is masked from 'package:kableExtra':
##
## group_rows
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
2. Leer datos
setwd("~/CAMILA")
datos <- read.csv("Datos cambiados..csv",
header = TRUE,
sep = ",", dec = "." )
3. Selección de la variable
# Limpiar variable
datos$NO2[datos$NO2 == "-"] <- NA
datos$NO2 <- as.numeric(datos$NO2)
# Eliminar NA
dioxido_nitrogeno <- na.omit(datos$NO2)
dioxido_nitrogeno <- dioxido_nitrogeno[dioxido_nitrogeno >= 0]
# Tamaño de muestra
n <- length(dioxido_nitrogeno)
n
## [1] 25946
4. Tabla de distribución de frecuencia
4.1 Construcción manual (Regla de Sturges)
# Parámetros
minimo <- min(dioxido_nitrogeno)
maximo <- max(dioxido_nitrogeno)
R <- maximo - minimo
K <- floor(1 + 3.322 * log10(n))
A <- R / K
# Límites
Li <- round(seq(from = minimo, to = maximo, length.out = K), 2)
Ls <- c(Li[-1], round(maximo,2))
Mc <- (Li + Ls)/2
ni <- numeric(K)
for (i in 1:K) {
if (i < K) {
ni[i] <- sum(dioxido_nitrogeno >= Li[i] &
dioxido_nitrogeno < Ls[i])
} else {
ni[i] <- sum(dioxido_nitrogeno >= Li[i] &
dioxido_nitrogeno <= Ls[i])
}
}
hi <- round((ni / sum(ni)) * 100, 2)
hi[length(hi)] <- round(
100 - sum(hi[-length(hi)]),
2
)
Ni_asc <- cumsum(ni)
Ni_dsc <- rev(cumsum(rev(ni)))
Hi_asc <- round(cumsum(hi), 2)
Hi_dsc <- round(rev(cumsum(rev(hi))), 2)
# Tabla de frecuencias
TDF_dioxido_nitrogeno <-data.frame(Li, Ls, Mc, ni, hi,
Ni_asc, Ni_dsc,
Hi_asc, Hi_dsc)
# Totales
total_ni <- sum(ni)
total_hi <- sum(hi)
# Agregra fila total
TDF_dioxido_nitrogeno_completo <- rbind(
TDF_dioxido_nitrogeno,
data.frame(
Li = "Total",
Ls = "-",
Mc = "-",
ni = total_ni,
hi = total_hi,
Ni_asc = "-",
Ni_dsc = "-",
Hi_asc = "-",
Hi_dsc = "-"
)
)
# Redondeo
TDF_dioxido_nitrogeno_completo$hi <- round(
as.numeric(TDF_dioxido_nitrogeno_completo$hi),
2
)
tabla_dioxido_nitrogeno <- TDF_dioxido_nitrogeno_completo %>%
gt() %>%
fmt_number(
columns = hi,
decimals = 2
) %>%
tab_header(
title = md("*Tabla Nº1*"),
subtitle = md(
"**Distribución de frecuencia de Dióxiodo de Nitrógeno en el análisis
sobre la calidad del aire en India**"
)
) %>%
tab_source_note(
source_note = md("Autor: Grupo 1")
) %>%
tab_options(
table.border.top.color = "black",
table.border.bottom.color = "black",
table.border.top.style = "solid",
table.border.bottom.style = "solid",
column_labels.border.top.color = "black",
column_labels.border.bottom.color = "black",
column_labels.border.bottom.width = px(2),
row.striping.include_table_body = TRUE,
heading.border.bottom.color = "black",
heading.border.bottom.width = px(2),
table_body.hlines.color = "gray",
table_body.border.bottom.color = "black"
) %>%
tab_style(
style = cell_text(weight = "bold"),
locations = cells_body(
rows = Li == "Total"
)
)
tabla_dioxido_nitrogeno
| Tabla Nº1 |
| Distribución de frecuencia de Dióxiodo de Nitrógeno en el análisis
sobre la calidad del aire en India |
| Li |
Ls |
Mc |
ni |
hi |
Ni_asc |
Ni_dsc |
Hi_asc |
Hi_dsc |
| 0.01 |
25.88 |
12.945 |
15044 |
57.98 |
15044 |
25946 |
57.98 |
100 |
| 25.88 |
51.75 |
38.815 |
7462 |
28.76 |
22506 |
10902 |
86.74 |
42.02 |
| 51.75 |
77.62 |
64.685 |
2325 |
8.96 |
24831 |
3440 |
95.7 |
13.26 |
| 77.62 |
103.5 |
90.56 |
676 |
2.61 |
25507 |
1115 |
98.31 |
4.3 |
| 103.5 |
129.37 |
116.435 |
249 |
0.96 |
25756 |
439 |
99.27 |
1.69 |
| 129.37 |
155.24 |
142.305 |
94 |
0.36 |
25850 |
190 |
99.63 |
0.73 |
| 155.24 |
181.11 |
168.175 |
56 |
0.22 |
25906 |
96 |
99.85 |
0.37 |
| 181.11 |
206.98 |
194.045 |
18 |
0.07 |
25924 |
40 |
99.92 |
0.15 |
| 206.98 |
232.85 |
219.915 |
11 |
0.04 |
25935 |
22 |
99.96 |
0.08 |
| 232.85 |
258.72 |
245.785 |
6 |
0.02 |
25941 |
11 |
99.98 |
0.04 |
| 258.72 |
284.6 |
271.66 |
3 |
0.01 |
25944 |
5 |
99.99 |
0.02 |
| 284.6 |
310.47 |
297.535 |
1 |
0.00 |
25945 |
2 |
99.99 |
0.01 |
| 310.47 |
336.34 |
323.405 |
0 |
0.00 |
25945 |
1 |
99.99 |
0.01 |
| 336.34 |
362.21 |
349.275 |
0 |
0.00 |
25945 |
1 |
99.99 |
0.01 |
| 362.21 |
362.21 |
362.21 |
1 |
0.01 |
25946 |
1 |
100 |
0.01 |
| Total |
- |
- |
25946 |
100.00 |
- |
- |
- |
- |
| Autor: Grupo 1 |
5. Gráficas
5.1 Histograma
histoP<-hist(
dioxido_nitrogeno,
main= "Gráfica Nº1: Distribución de Dióxiodo de Nitrógeno en el análisis
sobre la calidad del aire en India",
xlab= "Dióxido de nitrógeno (µg/m3)",
ylab= "Cantidad", col="blue",
)

#Tabla simplificada en base al histograma
# Histograma con 10 clases
histoP <- hist(
dioxido_nitrogeno,
breaks = 10,
plot = FALSE
)
Limites <- histoP$breaks
LimInf <- Limites[1:(length(Limites)-1)]
LimSup <- Limites[2:length(Limites)]
Mc <- histoP$mids
ni <- histoP$counts
sum(ni)
## [1] 25946
hi <- round(ni/sum(ni)*100, 2)
sum(hi)
## [1] 99.99
Ni_asc <- cumsum(ni)
Ni_dsc <- rev(cumsum(rev(ni)))
Hi_asc <- round(cumsum(hi), 2)
Hi_dsc <- round(rev(cumsum(rev(hi))), 2)
TDF_completa <-data.frame(LimInf, LimSup, Mc, ni, hi, Ni_asc, Ni_dsc, Hi_asc, Hi_dsc)
totalni <- sum(ni)
totalhi <- 100
TDF_simplificada_completa <-rbind(
TDF_completa,
data.frame(LimInf="Total",
LimSup=" ", Mc=" ", ni=totalni,
hi=totalhi, Ni_asc=" ", Ni_dsc=" ",
Hi_asc=" ", Hi_dsc=" ")
)
tabla_simplificada<-TDF_simplificada_completa %>%
gt() %>%
tab_header(
title = md("*Tabla Nº2*"),
subtitle = md("**Tabla simplificada de distribución de frecuencia
de Dióxiodo de Nitrógeno en el análisis sobre la calidad del aire en India**")
) %>%
tab_source_note(
source_note = md("Autor:Grupo 1")
) %>%
tab_options(
table.border.top.color = "black",
table.border.bottom.color = "black",
table.border.top.style = "solid",
table.border.bottom.style = "solid",
column_labels.border.top.color = "black",
column_labels.border.bottom.color = "black",
column_labels.border.bottom.width = px(2),
row.striping.include_table_body = TRUE,
heading.border.bottom.color = "black",
heading.border.bottom.width = px(2),
table_body.hlines.color = "gray",
table_body.border.bottom.color = "black"
) %>%
tab_style(
style = cell_text(weight = "bold"),
locations = cells_body(
rows = LimInf == "Total"
)
)
tabla_simplificada
| Tabla Nº2 |
| Tabla simplificada de distribución de frecuencia
de Dióxiodo de Nitrógeno en el análisis sobre la calidad del aire en India |
| LimInf |
LimSup |
Mc |
ni |
hi |
Ni_asc |
Ni_dsc |
Hi_asc |
Hi_dsc |
| 0 |
50 |
25 |
22236 |
85.70 |
22236 |
25946 |
85.7 |
99.99 |
| 50 |
100 |
75 |
3218 |
12.40 |
25454 |
3710 |
98.1 |
14.29 |
| 100 |
150 |
125 |
384 |
1.48 |
25838 |
492 |
99.58 |
1.89 |
| 150 |
200 |
175 |
79 |
0.30 |
25917 |
108 |
99.88 |
0.41 |
| 200 |
250 |
225 |
24 |
0.09 |
25941 |
29 |
99.97 |
0.11 |
| 250 |
300 |
275 |
4 |
0.02 |
25945 |
5 |
99.99 |
0.02 |
| 300 |
350 |
325 |
0 |
0.00 |
25945 |
1 |
99.99 |
0 |
| 350 |
400 |
375 |
1 |
0.00 |
25946 |
1 |
99.99 |
0 |
| Total |
|
|
25946 |
100.00 |
|
|
|
|
| Autor:Grupo 1 |
5.2 Histograma local
hist(
dioxido_nitrogeno,
breaks = seq(minimo, maximo, A),
main = "Gráfica Nº2: Distribución de Dióxiodo de Nitrógeno en el análisis
sobre la calidad del aire en India",
xlab = "Dióxido de nitrógeno (µg/m3)",
ylab = "Cantidad",
col = "lightgreen",
cex.main = 1.1,
cex.lab = 1.1
)

5.3 Histograma global
hist(
dioxido_nitrogeno,
breaks = seq(minimo, maximo, A),
main = "Gráfica Nº3: Frecuencia de Dióxiodo de Nitrógeno en el análisis
sobre la calidad del aire en India",
xlab = "Dióxido de nitrógeno (µg/m3)",
ylab = "Cantidad",
col = "skyblue",
ylim = c(0, 29531),
cex.main = 1.1,
cex.lab = 1.1
)

5.4 Histograma porcentual local
barplot(
TDF_dioxido_nitrogeno_completo$hi,
space = 0,
col = "skyblue",
main = "Gráfica Nº4: Diagrama porcentual de Dióxiodo de Nitrógeno en el análisis
sobre la calidad del aire en India",
xlab = "Dióxido de nitrógeno (µg/m3)",
ylab = "Porcentaje",
ylim = c(0,90),
names.arg = TDF_dioxido_nitrogeno_completo$Mc,
cex.names = 0.9,
cex.main = 1.1,
cex.lab = 1.1
)

5.5 Histograma porcentual global
barplot(
TDF_dioxido_nitrogeno_completo$hi,
space = 0,
col = "yellow",
main = "Gráfica Nº5: Diagrama porcentual de Dioxiodo de Nitrógeno en el análisis
sobre la calidad del aire en India",
xlab = "Dióxido de nitrógeno (µg/m3)",
ylab = "Porcentaje",
names.arg = TDF_dioxido_nitrogeno_completo$Mc,
ylim = c(0, 100),
cex.names = 0.8,
cex.main = 1.1,
cex.lab = 1.1
)

6. Diagrama de caja
boxplot(dioxido_nitrogeno,
horizontal = TRUE,
main = "Gráfica N°6: Diagrama de caja del Dioxiodo de Nitrógeno en el análisis
sobre la calidad del aire en India",
xlab = "Dióxido de nitrógeno (µg/m3)",
col = "pink",
outline = TRUE)

summary(dioxido_nitrogeno)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.01 11.75 21.69 28.56 37.62 362.21
# Recuperar datos de la tabla original
Li <- TDF_dioxido_nitrogeno$Li
Ls <- TDF_dioxido_nitrogeno$Ls
ni <- TDF_dioxido_nitrogeno$ni
hi <- TDF_dioxido_nitrogeno$hi
7. Ojivas
7.1 Ojivas Ascendentes y Descendentes (ni)
Ni_asc <- cumsum(ni)
Ni_dsc <- rev(cumsum(rev(ni)))
plot(Ls, Ni_asc,
type = "o",
col = "orange",
lwd = 3,
xlab = "Dióxido de nitrógeno (µg/m3)",
ylab = "Frecuencia acumulada",
main = "Gráfica N°7: Ojiva Ascendente y Descendente")
lines(Li, Ni_dsc,
type = "o",
col = "green",
lwd = 3)

7.2 Ojivas Ascendentes y Descendentes (hi)
Hi_asc <- cumsum(hi)
Hi_dsc <- rev(cumsum(rev(hi)))
plot(Ls, Hi_asc,
type = "o",
col = "blue",
lwd = 3,
xlab = "Dióxido de nitrógeno (µg/m3)",
ylab = "Porcentaje acumulado",
main = "Gráfica N°8: Ojiva porcentual Ascendente y Descendente")
lines(Li, Hi_dsc,
type = "o",
col = "red",
lwd = 3)

8.Indicadores Estadísticos
8.1 Indicadores de Tendencia Central
# Media aritmética
media <- round(mean(dioxido_nitrogeno),2)
media
## [1] 28.56
# Mediana
mediana <- median(dioxido_nitrogeno)
mediana
## [1] 21.69
# Moda
max_ni <- max(TDF_dioxido_nitrogeno$ni)
moda <- TDF_dioxido_nitrogeno$Mc[TDF_dioxido_nitrogeno$ni == max_ni]
moda
## [1] 12.945
8.2 Indicadores de Dispersión
# Varianza
varianza <- var(dioxido_nitrogeno)
varianza
## [1] 599.0132
# Desviación estándar
sd <- sd(dioxido_nitrogeno)
sd
## [1] 24.47475
# Coeficiente de variación
cv <- round((sd / media) * 100, 2)
cv
## [1] 85.7
9. Tabla de Resumen
tabla_indicadores <- data.frame(
"Variable" = c("Dióxido de nitrógeno"),
"Rango" = paste0(
"[",
min(dioxido_nitrogeno),
";",
max(dioxido_nitrogeno),
"]"
),
"X" = media,
"Me" = round(mediana, 2),
"Mo" = moda,
"V" = round(varianza, 2),
"Sd" = round(sd, 2),
"Cv" = cv,
"As" = round(asimetria, 2),
"K" = round(curtosis, 2),
"Valores Atípicos" = "[0.01;362.21]"
)
library(knitr)
kable(
tabla_indicadores,
align = "c",
caption = "Conclusiones de la variable Dióxido de nitrógeno"
)
Conclusiones de la variable Dióxido de nitrógeno
| Dióxido de nitrógeno |
[0.01;362.21] |
28.56 |
21.69 |
12.945 |
599.01 |
24.47 |
85.7 |
2.46 |
11.21 |
[0.01;362.21] |