0.- Líbrerias

library(readr)
library(dplyr)
library(knitr)
library(kableExtra)
library(ggplot2)

1.- leer datos

variables <- read_csv("C:/Users/CESAR/Downloads/proyecto x/GlobalWeatherRepository.csv", show_col_types = TRUE)

2.- Depuración y selección de la variable

Depuración

variables <- na.omit(variables)

Selección

EPA <- variables$`air_quality_us-epa-index`

3.- Tabla de frecuencias

Extraemos la tabla obtenidad de la la estadistica diferencial de esta variable

Tabla_EPA <- table(EPA)

ni_EPA <- as.vector(Tabla_EPA) 
hi_EPA <- round((ni_EPA / sum(ni_EPA)) * 100, 2)

TDF_EPA_Base <- data.frame(
  EPA = names(Tabla_EPA),
  ni = ni_EPA,
  hi = hi_EPA
)
sumatoria_EPA <- data.frame(
  EPA = "TOTAL", 
  ni = sum(ni_EPA), 
  hi = 100
)
TDF_EPA_Suma <- rbind(TDF_EPA_Base, sumatoria_EPA)

colnames(TDF_EPA_Suma) <- c("EPA", "Frecuencia Absoluta (ni)", "Frecuencia Relativa (hi %)")

kable(TDF_EPA_Suma, 
      align = "c",
      caption =  "Tabla N°1:Distribución de frecuencia del índice 
      de calidad del aire según escala 
      (AQI EPA) del año 2024 hasta 2026 ") |> 
  kable_styling(full_width = TRUE, position = "center",
                bootstrap_options = c("striped", "hover", "condensed", "responsive")) |> 
  row_spec(0, bold = TRUE, color = "white", background = "#90D5FF") |> 
  row_spec(nrow(TDF_EPA_Suma), bold = TRUE, background = "#d3d3d3") |> 
  footnote(general =     "Fuente: Global Weather Repository,(https://www.kaggle.com/datasets/nelgiriyewithana/global-weather-repository)",
           general_title = "Nota: Grupo N°2",
           footnote_as_chunk = TRUE,
           title_format = c("italic", "bold"))
Tabla N°1:Distribución de frecuencia del índice de calidad del aire según escala (AQI EPA) del año 2024 hasta 2026
EPA Frecuencia Absoluta (ni) Frecuencia Relativa (hi %)
1 76644 54.09
2 44207 31.20
3 11301 7.98
4 7916 5.59
5 1189 0.84
6 446 0.31
TOTAL 141703 100.00
Nota: Grupo N°2 Fuente: Global Weather Repository,(https://www.kaggle.com/datasets/nelgiriyewithana/global-weather-repository)

4.- Gráfica de distribución de frecuencias

# Extraer datos de la tabla (usando los vectores que ya definiste)
EPA_levels <- TDF_EPA_Base$EPA
ni <- TDF_EPA_Base$ni

# Generar el diagrama de barras
grafico <- barplot(ni, 
        names.arg = EPA_levels,
        col = "#90D5FF",           # Color consistente con el encabezado de tu tabla
        border = "black",
        main = "Gráfico N°2: Distribución de Frecuencia Absoluta del Índice EPA\nPeriodo 2024-2026",
        xlab = "Nivel de calidad del aire (Escala EPA)",
        ylab = "Frecuencia Absoluta (ni)",
        ylim = c(0, max(ni) * 1.15), # Aumentamos el límite superior para las etiquetas
        las = 1)                     # Etiquetas horizontales

# Añadir las frecuencias (ni) sobre cada barra
text(x = grafico, 
     y = ni + 2000, 
     labels = ni, 
     cex = 0.9, 
     font = 2)

# Añadir fuente y nota para mantener el formato académico
mtext("Fuente: Global Weather Repository", side = 1, line = 3, adj = 1, cex = 0.8)
grid(nx = NA, ny = NULL, col = "gray", lty = "dotted")

5.- Conjetura

Se conjetura que la calidad del aire sigue un modelo de Poisson, ya que la mayoría de las ciudades mantienen niveles bajos de contaminación (1 y 2) y estos disminuyen a medida que el índice aumenta.

Extraer datos directamente desde el dataframe de tu tabla Convertimos a numérico para asegurar que el cálculo funcione

EPA_niveles <- as.numeric(TDF_EPA_Suma$EPA[1:(nrow(TDF_EPA_Suma)-1)])
ni_observado <- TDF_EPA_Suma$`Frecuencia Absoluta (ni)`[1:(nrow(TDF_EPA_Suma)-1)]
total_ni <- TDF_EPA_Suma$`Frecuencia Absoluta (ni)`[nrow(TDF_EPA_Suma)]

6.- Cálculo de Párametros

# 2. Calcular Lambda (Promedio ponderado)
lambda_p <- sum(EPA_niveles * ni_observado) / total_ni
lambda_p
## [1] 1.688362
# 3. Calcular frecuencias esperadas (FE) según Poisson
FE_poisson <- dpois(EPA_niveles, lambda = lambda_p) * total_ni
FE_poisson
## [1] 44217.9154 37327.9302 21007.6898  8867.1477  2994.1916   842.5467

7.- Sobreponer la realidad con el modelo

# 4. Crear matriz y gráfico
matriz_comp <- rbind(ni_observado, FE_poisson)

par(mar = c(5, 7, 4, 2), mgp = c(4, 1, 0))
grafico <- barplot(matriz_comp,
        beside = TRUE,
        names.arg = EPA_niveles,
        col = c("#90D5FF", "#004C99"), 
        main = "Gráfico N°2: Ajuste del Modelo Poisson al Índice EPA",
        xlab = "Nivel EPA",
        ylab = "Frecuencia Absoluta (ni)",
        ylim = c(0, max(ni_observado) * 1.1),
        las = 1)

# Añadir leyenda
legend("topright", legend = c("Observado (Tabla)", "Teórico Poisson"),
       fill = c("#90D5FF", "#004C99"), bty = "n")
grid(nx = NA, ny = NULL, col = "gray", lty = "dotted")

8.- Test de bondad

Test de pearson

FO_prop <- ni_observado / sum(ni_observado)
FE_prop <- FE_poisson / sum(FE_poisson)

# 2. Ejecutar el test de Pearson
test_pearson <- cor(FO_prop, FE_prop, method = "pearson")

# 3. Mostrar resultados en consola
test_pearson
## [1] 0.9425325
# 4. (Opcional) Graficar la correlación para confirmar visualmente
plot(FO_prop, FE_prop,
     main = "Gráfico N°3: Correlación del modelo Poisson",
     xlab = "Frecuencia observada (proporción)", 
     ylab = "Frecuencia esperada (proporción)",
     pch = 18, col = "darkblue", las = 1)
abline(lm(FE_prop ~ 0 + FO_prop), col = "red", lwd = 2)

Test de chi cuadrado

# 1. Cálculo del estadístico Chi-cuadrado
# 1. Preparar las frecuencias en porcentaje (hi)
FO_hi <- TDF_EPA_Suma$`Frecuencia Relativa (hi %)`[1:(nrow(TDF_EPA_Suma)-1)]  

# 2. Calcular las esperadas también en porcentaje
FE_hi <- (FE_poisson / sum(FE_poisson)) * 100

# 3. Chi-cuadrado con porcentajes
x2_p <- sum((FO_hi - FE_hi)^2 / FE_hi)
gl_p <- length(FO_hi) - 1
VC_p <- qchisq(0.99, gl_p)

# 4. Resultados
cat("Chi-cuadrado calculado:", round(x2_p, 4), "\n")
## Chi-cuadrado calculado: 14.2568
cat("Valor Crítico:", round(VC_p, 4), "\n")
## Valor Crítico: 15.0863
cat("¿Modelo aprobado?:", x2_p < VC_p, "\n")
## ¿Modelo aprobado?: TRUE

9.- Cálculo de probabilidades

# 1. Definir cuántos datos nuevos quieres predecir
# 1. Preparar el lienzo gráfico vacío
plot(1, type = "n", axes = FALSE, xlab = "", ylab = "")

# 2. Definir los niveles que quieres consultar
# Por ejemplo: ¿Cuál es la probabilidad de que el nivel esté entre 1 y 2?
nivel_min <- 1
nivel_max <- 2

# 3. Calcular la probabilidad usando Poisson y tu lambda_p
prob_epas <- (ppois(nivel_max, lambda_p) - ppois(nivel_min - 1, lambda_p)) * 100

# 4. Mostrar en la gráfica con tu estilo
text(x = 1, y = 1,
     labels = paste("¿Cuál es la probabilidad de que\n al seleccionar una muestra, el nivel EPA\n esté entre",
                    nivel_min, "y", nivel_max, "?\n\nR:", round(prob_epas, 2), "%"),
     cex = 1.6,
     col = "blue",
     font = 2)

10.- Intervalos de confianza

# 1. Parámetros del modelo de Poisson (usando la variable EPA)
# Extraemos los valores correspondientes de tus niveles EPA
valores_epa <- as.numeric(TDF_EPA_Suma$EPA[1:(nrow(TDF_EPA_Suma)-1)])
lambda_p <- mean(valores_epa)
n_epa <- sum(ni_observado) # Tamaño muestral total ajustado

# 2. Error estándar y límites para el parámetro Lambda (95% confianza)
# Para Poisson, el error estándar estimado es sqrt(lambda / n)
error_poisson <- 1.96 * sqrt(lambda_p / n_epa)
limite_inf_epa <- round(lambda_p - error_poisson, 2)
limite_sup_epa <- round(lambda_p + error_poisson, 2)

# 3. Crear tabla del intervalo con el mismo formato
IC_Poisson_EPA <- data.frame(
  "Nivel de confianza" = "95%",
  "Intervalo de confianza de λ (Nivel)" = paste0(
    limite_inf_epa, " < λ < ", limite_sup_epa
  ),
  "Desviación estándar (Teórica)" = round(sqrt(lambda_p), 2)
)

# 4. Mostrar tabla con tu estilo solicitado
kable(
  IC_Poisson_EPA,
  align = "c",
  caption = "Tabla N°2: Intervalo de confianza para el parámetro Lambda (λ) del modelo de Poisson aplicado al índice EPA de los registros meteorológicos mundiales, período 2024–2026"
) |>
  kable_styling(
    full_width = TRUE,
    position = "center",
    bootstrap_options = c("striped", "hover", "condensed", "responsive")
  ) |>
  row_spec(0, bold = TRUE, color = "white", background = "#2C3E50") |>
  row_spec(1, bold = TRUE, background = "#EAEDED") |>
  footnote(
    general = "Elaborado por Grupo 2. Fuente: Global Weather Repository.",
    general_title = "Nota: ",
    footnote_as_chunk = TRUE
  )
Tabla N°2: Intervalo de confianza para el parámetro Lambda (λ) del modelo de Poisson aplicado al índice EPA de los registros meteorológicos mundiales, período 2024–2026
Nivel.de.confianza Intervalo.de.confianza.de.λ..Nivel. Desviación.estándar..Teórica.
95% 3.49 < λ < 3.51 1.87
Nota: Elaborado por Grupo 2. Fuente: Global Weather Repository.

11.- Conclusiones

La variable índice EPA se explica de forma adecuada mediante un modelo de distribución de Poisson con parámetro \(\lambda = 3.50\) (valor central de tu intervalo), y se puede afirmar con un 95% de confianza de ocurrencia de los niveles se encuentra entre 3.49 y 3.51 unidades, presentando una desviación estándar teórica de 1.87 unidades, lo que evidencia la estabilidad y el comportamiento esperado del modelo matemático frente al histórico de datos climáticos analizados.