UNIVERSIDAD CENTRAL DEL ECUADOR - FIGEMPA , INGENIERÍA AMBIENTAL

#Estadística Inferencial 
#17/01/2026
#Lorien Arcentales
# Carga de paquetes
library(gt)
library(dplyr)
#1. CARGA DE DATOS
datos<-read.csv("city_day.csv", header = TRUE, dec = ".",
                sep = ",")
#Extraccion de la variabela Dióxido de azufre y los "-" de la variable porque son valores inexistentes, 
# para un mejor analisis, cambia tamaño muestral de 29531 a 25677
dióxidoazufre <- datos$SO2[datos$SO2 != "-"]
length(dióxidoazufre)
## [1] 25677
dióxidoazufre <- as.numeric(dióxidoazufre)
#Justificación porque la variable es continua: porque puede tomar cualquier valor dentro de los números reales positivos, incluido el cero, sin presentar saltos en su dominio o la variable cambia de manera gradual y no pasa bruscamente de un valor a otro.

# 2. TDF simplificada
Histograma_dióxidoazufre<-hist(dióxidoazufre,plot = FALSE)
#Elemnetos simplificados 
breaks <- Histograma_dióxidoazufre$breaks
Li <- breaks[1:(length(breaks)-1)]
Ls <- breaks[2:length(breaks)]
ni<-Histograma_dióxidoazufre$counts
N<-length(dióxidoazufre)
hi<- (ni / N) * 100
TDF_dióxidoazufresimplificado <- data.frame(
  Intervalo = paste0("[", round(Li,2), " - ", round(Ls,2), ")"),
  ni = ni,
  hi= round(hi, 2))
colnames(TDF_dióxidoazufresimplificado) <- c(
  "Intervalo",
  "ni",
  "hi(%)"
)
totales<- data.frame(
  Intervalo = "Totales",
  ni = sum(ni),           # suma total de ni
  hi = sum(hi)
)
colnames(totales) <- c(
  "Intervalo",
  "ni",
  "hi(%)"
)
# Agregar al final de la tabla
TDF_dióxidoazufresimplificado <- rbind(TDF_dióxidoazufresimplificado, totales)
TDF_dióxidoazufresimplificado %>%
  gt() %>%
  tab_header(
    title = md("*Tabla Nro. 1*"),
    subtitle = md("**Distribucion de frecuencia simplificado de concentración de dióxido de azufre,estudio calidad del aire en India entre 2015-2020 **")
  ) %>%
  tab_source_note(
    source_note = md("Autor: Grupo 2\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
**Distribucion de frecuencia simplificado de concentración de dióxido de azufre,estudio calidad del aire en India entre 2015-2020 **
Intervalo ni hi(%)
[0 - 10) 14075 54.82
[10 - 20) 7169 27.92
[20 - 30) 1900 7.40
[30 - 40) 835 3.25
[40 - 50) 613 2.39
[50 - 60) 340 1.32
[60 - 70) 178 0.69
[70 - 80) 109 0.42
[80 - 90) 94 0.37
[90 - 100) 80 0.31
[100 - 110) 70 0.27
[110 - 120) 58 0.23
[120 - 130) 44 0.17
[130 - 140) 39 0.15
[140 - 150) 22 0.09
[150 - 160) 18 0.07
[160 - 170) 17 0.07
[170 - 180) 11 0.04
[180 - 190) 4 0.02
[190 - 200) 1 0.00
Totales 25677 100.00
Autor: Grupo 2 Fuente:https://www.kaggle.com/datasets/rohanrao/air-quality-data-in-india
# 3. GDF-Histograma de la variable
par(mar = c(5.1, 4.1, 4.1, 2.1))
post<-barplot(TDF_dióxidoazufresimplificado$`hi(%)`[1:(nrow(TDF_dióxidoazufresimplificado)-1)],
              space = 0,
              col = "orange",
              main = "Gráfica N°1:Distribución de la Concentración de Dióxido de azufre, 
              estudio calidad del aire en India, 2015-2020",
              xlab = "Dióxido de azufre (µg/m3)",
              ylab = "Porcentaje (%)",
              ylim = c(0,100), xaxt = "n")
limites <- c(post[1] - diff(post)[1]/2,
             post + diff(post)[1]/2)
axis(
  side = 1,
  at = limites,
  labels = round(breaks, 2),
  tck = -0.02
)

# 4. CONJETURA
#Se conjetura que la concentración de dióxido de azufre sigue un modelo de probabilidad exponencial, ya que la variable en su histograma muestra la mayor parte de los datos está concentrada en el extremo izquierdo (bajos valores de SO₂) y la frecuencia disminuye rápidamente conforme aumentan los valores de SO₂.

# 5. CÁLCULO DE PARÁMETROS DISTRIBUCIÓN EXPONELCIAL
# Media 
media <- mean(dióxidoazufre)
media
## [1] 14.53198
# Lambda
lambda<-1/media
lambda
## [1] 0.06881376
#6. HISTOGRAMA densidad de probabilidad
Histograma_dióxidoazufre <- hist(dióxidoazufre,
                            breaks = breaks,
                            freq = FALSE,          
                            main = "Gráfica Nº2: Comparación modelo exponelcial realidad concentración\n de dióxido de azufre nestudio calidad de aire India 2015-2020", 
                            xlab = "Dióxido de azufre (µg/m3)",
                            ylab = "Densidad probabilidad ",
                            col = "grey", ylim = c(0,0.07),xaxt = "n"
)  
axis(1, at = breaks)
# Curva exponencial
curve(dexp(x,rate = lambda),
      from = 0, to = 200,
      col = "orange", lwd = 2, add = TRUE)

#7.TEST DE BONDAD
#Test de Pearson
#Frecuencia observada
# Frecuencias observadas por intervalo
fo <- hist(dióxidoazufre, breaks=breaks, plot=FALSE)$counts
fo
##  [1] 14075  7169  1900   835   613   340   178   109    94    80    70    58
## [13]    44    39    22    18    17    11     4     1
n <- length(dióxidoazufre)
p <- diff(pexp(breaks, rate=lambda))
# Fe = Probabilidad * n
fe <- p * n
fe
##  [1] 1.277402e+04 6.419088e+03 3.225663e+03 1.620931e+03 8.145359e+02
##  [6] 4.093133e+02 2.056845e+02 1.033587e+02 5.193890e+01 2.609987e+01
## [11] 1.311548e+01 6.590672e+00 3.311886e+00 1.664259e+00 8.363087e-01
## [16] 4.202544e-01 2.111825e-01 1.061215e-01 5.332725e-02 2.679753e-02
Correlación<-cor(fo,fe)*100
Correlación
## [1] 99.23768
#Test Chi-cuadrado
# Fo y Fe en porcentual
Fo_porcentual<- fo/n*100
Fo_porcentual
##  [1] 54.815593722 27.919928341  7.399618335  3.251937532  2.387350547
##  [6]  1.324142228  0.693227402  0.424504420  0.366086381  0.311562877
## [11]  0.272617518  0.225883086  0.171359583  0.151886903  0.085679791
## [16]  0.070101647  0.066207111  0.042839896  0.015578144  0.003894536
Fe_porcentual<- p*100
Fe_porcentual
##  [1] 4.974889e+01 2.499937e+01 1.256246e+01 6.312775e+00 3.172239e+00
##  [6] 1.594085e+00 8.010456e-01 4.025343e-01 2.022779e-01 1.016469e-01
## [11] 5.107869e-02 2.566761e-02 1.289826e-02 6.481517e-03 3.257034e-03
## [16] 1.636696e-03 8.224577e-04 4.132941e-04 2.076849e-04 1.043639e-04
x2 <- sum((Fo_porcentual - Fe_porcentual)^2 / Fe_porcentual)
x2
## [1] 28.79454
k <- length(Fo_porcentual)
grados_libertad <- k - 1
grados_libertad
## [1] 19
umbral_aceptacion <- qchisq(0.95, df = grados_libertad)
umbral_aceptacion
## [1] 30.14353
x2<umbral_aceptacion
## [1] TRUE
# 8.CÁLCULO DE PROBABILIDAD
#“¿Cuál es la probabilidad de que la concentración de SO₂ supere el límite legal de 40 µg/m³ en un día cualquiera?”
1-pexp(40, rate = lambda)
## [1] 0.06376503
#Demostración:
# Rango de x para la curva
x <- seq(0, 200, by=0.001)
y <- dexp(x, rate=lambda)

# Calcular máximo para ajustar ylim
ylim_max <- max(y) * 1.1

# Graficar curva principal
plot(x, y, type="l", col="orange", lwd=2, xlim=c(0,200), ylim=c(0, ylim_max),
     main="Gráfica N°3: Cálculo de probabilidad",
     ylab="Densidad de probabilidad", xlab="Dióxido de azufre (µg/m3)", xaxt="n")

# Área a sombrear (por ejemplo, x >= 40)
x_section <- seq(40, 200, by=0.001)
y_section <- dexp(x_section, rate=lambda)

# Sombrear el área
polygon(c(x_section, rev(x_section)), c(y_section, rep(0, length(y_section))),
        col=rgb(0,1,0,0.5), border=NA)  # verde semitransparente

# Dibujar línea verde sobre el área
lines(x_section, y_section, col="green", lwd=2)

# Leyenda
legend("topright", legend=c("Modelo", "Área de Probabilidad"), 
       col=c("orange","green"), lwd=2, lty=c(1,1))

# Eje x
axis(1, at=seq(0,200,by=20))