Este notebook

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

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(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)

Preguntas

¿Qué puede decir de la evolución de la temperatura a lo largo del tiempo?

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').

  • Respuesta:
plot(datos$fecha,datos$media,type='l')

¿Qué puede decir de la evolución de la mínima y la máxima en función del tiempo?

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.

  • Respuesta:
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.

  • Respuesta
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)

¿En torno a que valor ronda la temperatura en C.A.B.A.?

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')

¿Cuál es el mes más frio del año? ¿Y el más cálido?

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)

¿Cuál es el mes con temperatura más variable?

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)

¿Cómo se relacionan la temperatura media y la variabilidad?

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))

¿Cómo cambió la temperatura a lo largo de los años?

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