UNIVERSIDAD CENTRAL DEL ECUADOR-FIGEMPA-Ingeniería Ambiental

#Estadística inferencial
#10/01/2026
#Daniela Llumitasig
# Carga de paquetes
library(gt)
library(dplyr)
#1. CARGA DE DATOS
datos<-read.csv("city_day.csv", header = TRUE, dec = ".",
                sep = ",")
#Extracción variable
longitud<-datos$Longitud
length(longitud)
## [1] 29531
#Justificación por qué la variable Longitud es continua: La longitud geográfica es una variable cuantitativa continua porque se mide como una magnitud y puede tomar infinitos valores reales dentro del intervalo [−180, 180],donde los valores negativos indican longitudes occidentales y los positivos longitudes orientales, sin existir saltos naturales entre valores consecutivos.
#2. TDF
breaks <- seq(70, 94, length.out = 7)
round(breaks)
## [1] 70 74 78 82 86 90 94
longitud_cut <- cut(
  longitud,
  breaks = breaks,
  include.lowest = TRUE,
  right = FALSE
)

table(longitud_cut)
## longitud_cut
## [70,74) [74,78) [78,82) [82,86) [86,90) [90,94] 
##    4018   16201    2960    4873    1169     310
tabla <- table(longitud_cut)
ni <- as.numeric(table(longitud_cut))
hi <- round(ni / sum(ni) * 100, 2)
Li <- breaks[-length(breaks)]
Ls <- breaks[-1]

Intervalos <- paste0("[", Li, " – ", Ls, ")")
Intervalos[length(Intervalos)] <- paste0("[", Li[length(Li)], " – ", Ls[length(Ls)], "]")
TDF_longitud <- data.frame(
  Intervalo = Intervalos,
  ni = ni,
  `hi(%)` = hi
)

totales <- data.frame(
  Intervalo = "Totales",
  ni = sum(ni),
  `hi(%)` = round(sum(hi), 2)
)
TDF_longitud <- rbind(TDF_longitud, totales)
colnames(TDF_longitud) <- c(
  "Intervalo",
  "ni",
  "hi(%)"
  
)
TDF_longitud %>%
  gt() %>%
  tab_header(
    title = md("*Tabla Nro. 1*"),
    subtitle = md("**Distribucion de frecuencia simplificado de Longitud ,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 Longitud ,estudio calidad del aire en India entre 2015-2020 **
Intervalo ni hi(%)
[70 – 74) 4018 13.61
[74 – 78) 16201 54.86
[78 – 82) 2960 10.02
[82 – 86) 4873 16.50
[86 – 90) 1169 3.96
[90 – 94] 310 1.05
Totales 29531 100.00
Autor: Grupo 2 Fuente:https://www.kaggle.com/datasets/rohanrao/air-quality-data-in-india
#3.GDF-Histograma
TDF_longitud$`hi (%)` <- as.numeric(TDF_longitud$`hi(%)`)
TDF_longitud_graf <- TDF_longitud[TDF_longitud$Intervalo != "Totales", ]
par(mar = c(9, 5, 4, 2))  # margen inferior más grande
post <- barplot(
  TDF_longitud_graf$`hi(%)`,
  space = 0,
  col = "steelblue",
  ylim = c(0, 100),
  xaxt = "n",
  ylab = "Porcentaje (%)",
  main = "Gráfica N°1:Distribució de la Longitud en el estudio
        calidad del aire en India, 2015-2020"
)
axis(
  side = 1,
  at = post,
  labels = TDF_longitud_graf$Intervalo,
  las = 2,
  cex.axis = 0.8
)
mtext(
  "Longitud (°)",
  side = 1,
  line = 7
)

#3.1 Agrupación 1 
#Extraemos el intervalo de 70 a 82
longitud1<-longitud[longitud >=70  & longitud<82 ]

#4.CONJETURA DEL MODELO: Se observa la distribución de la variable longitud sigue aproximadamente un modelo de distribución normal. Esto se basa en la observación del histograma, en el que las frecuencias de las tres primeras barras analizadas muestran una forma simétrica y centralizada, característica de la distribución normal.
#5.CÁLCULO DE LOS PARÁMETROS DISTRIBUCIÓN NORMAL
# Media (mu)
mu <- mean(longitud1)
mu
## [1] 76.76874
# Desviación estándar (sigma)
sigma <- sd(longitud1)
sigma
## [1] 2.217821
#6. HISTOGRAMA densidad de probabilidad
cortes_limpios <- seq(70, 82, length.out = 4)
Histogramalongitud1 <- hist(longitud1,
                  breaks = cortes_limpios,
                  freq = FALSE,          
                  main = "Gráfica Nº2: Comparación modelo normal con la realidad,  Longitud\nestudio calidad de aire India 2015-2020", 
                  xlab = "Longitud (°)",
                  ylab = "Densidad probabilidad ",
                  col = "grey", ylim = c(0,0.5),xaxt = "n"
                 )  
axis(1, at = cortes_limpios)

# Secuencia para la curva normal
x <- seq(min(longitud1), max(longitud1), by=0.01)

# Curva normal 
curve(dnorm(x, mu, sigma),type="l",add = T,lwd=4, col = "steelblue")

#7.TEST DE BONDAD

#Test de Pearson
#Frecuencia observada
Fo<-as.numeric(table(cut(longitud1, breaks = cortes_limpios, include.lowest = TRUE)))
Fo
## [1]  4018 16201  2960
n <- length(longitud1)
# Probabilidad = P(X <= Ls) - P(X <= Li)
p <- diff(pnorm(cortes_limpios, mean = mu, sd = sigma))
# Fe = Probabilidad * n
Fe <- p * n
Fe
## [1]  2429.271 14015.614  6495.250
Correlación<-cor(Fo,Fe)*100
Correlación
## [1] 91.10017
#Test Chi-cuadrado
# Fo y Fe en fracción
Fo_fracción<- Fo/n
Fo_fracción
## [1] 0.1733466 0.6989516 0.1277018
Fe_fracción<- p
Fe_fracción
## [1] 0.1048048 0.6046686 0.2802213
x2 <- sum((Fo_fracción - Fe_fracción)^2 / Fe_fracción)
x2
## [1] 0.1425406
k <- length(Fo)
grados_libertad <- k - 1
grados_libertad
## [1] 2
umbral_aceptacion <- qchisq(0.95, df = grados_libertad)
umbral_aceptacion
## [1] 5.991465
x2<umbral_aceptacion
## [1] TRUE
# 8. CÁLCULO DE PROBABILDAD

#¿Cuál es la probabilidad de que una estación de monitoreo proyectada para 2028 se encuentre en el intervalo de longitud 70°–74°?
 pnorm(74,mu,sigma)-pnorm(70,mu,sigma)
## [1] 0.1048048
#¿Cuál es la probabilidad de que una estación de monitoreo para 2029 tenga longitud mayor o igual a 78°?
  1-pnorm(78,mu,sigma)
## [1] 0.2893899
# Demostración:
  # Secuencia para densidad
  x <- seq(69, 83, by=0.01)
  
  plot(x, dnorm(x, mu, sigma), type="l", col="skyblue3", lwd=2,
       main="Gráfica N°3: Cálculo de probabilidad",
       ylab="Densidad de probabilidad", xlab="Longitud (°)", xaxt="n", xlim=c(70, 82))
  
  # Área roja: 72 a 74
  x_section1 <- seq(72, 74, by=0.01)
  y_section1 <- dnorm(x_section1, mu, sigma)
  polygon(c(x_section1, rev(x_section1)), c(y_section1, rep(0, length(y_section1))),
          col=rgb(1,0,0,0.5))
  
  # Área verde: 78 a 82
  x_section2 <- seq(78, 82, by=0.01)
  y_section2 <- dnorm(x_section2, mu, sigma)
  polygon(c(x_section2, rev(x_section2)), c(y_section2, rep(0, length(y_section2))),
          col=rgb(0,1,0,0.5))
  
  # Leyenda
  legend("topright", legend=c("Modelo","Área roja","Área verde"),
         col=c("skyblue3","red","green"), lwd=2, fill=c(NA,"red","green"),cex = 0.8 )
  
  # Eje X
  axis(1, at=seq(70, 82, by=4), labels=seq(70, 82, by=4))

# 3.2 Agrupación 2 
  #Extraemos el intervalo de 70 a 82
  longitud2<-longitud[longitud >=82  & longitud<=94 ]
  
  #4.CONJETURA DEL MODELO: "En el rango de longitudes de 82 a 94, la distribución de frecuencias muestra un decrecimiento continuo desde los valores más bajos hacia los más altos, lo que sugiere que podría aproximarse a un modelo exponencial decreciente."
  #5.CÁLCULO DE LOS PARÁMETROS DISTRIBUCIÓN EXPONENCIAL
  # Desplazamiento para aplicar exponencial
  base <- 82
  longitud2_exponencial <- longitud2 - base
  
  # Media 
  media <- mean(longitud2_exponencial)
  media
## [1] 3.102811
  # Lambda
  lambda<-1/media
  lambda
## [1] 0.3222884
  #6. HISTOGRAMA densidad de probabilidad
  cortes_limpios <- seq(82, 94, length.out = 4)
  Histogramalongitud2 <- hist(longitud2,
                              breaks = cortes_limpios,
                              freq = FALSE,          
                           main = "Gráfica Nº4: Comparación modelo exponencial con la realidad,Longitud\nestudio calidad de aire India 2015-2020", 
                              xlab = "Longitud (°)",
                              ylab = "Densidad probabilidad ",
                              col = "grey", ylim = c(0,0.5),xaxt = "n"
  )  
  axis(1, at = cortes_limpios)
  # Curva exponencial
  curve(dexp(x-base,rate = lambda),
  from = 82, to = 94,
  col = "blue", lwd = 2, add = TRUE)

  #7.TEST DE BONDAD
  
  #Test de Pearson
  #Frecuencia observada
  # Frecuencias observadas por intervalo
  fo <- hist(longitud2, breaks=cortes_limpios, plot=FALSE)$counts
  fo
## [1] 4873 1169  310
   n <- length(longitud2)
   intervalos_exponencial <- cortes_limpios - base
   p <- diff(pexp(intervalos_exponencial, rate=lambda))
  # Fe = Probabilidad * n
  fe <- p * n
  fe
## [1] 4601.9996 1267.8686  349.3027
  Correlación<-cor(Fo,Fe)*100
  Correlación
## [1] 91.10017
  #Test Chi-cuadrado
  # Fo y Fe en porcentual
  Fo_porcentual<- fo/n*100
  Fo_porcentual
## [1] 76.715995 18.403652  4.880353
  Fe_porcentual<- p*100
  Fe_porcentual
## [1] 72.449616 19.960147  5.499097
  x2 <- sum((Fo_porcentual - Fe_porcentual)^2 / Fe_porcentual)
  x2
## [1] 0.4422318
  k <- length(Fo_porcentual)
  grados_libertad <- k - 1
  grados_libertad
## [1] 2
  umbral_aceptacion <- qchisq(0.95, df = grados_libertad)
  umbral_aceptacion
## [1] 5.991465
  x2<umbral_aceptacion
## [1] TRUE
  # 8.CÁLCULO DE PROBABILIDAD
  #¿Cuál es la probabilidad de que una estación de monitoreo para 2030 tenga longitud menor o igual a 90°?
  pexp(90 - base, rate = lambda)
## [1] 0.9240976
  #Demostración:
  x <- seq(82, 94, by=0.001) 
  y <- dexp(x - base, rate = lambda)
  plot(x, y,col = "skyblue3", lwd = 1, xlim = c(82,94), ylim=c(0,0.40),
       main="Gráfica N°5: Cálculo de probabilidad",
       ylab="Densidad de probabilidad",xlab="Longitud (°)", xaxt="n")
  
  # Área a sombrear (por ejemplo, hasta 90°)
  x_section <- seq(82, 90, by=0.001)
  y_section <- dexp(x_section - base, rate = lambda)
  
  # Sombrear el área
  polygon(c(x_section, rev(x_section)), c(y_section, rep(0, length(y_section))), 
          col=rgb(1,0,0,0.6))
  
  # Dibujar línea roja sobre la sección
  lines(x_section, y_section, col="red", lwd=2)
  
  # Leyenda
  legend("topright", legend=c("Modelo", "Área de Probabilidad"), 
         col=c("skyblue3","red"), lwd=2, lty=c(1,1))
  
  # Ajustar eje X
  axis(1, at=seq(82, 94, by=2))

# 9. INTERVALO DE CONFIANZA
  media <-mean(longitud)
  sigma<-sd(longitud)
  n<-length(longitud)
  error<- 2*(sigma/sqrt(n))
  #Límites intevalo de cofianza
  limite_inferior<- round(media-error,2)
  limite_superior<- round(media+error,2)
  tabla_intervalo <- data.frame(Intervalo = "P [78.51< µ <78.61] = 95%")
  
  tabla_intervalo %>%
    gt() %>%
    tab_header(
      title = md("*Tabla Nro. 2*"),
      subtitle = md("**Intervalo de confianza de la longitud,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. 2
**Intervalo de confianza de la longitud,estudio calidad del aire en India entre 2015-2020 **
Intervalo
P [78.51< µ <78.61] = 95%
Autor: Grupo 2 Fuente:https://www.kaggle.com/datasets/rohanrao/air-quality-data-in-india
# 10. CONCLUSIÓN LONGITUD

# La variable longitud en (°) sigue o se explica con dos modelos exponencial con parametro λ= 0.322 y normal con parametros µ= 76.76 σ= 2.217 y podemos afirmar con el 95% de confianza que la media aritmética de está variable se encuentra entre 78.51 y 78.61 (°) con una desviación estándar de 4.060 (°).