##Estadística Descriptiva
#Variable Continua Benceno
#Llumitasig Daniela 

0.- Carga de librerías

library(gt)
library(dplyr)
## 
## Adjuntando el paquete: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(e1071)
## Warning: package 'e1071' was built under R version 4.5.3

1.- Carga de datos

datos <- read.csv("~/Estadistica/Proyecto 2026/Datos utilizados/city_day (1).csv")

2.- Selección de la variable

benceno <- datos$Benzene

#Extraccion de los "-" de la variable Benzene debido a que son valores inexistentes, 
# para un mejor analisis, cambia tamaño muestral de 29531 a 23908

datos$Benzene[datos$Benzene == "-"] <- NA

datos$Benzene <- as.numeric(datos$Benzene)

benceno <- na.omit(datos$Benzene)

#Filtrar benceno 
benceno <- subset(datos$Benzene, datos$Benzene >= 0)

3.- Frecuencia (Conteo)

# Calcular el mínimo y máximo de NH3
min_benceno <- min(benceno)
max_benceno <- max(benceno)

#Calcular rango 
R <- max_benceno - min_benceno

#Calcular intervalos 
K <- floor(1 + 3.33 * log10(length(benceno)))

#Calcular amplitud 
A <-R/K

#Limite inferior 
Li <-round(seq(from=min_benceno,to=max_benceno-A,by=A),2)

#Limite superior 
Ls <-round(seq(from=min_benceno+A,to=max_benceno,by=A),2)

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

# Vector vacío para guardar las frecuencias de cada clase
ni <- c()

for (i in 1:K) {
  if (i < K) {
    # Para las primeras clases: [Li , Ls)
    ni[i] <- length(subset(benceno, benceno >= Li[i] & benceno < Ls[i]))
  } else {
    # Para la última clase: [Li , Ls]
    ni[i] <- length(subset(benceno, benceno >= Li[i] & benceno <= Ls[i]))
  }
}

N <- sum(ni)
hi <- (ni / N) * 100
Ni_asc <- cumsum(ni)
Ni_desc <- rev(cumsum(rev(ni)))
Hi_asc <- cumsum(hi)
Hi_desc <- rev(cumsum(rev(hi)))
Intervalo <- paste0("[", round(Li,2), " - ", round(Ls,2), ")")
Intervalo[length(Intervalo)] <- paste0("[", round(Li[length(Li)],2), " - ", 
                                       round(Ls[length(Ls)],2), "]")

4- Tabla de distribución de frecuencia

Tabla general

TDF_benceno <- data.frame(
  Intervalo = Intervalo,
  Mc = round(Mc, 2),
  ni = ni,
  hi = round(hi, 2),
  Ni_asc = Ni_asc,
  Ni_desc = Ni_desc,
  Hi_asc = round(Hi_asc, 2),
  Hi_desc = round(Hi_desc, 2)
)
# Crear fila de totales para Benceno
totales <- data.frame(
  Intervalo = "Totales",
  Mc = "-",
  ni = sum(ni),
  hi = round(sum(hi), 2),
  Ni_asc = "-",
  Ni_desc = "-",
  Hi_asc= "-",
  Hi_desc = "-"
)

TDF_benceno <- rbind(TDF_benceno, totales)

length(Li)
## [1] 15
library(gt)
library(dplyr)

TDF_benceno %>%
  gt() %>%
  tab_header(
    title = md("*Tabla Nro. 1*"),
    subtitle = md("**Distribución de frecuencias de la concentración de Benceno en el estudio de calidad del aire en la India**")
  ) %>%
  tab_source_note(
    source_note = md("Autor: Grupo 1
                     \n Fuente:https://www.kaggle.com/datasets/rohanrao/air-quality-data-in-india")
  ) %>%
  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"
  )
Tabla Nro. 1
Distribución de frecuencias de la concentración de Benceno en el estudio de calidad del aire en la India
Intervalo Mc ni hi Ni_asc Ni_desc Hi_asc Hi_desc
[0 - 30.34) 15.17 23698 99.12 23698 23908 99.12 100
[30.34 - 60.67) 45.51 121 0.51 23819 210 99.63 0.88
[60.67 - 91.01) 75.84 31 0.13 23850 89 99.76 0.37
[91.01 - 121.34) 106.18 8 0.03 23858 58 99.79 0.24
[121.34 - 151.68) 136.51 4 0.02 23862 50 99.81 0.21
[151.68 - 182.01) 166.84 8 0.03 23870 46 99.84 0.19
[182.01 - 212.35) 197.18 4 0.02 23874 38 99.86 0.16
[212.35 - 242.68) 227.51 3 0.01 23877 34 99.87 0.14
[242.68 - 273.02) 257.85 2 0.01 23879 31 99.88 0.13
[273.02 - 303.35) 288.18 7 0.03 23886 29 99.91 0.12
[303.35 - 333.69) 318.52 1 0.00 23887 22 99.91 0.09
[333.69 - 364.02) 348.86 0 0.00 23887 21 99.91 0.09
[364.02 - 394.36) 379.19 1 0.00 23888 21 99.92 0.09
[394.36 - 424.69) 409.52 4 0.02 23892 20 99.93 0.08
[424.69 - 455.03] 439.86 16 0.07 23908 16 100 0.07
Totales - 23908 100.00 - - - -
Autor: Grupo 1

Fuente:https://www.kaggle.com/datasets/rohanrao/air-quality-data-in-india

Tabla simplificada

#Histograma benceno
histo_benceno <-hist(benceno,plot = FALSE)



Lis<-histo_benceno$breaks [1:10]
Lss<-histo_benceno$breaks [2:11]
MCs<-(Lis+Lss)/2
nis<-histo_benceno$counts
his <- (nis / N) * 100
Nis_asc <- cumsum(nis) 
His_asc <- cumsum(his) 
Nis_desc <- rev(cumsum(rev(nis)))
His_desc <- rev(cumsum(rev(his)))
Intervalos <- paste0("[", round(Lis,2), " - ", round(Lss,2), ")")
Intervalos[length(Intervalos)] <- paste0("[", round(Lis[length(Lis)],2), 
                                         " - ", round(Lss[length(Lss)],2), "]")
TDF_bencenosimplificado <- data.frame(
  Intervalo = Intervalos,
  MC = round(MCs, 2),
  ni = nis,
  hi= round(his, 2),
  Ni_ascendente = Nis_asc,
  Hi_ascendente = round(His_asc, 2),
  Ni_descendente = Nis_desc,
  Hi_descendente = round(His_desc, 2)
)
colnames(TDF_bencenosimplificado) <- c(
  "Intervalo",
  "MC",
  "ni",
  "hi(%)",
  "Ni_asc",
  "Hi_asc (%)",
  "Ni_desc",
  "Hi_desc (%)"
)
totaless <- data.frame(
  Intervalo = "Totales",
  MC = "-",
  ni = sum(nis),           # suma total de ni
  hi = sum(his),            # suma total de hi (%)
  Ni_ascendente = "-",
  Ni_descendente = "-",
  Hi_ascendente = "-",
  Hi_descendente = "-"
)
colnames(totaless) <- c(
  "Intervalo",
  "MC",
  "ni",
  "hi(%)",
  "Ni_asc",
  "Hi_asc (%)",
  "Ni_desc",
  "Hi_desc (%)"
)
# Agregar al final de la tabla
TDF_bencenosimplificado <- rbind(TDF_bencenosimplificado, totaless)

TDF_bencenosimplificado %>%
  gt() %>%
  tab_header(
    title = md("*Tabla Nro. 2*"),
    subtitle = md("*Distribución de frecuencia simplificada de concentración de Benceno, estudio calidad del aire en India*")
  ) %>%
  tab_source_note(
    source_note = md("Autor: Grupo 1
                     \n Fuente:https://www.kaggle.com/datasets/rohanrao/air-quality-data-in-india")
  ) %>%
  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"
  )
Tabla Nro. 2
Distribución de frecuencia simplificada de concentración de Benceno, estudio calidad del aire en India
Intervalo MC ni hi(%) Ni_asc Hi_asc (%) Ni_desc Hi_desc (%)
[0 - 50) 25 23809 99.59 23809 99.59 23908 100
[50 - 100) 75 45 0.19 23854 99.77 99 0.41
[100 - 150) 125 8 0.03 23862 99.81 54 0.23
[150 - 200) 175 11 0.05 23873 99.85 46 0.19
[200 - 250) 225 5 0.02 23878 99.87 35 0.15
[250 - 300) 275 8 0.03 23886 99.91 30 0.13
[300 - 350) 325 1 0.00 23887 99.91 22 0.09
[350 - 400) 375 1 0.00 23888 99.92 21 0.09
[400 - 450) 425 18 0.08 23906 99.99 20 0.08
[450 - 500] 475 2 0.01 23908 100 2 0.01
Totales - 23908 100.00 - - - -
Autor: Grupo 1

Fuente:https://www.kaggle.com/datasets/rohanrao/air-quality-data-in-india

5.- Gráficas de distribución de frecuenciaas

Histograma local

hist(benceno, breaks = 11,
     main = "Gráfica N°1: Distribución de la Concentración de Benceno
     presente en el estudio sobre calidad del aire en Inia ",
     xlab = " benceno (µg/m3)",
     ylab = "Cantidad",
     ylim = c(0, max(nis)),
     col = "pink",
     cex.main = 0.9,
     cex.lab = 1,
     cex.axis = 0.9,
     xaxt = "n")
axis(1, at = histo_benceno$breaks,
     labels = histo_benceno$breaks, las = 1,
     cex.axis = 0.9)

Histograma global

hist(benceno, breaks = 11,
     main = "Gráfica N°2:Distribución de la Concentración de Benceno
     presente en el estudio sobre calidad del aire en India",
     xlab = "Benzene (µg/m3)",
     ylab = "Cantidad",
     ylim = c(0, length(benceno)),
     col = "pink",
     cex.main = 1,
     cex.lab = 1,
     cex.axis = 0.9,
     xaxt = "n")
axis(1, at = histo_benceno$breaks,
     labels = histo_benceno$breaks, las = 1,
     cex.axis = 0.9)

Histograma porcentual local

n <- as.numeric(nrow(TDF_bencenosimplificado))
pos<-barplot(
  TDF_bencenosimplificado$`hi(%)`[1:(n-1)],
  space = 0,
  main = "Gráfica No. 4:Distribución concentración de Benceno en el estudio 
  calidad del aire en India",
  ylab = "Porcentaje (%)",
  xlab = "Benzene (µg/m3)",
  names.arg = TDF_bencenosimplificado$MC[1:(n-1)],
  col = "pink"
)
axis(side = 1,
     at = pos,
     labels = TDF_bencenosimplificado$MC[1:(nrow(TDF_bencenosimplificado)-1)],
     tck = -0.04,   
     las = 1)   

Histograma porcentual global

TDF_bencenosimplificado$`hi (%)` <- as.numeric(TDF_bencenosimplificado$`hi(%)`)

post<-barplot(TDF_bencenosimplificado$`hi(%)`[1:(nrow(TDF_bencenosimplificado)-1)],
              space = 0,
              col = "pink",
              main = "Gráfica N°3:Distribución de la Concentración de Benceno, estudio
        calidad del aire en India",
              xlab = "Benzene (µg/m3)",
              ylab = "Porcentaje (%)",
              names.arg = TDF_bencenosimplificado$MC[1:(nrow(TDF_bencenosimplificado)-1)],
              ylim = c(0,100),
              xaxt = "n")
axis(side = 1,
     at = post,
     labels = TDF_bencenosimplificado$MC[1:(nrow(TDF_bencenosimplificado)-1)],
     tck = -0.02)

6.- Diagrama de caja

Cajabenceno<-boxplot(benceno, horizontal = T,col = "orange", border = "black",
                    main= "Gráfica No. 5: Distribución de la concentración de Benceno,
                   estudio calidad del aire en India",
                    xlab="Benzene (µg/m3)")

7.- Ojivas

Ojivas Ascendentes y Descendentes (ni)

# Ojiva ascendente
plot(Lss, Nis_asc, type = "b", main = "Gráfica N°7:Distribución de Frecuencias Ascendente y Descendente 
  de la Concentración de Benceno",
     xlab = "Benzene (µg/m3)",
     ylab = "Cantidad", pch = 19,col="red")

# Ojiva descendente
lines(Lis, Nis_desc, type = "b", col = "blue", pch = 19)  

Ojivas Ascendentes y Descendentes (hi)

# Ojiva ascendente
plot(Lss, His_asc,
     type = "b",
     main = " Gráfica N°8:Distribución Porcentual Ascendente y Descendente
  de la Concentración de Benceno",
     xlab = "Benzene (µg/m3)",
     ylab = "Porcentaje %",
     col = "blue",
     pch = 19,
     yaxt = "n",          
     ylim = c(99, 100)    
)

axis(2, at = c(99, 100), labels = c("99", "100"))

# Ojiva descendente
lines(Lis, His_desc,
      type = "b",
      col = "red",
      pch = 19)

8.- Indicadores Estadísticos

Indicadores de posición

# MEDIA ARITMÉTICA 

X <- sum(benceno) / length(benceno)
X
## [1] 3.28084
#MEDIANA 
Me <- median(benceno)
Me
## [1] 1.07
#MODA
Mo <- max(TDF_benceno$ni)
moda <- TDF_benceno$Mc[TDF_benceno$ni == max_benceno]
Mo
## [1] 23908
#Porque la tabla simplificada, la clase número 1 en el intervalo [0,50] tiene la frecuencia más alta.
#La mayor frecuencia es 23809,que está en la posición 1 del vector

Indicadores de disperción

#VARIANZA
var<- var(benceno)
var
## [1] 249.992
#DESVIACION ESTANDAR 
sd <- sd(benceno)
sd
## [1] 15.81114
# COEFICIENTE DE VARIACIÓN (%)
CV <- (sd / X) * 100
CV
## [1] 481.9234
#La dispersión de benceno  es muy alta respecto al promedio

Indicadores de forma

#COEFICIENTE DE ASIMETRIA 
install.packages("e1071")
## Warning: package 'e1071' is in use and will not be installed
library(e1071)

As <- skewness(benceno)
As
## [1] 21.30155
#CUORTOSIS
library(e1071)

Cu <- kurtosis(benceno)
Cu
## [1] 530.0158
#CUORTOSIS
library(e1071)

Cu <- kurtosis(benceno)
Cu
## [1] 530.0158
#outliers

cajaBigotes <- boxplot(benceno,plot = FALSE)

outliers <- cajaBigotes$out
min(outliers)
## [1] 7.54
max(outliers)
## [1] 455.03
length(outliers)
## [1] 1668
tabla_indicadores <- data.frame(
  Variable = c("Benceno"),
  Rango = paste0("[", min(benceno), "; ", max(benceno), "]"),
  X = X,
  Me = round(Me, 2),
  Mo = Mo,
  V = round(var, 2),
  Sd = round(sd, 2),
  Cv = CV,
  As = round(As, 2),
  K = round(K, 2),
  `Valores Atípicos` = "[7.54 ; 455.03]"
)

library(knitr)

kable(
  tabla_indicadores,
  align = "c",
  caption = "Conclusiones de la variable benceno"
)
Conclusiones de la variable benceno
Variable Rango X Me Mo V Sd Cv As K Valores.Atípicos
Benceno [0; 455.03] 3.28084 1.07 23908 249.99 15.81 481.9234 21.3 15 [7.54 ; 455.03]

9.- Conclusiones

En conclusión:

La variable Benceno dado en (µg/m3) fluctúa entre 0 y 455.03 (µg/m3), y sus valores giran entorno a 1.07 con una desviación estándar de 21.3 (µg/m3) siendo un conjunto de valores heterogéneos. Con la presencia de valores atípicos del intervalo 7.54 a 455.03 (µg/m3).