0.- Librerías

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.- Selección de las variables (Causa y Efecto)

Causa y Efecto:

Elegimos analizar el ozono(Causa) y temperatura(Efecto),el ozono es un gas que atrapa el calor en el aire, a mayor presencia de este contaminante, aumenta el calor en nuestra zona de estudio. Así, demostramos que la contaminación no solo afecta el aire que respiramos, sino que también altera directamente la temperatura de nuestro entorno.”

x <- variables$air_quality_Ozone
y <- variables$temperature_celsius
TPP <- data.frame(y, x)
n <- nrow(TPP)
cat("Tamaño muestral del modelo = ", n)
## Tamaño muestral del modelo =  141703

3.- Tabla de pares de valores

Antes de realizar la tabla pares de valores, debemos comprobar que estas variables tengan el mismo tamaño muestral para no tener algún error a la hora de hacer la tabla y el gráfico

limpiar_columna <- function(df, cols) {
  for (col in cols) {
    df[[col]] <- as.numeric(as.character(df[[col]]))
  }
  return(df)
}

# Aplicar la función a tus variables climáticas
datos <- limpiar_columna(variables, c("air_quality_Ozone", "temperature_celsius"))

# Filtrar filas completas (eliminar los NA)
datos_limpios <- datos %>% filter(!is.na(air_quality_Ozone) & !is.na(temperature_celsius))

# Asignar variables para el análisis
y  <- datos_limpios$temperature_celsius 
x  <- datos_limpios$air_quality_Ozone

TPP <- data.frame(y, x)
n <- nrow(TPP)
cat("Tamaño muestral del modelo = ", n)
## Tamaño muestral del modelo =  141703
# Creamos el data frame con tus variables limpias
tabla_pares_valores <- head(data.frame(
 `Ozono µg/m³` = datos_limpios$air_quality_Ozone,
  `Temperatura (°C)` = datos_limpios$temperature_celsius ,
 check.names = FALSE
), 300)

# 2. Generar la tabla con tu estilo personalizado
kable(
  tabla_pares_valores,    
  align = "c",      
  booktabs = TRUE,
  caption = "Tabla N.1: Pares de valores entre ozono y temperatura para el análisis
  meteorológico en capitales del mundo
  Periodo: Mayo 2024 a Mayo 2026 "
) %>%
  kable_styling(
    bootstrap_options = c("striped", "hover", "condensed"), 
    full_width = FALSE,                                    
    position = "center"                                     
  ) %>%
  row_spec(0, bold = TRUE, color = "white", background = "#1F4E79") %>%
  footnote(
    general = "Fuente: Global Weather Repository.",
    general_title = "Nota: ", 
    footnote_as_chunk = TRUE
  )%>%
  scroll_box(height = "400px", width = "100%") 
Tabla N.1: Pares de valores entre ozono y temperatura para el análisis meteorológico en capitales del mundo Periodo: Mayo 2024 a Mayo 2026
Ozono µg/m³ Temperatura (°C)
103.0 26.6
97.3 19.0
12.2 23.0
64.4 6.3
19.0 26.0
29.0 26.0
7.7 8.0
103.0 19.0
26.8 9.0
68.7 16.0
81.5 17.0
59.4 27.0
100.1 36.0
188.8 38.4
21.1 28.0
88.7 17.0
11.2 15.0
34.0 26.0
14.5 28.0
69.4 18.2
26.5 12.3
70.1 19.0
47.2 22.0
1.0 23.1
27.2 32.0
57.2 12.0
21.6 32.0
67.2 21.1
39.0 27.4
45.8 22.0
46.5 38.0
12.9 25.0
15.0 12.0
0.6 28.4
37.2 37.2
0.0 1.0
85.1 29.0
64.4 15.9
37.6 27.5
5.2 29.6
0.0 21.0
29.7 16.0
32.9 26.0
118.7 25.0
80.8 18.0
5.2 29.4
85.1 16.0
65.1 31.8
19.5 27.2
0.5 23.0
0.0 11.9
127.3 27.0
5.9 26.0
25.4 30.0
52.2 22.6
88.7 19.0
44.0 22.2
56.5 22.3
14.0 26.0
89.4 22.0
11.8 15.0
5.3 29.0
65.1 23.0
65.1 16.0
86.6 22.0
11.4 29.0
105.9 23.0
20.2 28.0
0.4 20.0
14.7 26.0
50.1 24.0
20.6 24.0
65.1 21.0
62.2 24.0
23.3 23.0
74.4 20.0
80.8 7.0
144.5 42.0
303.3 32.0
46.5 24.0
161.7 33.0
11.1 14.0
134.5 25.0
62.2 24.0
0.2 21.9
100.1 24.0
120.2 23.0
77.3 16.0
160.2 23.0
8.8 28.8
78.7 30.4
95.8 22.5
75.1 28.0
98.7 17.0
115.9 22.0
40.8 18.0
30.0 26.0
27.2 33.0
20.7 15.0
89.4 17.0
16.5 14.0
49.4 22.0
39.7 21.0
5.4 29.0
26.1 29.5
11.4 27.0
86.6 28.0
25.4 29.0
75.1 19.5
45.4 24.0
7.4 20.8
23.3 27.0
111.6 15.9
88.7 16.0
57.9 27.0
101.6 16.0
105.9 18.0
34.3 24.0
20.6 37.5
42.6 20.0
87.3 18.0
120.2 29.0
4.1 16.0
41.8 13.0
14.3 27.2
27.9 33.0
20.2 29.2
105.9 19.0
63.7 13.0
52.9 18.0
173.1 33.0
163.1 38.2
23.3 31.0
3.6 17.4
11.6 26.0
34.0 26.2
8.8 14.1
30.0 16.6
128.8 35.0
93.0 18.0
82.3 16.0
97.3 37.0
93.0 18.0
103.0 18.0
30.0 25.0
26.5 27.0
21.8 28.0
20.4 28.0
25.4 26.0
70.1 18.0
8.3 14.0
103.0 39.0
66.5 22.0
85.1 19.0
33.6 27.0
3.6 27.4
16.3 26.0
74.4 17.0
61.5 16.0
23.3 26.9
32.2 30.0
53.6 20.0
93.0 19.0
95.8 30.3
87.3 14.0
57.2 26.0
130.2 32.5
31.1 24.4
76.5 20.0
60.8 14.0
121.6 24.0
105.9 29.0
27.9 25.0
0.0 31.0
26.5 28.0
68.0 19.0
36.8 23.0
19.5 26.0
73.7 24.0
107.3 16.0
85.1 23.0
23.6 26.0
36.8 25.7
93.0 13.8
91.6 39.0
0.5 14.0
62.2 16.1
19.3 6.0
107.3 22.0
45.1 25.0
0.2 26.0
197.4 30.0
83.7 25.7
60.8 21.8
80.8 20.2
60.1 22.0
93.0 29.0
105.9 25.0
80.1 6.3
85.8 32.0
31.5 29.0
4.0 11.0
91.6 15.0
2.5 5.0
86.6 17.0
65.8 17.0
62.9 29.0
133.0 36.0
117.3 34.2
31.5 30.0
85.8 17.0
83.0 17.0
29.0 30.0
25.8 24.0
73.0 10.5
40.4 18.8
89.4 20.0
98.7 29.0
5.4 31.4
51.5 27.0
73.0 11.0
25.8 24.0
44.7 31.0
37.6 27.8
68.0 26.0
19.0 30.0
26.5 32.0
43.6 16.0
3.2 35.0
47.9 42.0
19.7 2.0
0.0 23.0
85.1 19.4
42.9 25.8
73.0 32.0
0.3 23.0
78.7 20.0
48.6 29.0
108.7 26.0
88.7 19.0
73.0 32.0
97.3 18.0
58.7 35.0
29.7 30.0
41.1 28.0
10.9 16.2
128.8 32.0
14.5 26.0
24.7 32.0
47.2 22.2
120.2 20.0
54.4 22.5
57.9 26.0
16.3 24.0
101.6 26.0
88.7 18.0
70.1 31.0
79.4 30.0
72.2 13.0
105.9 24.0
45.1 31.0
121.6 21.0
24.7 31.0
63.7 21.0
25.0 31.0
53.6 34.0
41.8 29.0
147.3 30.0
98.7 22.0
18.2 25.0
87.3 22.0
94.4 9.0
120.2 38.0
0.0 29.0
53.6 26.0
176.0 35.0
88.7 19.0
123.0 25.0
98.7 22.0
38.3 31.0
103.0 18.3
140.2 25.0
84.4 15.0
91.6 25.0
10.2 28.8
53.6 29.0
63.7 15.3
13.2 20.7
75.1 21.0
110.2 23.0
63.7 23.4
41.5 31.0
8.0 27.0
79.4 19.0
88.0 18.0
54.4 17.0
42.6 19.0
42.2 24.0
0.0 25.0
27.9 29.6
Nota: Fuente: Global Weather Repository.

4.- Gráfica de dispersión

x <- datos_limpios$air_quality_Ozone
y <- datos_limpios$temperature_celsius

# Graficamos con la escala fija en el eje Y
plot(
  x, y, 
  type = "p",              
  pch = 16,                
  col = "green",           
  main = "Gráfico N°1: Pares de valores Temperatura según el Ozono para el
  análisis meteorológico en capitales del mundo
  Periodo: Mayo 2024 a Mayo 2026",
  xlab = "Ozono (µg/m³)", 
  ylab = "Temperatura (°C)"

)

5.- Conjetura

Dado de se observa una distribución heterogenea no podemos definir como tal certesa un modelo de regresión, aplicamos alguna estratejia para asi lograr conjeturar, procedemos hacer el tratamiento de datos

Tratamiento de datos

Estrategia 1

cálculamos la mediana de temperatura para cada concentración de Ozono

# 1. Crear el dataframe agregado (promedio de temperatura según nivel de ozono)
# Esto agrupa todos los datos por nivel de ozono y calcula el promedio de temperatura
datos_promediados <- aggregate(temperature_celsius ~ air_quality_Ozone , data = variables, FUN = median)

# 2. Renombrar columnas para facilitar el manejo
colnames(datos_promediados) <- c("Ozono", "Temperatura")

# 3. Asignar las variables para el gráfico
x <- datos_promediados$Ozono
y <- datos_promediados$Temperatura

# 4. Generar el gráfico siguiendo tu estructura
plot(
  x, 
  y, 
  type = "p",               
  pch = 16,                 
  col = "green",            
  main = "Gráfico N°2: Promedio de temperatura según Ozono 
  para el análisis meteorológico en capitales del mundo
  Periodo: Mayo 2024 a Mayo 2026",
  xlab = " Ozono (µg/m³)", 
  ylab = "Temperatura (°C)"
)

Aun se observa una dispersión muy heterogenea asi que aplicamos segunda estrategia

Estrategia 2

Trabajamos sin valores atipicos y con los valores de los cuartiles del diagrama de caja

# 1. Definir función para eliminar outliers (corregida con tus nombres)
remove_outliers <- function(x) {
  Q1 <- quantile(x, 0.25, na.rm = TRUE)
  Q3 <- quantile(x, 0.75, na.rm = TRUE)
  IQR <- Q3 - Q1
  return(x >= (Q1 - 1.5 * IQR) & x <= (Q3 + 1.5 * IQR))
}
# 2. Filtrar el dataset con los nombres correctos
datos_limpios <- datos_promediados[remove_outliers(datos_promediados$Ozono) & 
                                   remove_outliers(datos_promediados$Temperatura), ]
# 3. Asignar variables (con los nombres correctos)
x <- datos_limpios$Ozono
y <- datos_limpios$Temperatura

# 4. Graficar
plot(
  x, 
  y, 
  pch = 16,                 
  col = "green",            
  main = "Gráfico N°3: Temperatura según Ozono si valores atipicos para el 
  análisis meteorológico en capitales del mundo
  Periodo: Mayo 2024 a Mayo 2026",
  xlab = "Ozono (µg/m³)", 
  ylab = "Temperatura (°C)"
)

Como podemos observar los puntos tienen tendencia no lineal, siguindo un modelo de regresión logaritmico asi que procedemos a cálcular sus parametros

Modelo Logarítmico

\[Y = \alpha + \beta \cdot \ln(X)\]

Donde:

-\(Y\): Temperatura (°C). -\(X\): Calidad del aire: Ozono (µg/m³). -\(\alpha\): El valor base de la temperatura cuando el logaritmo del ozono es igual a cero (intercepto). -\(\beta\): >La tasa de sensibilidad térmica; indica cuánto cambia la temperatura ante un incremento logarítmico en la concentración de ozono.

6.- Cálculo de parametros

modelo_log <- lm(Temperatura ~ log(Ozono + 0.001), data = datos_limpios)
parametros <- coef(modelo_log)

alfa <- parametros[1]
alfa
## (Intercept) 
##    20.89983
beta <- parametros[2]
beta
## log(Ozono + 0.001) 
##           1.714365
# Imprimir para tu póster
cat("Ecuación del modelo: Y =", round(alfa, 4), "+", round(beta, 4), "* ln(X)\n")
## Ecuación del modelo: Y = 20.8998 + 1.7144 * ln(X)

7.- Sobreponer la realidad con el modelo

# 1. Definir la leyenda primero
leyenda <- c("Modelo Logarítmico")

# 2. Tu gráfico original
plot(datos_limpios$Ozono, datos_limpios$Temperatura, 
     pch = 16, col = "green",
     main = "Gráfico N°4: Modelo logarítmico: Temperatura según Ozono 
  para el análisis meteorológico en capitales del mundo
  Periodo: Mayo 2024 a Mayo 2026",
     xlab = "Ozono (µg/m³)", ylab = "Temperatura (°C)")

# 3. Dibujar la línea del modelo
x_seq <- seq(0.1, max(datos_limpios$Ozono), length.out = 100)
y_pred <- alfa + beta * log(x_seq)
lines(x_seq, y_pred, col = "red", lwd = 3)

# 4. Ahora sí, dibujar la leyenda usando el objeto que creamos en el paso 1
legend("bottomright", legend = leyenda, 
       col = "red", lty = 1, lwd = 3, bg = "white")

8.- Test de Bondad

x <- datos_limpios$Ozono
y <- datos_limpios$Temperatura
correlacion <- cor(y, x, method = "pearson")
print(paste("Correlación de Pearson:", round(correlacion, 2)))
## [1] "Correlación de Pearson: 0.72"

9.- Restriciones

Ozono:D = {x ∈ ℝ | x ≥ 0}

Temperatura: D = {y ∈ ℝ | y ≥ 0}

Error del modelo: ¿Existe un valor de Ozono que reemplazado en la ecuación del modelo genere un valor fuera del dominio de temperatura ?

No existen valores de Ozono que generen resultados fuera del dominio físico de la temperatura. Aunque el modelo logarítmico tiende a \(-\infty\) cerca de cero, el análisis se restringe al rango de datos reales registrados, garantizando su validez técnica y coherencia meteorológica

10.- Estimaciones

Si la concentración de ozono alcanza los 200 µg/m³, ¿cuál será la temperatura estimada?

ozono_estimado <- 200
temp_estimada <- alfa + beta * log(ozono_estimado)
temp_estimada
## (Intercept) 
##    29.98308
# 1. Graficamos usando tu estructura original
plot(datos_limpios$Ozono, datos_limpios$Temperatura, 
     pch = 16, col = "white", # Col = "white" oculta los puntos pero mantiene el marco
     main = "Gráfico N°4: Modelo logaritmico: Temperatura según Ozono 
  para el análisis meteorológico en capitales del mundo
  Periodo: Mayo 2024 a Mayo 2026",
     xlab = "Ozono (µg/m³)", ylab = "Temperatura (°C)",
     xlim = c(0, max(datos_limpios$Ozono)), 
     ylim = c(0, 40),
     xaxs = "i", yaxs = "i")

# 2. Dibujamos la línea del modelo
x_seq <- seq(0.1, max(datos_limpios$Ozono), length.out = 100)
y_pred <- alfa + beta * log(x_seq)
lines(x_seq, y_pred, col = "red", lwd = 3)

# 3. Calculamos y graficamos solo la estimación para 200
temp_estimada <- alfa + beta * log(ozono_estimado)

points(ozono_estimado, temp_estimada, col = "blue", pch = 19, cex = 1.5)

# 4. Añadimos la etiqueta al punto
text(ozono_estimado, temp_estimada, 
     labels = paste("Est. (200, ", round(temp_estimada, 1), ")"), 
     pos = 3, col = "blue")
# 5. Leyenda
legend("bottomright", 
       legend = c("Modelo Logarítmico", "Estimación (200 µg/m³)"), 
       col = c("red", "blue"), lty = c(1, NA), pch = c(NA, 19), lwd = 3, bg = "white")

11.- Conclusión

Entre la calidad del aire (Ozono en µg/m³) y la temperatura (°C) existe una relación de tipo logarítmica definida por la ecuación \(Y = 20.9 + 1.71 \cdot \ln(X)\). Se observa una correlación de Pearson de \(r = 0.72\) donde la temperatura presenta un crecimiento con tendencia a la saturación a medida que la concentración de ozono aumenta. El modelo presenta restricciones claras, es válido únicamente dentro del dominio de datos registrados; fuera de este rango operativo, el modelo carece de sentido físico y validez técnica.