En este notebook el objetivo es que ustedes puedan emplear lo visto en el notebook Nociones básicas de estadística descriptiva para caracterizar la evolución de la temperatura mensual en la C.A.B.A.
Proponemos una serie de preguntas guía a responder usando las herramientas que vimos en el notebook de estadística descriptiva. Sientan la libertad de hacer nuevas preguntas y explorar el dataset libremente.
El dataset que usaremos puede descargarse (además del repositorio) de la página del gobierno de la ciudad en formato csv: https://data.buenosaires.gob.ar/dataset/registro-temperatura-ciudad
Carguemoslo:
datos = read.csv('historico_temperaturas.csv')
head
head(datos)
Dado que mes y año no están en un formato cómodo para ser procesado y graficado, necesitamos crear un string que contenga esa misma información pero en formato YYYY-MM-DD (año-mes-día). Hay formas de hacerlo automáticamente, pero hoy la función la van a hacer ustedes. Les dejo un boceto:
arma_fecha = function(año,mes){
# Primero necesitamos convertir el mes en palabras a número con dos dígitos.
# Lo hacemos con un diccionario y la función match
diccionario = c('Enero'='01',
'Febrero'='02',
'Marzo'='03',
'Abril'='04',
'Mayo'='05',
'Junio'='06',
'Julio'='07',
'Agosto'='08',
'Septiembre'='09',
'Octubre'='10',
'Noviembre'='11',
'Diciembre'='12')
mes_numerico = diccionario[match(mes,names(diccionario))] # Exploren esto un poco en la consola para ver qué hace exactamente.
fechas = paste(año,mes_numerico,'01',sep='-')
# Fijamos el día siempre en el primero del més
fechas = as.Date(fechas) # Lo convertimos a un formato de fecha
return(fechas)
}
datos$fecha = arma_fecha(datos$año,datos$mes)
Realice un gráfico que muestre la temperatura media en función de la fecha. Sugerencia: agregando en plot(x,y)
la opción type='l'
obtenemos un gráfico de lineas: plot(x,y,type='l')
.
plot(datos$fecha,datos$media,type='l')
Realice un gráfico que muestre la evolución de las tres temperaturas (mínima, media y máxima) a la vez, con lineas y usando diferentes colores. Los colores los indicamos usando la opción col
_ en la función plot
. _Para agregar lineas usamos la función lines
.
plot(datos$fecha,datos$media,type='l',ylim=c(5,40))
lines(datos$fecha,datos$máxima,col='red')
lines(datos$fecha,datos$mínima,col='blue')
#### ¿En qué año y mes se registró la temperatura máxima? ¿Y la mínima?
Detecte, año, mes y fecha y repita el gráfico anterior, agregando un punto rojo y uno azul en la posición de la temperatura máxima y mínima. Para agregar puntos a un gráfico, puede usar la función points
, similar a lines
. Para ubicar las posiciones donde ocurre el máximo y el mínimo de un vector aproveche las funciones which.max
y which.min
.
imax = which.max(datos$máxima)
imin = which.min(datos$mínima)
print(datos[imax,])
## año mes máxima mínima media fecha
## 276 2013 Diciembre 32.5 21.5 27 2013-12-01
print(datos[imin,])
## año mes máxima mínima media fecha
## 199 2007 Julio 14.1 4.6 9.35 2007-07-01
plot(datos$fecha,datos$media,type='l',ylim=c(5,40))
lines(datos$fecha,datos$máxima,col='red')
lines(datos$fecha,datos$mínima,col='blue')
points(datos$fecha[imax],datos$máxima[imax],col='red',pch=18)
points(datos$fecha[imin],datos$mínima[imin],col='blue',pch=18)
Calcule las temperaturas promedio y mediana a lo largo de todos los años usando la temperatura media mensual. ¿Son similares en este caso? Calcule la desviación estandar de la temperatura media y los cuartiles 1ro y 3ro, y agreguelos al gráfico original de la temperatura media. La función abline
permite dibujar lineas horizontales a través de su argumento h
.
promedio = mean(datos$media)
mediana = median(datos$media)
SD = sd(datos$media)
Q1 = quantile(datos$media,.25)
Q3 = quantile(datos$media,.75)
print(promedio)
## [1] 18.40493
print(mediana)
## [1] 18.275
plot(datos$fecha,datos$media,type='l')
abline(h=promedio,col='blue',lty='solid')
abline(h=mediana,col='red',lty='solid')
abline(h=promedio+c(-SD,SD),col='blue',lty='dashed')
abline(h=c(Q1,Q3),col='red',lty='dashed')
Calcule la temperatura media, mínima y máxima promedio para cada mes, y construya un boxplot de la temperatura media separado por mes. ¿Qué meses presentan temperaturas más atípicas?
medias_mensuales = rep(NA,12) # Un vector a completar con la temperatura media de cada mes
minimas_mensuales = rep(NA,12)
maximas_mensuales = rep(NA,12)
meses = unique(datos$mes)
for(i in 1:length(meses)){
mes = meses[i]
medias_mensuales[i] = mean(datos$media[datos$mes==mes])
minimas_mensuales[i] = mean(datos$mínima[datos$mes==mes])
maximas_mensuales[i] = mean(datos$máxima[datos$mes==mes])
}
temperaturas_mensuales = cbind(medias_mensuales,minimas_mensuales,maximas_mensuales)
rownames(temperaturas_mensuales) = meses
print(temperaturas_mensuales)
## medias_mensuales minimas_mensuales maximas_mensuales
## Enero 25.11667 20.200000 30.03333
## Febrero 24.11833 19.350000 28.88667
## Marzo 22.32833 17.720000 26.93667
## Abril 18.65833 14.066667 23.25000
## Mayo 15.26333 11.096667 19.43000
## Junio 12.38000 8.373333 16.38667
## Julio 11.56207 7.641379 15.48276
## Agosto 13.35672 8.868966 17.84483
## Septiembre 15.15172 10.641379 19.66207
## Octubre 17.96552 13.375862 22.55517
## Noviembre 20.96897 16.037931 25.90000
## Diciembre 23.73276 18.600000 28.86552
datos$mes = factor(datos$mes,meses)
boxplot(datos$media~datos$mes,las=2,xlab='')
# Acá el barplot también
barplot(medias_mensuales,names.arg = meses,las=2,cex.names=.8)
Calcule la variabilidad de cada mes como máxima-mínima
y calcule el promedio mensual y construya un boxplot para cada mes. ¿En qué mes es más variable la temperatura? ¿Y en cuál menos? ¿Observa una relación con la temperatura del mes?
datos$variabilidad = datos$máxima-datos$mínima
variabilidad_mensual = rep(NA,12) # Un vector a
for(i in 1:length(meses)){
mes = meses[i]
variabilidad_mensual[i] = mean(datos$variabilidad[datos$mes==mes])
}
names(variabilidad_mensual) = meses
print(variabilidad_mensual)
## Enero Febrero Marzo Abril Mayo Junio Julio
## 9.833333 9.536667 9.216667 9.183333 8.333333 8.013333 7.841379
## Agosto Septiembre Octubre Noviembre Diciembre
## 8.975862 9.020690 9.179310 9.862069 10.265517
boxplot(datos$variabilidad~datos$mes,las=2,xlab='')
barplot(variabilidad_mensual,names.arg = meses,las=2,cex.names=.8)
barplot(variabilidad_mensual,names.arg = meses,las=2,cex.names=.8)
Grafique la temperatura media contra la variabilidad. ¿Observa una relación? Calcule el coeficiente de correlación entre ambas. ¿Se condice con lo que observa en el gráfico?
colores = as.numeric((datos$fecha-min(datos$fecha)))/(as.numeric(diff(range(datos$fecha))))
colores = rgb(1-colores,colores,0)
plot(datos$media,datos$variabilidad,col=colores,pch=18)
print(cor(datos$media,datos$variabilidad))
## [1] 0.5236947
md = lm(variabilidad~media,data = datos)
lines(datos$media,predict(md))
Grafique boxplots separando la temperatura media por año, y la variabilidad por año. Calcule la temperatura media, mínima y máxima por año. ¿Detecta algún año especialmente frío? Grafique la temperatura media máxima y mínima año a año. Calcule la correlación entre el año y la temperatura media.
boxplot(datos$media~datos$año)
abline(h=mean(datos$media))
boxplot(datos$variabilidad~datos$año)
abline(h=mean(datos$variabilidad))
años = unique(datos$año)
medias_anual = rep(NA,length(años))
minimas_anual = rep(NA,length(años))
maximas_anual = rep(NA,length(años))
for(i in 1:length(años)){
año = años[i]
medias_anual[i] = mean(datos$media[datos$año==año])
minimas_anual[i] = mean(datos$mínima[datos$año==año])
maximas_anual[i] = mean(datos$máxima[datos$año==año])
}
temperaturas_anuales = cbind(medias_anual,minimas_anual,maximas_anual)
rownames(temperaturas_anuales) = años
años_fecha = as.Date(as.character(años),format='%Y')
print(temperaturas_anuales)
## medias_anual minimas_anual maximas_anual
## 1991 17.94167 13.60833 22.27500
## 1992 17.82917 13.48333 22.17500
## 1993 17.82917 13.71667 21.94167
## 1994 18.52500 14.15000 22.90000
## 1995 18.17500 13.45833 22.89167
## 1996 18.53750 13.84167 23.23333
## 1997 18.86250 14.40833 23.31667
## 1998 17.70000 13.24167 22.15833
## 1999 17.92500 13.45000 22.40000
## 2000 17.95833 13.79167 22.12500
## 2001 18.37500 14.11667 22.63333
## 2002 18.25833 13.77500 22.74167
## 2003 18.00417 13.28333 22.72500
## 2004 18.44583 13.81667 23.07500
## 2005 18.25000 13.47500 23.02500
## 2006 18.52917 13.92500 23.13333
## 2007 17.68333 12.90833 22.45833
## 2008 19.03333 14.25000 23.81667
## 2009 18.62042 13.79167 23.45000
## 2010 18.43750 13.77500 23.10000
## 2011 18.28750 13.64167 22.93333
## 2012 18.70000 13.95833 23.44167
## 2013 18.52917 13.65833 23.40000
## 2014 18.60833 13.95000 23.26667
## 2015 18.86250 14.25000 23.47500
## 2016 18.10417 13.65833 22.55000
## 2017 19.07917 14.46667 23.69167
## 2018 18.90417 14.51667 23.29167
## 2019 18.88333 14.52500 23.24167
## 2020 20.13333 15.55000 24.71667
plot(años_fecha,temperaturas_anuales[,1],type='l',ylim=c(10,30))
abline(h=mean(temperaturas_anuales[,1]))
lines(años_fecha,temperaturas_anuales[,2],col='blue')
abline(h=mean(temperaturas_anuales[,2]),col='blue')
lines(años_fecha,temperaturas_anuales[,3],col='red')
abline(h=mean(temperaturas_anuales[,3]),col='red')
print(cor(años,temperaturas_anuales[,1]))
## [1] 0.6272737