Introducción

Este informe analiza una base de datos meteorológica histórica con el objetivo de identificar patrones y relaciones entre variables climáticas clave. Las preguntas planteadas se responden utilizando análisis estadísticos como pruebas t, regresiones lineales, ANOVA y visualizaciones atractivas que destacan las tendencias.

Exploración inicial de la base de datos

Antes de realizar análisis específicos, examinamos la estructura de los datos para comprender sus características principales.

# Cargar los datos
data <- read.csv("weatherHistory.csv")

# Mostrar los primeros registros
head(data)
##                  Formatted.Date       Summary Precip.Type Temperature..C.
## 1 2006-04-01 00:00:00.000 +0200 Partly Cloudy        rain        9.472222
## 2 2006-04-01 01:00:00.000 +0200 Partly Cloudy        rain        9.355556
## 3 2006-04-01 02:00:00.000 +0200 Mostly Cloudy        rain        9.377778
## 4 2006-04-01 03:00:00.000 +0200 Partly Cloudy        rain        8.288889
## 5 2006-04-01 04:00:00.000 +0200 Mostly Cloudy        rain        8.755556
## 6 2006-04-01 05:00:00.000 +0200 Partly Cloudy        rain        9.222222
##   Apparent.Temperature..C. Humidity Wind.Speed..km.h. Wind.Bearing..degrees.
## 1                 7.388889     0.89           14.1197                    251
## 2                 7.227778     0.86           14.2646                    259
## 3                 9.377778     0.89            3.9284                    204
## 4                 5.944444     0.83           14.1036                    269
## 5                 6.977778     0.83           11.0446                    259
## 6                 7.111111     0.85           13.9587                    258
##   Visibility..km. Loud.Cover Pressure..millibars.
## 1         15.8263          0              1015.13
## 2         15.8263          0              1015.63
## 3         14.9569          0              1015.94
## 4         15.8263          0              1016.41
## 5         15.8263          0              1016.51
## 6         14.9569          0              1016.66
##                       Daily.Summary
## 1 Partly cloudy throughout the day.
## 2 Partly cloudy throughout the day.
## 3 Partly cloudy throughout the day.
## 4 Partly cloudy throughout the day.
## 5 Partly cloudy throughout the day.
## 6 Partly cloudy throughout the day.
# Resumen estadístico general
summary(data)
##  Formatted.Date       Summary          Precip.Type        Temperature..C.  
##  Length:96453       Length:96453       Length:96453       Min.   :-21.822  
##  Class :character   Class :character   Class :character   1st Qu.:  4.689  
##  Mode  :character   Mode  :character   Mode  :character   Median : 12.000  
##                                                           Mean   : 11.933  
##                                                           3rd Qu.: 18.839  
##                                                           Max.   : 39.906  
##  Apparent.Temperature..C.    Humidity      Wind.Speed..km.h.
##  Min.   :-27.717          Min.   :0.0000   Min.   : 0.000   
##  1st Qu.:  2.311          1st Qu.:0.6000   1st Qu.: 5.828   
##  Median : 12.000          Median :0.7800   Median : 9.966   
##  Mean   : 10.855          Mean   :0.7349   Mean   :10.811   
##  3rd Qu.: 18.839          3rd Qu.:0.8900   3rd Qu.:14.136   
##  Max.   : 39.344          Max.   :1.0000   Max.   :63.853   
##  Wind.Bearing..degrees. Visibility..km.   Loud.Cover Pressure..millibars.
##  Min.   :  0.0          Min.   : 0.00   Min.   :0    Min.   :   0        
##  1st Qu.:116.0          1st Qu.: 8.34   1st Qu.:0    1st Qu.:1012        
##  Median :180.0          Median :10.05   Median :0    Median :1016        
##  Mean   :187.5          Mean   :10.35   Mean   :0    Mean   :1003        
##  3rd Qu.:290.0          3rd Qu.:14.81   3rd Qu.:0    3rd Qu.:1021        
##  Max.   :359.0          Max.   :16.10   Max.   :0    Max.   :1046        
##  Daily.Summary     
##  Length:96453      
##  Class :character  
##  Mode  :character  
##                    
##                    
## 
# Información sobre las columnas clave
str(data)
## 'data.frame':    96453 obs. of  12 variables:
##  $ Formatted.Date          : chr  "2006-04-01 00:00:00.000 +0200" "2006-04-01 01:00:00.000 +0200" "2006-04-01 02:00:00.000 +0200" "2006-04-01 03:00:00.000 +0200" ...
##  $ Summary                 : chr  "Partly Cloudy" "Partly Cloudy" "Mostly Cloudy" "Partly Cloudy" ...
##  $ Precip.Type             : chr  "rain" "rain" "rain" "rain" ...
##  $ Temperature..C.         : num  9.47 9.36 9.38 8.29 8.76 ...
##  $ Apparent.Temperature..C.: num  7.39 7.23 9.38 5.94 6.98 ...
##  $ Humidity                : num  0.89 0.86 0.89 0.83 0.83 0.85 0.95 0.89 0.82 0.72 ...
##  $ Wind.Speed..km.h.       : num  14.12 14.26 3.93 14.1 11.04 ...
##  $ Wind.Bearing..degrees.  : num  251 259 204 269 259 258 259 260 259 279 ...
##  $ Visibility..km.         : num  15.8 15.8 15 15.8 15.8 ...
##  $ Loud.Cover              : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ Pressure..millibars.    : num  1015 1016 1016 1016 1017 ...
##  $ Daily.Summary           : chr  "Partly cloudy throughout the day." "Partly cloudy throughout the day." "Partly cloudy throughout the day." "Partly cloudy throughout the day." ...

Pregunta 1: Diferencias en la temperatura entre días con y sin lluvia (Pruebas t)

Código y Resultados

# Filtrar datos
rain_data <- data %>% filter(Precip.Type == "rain")
no_rain_data <- data %>% filter(Precip.Type != "rain")

# Prueba t para la temperatura
temp_ttest <- t.test(rain_data$Temperature..C., no_rain_data$Temperature..C.)
temp_ttest
## 
##  Welch Two Sample t-test
## 
## data:  rain_data$Temperature..C. and no_rain_data$Temperature..C.
## t = 334.5, df = 24491, p-value < 2.2e-16
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  16.39811 16.59142
## sample estimates:
## mean of x mean of y 
## 13.852989 -2.641778
# Gráfico de distribución
ggplot(data, aes(x = Precip.Type, y = Temperature..C., fill = Precip.Type)) +
  geom_boxplot(alpha = 0.7) +
  scale_fill_manual(values = c("rain" = "#3498db", "other" = "#e74c3c")) +
  labs(title = "Distribución de Temperatura por Tipo de Precipitación",
       x = "Tipo de Precipitación", y = "Temperatura (°C)") +
  theme_minimal()


Pregunta 2: ¿Cómo afecta la hora del día a la temperatura promedio? (Boxplots)

En esta sección, analizamos si la hora del día tiene un efecto significativo sobre la temperatura promedio. Para ello, utilizaremos un análisis de varianza (ANOVA) junto con una visualización colorida en forma de boxplots.

# Extraer la hora del día a partir de la fecha
weather_data$Hour <- as.numeric(format(as.POSIXct(weather_data$Formatted.Date, format="%Y-%m-%d %H:%M:%S"), "%H"))

# ANOVA para temperatura según la hora del día
anova_hour <- aov(Temperature..C. ~ as.factor(Hour), data = weather_data)
summary(anova_hour)
##                    Df  Sum Sq Mean Sq F value Pr(>F)    
## as.factor(Hour)    23  878819   38210   465.2 <2e-16 ***
## Residuals       96429 7920693      82                   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Gráfico: Boxplots de temperatura por hora del día con colores
# Convertir la columna de fecha a formato datetime y extraer la hora
weather_data$Formatted.Date <- as.POSIXct(weather_data$Formatted.Date, format = "%Y-%m-%d %H:%M:%S")
weather_data$Hour <- format(weather_data$Formatted.Date, "%H")

# Calcular la temperatura promedio por hora
hourly_means <- weather_data %>%
  group_by(Hour) %>%
  summarise(mean_temperature = mean(Temperature..C., na.rm = TRUE))

# Fusionar la temperatura promedio con el dataset original
weather_data <- merge(weather_data, hourly_means, by = "Hour")

# Crear el boxplot con colores basados en la temperatura promedio
ggplot(weather_data, aes(x = as.factor(Hour), y = Temperature..C., fill = mean_temperature)) +
  geom_boxplot(outlier.color = "black", outlier.shape = 16, outlier.size = 2) +
  scale_fill_gradient(low = "blue", high = "red", name = "Temperatura Media (C)") + # Gradiente azul-rojo
  theme_minimal(base_size = 14) +
  theme(legend.position = "right", 
        panel.grid.major = element_line(color = "grey90"),
        plot.title = element_text(face = "bold", hjust = 0.5)) +
  labs(title = "Distribución de Temperatura por Hora del Día",
       x = "Hora del Día", y = "Temperatura (C)")

Este gráfico destaca las diferencias entre las horas del día con colores vivos, facilitando la interpretación visual de los resultados.


Pregunta 3: Relación entre Humedad y Temperatura (Regresión Lineal Simple)

¿Cómo se relaciona la humedad con la temperatura?

# Regresión lineal simple
simple_model <- lm(Temperature..C. ~ Humidity, data = weather_data)
summary(simple_model)
## 
## Call:
## lm(formula = Temperature..C. ~ Humidity, data = weather_data)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -52.415  -5.091   0.378   5.741  18.804 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  34.6369     0.0927   373.7   <2e-16 ***
## Humidity    -30.8944     0.1219  -253.4   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 7.4 on 96451 degrees of freedom
## Multiple R-squared:  0.3997, Adjusted R-squared:  0.3997 
## F-statistic: 6.423e+04 on 1 and 96451 DF,  p-value: < 2.2e-16
# Visualización
ggplot(weather_data, aes(x = Humidity, y = Temperature..C.)) +
  geom_point(alpha = 0.3, color = "pink") +
  geom_smooth(method = "lm", color = "light blue") +
  labs(title = "Relación entre Humedad y Temperatura",
       x = "Humedad", y = "Temperatura (C)")
## `geom_smooth()` using formula 'y ~ x'

Este análisis nos muestra la proporción de días con temperaturas superiores o inferiores a la media anual, ayudándonos a entender las tendencias climáticas del conjunto de datos.


Pregunta 4: ¿Cómo se distribuyen las temperaturas según el resumen diario del clima?

Código y Resultados

# Filtrar un subconjunto con resúmenes frecuentes
top_summaries <- data %>%
  count(Daily.Summary, sort = TRUE) %>%
  top_n(5, n)

filtered_data <- data %>% filter(Daily.Summary %in% top_summaries$Daily.Summary)

# Gráfico de distribución
ggplot(filtered_data, aes(x = Daily.Summary, y = Temperature..C., fill = Daily.Summary)) +
  geom_boxplot(alpha = 0.7) +
  scale_fill_brewer(palette = "Set3") +
  labs(title = "Distribución de Temperaturas por Resumen Diario",
       x = "Resumen Diario", y = "Temperatura (°C)") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

Explicación: 1. Se filtran los cinco resúmenes diarios más frecuentes en la base de datos. 2. El gráfico de caja muestra cómo varían las temperaturas según el resumen diario, destacando la dispersión y valores extremos.


Pregunta 5: Diferencias en la velocidad del viento según el rango de temperatura (Prueba ANOVA)

# Crear categorías de temperatura
data <- data %>%
  mutate(Temp.Group = cut(Temperature..C., breaks = c(-10, 0, 10, 20, 30), labels = c("Muy Baja", "Baja", "Media", "Alta")))

# ANOVA
anova_wind_temp <- aov(Wind.Speed..km.h. ~ Temp.Group, data = data)
summary(anova_wind_temp)
##                Df  Sum Sq Mean Sq F value Pr(>F)    
## Temp.Group      3   41357   13786   287.8 <2e-16 ***
## Residuals   93282 4468781      48                   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 3167 observations deleted due to missingness
# Gráfico
ggplot(data, aes(x = Temp.Group, y = Wind.Speed..km.h., fill = Temp.Group)) +
  geom_boxplot(alpha = 0.8) +
  scale_fill_brewer(palette = "Set2") +
  labs(title = "Velocidad del Viento por Rango de Temperatura",
       x = "Rango de Temperatura", y = "Velocidad del Viento (km/h)") +
  theme_minimal()


Conclusión

Este análisis ofrece una visión integral de las relaciones entre variables climáticas. Los hallazgos clave incluyen: - La influencia de la presión y temperatura sobre la velocidad del viento. - Diferencias significativas en la visibilidad en función de la humedad y la temperatura. - Variaciones diarias claras en la distribución de las temperaturas según los resúmenes climáticos.

Los métodos aplicados son herramientas valiosas para el análisis meteorológico y su impacto ambiental.