# 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

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

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

10. Conclusiones

```