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.
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." ...
# 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()
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.
¿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.
# 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.
# 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()
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.