Visualizando o clima de Curitiba e Porto Alegre no R

November 12, 2012
By

This post was kindly contributed by fernandohrosa.com.br » R - go there to comment and to read the full post.

Após algumas noites mal dormidas por conta do calor, resolvi usar a estatística para saber o que me espera no verão de Porto Alegre. Este post foi inspirado por uma apresentação sobre visualização da Fernanda Viegas, que assisti faz alguns anos no IME-USP (< 2005, provavelmente, pois não encontrei-a no site dela).

O exemplo que ela utilizou na apresentação ficou comigo até hoje. Ela mostrou algumas figuras de ambientes urbanos, e pedia para que julgássemos se era um lugar perigoso ou seguro, hospitaleiro ou inóspito. Sem precisar parar para pensar, a maioria das pessoas que já viveram em grandes centros urbanos consegue visualizar estes atributos de maneira intuitiva.

O grande desafio da ciência/arte de visualização de dados é conseguir construir representações visuais que proporcionem a quem está interpretando a possibilidade de tirar a maior quantidade de informações possíveis da maneira mais intuitiva possível. No limite, o processo deveria ser tão simples quanto o exemplo que ela mostrou. Quanto mais legendas e explicações são necessárias para interpretar um gráfico, mais longe estamos do objetivo.

Se antigamente esta era uma área de nicho bem pequena, hoje em dia com ‘big data’ virando a buzz-word do momento, tem uma multitude de coisas interessantes sendo feitas nessa área. Para quem se interessa por essa área, coloquei algumas referências no final do post.

Encontrei o site Vacation Planner: Climate Comparison do Weather.com, que permite comparar duas cidades no mundo de maneira bem fácil. Segue o exemplo para Curitiba e Porto Alegre:

Comparação da média da temperatura mínima por mês entre Curitiba e Porto Alegre. Clique aqui para ir ao Vacation Planner: Climate Comparison e comparar quaisquer duas cidades.

O problema é que eles não fornecem os dados brutos e você fica bem limitado no tipo de comparação que pode ser feita. A ideia desse post é aplicar alguns dos princípios de visualização de dados e mostrar como fazer uma comparação mais detalhada do clima das duas cidades usando o R.

1. Fontes de dados

O Instituto Nacional de Meterologia – www.inmet.gov.br disponibiliza dados de centenas de estações metereológicas no país, com dados disponíveis desde o começo do século passado. O processo é bem simples, basta acessar o link do BDMEP – Banco de Dados Meteorólogicos para Ensino e Pesquisa, criar uma conta e obter os dados desejados. No nosso caso solicitei os dados para a estação 83842 – Curitiba e 83967 – Porto Alegre, com dados dos últimos 32 anos (desde 01/01/1980 até 09/10/2012).

Os dados saem em formato CSV, então basta copiar e colar em um arquivo texto para conseguir ler no R. Como o ponto decimal estava em formato americano, somente tive que substituir todos os pontos por virgulas para ler com o read.csv2() no R.

2. Leitura e verificação de consistência

Com o código abaixo lemos os dados, armazenamos a data em formato Date e criamos uma variável para indicar a cidade.

1
2
3
4
5
6
7
inmet <- read.csv2("combined1980.csv")
datas2 <- as.Date(strptime(as.character(inmet$Data), "%d/%m/%Y",tz="GMT"))
inmet$datas <- datas2
inmet$DirecaoVento <- factor(inmet$DirecaoVento) 
str(inmet)
summary(inmet$datas)
inmet$Cidade <- factor(ifelse(inmet$Estacao == 83842,"CWB","POA"))

Uma coisa que chama a atenção é que o número de dados não é o mesmo para as duas estações, o que sugere que há datas onde não há informação. Para verificar se não há ‘buracos’ desiguais em termos de datas que possam influenciar nossa análise, o comando abaixo permite listar as datas faltantes para cada estação:

1
2
3
4
5
6
7
8
9
10
11
12
13
datascwb <- subset(inmet, Cidade == "CWB")$datas
dataspoa <- subset(inmet, Cidade == "POA")$datas
 
summary(datascwb)
summary(dataspoa)
 
completo <- seq(as.Date("1980/1/1"),as.Date("2012/10/9"),by=1)
 
faltantes <- which(completo %in% datascwb != TRUE)
completo[faltantes]
 
faltantes <- which(completo %in% dataspoa != TRUE)
completo[faltantes]

Vemos que há cerca de 500 datas faltantes para Curitiba e 1500 para Porto Alegre, o que dá cerca de 5% de faltantes para POA e 2% para Curitiba. Como a proporção é baixa e as datas faltantes não parecem particularmente concentradas em períodos diferentes para as duas cidades vamos ignorar isto por hora e prosseguir com a análise.

2. Comparando o Frio

Minha primeira surpresa foi notar que o inverno em Porto Alegre não era tão rigoroso quanto em Curitiba. Intuitivamente por conta da localização mais ao Sul, a impressão é que o clima seria mais frio no inverno. Entretanto a altitude compensa bastante neste caso: Porto Alegre está praticamente no nível do mar, enquanto Curitiba está a quase 1.000 metros.

Vamos ver se os dados corroboram esta impressão. Vamos começar olhando os dados de Temperatura Mínima conforme medido nas estações. Esta informação está registrada somente nas linhas com Hora == 1200, portanto o filtro linha 1. Depois calculamos a média diária ao longo dos últimos 32 anos para cada dia do ano para ambas as cidades. Para ter uma idéia da magnitude da variação, calculamos o desvio-padrão também.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
hr12 <- subset(inmet,Hora == 1200)
hr12$mesdia <- factor(format(hr12$datas,"%m%d"))
hr12poa <- subset(hr12,Cidade == "POA")
hr12cwb <- subset(hr12,Cidade == "CWB")
tm.medspoa <- tapply(hr12poa$TempMinima,hr12poa$mesdia,mean,na.rm=TRUE)
tm.medscwb <- tapply(hr12cwb$TempMinima,hr12cwb$mesdia,mean,na.rm=TRUE)
tm.sdspoa <-  tapply(hr12poa$TempMinima,hr12poa$mesdia,sd,na.rm=TRUE)
tm.sdscwb <-  tapply(hr12cwb$TempMinima,hr12cwb$mesdia,sd,na.rm=TRUE)
 
shortdata <- as.Date(paste("2012",levels(hr12poa$mesdia),sep=""),format="%Y%m%d")
longdata <- as.POSIXct(shortdata,tz="BRST")
 
comp <- data.frame(shortdata,datas=longdata,Cidade=c(rep("CWB",366),rep("POA",366)),
	   tm.meds=as.numeric(c(tm.medscwb,tm.medspoa)),
	   tm.sds=as.numeric(c(tm.sdscwb,tm.sdspoa))
	    )

Por fim carregamos os pacotes scales e ggplot2 para fazer o gráfico e utilizandos as funções especiais scale_x_datetime e scale_y_continuous para dar os retoques finais:

1
2
3
4
5
require(ggplot2)
require(scales)
 
qplot(datas,tm.meds,data=comp,geom=c("point","smooth"),color=Cidade,method="loess",ylab="TempMinima oC",xlab="Dia do mês")
last_plot() + scale_x_datetime(breaks=date_breaks("30 days"),minor_breaks=("15 days"),labels=date_format("%b")) + scale_y_continuous(breaks=seq(5,25,by=5),minor_breaks=1:25)

Médias ao longo dos últimos 32 anos (1980-2012) para a temperatura mínima para as duas cidades para cada dia do ano

Clique na imagem para visualizar a versão em tamanho completo. Com este gráfico conseguimos resumir o comportamento da temperatura mínima para as duas cidades e várias conclusões interessantes podem ser tiradas. Cada ponto no gráfico representa a média de até 32 anos por cidade. As linhas tracejadas representam um ajuste não paramétrico de smoothing por loess, que captura as tendências ao longo do tempo. A banda cinza ao redor da linha de ajuste representa uma margem de confiança de aproximadamente 95%. Como as margens não se cruzam em nenhum ponto podemos concluir que a temperatura mínima em Curitiba é estatisticamente diferente em relação a Porto Alegre. Pela posição das curvas, vemos que a temperatura mínima é quase sempre menor em Curitiba. O maior gap está curiosamente nos meses de verão, onde chega a quase 5 graus a menos. No inverno a temperatura está em média 2 graus a menos, com as temperaturas mais baixas no final de julho em Curitiba.

Outro ponto curioso é a queda abrupta na temperatura de março para abril. Em ambas as cidades, mas mais marcadamente para Porto Alegre, se nota este padrão de queda bem íngreme, tanto que o alisamento por loess suaviza até um pouco de mais essa queda.

O gráfico acima nos dá bastante informação sobre as médias mas não nos informa nada sobre a variabilidade da temperatura ao longo dos anos para cada dia. Com um pequeno ajuste fazemos o mesmo gráfico mas para os desvios:

1
2
qplot(datas,tm.sds,data=comp,geom=c("point","smooth"),color=Cidade,method="loess",ylab="TempMinima oC",xlab="Dia do mês\n Desvios")
last_plot() + scale_x_datetime(breaks=date_breaks("30 days"),minor_breaks=("15 days"),labels=date_format("%b"))

Desvio-padrão por dia por cidade (1980-2012, dados INMET)

Curiosamente, no gráfico de desvios o padrão se inverte, com Porto Alegre quase sempre acima de Curitiba. Outro ponto curioso é que a variabilidade é maior meses de menor temperatura. Isso indica que Curitiba esteve uniformemente mais fria que Porto Alegre nos últimos 32 anos, embora nos meses de inverno haja uma instabilidade maior.

Outra informação interessante é considerar que o efeito da temperatura no inverno acaba sendo nivelado por baixo, os dias mais frios acabam sendo talvez mais impactantes do que vários dias com temperaturas mais amenas. Com os comandos abaixo listamos todas as vezes que ocorreram temperaturas abaixo de 0 registradas pelas estações metereológicas em questão nos últimos 32 anos:

1
2
3
4
table(subset(inmet,TempMinima < 0)$Cidade)
> CWB POA 
>  39   1 
qplot(datas,TempMinima,data=subset(inmet,TempMinima < 0),color=Cidade)

Onde vemos que houveram somente 40 dias com temperatura mínima registrando valores abaixo de 0oC no período, das quais 39 em Curitiba e 1 em Porto Alegre. A pior até agora foi no inverno de 2000, onde a estação chegou a marcar quase -4oC em Curitiba. Lembro-me bem deste inverno! Sai com 5 blusas na rua e ainda estava com frio. De maneira geral a análise corrobora a impressão que eu tinha, embora a diferença não seja tão grande em termos absolutos.

40 temperaturas mais baixas de 1980 a 2012

3. Comparando o calor

Agora vem a análise que me motivou a coletar os dados (e dimensionar quantos ventiladores vou precisar pra conseguir dormir no verão!). Com código análogo ao anterior, computamos os valores necessários para fazer os gráficos das Temperaturas Máximas:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# max
hr12 <- subset(inmet,Hora == 0)
hr12$mesdia <- factor(format(hr12$datas,"%m%d"))
hr12poa <- subset(hr12,Cidade == "POA")
hr12cwb <- subset(hr12,Cidade == "CWB")
tm.medspoa <- tapply(hr12poa$TempMaxima,hr12poa$mesdia,mean,na.rm=TRUE)
tm.medscwb <- tapply(hr12cwb$TempMaxima,hr12cwb$mesdia,mean,na.rm=TRUE)
tm.sdspoa <-  tapply(hr12poa$TempMaxima,hr12poa$mesdia,sd,na.rm=TRUE)
tm.sdscwb <-  tapply(hr12cwb$TempMaxima,hr12cwb$mesdia,sd,na.rm=TRUE)
 
shortdata <- as.Date(paste("2012",levels(hr12poa$mesdia),sep=""),format="%Y%m%d")
longdata <- as.POSIXct(shortdata,tz="BRST")
 
comp <- data.frame(shortdata,datas=longdata,Cidade=c(rep("CWB",366),rep("POA",366)),
	   tm.meds=as.numeric(c(tm.medscwb,tm.medspoa)),
	   tm.sds=as.numeric(c(tm.sdscwb,tm.sdspoa))
	    )

Da mesma maneira, obtemos os gráficos:

1
2
3
4
5
require(ggplot2)
require(scales)
 
qplot(datas,tm.meds,data=comp,geom=c("point","smooth"),color=Cidade,method="loess",ylab="TempMaxima oC",xlab="Dia do mês \nMédias")
last_plot() + scale_x_datetime(breaks=date_breaks("30 days"),minor_breaks=("15 days"),labels=date_format("%b"))

Médias temperaturas máximas 1980-2012

Os resultados são bem preocupantes. Seguindo o padrão histórico, começo de novembro em Porto Alegre ainda está substancialmente abaixo do que se obteve historicamente de janeiro a março. Conclusão [ pausa para ir ao SamsClub buscar um novo ventilador ] – ainda vai esquentar bastante – e vai ficar no novo patamar por quase 3 meses seguidos, com baixa variabilidade. Agora entendi porque 110% de Porto Alegre foge para a praia no verão.

O código em R não está muito elegante nem otimizado da melhor maneira possível mas queria deixar como referência para quem precisar trabalhar com dados parecidos. Se tiverem sugestões deixem nos comentários. Prometo que se não estiver derretendo no verão atualizo as análises com mais variáveis depois (umidade relativa do ar, índices pluviométricos, velocidade do vento…).

Referências

  1. Dados da Rede do INMET – Instituto Nacional de Metrologia – Banco de Dados Meterológico para Ensino e Pesquisa
  2. The Information Visualization Community Platform: www.infovis-wiki.net
  3. Cleveland, W. S. (1994). The elements of graphing data. Hobart Press.
  4. Cleveland, W. S. (1993). Visualizing data. Hobart Press.
  5. Tufte, Edward (2001). The Visual Display of Quantitative Information

Tags: , , , ,

Comments are closed.