Visualizando o clima de Curitiba e Porto Alegre no R

Visualizando o clima de Curitiba e Porto Alegre no R

Conteúdo

1. Introdução

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.

2. 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.

3. 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.


4. 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 nos 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


5. 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…).


6. Umidade Relativa do Ar

Conforme prometido – e milagrosamente termos sobrevivido ao verão Forno Alegre 2013 sem ar-condicionado até o dia 02 de Fevereiro (veja [em breve] o post – Vale a pena comprar um ar-condicionado portátil?) seguem os dados de umidade, que nos ajudam a responder o comentário do Ângelo Goethe:

1
2
qplot(datas,ur.meds,data=comp,geom=c("point","smooth"),color=Cidade,method="loess",ylab="UmidadeRelativa (%)",xlab="Dia do mês",main="Media")
last_plot() + scale_x_datetime(breaks=date_breaks("30 days"),minor_breaks=("15 days"),labels=date_format("%b"))

Médias de Umidade Relativa do Ar  dos últimos 32 anos (1980-2012)

Médias de Umidade Relativa do Ar dos últimos 32 anos (1980-2012)

O que corrobora a impressão do Ângelo com relação à umidade: de fato Porto Alegre é mais úmida que Curitiba nos meses de inverno. O curioso é que o ano todo Curitiba tende a ser bem mais úmida que Porto Alegre, o que qualquer pessoa que já morou em Curitiba pode confirmar: a dificuldade de secar as roupas sem secadora ou as roupas e sapatos criando mofo incrivelmente rápido são unânimes por lá.


7. Conclusões

Tomando como base todas as informações aqui disponíveis e os gráficos construídos, a conclusão é que de fato Curitiba é mais fria que Porto Alegre, embora no inverno, com a umidade relativa menor (em torno de 50 a 55%), temperaturas mais baixas podem dar uma sensação térmica menos fria que em Porto Alegre. Veja também Quão atípicos foram o Verão 2013 e Inverno 2012 em Porto Alegre?.

Com relação ao verão, Porto Alegre apresenta umidade relativa menor que Curitiba e temperaturas bem maiores. Do ponto de vista de alguém aqui há já um ano, eu não fazia ideia que era possível passar tanto calor na vida. De maneira geral, as diferenças no inverno pareceram de menor importância: as temperaturas em Curitiba são menores mas uma umidade menor talvez compense um pouco na sensação e acaba equivalendo à sensação em Porto Alegre. Quanto ao verão, sem sombra de dúvidas não existe nada sequer parecido em Curitiba e em muitas outras cidades do país.

Recomendação final para quem chegou até o fim: se algum dia tiver que morar em Porto Alegre, coloque o item ar-condicionado como item essencial em todos os seus cálculos (seja moradia, carro, escritório). É possível sobreviver sem, principalmente se você já mora hoje em um lugar muito quente (Belém, Cuiabá?) mas para quem está acostumado com climas mais amenos, é bem complicado.

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


tabs-top

5 Comentários para “Visualizando o clima de Curitiba e Porto Alegre no R”

  1. Ângelo Goethe disse:

    A imprensa que tenho que o inverno de POA é mais rigoroso que o de Curitiba, sei lá talvez o clima mais úmido no auge do inverno varias dias com temperaturas máximas baixas, mais é essa a impressão que passa.

    • Olá Ângelo, obrigado pelo comentário. Acrescentei o gráfico de umidade relativa do ar ao final do artigo para poder melhor responder seu comentário, e de fato, a umidade relativa do ar é menor em Curitiba nos meses de inverno. Porém, as temperaturas mínimas são bem menores em Curitiba do que em Porto Alegre. Minha impressão é que a sensação térmica deve ser muito próxima nas duas cidades, justamente por conta das diferenças na umidade relativa.

  2. Jack disse:

    Faltou citar as temperaturas máximas -extremas- e em um periodo do inverno mais baixas em POA do que em CTBA. tlavez pudesse citar os valores extremos com mais precisão.
    Mas, sem dúvida, um excelente estudo

Deixar uma resposta