# Tema: Estadística Descriptiva
# Autor: Camila Zambrano
# Fecha: 26/05/2026

0.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

1. Leer datos

setwd("~/CAMILA")
datos <- read.csv("Datos cambiados..csv",
                  header = TRUE, 
                  sep = ",", dec = "." )

2. 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

3. Conteo (frecuencia)

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))

# Marca de clase
Mc <- (Li + Ls)/2

# Frecuencia absoluta
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])
  }
}

# Frecuencia relativa
hi <- round((ni / sum(ni)) * 100, 2)
hi[length(hi)] <- round(
  100 - sum(hi[-length(hi)]),
  2
)

# Frecuencia acumuladas 
Ni_asc <- cumsum(ni)
Ni_dsc <- rev(cumsum(rev(ni)))
Hi_asc <- round(cumsum(hi), 2)
Hi_dsc <- round(rev(cumsum(rev(hi))), 2)

3. Tabla de distribución de frecuencia

# 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

# 4. Gráficas de distribución de frecuencia

4.1 Histograma

# Diagrama de barras general
histograma_general <-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
histograma_simplificado <- hist(
  dioxido_nitrogeno,
  breaks = 10,
  plot = FALSE
)

# Límites y frecuencias
Limites <- histograma_simplificado$breaks

Li <- Limites[1:(length(Limites)-1)]
Ls <- Limites[2:length(Limites)]

Mc <- histograma_simplificado$mids
ni <- histograma_simplificado$counts

hi <- ni/sum(ni)*100
hi <- round(hi, 2)
hi[length(hi)] <- round(
  100 - sum(hi[-length(hi)]),
  2
)

Ni_asc <- cumsum(ni)
Ni_dsc <- rev(cumsum(rev(ni)))

Hi_asc <- cumsum(hi)
Hi_dsc <- rev(cumsum(rev(hi)))
Hi_asc <- round(Hi_asc, 2)
Hi_dsc <- round(Hi_dsc, 2)
Hi_asc[length(Hi_asc)] <- 100
Hi_dsc[1] <- 100

# Tabla
TDF_completa <- data.frame(
  Li,
  Ls,
  Mc,
  ni,
  hi,
  Ni_asc,
  Ni_dsc,
  Hi_asc,
  Hi_dsc
)

# Totales
totalni <- sum(ni)
totalhi <- sum(hi)

# Agregar fila total
TDF_simplificada_completa <-rbind(
  TDF_completa,
  data.frame(
    Li = "Total",
    Ls = "-",
    Mc = "-",
    ni = totalni,
    hi = totalhi,
    Ni_asc = "-",
    Ni_dsc = "-",
    Hi_asc = "-",
    Hi_dsc = "-"
  )
)

# Crear tabla gt
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 = Li == "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
Li Ls Mc ni hi Ni_asc Ni_dsc Hi_asc Hi_dsc
0 50 25 22236 85.70 22236 25946 85.7 100
50 100 75 3218 12.40 25454 3710 98.1 14.3
100 150 125 384 1.48 25838 492 99.58 1.9
150 200 175 79 0.30 25917 108 99.88 0.42
200 250 225 24 0.09 25941 29 99.97 0.12
250 300 275 4 0.02 25945 5 99.99 0.03
300 350 325 0 0.00 25945 1 99.99 0.01
350 400 375 1 0.01 25946 1 100 0.01
Total - - 25946 100.00 - - - -
Autor:Grupo 1

4.2 Histograma

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
)

4.3 Histograma

# Diagrama de barras con relación al todo
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),
  xlim = c(0, 150),
  cex.main = 1.1,
  cex.lab = 1.1
)

4.4 Histograma porcentual

# Eliminar la fila total de la tabla
TDF_simplificada_completa_sintotal <- 
  TDF_simplificada_completa[
    TDF_simplificada_completa$Li != "Total", 
  ]

barplot(
  TDF_simplificada_completa_sintotal$hi,
  space = 0,
  col = "pink",
  main = "Gráfica Nº4: Diagrama porcentual de Dióxido 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_simplificada_completa_sintotal$Mc,
  cex.names = 0.9,
  cex.main = 1.1,
  cex.lab = 1.1
)

4.5 Histograma porcentual

# Tabla sin la fila Total
barplot(
  TDF_simplificada_completa_sintotal$hi,
  space = 0,
  col = "yellow",
  main = "Gráfica Nº5: Diagrama porcentual de Dióxido 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_simplificada_completa_sintotal$Mc,
  ylim = c(0, 100),
  cex.names = 0.8,
  cex.main = 1.1,
  cex.lab = 1.1
)

5. 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 = "orange",
        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

6. Ojivas

6.1 Ojivas Ascendentes y Descendentes (ni)

Ni_asc <- cumsum(ni)
Ni_dsc <- rev(cumsum(rev(ni)))

plot(Li, Ni_asc,
     type = "o",
     col = "skyblue",
     lwd = 3,
     xlim = c(minimo,maximo),
     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 = "red",
      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 = "skyblue",
     lwd = 3,
     xlim = c(minimo,maximo),
     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)
axis(1, at = round(seq(minimo, maximo, length.out = 10), 0))

7.Indicadores Estadísticos

7.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

7.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

7.3 Indicadores de Forma

# Asimetría
library(e1071)
asimetria <- skewness(dioxido_nitrogeno, type = 2)
asimetria
## [1] 2.46456
# Curtosis
curtosis <- kurtosis(dioxido_nitrogeno)
curtosis
## [1] 11.20764

8. 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
Variable Rango X Me Mo V Sd Cv As K Valores.Atípicos
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]

9. Conclusiones