Séries temporais multivariadas | Regressão automática de vetor (ONDE)

Conteúdo

Introdução

O tempo é o fator mais crítico para decidir se uma empresa vai subir ou descer. É por isso que vemos vendas em lojas e plataformas de comércio eletrônico alinhadas aos festivais.. Essas empresas analisam anos de dados de gastos para entender o melhor momento para abrir as portas e ver um aumento nos gastos do consumidor..

Mas, Como você pode, como cientista de dados, realizar esta análise? Não te preocupes, você não precisa construir uma máquina do tempo! A modelagem de séries temporais é uma técnica poderosa que atua como um portal para entender e prever tendências e padrões..

mts-6650631

Mas mesmo um modelo de Série temporal Tem diferentes facetas. A maioria dos exemplos que vemos na web trata de séries temporais univariadas. Infelizmente, casos de uso do mundo real não funcionam assim. Existem várias variáveis ​​em jogo, e lidar com todos eles ao mesmo tempo é onde um cientista de dados ganhará coragem.

Neste artigo, vamos entender o que é uma série temporal multivariada e como lidar com ela. Também faremos um estudo de caso e o implementaremos em Python para fornecer a você uma compreensão prática do tópico..

Tabela de conteúdo

  1. Séries temporais univariadas versus multivariadas
    1. Séries temporais univariadas
    2. Séries temporais multivariadas
  2. Gestão de uma série temporal multivariada: regressão automática de vetor (ONDE)
  3. Por que precisamos de VAR?
  4. Estacionariedade em uma série temporal multivariada
  5. Divisão de validação de trem
  6. Implementação Python

1. Séries temporais univariadas versus multivariadas

Este artigo pressupõe alguma familiaridade com séries temporais univariadas, suas propriedades e as várias técnicas usadas para previsão. Como este artigo se concentrará em séries temporais multivariadas, Eu sugiro que você reveja os seguintes artigos que servem como uma boa introdução para séries temporais univariadas:

Mas vou dar uma rápida visão geral do que é uma série temporal univariada., antes de entrar nos detalhes de uma série temporal multivariada. Vamos examiná-los um por um para entender a diferença.

1.1 Séries temporais univariadas

Uma série temporal univariada, como o nome sugere, É uma série com um variável dependente do tempo.

Por exemplo, dê uma olhada no conjunto de dados de amostra abaixo que consiste nos valores de temperatura (cada hora), Durante o último 2 anos. Aqui, temperatura é a variável dependente (dependente do tempo).

var_3-3826376

Se formos solicitados a prever a temperatura para os próximos dias, vamos olhar para os valores anteriores e tentar medir e extrair um padrão. Notaríamos que a temperatura é mais baixa pela manhã e à noite, enquanto atinge o pico à tarde. O que mais, se você tem dados dos últimos anos, você notará que está mais frio durante os meses de novembro a janeiro, embora seja comparativamente mais quente de abril a junho.

Essas observações nos ajudarão a prever valores futuros.. Você percebeu que usamos apenas uma variável (a temperatura do último 2 anos)? Portanto, isso é chamado de análise / Previsão de série temporal univariada.

1.2 Séries temporais multivariadas (MTS)

Uma série temporal multivariada tem mais de uma variável dependente do tempo. Cada variável depende não apenas de seus valores anteriores, também tem alguma dependência de outras variáveis. Esta dependência é usada para prever valores futuros. Parece complicado? Deixe-me explicar.

Considere o exemplo acima. Agora, suponha que nosso conjunto de dados inclua a porcentagem de transpiração, ponto de condensação da água, velocidade do vento, a porcentagem de cobertura de nuvens, etc. junto com o valor da temperatura dos últimos dois anos. Neste caso, múltiplas variáveis ​​devem ser consideradas para prever a temperatura de maneira ideal. Uma série como essa se enquadraria na categoria de séries temporais multivariadas.. Abaixo está uma ilustração deste:

var_4-4710969

Agora que entendemos como é uma série temporal multivariada, vamos entender como podemos usá-lo para construir uma previsão.

2. Gestão de uma série temporal multivariada – ONDE

Nesta secção, Vou apresentar a você um dos métodos mais usados ​​para previsão de série temporal multivariada: Regressão automática de vetor (ONDE).

Em um modelo VAR, cada variável é uma função linear dos valores anteriores de si mesma e dos valores anteriores de todas as outras variáveis. Para explicar isso de uma maneira melhor, Vou usar um exemplo visual simples:

Temos duas variáveis, y1 e y2. Precisamos prever o valor dessas duas variáveis ​​no tempo t, a partir dos dados fornecidos para os n valores passados. Para simplificar, Eu considerei o valor do atraso como 1.

var_12-6941593 var_21-7431126

Para calcular y1

1-3391035

2-2155452

Aqui,

  • a1 e a2 são os termos constantes,
  • w11, w12, w21 e w22 são os coeficientes,
  • e1 e e2 são os termos de erro

Essas equações são semelhantes à equação de um processo AR. Uma vez que o processo AR é usado para dados de série temporal univariados, valores futuros são combinações lineares de seus próprios valores passados ​​apenas. Considere o processo de AR (1):

e

Neste caso, nós temos apenas uma variável – e, um termo constante – uma, um termo de erro – e, e um coeficiente – C. Para acomodar os vários termos de variáveis ​​em cada equação para VAR, vamos usar vetores. Podemos escrever as equações (1) e (2) da seguinte forma:

vector_eqn1-5027998

As duas variáveis ​​são y1 e y2, seguido por uma constante, um coeficiente métrico, um valor de atraso e uma métrica de erro. Esta é a equação vetorial para um processo VAR (1). Para um processo VAR (2), outro termo vetorial será adicionado por tempo (t-2) à equação para generalizar para defasagens:

vector_eqn2-2135928

A equação acima representa um processo VAR (p) com variáveis ​​y1, y2 ... yk. O mesmo pode ser escrito como:

vector_eqn3-6014342

3-7711571

O termo εt na equação representa o vetor multivariado de ruído branco. Para uma série temporal multivariada, et deve ser um vetor aleatório contínuo que satisfaça as seguintes condições:

  1. E (et) = 0
    O valor esperado para o vetor de erro é 0
  2. E (et1, et2‘) = σ12
    Valor esperado de εt y εt'É o desvio padrão da série

3. Por que precisamos de VAR?

Lembre-se do exemplo de previsão de temperaturas temperadas que vimos anteriormente. Pode-se argumentar que será tratado como uma série univariada múltipla. Podemos resolvê-lo usando métodos de previsão univariados simples como AR. Já que o objetivo é prever a temperatura, podemos apenas remover as outras variáveis (exceto temperatura) e ajustar um modelo para a série univariada restante.

Outra ideia simples é prever os valores de cada série individualmente usando as técnicas que já conhecemos.. Isso tornaria o trabalho extremamente fácil!! Então, Por que devo aprender outra técnica de previsão? Este assunto já não é complicado o suficiente?

Das equações acima (1) e (2), é claro que cada variável está usando os valores anteriores de cada variável para fazer as previsões. Ao contrário de AR, VAR é capaz de entender e usar a relação entre várias variáveis.. Isso é útil para descrever o comportamento dinâmico dos dados e também fornece melhores resultados de previsão.. O que mais, implementar VAR é tão simples quanto usar qualquer outra técnica univariada (o que você verá na última seção).

4. Estacionariedade de uma série temporal multivariada

Sabemos, a partir do estudo do conceito univariado, que uma série temporal estacionária nos dará, na maioria dos casos, um melhor conjunto de previsões. Se você não está familiarizado com o conceito de estacionariedade, leia este artigo primeiro: Uma introdução suave para lidar com séries temporais não estacionárias.

Para resumir, para uma dada série temporal univariada:

e

A série é considerada estacionária se o valor de | c | <1. Agora, lembre-se da equação do nosso processo VAR:

4-2968103

Observação: Eu é a matriz de identidade.

Representa a equação em termos de Operadores de atraso, tenho:

5-2014328

Pegando todos os termos e

6-7179525

7-4583933

O coeficiente de y

codecogseqn-6620479

codecogseqn1-4388314

Para uma série ser estacionária, os autovalores de | Phi (eu)-1| deve ser menor que 1 no módulo. Isso pode parecer complicado, dado o número de variáveis ​​na derivação. Essa ideia foi explicada por um exemplo numérico simples no vídeo a seguir. Eu recomendo que você assista para solidificar seu entendimento:

Semelhante ao teste Augmented Dickey-Fuller para séries univariadas, temos o teste de Johansen para verificar a estacionariedade de quaisquer dados de série temporal multivariada. Veremos como realizar o teste na última seção deste artigo.

5. Divisão de validação de trem

Se você já trabalhou com dados de série temporal univariados, conheça os conjuntos de validação de trens. A ideia de criar um conjunto de validação é analisar o desempenho do modelo antes de usá-lo para fazer previsões..

Criar um conjunto de validação para problemas de série temporal é complicado porque temos que levar em consideração o componente de tempo. Não se pode usar diretamente o train_test_split o k-fold validação, pois isso vai interromper o padrão da série. O conjunto de validação deve ser criado com os valores de data e hora em mente.

Suponha que temos que prever a temperatura, ponto de condensação da água, a porcentagem de nuvens, etc. pelos próximos dois meses usando dados dos últimos dois anos. Um método possível é manter os dados dos últimos dois meses de lado e treinar o modelo no 22 meses restantes.

Uma vez que o modelo foi treinado, podemos usá-lo para fazer previsões sobre o conjunto de validação. Com base nessas previsões e nos valores reais, podemos verificar o desempenho do modelo e as variáveis ​​para as quais o modelo não teve um desempenho tão bom. E para fazer a previsão final, use todo o conjunto de dados (combinar conjuntos de trem e validação).

6. Implementação Python

Nesta secção, vamos implementar o modelo Vector AR em um conjunto de dados de brinquedo. Usei o conjunto de dados de qualidade do ar para isso e você pode baixá-lo em aqui.

#importar pacotes necessários
importar pandas como pd
import matplotlib.pyplot as plt
% matplotlib inline

#read the data
df = pd.read_csv("AirQualityUCI.csv", parse_dates =[['Date', 'Tempo']])

#verifique os dtypes
df.dtypes

Objeto Date_Time
CO(GT)            int64
PT08.S1(CO)       int64
NMHC(GT)          int64
C6H6(GT)          int64
PT08.S2(NMHC)     int64
NOx(GT)           int64
PT08.S3(NOx)      int64
NO2(GT)           int64
PT08.S4(NO2)      int64
PT08.S5(O3)       int64
T int64
RH int64
AH int64
dtype: objeto

O tipo de dados do Data e hora a coluna é objeto e temos que mudar para data e hora. O que mais, para preparar os dados, precisamos do índice Ter data e hora. Siga os seguintes comandos:

df['Date_Time'] = pd.to_datetime(df.Date_Time , format ="%d /% m /% Y% H.% M.% S")
data = df.drop(['Date_Time'], eixo = 1)
data.index = df.Date_Time

A próxima etapa é lidar com os valores ausentes. Uma vez que os valores ausentes nos dados são substituídos por um valor -200, teremos que imputar o valor ausente com um número melhor. Considere isto: se o valor do ponto de orvalho atual estiver faltando, podemos supor com segurança que será próximo ao valor da hora anterior. Tem sentido, verdade? Aqui, Vou imputar -200 com o valor anterior.

Você pode escolher substituir o valor usando a média de alguns valores anteriores, ou o valor na mesma hora do dia anterior (você pode compartilhar seu (s) ideia (s) para imputar valores ausentes na seção de comentários abaixo).

#tratamento de valor ausente
cols = data.columns
para j em cols:
    para eu no alcance(0,len(dados)):
       se dados[j][eu] == -200:
           dados[j][eu] = dados[j][i-1]

#verificando a estacionariedade
de statsmodels.tsa.vector_ar.vecm import coint_johansen
# visto que o teste funciona apenas para 12 variáveis, Eu deixei cair aleatoriamente
# na próxima iteração, Eu largaria outro e verificaria os autovalores
johan_test_temp = data.drop([ 'CO(GT)'], eixo = 1)
coint_johansen(johan_test_temp,-1,1).ter

Abaixo está o resultado do teste:

variedade([ 0.17806667,  0.1552133 ,  0.1274826 ,  0.12277888,  0.09554265,
        0.08383711,  0.07246919,  0.06337852,  0.04051374,  0.02652395,
        0.01467492,  0.00051835])

Agora podemos prosseguir e criar o conjunto de validação para ajustar o modelo e testar o desempenho do modelo:

#criando o trem e o conjunto de validação
train = data[:int(0.8*(len(dados)))]
válido = dados[int(0.8*(len(dados))):]

#ajustar o modelo
de statsmodels.tsa.vector_ar.var_model import VAR

modelo = VAR(endog = treinar)
model_fit = model.fit()

# fazer previsões na validação
prediction = model_fit.forecast(model_fit.y, passos = len(válido))

As previsões são na forma de uma matriz, onde cada lista representa as previsões na linha. Vamos transformar isso em um formato mais apresentável.

#conversão de previsões em dataframe
pred = pd.DataFrame(índice = intervalo(0,len(predição)),colunas =[cols])
para j no intervalo(0,13):
    para eu no alcance(0, len(predição)):
       pred.iloc[eu][j] = previsão[eu][j]

#verificar rmse
para eu nas cols:
    imprimir('rmse value for', eu, 'is : ', sqrt(mean_squared_error(pred[eu], válido[eu])))

Saída de código anterior:

valor rmse para CO(GT) é :  1.4200393103392812
valor rmse para PT08.S1(CO) é :  303.3909208229375
valor rmse para NMHC(GT) é :  204.0662895081472
valor rmse para C6H6(GT) é :  28.153391799471244
valor rmse para PT08.S2(NMHC) é :  6.538063846286176
valor rmse para NOx(GT) é :  265.04913993413805
valor rmse para PT08.S3(NOx) é :  250.7673347152554
valor rmse para NO2(GT) é :  238.92642219826683
valor rmse para PT08.S4(NO2) é :  247.50612831072633
valor rmse para PT08.S5(O3) é :  392.3129907890131
valor rmse para T é :  383.1344361254454
valor rmse para RH é :  506.5847387424092
valor rmse para AH é :  8.139735443605728

Após o teste no conjunto de validação, vamos encaixar o modelo no conjunto de dados completo

#fazer previsões finais
modelo = VAR(even = data)
model_fit = model.fit()
yhat = model_fit.forecast(model_fit.y, passos = 1)
imprimir(yhat)

Notas finais

Antes de começar este artigo, a ideia de trabalhar com uma série temporal multivariada parecia assustadora em seu escopo. É um assunto complexo, então tome seu tempo para entender os detalhes. A melhor maneira de aprender é praticar, então espero que a implementação python acima seja útil para você.

Eu recomendo que você use essa abordagem em um conjunto de dados de sua escolha. Isso solidificará ainda mais sua compreensão desse tópico complexo, mas muito útil.. Se você tiver alguma sugestão ou dúvida, compartilhe na seção de comentários.

Assine a nossa newsletter

Nós não enviaremos SPAM para você. Nós odiamos isso tanto quanto você.

Datapeaker