Exploração, Limpeza dos dados e Visualizações

Notebook referência: Data_Cleaning_and_EDA.ipynb

Trabalharemos com três datasets. O primeiro é um subconjunto do ICOADS (International Comprehensive Ocean-Atmosphere Data Set) fornecido pela NOAA (National Oceanic and Atmospheric Administration) que possui vários dados climáticos de cobertura mensal, desde 1800 até o presente, e com abrangência marítima; Possui dados como temperatura do mar, umidade, pressão, cobertura de nuvens, velocidade de vento, etc.

Caso queira trabalhar com eles, as instrucões para baixá-los estão no notebook referência.

O segundo grande conjunto de dados é o HURDAT2 cuja fonte oficial é a NHC (National Hurricane Center), divisão da NOAA responsável pelos furações e tempestades.

Os dados do Kaggle fornecem dados de tempestades e furacões desde o século XIX até 2015 no pacífico e atlântico, mas iremos focar nossa análise no dadaset do atlântico.

O terceiro, é um dado com o índice PDI, mas ele já vem da fonte em boas condições e não necessita de limpeza. Veja mais no notebook PowerDissipationIndex.ipynb.

Dataset ICOADS

Os dados da ICOADS vem no formato .nc que é legível ao python através da biblioteca netCDF4 que é um dos pré-requisitos para execução dos notebooks.

Análise de dados faltantes

png

Legenda:

  • sst: Sea Surface Temperature (Temperatura na superfície do mar)
  • wspd: Scalar Wind Speed (Velocidade de vento escalar)
  • rhum: Relative Humidity (Umidade relativa)
  • slp: Sea Level Pressure (Pressão no nível do mar)
  • vwnd: V-wind component (Componente V-wind)
  • cldc: Cloudiness (Nebulosidade das nuvens)

Como os continentes representam aproximadamente da suferfície terrestre e nossos dados só preenchem os oceanos, os continentes são preenchidos como dados inexistentes. Então naturalmente nossa cota inferior de dados faltantes é essa porcentagem.

Os dados lidos dos arquivos .nc vem no formato de "numpy masked array" de 3 dimensões (tempo,latitude,longitude) que tem um atributo "mask" que é indicadora de dado faltante, isso nos ajudará a lidar com esses dados.

Como vemos no plot acima temos várias décadas com níveis de dados faltantes acima de mas vamos analisar focadamente e atlântico norte, que é nossa região de estudos.

png

*MDR é a abreviação de Main Development Region ou região central de desenvolvimento dos furacões no Atlântico Norte e se refere à faixa 10°-20°N, 80°-20°W.

Vemos que a partir de 1950-1960, os dados começam a ficar mais completos na região de estudos. Então, para entender a relação as variáveis, iremos trabalhar a partir desta data.

Entretanto, nada nos impede de usar os dados mais antigos, já que as medições não variam muito quando estão perto, se quisermos trabalhar com tendências de longo prazo podemos cortar os dados a partir de 1920, trabalhar com a média das regiões estudadas, mesmo que com de dados faltantes. Isso pois temos a array indicadora, que pode ajudar em modelos, e também essa porcentagem é um pouco mais baixa devido às faixas continentais considaradas no corte de coordenadas.

Visualização

Abaixo temos um exemplo de como os dados de temperatura estão distribuídos em Janeiro de 1955

png

Agregação dos Dados MDR

Criaremos um dataframe com as médias espaciais da região MDR, para análise futura com o PDI. Usamos essa média baseados na premissa razoável de que nesse corte espacial da MDR do atlântico os valores não variam muito dentro de um mês. Fazemos essa médias para análises de mais longo prazo como podem ver no notebook do PDI.

Mais detalhes sobre a criação desse dataframe veja no notebook referência.

Um plot que se tornou possível após essa agregação foi o mostrado abaixo:

png

Podemos ver que após 1970-1980 inicia-se uma tendência crescente de aumento de temperatura do mar em relação à média histórica.

Temos também a matriz de correlação entre as variáveis desde novo dataframe:

Year Month sst rhum slp wspd vwnd cldc sst_anomaly
Year 1.000000 -0.010203 0.145686 -0.098235 0.048908 0.646453 -0.035567 0.241832 0.379038
Month -0.010203 1.000000 0.762722 0.392842 -0.434216 -0.385048 0.151316 0.380311 -0.017207
sst 0.145686 0.762722 1.000000 0.635370 -0.632031 -0.416486 0.432498 0.559898 0.312656
rhum -0.098235 0.392842 0.635370 1.000000 -0.768182 -0.380635 0.803748 0.305508 0.014696
slp 0.048908 -0.434216 -0.632031 -0.768182 1.000000 0.317397 -0.812037 -0.548567 0.129542
wspd 0.646453 -0.385048 -0.416486 -0.380635 0.317397 1.000000 -0.253309 0.007404 0.040588
vwnd -0.035567 0.151316 0.432498 0.803748 -0.812037 -0.253309 1.000000 0.236100 -0.002599
cldc 0.241832 0.380311 0.559898 0.305508 -0.548567 0.007404 0.236100 1.000000 0.019122
sst_anomaly 0.379038 -0.017207 0.312656 0.014696 0.129542 0.040588 -0.002599 0.019122 1.000000

Alguma correlações fortes interessantes:

  • Temperatura do mar (sst) com ano (Year)
  • Temperatura do mar (sst) e umidade (rhum)
  • Velocidade de vento (wspd) e ano (Year)
  • Pressão (slp) e Umidade (rhum)

Análises mais aprofundadas dessas variáveis veremos no notebook de análise do PDI.

Dataset HURDAT2 (Hurricane) - Análise e Limpeza

Passemos agora a analisar os dados de tempestades e furacões.

Segue a visualização da Temporada de Furacões:

png

Período de furacões se concentra entre os meses de julho e novembro. Isso deve estar relacionado com o período anterior (verão do hemisfério norte, onde acontece o maior número de casos) O aquecimento das águas está intimamente ligado com a formação das massas de ar que ocasionam os furacões Isso nos dá uma pista da forma de correlação temporal que devemos buscar para predizer os eventos.

png

Veja acima que os picos de temperatura e umidade, coincidem razoavelmente com a temporada de furacões.

png

O pico de nebulosidade das nuvens também coincide de forma razoável com a temporada de furacões. Assim como os valores mais baixos de pressão. Essas características estão relacionadas com a formação do evento de tempestade forte ou furacão.

Veja abaixo a relação quase linear entre velocidade máxima sustendada de vento e a pressão mínima dos eventos. Essa relação coincide com o que se sabe da formação do evento de furacão.

png

Vemos abaixo que o número de registro de furações tem crescido desde 1850, mas isso se deve à maior capacidade de detecção com o passar dos anos.

png

Vemos também que a velocidade máxima de vento sustentada pelos furacões reduziu, mas isso também se deve à maior capacidade de registro de eventos de pequeno porte, que acabam pesando a média para baixo. Assim, para não enviesar nossos dados, filtraremos os registros de pequeno porte; Consideramos apenas tempestades cuja duração em dias é maior que 2, e cuja classificação na escala Saffir-Simpson seja no mínimo Tempestade Tropical.

Para essa classificação, a velocidade máxima sustentada de vento deve ultrapassar 63km/h o que equivale a 34 knots (milhas náuticas).

png

Após algumas análises (veja notebook referência), decidimos aplicar um filtro aos dados, para reduzir viés de capacidade de observação, e detecção de tempestades menores.

Os filtros foram:

  • Velocidade Máxima Sustentada > 34 milhas náuticas
  • Duração > 2 dias
  • Furacões a partir de 1950 (quando a capacidade de medição começa a evoluir
  • Latitude entre 0° e 25°N (remover viés dos registros extratropicais)

Fazemos também outras limpezas como formatação de entradas de latitude, longitude e outras variáveis que não vieram da forma ideal.

União dos dados via k-NN ponderado

A partir dos dois grandes conjuntos de dados descritos acima criamos um novo dataframe que pega o dataframe HURDAT2 filtrado acima e busca os dados climáticos nos datasets da ICOADS diretamente dos arquivos .nc. Fizemos essa busca via coordenadas e para lidar com dados faltantes implementaremos um k-NN ponderado pelo inverso das distâncias entre as coordenadas originais e o vizinho considerado no algoritmo.

Formula da distância

Dados duas coordenadas e ( em radianos, a Fórmula Haversine é capaz de calcular a distância real entre esses dois pontos no mapa:

teste

Onde é o raio da Terra.

Usando aproximadamente igual a km o valor de será a distância em km dos dois pontos dados em coordenadas geográficas.

Detalhes sobre a implementação desse cálculo estão no notebook referência.

k-NN ponderado por inverso da distância

Implementamos várias funcões auxiliares para ajudar nessa tarefa de coletar vizinhos para cálculo de média. Detalhes estão no notebook referência.

Por conta de dados faltantes no ICOADS, nem sempre existirá registros para todas as coordenadas. Assim, buscamos os vizinhos mais próximos a calculamos a média entre eles, porém a média é ponderada pelo inverso da distância entre o vizinho e a coordenada original (usando a Fórmula Haversive). Sendo assim, pontos mais distantes terão menor peso na média, enquanto pontos mais próximos serão considerados mais importantes.

Por simplicidade, usamos .

Após a execução dos algoritmos implementados, salvamos o dataframe gerado em um csv e o usamos para outras análises.

Outras Visualizações

png

png

Nos plots abaixo usaremos a biblioteca troPYcal. Internamente ela tem o dataset HURDAT2 atualizado e possui funções de visualização prontas, simples de serem usadas.

Referência: https://tropycal.github.io/tropycal/examples/index.html

png

png

png