Category

Data Science

Criando relatórios customizados com o pacote {pagedreport}

By | Hackeando o R

Quando se está interessado na montagem de relatórios, o Rmarkdown é a primeira ferramenta que se passa na mente, afinal, ele facilita na construção de apresentações com o R. Apesar disso, há a dificuldade da criação de relatórios com visuais mais elegantes. Para suprir essa demanda, o pacote {pagedreport} facilita o trabalho de customizar PDFs gerados pelo Rmarkdown.  No post de hoje, vamos mostrar um pouco sobre esse pacote.

O pacote, até o momento, possui 3 temas principais, cada um com seu próprio estilo e que também podem ser alterados suas configurações visuais padrão conforme aquela que melhor atende o usuário, sendo possível alterar cores, fontes e imagens. Para utilizar o pacote, primeiro ele deve ser baixado através do Github.

Após a instalação (é recomendado reiniciar o Rstudio), para criar sua primeira apresentação com o {pagedreport}, vá em File > New File > R markdown > From Template. Veja, como na imagem abaixo, que aparecerá três opções ligadas ao {pagedreport} , cada uma representando um tema que melhor agrada. Para prosseguir com a criação, selecione uma opção e clique em Ok.

Ao prosseguirmos, será aberto um arquivo .Rmd com os códigos iguais a imagem abaixo. Veja que se comparar o YAML com documentos Rmarkdown padrão, verá que não há nada de assustador.

 

  • title: título,
  • subtitle: subtítulo
  • author: autor
  • date: data

O que realmente muda é a parte após o output, no qual contém o uso do pacote e suas respectivas configurações.

No caso, vemos algumas opções, além de "setar" o template, em pagedreport::paged_grid:, é configurado a logo, por meio de um link da internet (recomendável, pois dessa forma pode se tornar reprodutível), o knit e a cor principal do PDF.

Outros templates podem vir com configurações a mais ou que podem ser adicionadas, como:

  • front_img: configura a imagem da capa.
  • back_img: altera a imagem da capa do fundo.
  • img_to_dark: TRUE ou FALSE, escure as imagens de capa e fundo.
  • logo_to_white: TRUE ou FALSE, transforma a imagem do logo em branco.
  • secondary_color: altera a cor secundária.

Outras possíveis seções de configuração do YAML condensam as padrões do Rmarkdown.

No final, podemos construir um documento pdf com a seguinte capa personalizada:

_________________________________________

Fizemos aqui uma introdução de como customizar seus relatórios PDFs de forma simples. Caso queira se aprofundar na apresentação de relatórios, conhecer mais sobre Rmarkdown e entender melhor o pacote {pagedreport}, é importante que confira nosso Curso de produção de Relatórios em Rmarkdown.

_________________________________________

 

Modelagem e previsão com o {modeltime}

By | Data Science

O pacote {modeltime} é um framework para modelagem e previsão de séries temporais no R, com a possibilidade de integração com o ecossistema do {tidymodels} para uso de técnicas de machine learning. O pacote promete ser uma interface veloz e moderna que possibilita prever séries temporais em grande escala (i.e. 10+ mil séries).

Utilizando uma interface simples e integrada com outros pacotes populares na linguagem, é possível construir uma ampla gama de modelos de previsão univariados e multivariados, tradicionais ou "modernos", dentre eles:

  • ARIMA
  • Suavização exponencial (ETS)
  • Regressão linear (TSLM)
  • Autoregressão de rede neural (NNETAR)
  • Algoritmo Prophet
  • Support Vector Machines (SVM)
  • Random Forest
  • Boosted trees

Neste exercício, daremos uma breve introdução aplicada exemplificando o fluxo de trabalho do {modeltime} para modelagem e previsão, além de fornecer nossa opinião sobre o mesmo. Para se aprofundar nos detalhes de cada tópico confira os cursos de Séries Temporais e Modelos Preditivos da Análise Macro.

Fluxo de trabalho

O fluxo de trabalho do pacote {modeltime} para criar um modelo de previsão de séries temporais pode ser resumido em 5 etapas:

  1. Colete e prepare os dados no ambiente do R;
  2. Separe amostras de treino/teste para avaliar modelos;
  3. Crie e estime múltiplos modelos de previsão;
  4. Avalie os modelos (resíduos, acurácia no teste, etc.);
  5. Reestime os modelos na amostra completa e gere previsões.

Com esse fluxo em mente, vamos agora realizar um exercício prático e didático: construir um modelo de previsão para a taxa de inflação brasileira, medida pelo IPCA (% a.m.) do IBGE. O objetivo é apenas demonstrar as ferramentas ( {modeltime}) de maneira prática no R, não estamos preocupados em criar o melhor modelo possível e nem em avaliar especificações profundamente. Para tal dê uma olhada nos cursos da Análise Macro.

Para reproduzir o exercício você precisará dos seguintes pacotes de R:


Passo 1: dados

Nesse exercício vamos criar modelos de previsão para o IPCA (% a.m.), portanto começamos por coletar e tratar os dados de maneira online diretamente do Sidra/IBGE (veja um tutorial neste link). Nossa amostra parte de 1999 e vai até o último dado disponível.

Abaixo criamos um gráfico de linha simples da série temporal do IPCA (% a.m.), do qual podemos observar uma flutuação em torno de 0,5% e um padrão sazonal, além de outliers (veja mais sobre análise exploratória neste link):

Passo 2: separar amostras

Com o objetivo de avaliar os modelos que criaremos em termos de acurácia da previsão pontual, vamos criar duas amostras da série temporal do IPCA: a de treino é usada para estimar um modelo especificado e gerar previsões com o mesmo e a de teste é usada para comparar as previsões geradas com os dados observados (verdadeiros). Nesse exercício vamos fazer essa separação em 95% para treino e o restante para teste:

Passo 3: modelagem

Como exemplo, vamos criar dois modelos univariados simples: família (auto) ARIMA e um passeio aleatório como benchmark. No {modeltime} a modelagem é feita em 3 etapas:

  1. Especificar o modelo (usando funções como arima_reg() e outras);
  2. Definir o pacote a ser usado (alguns modelos são implementados em mais de um pacote, e você tem flexibilidade em escolher qual usar com a função set_engine());
  3. Estimar o modelo (usando a função genérica fit(y ~ date, data = df), onde date não é um regressor, é apenas para uso interno do {modeltime}).

Note que, por esse fluxo de trabalho, o {modeltime} traz a vantagem de integrar em um único lugar diversos outros pacotes/modelos (consulte a documentação).

Os modelos ficam salvos como objetos do tipo lista no R e ao imprimi-los temos os principais resultados:

Passo 4: avaliar modelos

Uma vez que os modelos tenham sido estimados, vamos então investigar brevemente suas especificações: focaremos apenas em testar a normalidade e autocorrelação dos resíduos dos modelos estimados e em calcular as métricas MAE e RMSE dos pontos de previsão pseudo fora da amostra (comparando com a amostra de teste).

Para tais tarefas de diagnóstico de modelos o {modeltime} disponibiliza algumas funções úteis:

  • modeltime_table() adiciona um ou mais modelos para criar uma "tabela de modelos";
  • modeltime_calibrate() calcula os resíduos dos modelos;
  • modeltime_residuals_test() aplica testes de normalidade/autocorrelação;
  • modeltime_forecast() gera previsões;
  • plot_modeltime_forecast() visualiza as previsões;
  • modeltime_accuracy() calcula métricas de acurácia.

Vamos começar aplicando os testes de normalidade (Shapiro-Wilk) e autocorrelação (Box-Pierce e Ljung-Box) dos resíduos:

O resultado é uma tabela com os p-valores de cada teste, que indicam que os resíduos do modelo auto ARIMA, ao nível de 5% de significância, não são normalmente distribuídos e não apresentam autocorrelação. Para dados econômicos esses resultados são, em grande parte, comuns, de modo que iremos ignorar aqui o problema de normalidade e seguir adiante.

Agora vamos verificar a performance preditiva dos modelos nesse esquema pseudo fora da amostra. Para tal, primeiro juntamos os modelos em uma tabela de modelos e geramos n previsões fora da amostra, onde n é o número de observações da amostra de teste. Abaixo plotamos o gráfico das previsões geradas:

Pela avaliação visual os modelos estão muito aquém do desejado, mas esse exercício é apenas didático e, conforme mencionado, não estamos interessados em criar um "super" modelo que desempenhe melhor que as expectativas do Focus/BCB.

Em seguida, usamos a tabela de modelos para comparar os pontos de previsões gerados com os valores observados da amostra de teste, computado as métricas MAE e RMSE:

Como esperado, o modelo ARIMA apresenta um RMSE menor em relação ao benchmark, para o horizonte e amostra utilizados. Portanto, se fossemos decidir um modelo final entre os dois, a escolha seria pelo ARIMA. Note que em exercícios mais robustos o mais interessante é que você faça essa avaliação usando validação cruzada por horizontes de previsão (1, 2, 3, ..., meses a frente).

Passo 5: previsão

Com os modelos treinados e avaliados, o último passo é reestimar o(s) modelo(s) usando a amostra completa de dados para gerar previsões (efetivamente) fora da amostra. Use a função modeltime_refit() para tal:

E assim terminamos o fluxo de trabalho para modelagem e previsão com o {modeltime}. O que você achou do pacote?

Comentários

Como qualquer pacote/software, o {modeltime} tem suas vantagens e desvantagens, aqui vou pontuar a minha visão.

  • Principais vantagens:
    • Interface simples para iniciantes;
    • Integra com o {tidymodels};
    • Ecossistema ativo de desenvolvimento.
  • Principais desvantagens:
    • Interface fora do comum dos pacotes econométricos (i.e. fit(y ~ date, data = df));
    • Documentação orientada a negócios/sem background estatístico;
    • Tem cerca de 3x mais dependências (pacotes) do que concorrentes como o {fabletools};
    • A comunidade de usuários é pequena (quando comparado pelo nº de perguntas no StackOverflow).

Em suma, se você é um iniciante o pacote {modeltime} deve ser ótimo para dar os primeiros passos no mundo de séries temporais e modelos de previsão, mas se você perguntar a uma pessoa mais experiente se esse é o pacote que ela prefere, provavelmente a resposta será não. Conforme você avança na área haverá a necessidade de ir além e essa lacuna provavelmente será preenchida por outro pacote. Contudo, se sua intenção não é mergulhar profundamente em séries temporais, basta instalar o pacote para começar usá-lo!

Saiba mais

Caso o assunto tenha despertado sua curiosidade, você pode se aprofundar nos tópicos com os cursos de Séries Temporais e Modelos Preditivos da Análise Macro.

Como exemplo, no curso de Modelos Preditivos utilizamos modelos de machine learning para a previsão do IPCA. Os resultados são sumarizados nessa dashboard (clique para acessar), em uma abordagem automatizada:

Para ter acesso aos códigos completos deste exercício e vários outros, faça parte do Clube AM.

 

 

Juntar data frames no Python

By | Python

Uma dúvida comum para iniciantes e até mesmo intermediários no estudo de Análise de dados é: como juntar diferentes data frames? quais os métodos que são possíveis de utilizar? No post de hoje, pretendemos responder estas dúvidas, mostrando as formas de realizar esse processo utilizando a biblioteca pandas do Python.

Devemos separar alguns pontos antes de entender como juntar data frames no Python.

Juntar dados pode ser realizado de duas formas: junção por meio de linhas (é como colocar um data frame encima do outro, empilhando as linhas) e junção de data frames por meio de dados relacionais, isto é, juntar os data frames que possuem uma coluna "chave" (com os mesmos valores). Usuários da linguagem SQL podem aprender rápido nesse caso, devido as similares dos métodos.

Concatenar

Concatenar permite juntar os data frames por meio das linhas, empilhando um data frame sobre o outro, utilizando os índices como localização. Vejamos o exemplo abaixo. Criamos dois data frames que possuem as mesmas colunas, porém, com valores diferentes.

A função cocat() permite fazer a junção das linhas passando uma lista de data frames como argumento. Como a localização do índice é quem manuseio os lugares, veja que como não havíamos identificado na criação dos data frame a ordem, acaba gerando um índice totalmente desorganizado, com valores 0,1,2,3,0,1,2,3.

Para evitar esse problema, utiliza-se o argumento  ignore_index = True. Veja a diferença abaixo.

Juntar os dados

Para juntar os dados de forma relacional, podemos utilizar as funções merge() e join().

Veja o exemplo abaixo, construímos dois data frames possuindo dados diferentes, porém, com uma coluna "key" (chave) idênticas para que seja possível juntar os data frames.

Por meio da função merge(), inserimos os dois data frames como argumento, e especificamos qual a coluna que irá ser a chave por meio do argumento on = "key".

E se as colunas chave não forem totalmente idênticas? Podemos especificar se queremos juntar com o argumento how =  . Entre as 3 mais comuns: left permite juntar com base na chave do data frame da "esquerda" (a primeira utilizada no argumento da função); right permite juntar com base na chave do data frame da "direita"; inner permite juntar com base na chave comum, retirando todos os possíveis NAs.

Vejamos o exemplo abaixo, com a função merge(), especificamos que os data frames abaixo (que possuem chaves diferentes) se juntem pela chave do data frame da direita (right1).

Repetimos o processo novamente, entretanto, especificando o data frame da esquerda com how = "left". Veja a diferença do resultado.

E se ao invés de colunas, quisermos juntar por meio dos valores do índices do data frame? Isto é, o índice como chave.

De forma simples e rápida, utiliza-se join(), que aplica como um método do data frame e utiliza o outro data frame como argumento. Veja que a escolha de left ou right é automática para left.

Apesar de automático, podemos ainda alterar a forma de junção por meio do argumento how = .

Com a função merge() também podemos especificar que queremos juntar com o índice como chave. Para isso, devemos identificar os argumentos right_index e left_index igual a True.

Por fim, podemos resolver um problema com dados reais. Abaixo importamos dados de preços da ação ITUB4 e da Ibovespa e data frames separados. Queremos juntar os dois data frames. Como fazemos isso?

No caso, ambos data frames possuem o índice em comum, que neste caso, possuem os valores da data, referentes ao dia de cada preço da ação. Escolhemos juntar por meio a função merge(), identificando os índices com left_index e right_index e a forma de junção como "inner".

Ainda existem muitas ferramentas que podem auxiliar neste processo de junção de dados no Python, mas espero que essa introdução seja suficiente para aqueles que possuem dúvidas.

Quer saber mais?

Veja nossos cursos de R e Python aplicados para a Análise de Dados e Economia

___________________

Referências

Pandas User Guide: Merge, join, concatenate and compare.

Modelos ARIMA na abordagem bayesiana

By | Data Science

A boa e velha econometria nos proporciona métodos que são ótimos para relacionar variáveis e construir previsões, sendo quase sempre o primeiro ponto de partida para praticantes, além de ser a base de grande parte dos modelos "famosos" da atualidade. Como exemplo, em problemas de previsão de séries temporais a família de modelos ARIMA, popularizada por Box e Jenkins (1970), costuma ser a primeira opção que vem à mente.

Uma das suposições destes modelos é a de que os erros — ou seja, a diferença entre o que é observado e o que é estimado — seguem uma distribuição normal, o que no mundo real nem sempre é factível com os dados que temos em mãos. E então, o que fazer nessa situação? Devemos descartar os modelos ARIMA e usar outra classe de modelos? Ou devemos descartar os dados, pois, claramente, "eles não se encaixam no modelo"?

Bom, nada disso! Em primeiro lugar, eu afirmaria que os modelos ARIMA ainda podem ser úteis. Em segundo lugar, neste exercício apresentarei uma visão diferente no que se refere ao método de estimação do modelo, trazendo uma breve introdução à abordagem bayesiana. Por fim, exemplificarei com um modelo ARIMA simples as diferenças entre previsões geradas pelas duas visões, isto é, a frequentista versus a bayesiana.

O foco aqui é ser objetivo, apresentando brevemente os conceitos básicos, as vantagens e diferenças entre as abordagens, em uma tentativa bem humilde de fechar o gap entre as duas visões em termos introdutórios. Para mais detalhes e aprofundamento nos tópicos confira os cursos de Séries Temporais e Estatística Bayesiana.

ARIMA

Para não complicar, vamos considerar um modelo autoregressivo (AR) simples neste exercício. Como este modelo se parece?

yt = c + ϕ1yt-1 + ϕ2 yt-2 + + ϕpyt-p + εt

onde:

c → uma constante;

ϕ1, ⋯, ϕp → parâmetros desconhecidos do modelo;

εt → termo de erro que segue uma distribuição normal, εt N(μ, σ2).

O modelo é autoregressivo pois, como pode ser observado, se trata de uma regressão da variável contra ela mesma (defasagens). Esse modelo é comumente denominado com o acrônimo AR(p), onde p é a ordem de defasagens da variável de interesse yt e é um caso especial de um modelo ARIMA(p, 0, 0)1.

Ok, mas visualmente, como um processo AR(p) se parece?

Podemos visualizar uma série temporal que segue um processo, por exemplo, de AR(1) com uma simulação simples (estou usando o R para isso), conforme abaixo:

Estimador MQO

Você deve ter notado que valores para a constante e para o primeiro parâmetro do AR(1)e ϕ1 , "caíram do céu". Na vida real, fora da simulação, devemos estimar esses valores, eles são desconhecidos. Portanto, como os parâmetros do modelo são estimados?

Existem algumas maneiras de estimar os parâmetros do modelo, o padrão comum é através do estimador de mínimos quadrados ordinários (MQO), onde o objetivo é encontrar valores ótimos para os parâmetros e ϕp do modelo minimizando a soma dos quadrados dos resíduos, sob diversas premissas. Ao usar essa abordagem, os parâmetros do modelo autoregressivo são fixos: cada observação t da série temporal y é associada com um mesmo valor estimado do parâmetro ϕp.

Isso é factível? E se você acredita que o valor ϕp não deveria ser fixo? Como poderíamos incorporar essa crença ao modelo? É aqui que entra a abordagem bayesiana! Mas antes, vamos dar uma olhada em dados reais para tentar entender a importância e uma motivação adjacente do assunto.

Exemplo: IPCA

Como exemplo, abaixo apresento visualizações gráficas da série do IPCA sazonalmente ajustado, uma medida de inflação divulgada pelo IBGE, expresso em variação % ao mês.

Note que pela distribuição dos dados o IPCA apresenta uma média de aproximadamente 0,5% com uma cauda pesada à direita. Isso é característico do que chamam de outliers ou valores extremos e pode ser um problema em métodos econométricos. Além disso, a série apresenta uma autocorrelação significativa na primeira defasagem, o que pode ser um sinal para modelagem ARIMA, se supormos que tal classe de modelos univariados é suficiente em explicar a inflação.

Dada essa simples inspeção visual dos dados o que frequentistas e bayesianos poderiam tirar de conclusão? Um frequentista diria, dentre outras coisas, que a variância da série é a mesma para qualquer janela amostral, enquanto que um bayesiano diria que a variância pode variar.

Nessa mesma linha, um frequentista poderia estimar um modelo autoregressivo por MQO para explicar a inflação, mas ao fazê-lo estaria encontrando um valor fixo associado a defasagens da inflação, o que é equivalente a dizer que a maldita inércia inflacionária — um fenômeno econômico — não se alterou em todos esses mais de 20 anos de Plano Real. Isso é plausível? Certamente não é uma pergunta trivial de ser respondida, mas exercícios prévios do colega Vitor Wilher sugerem que a inércia inflacionária vem mudando recentemente.

Ou seja, são nesses pontos, para citar apenas alguns, que as abordagens divergem. Em outras palavras, frequentistas e bayesianos fazem diferentes suposições sobre os dados e sobre os parâmetros de um modelo em questão.

Portanto, voltando à questão, como a modelagem bayesiana incorpora sua visão sobre os parâmetros ao modelo?

A abordagem bayesiana

Na abordagem bayesiana, ao invés de tentarmos encontrar um valor ótimo para os parâmetros do modelo, nesse caso um AR(p), começaríamos por assumir um distribuição de probabilidade a priori para os mesmos e, então, usaríamos o teorema de Bayes. Ou seja, em nosso exemplo o que muda é que você assume uma distribuição a priori para os valores desconhecidos de c, ϕ1,,ϕp, σ2, antes mesmo dos dados serem observados.

Mas de onde essa distribuição a priori vem? Bom, há muito o que se discutir sobre esse ponto, mas em resumo:

  • Estudos prévios ou trabalhos publicados;
  • Intuição do analista/pesquisador;
  • Conhecimento da área/expertise;
  • Conveniência;
  • Métodos não paramétricos e outras fontes de dados.

Você pode pensar nessa distribuição a priori como uma crença/conhecimento prévio ou, no caso de você possuir estimativas prévias dos parâmetros do modelo, essas estimativas prévias se tornam a distribuição a priori.

Voltando ao exemplo do IPCA, supondo que queiramos estimar um modelo AR(1), yt = c + ϕ1yt-1 + εt, como definiríamos distribuições a priori para os parâmetros? Vamos começar admitindo que não sabemos muito sobre os parâmetros, apenas sabemos que para um AR(1) ser estacionário o parâmetro ϕ1 precisar ser menor do que 1 em módulo2, então vamos assumir distribuições genéricas:

Como é um primeiro modelo, vamos ser bem vagos sobre as escolhas. Partindo de um entendimento básico sobre o modelo, sabemos que o parâmetro  para caracterizar um processo estacionário e que a variância dos erros deve ser positiva. Dessa forma utilizaremos, respectivamente, a distribuição uniforme e a gamma inversa e, quando não, a normal, assumindo os valores abaixo:

Essas são as nossas priors, como é referido no jargão bayesiano. Visualmente, como essas distribuições se parecem? Vamos plotar um gráfico (novamente, estou usando o R aqui):

A interpretação destas distribuições a priori é de que não estamos informando em nosso modelo AR(1) bayesiano sobre quais poderiam ser os valores dos parâmetros. A estimativa final, pelo teorema de Bayes, dependerá dos dados observados e das priors assumidas. Vamos definir isso brevemente:

O que essa equação nos diz, em termos simples? A priori é a probabilidade de algo acontecer antes de incluirmos a probabilidade dos dados (verossimilhança), e a posteriori é a probabilidade após a incorporação dos dados. Ou seja, o teorema de Bayes nos fornece um método para atualizar nossa crença sobre parâmetros desconhecidos para cada informação nova (observações), condicionando a probabilidade aos dados observados.

Para estimar um modelo AR(p) na abordagem bayesiana será utilizado, geralmente, um método chamado Monte Carlo Markov Chain (MCMC). Apesar do nome apavorante, é um procedimento relativamente simples. O objetivo é "caminhar" aleatoriamente por um espaço de parâmetros para encontrar as estimativas e, assim, desenhar uma estimativa da posteriori, a nossa distribuição de principal interesse.

Comparação

Agora vamos comparar as estimativas de um modelo AR(1) para o IPCA geradas pela visão frequentista vs. bayesiana3. Indo direto ao ponto, abaixo plotamos os resultados:

Aqui eu omito a distribuição a posteriori, que representaria a incerteza da estimativa bayesiana, exibindo apenas a a estimativa média dessa distribuição.

Note que as estimativas pontuais dentro da amostra são praticamente idênticas (eu separei em dois gráficos para melhor visualizar cada linha), refletindo semelhanças nos parâmetros estimados da abordagem bayesiana e da frequentista. O valor estimado para a constante é aproximadamente 0,20 e 0,19, respectivamente, enquanto que o é 0,6 e 0,6. Por quê? A razão é decorrente do fato que a estimativa pontual do método frequentista, por MQO, é, em verdade, a mesma coisa que maximizar a probabilidade a posteriori de uma regressão linear bayesiana, que no caso representa a moda da distribuição.

Ok, mas comparamos somente estimativas pontuais um passo a frente dentro da amostra. O que acontece se compararmos ambas as abordagens em termos de previsão fora da amostra? No gráfico acima as últimas 12 observações do IPCA foram omitidas dos modelos, justamente para ter um período pseudo fora da amostra que nos permita gerar previsões e compará-las com os dados observados, podendo dessa forma avaliar a performance preditiva de cada modelo para dados que os mesmos ainda não conhecem.

Gerando previsões pseudo fora da amostra 12 períodos (meses) a frente, temos os seguintes resultados:

Comentários

Apesar de ambas as previsões serem visivelmente ruins — acredito eu que não devido ao método de estimação em si, mas sim por conta da especificação/modelo simples para os dados e pela janela amostral (choques) "desfavorável" —, podemos notar uma grande diferença nas previsões pontuais e nos intervalos. A abordagem frequentista simplesmente previu o retorno a média da série (o que nesse caso é menos pior), enquanto que a abordagem bayesiana previu uma deflação (o que não é a realidade brasileira no momento).

Pela simplicidade da especificação do modelo AR em questão não podemos esperar bons resultados, por qualquer método de estimação considerado, e uma comparação mais exigente e justa implementaria a técnica de validação cruzada, o que eu não fiz neste exercício. Além disso, questões adjacentes como a inspeção dos resíduos e dos parâmetros são importantes para diagnosticar o modelo, as quais também deixamos de lado aqui.

Em suma, estimamos um modelo AR(1) para o IPCA por dois métodos diferentes que fundamentalmente fazem a mesma coisa: eles usam a defasagem da inflação para explicá-la. A primeira abordagem foi um modelo autoregressivo clássico, usando o método dos mínimos quadrados ordinários (MQO). O segundo foi um mesmo modelo autoregressivo, mas com estimação bayesiana, explorando a ideia de usar distribuições a priori para obter estimativas pontuais de distribuições a posteriori. Apesar disso, os resultados não foram satisfatórios. Ou seja, há trabalho ainda a se fazer, além de outros modelos a se testar.

Se o assunto te interessou e se você quiser saber mais sobre os temas abordados, dê uma olhada nos cursos de Séries Temporais e Estatística Bayesiana. Para ter acesso aos códigos deste exercício faça parte do Clube AM.

 


1,2 Veja mais em Hyndman e Athanasopoulos (2021).

3 Aqui eu relaxei a restrição de distribuição uniforme para o parâmetro  por recomendação dos desenvolvedores do pacote utilizado e por falha de inicialização da estimação. A priori desse parâmetro passou então para .

 

Referências

Box, G. E. P., & Jenkins, G. M. (1970). Time series analysis: Forecasting and control. Holden-Day.

Durbin, J., & Koopman, S. J. (2012). Time series analysis by state space methods (Vol. 38). OUP Oxford.

Hyndman, R.J., & Athanasopoulos, G. (2021) Forecasting: principles and practice, 3rd edition, OTexts: Melbourne, Australia. OTexts.com/fpp3. Accessed on 2022-07-20.

Você sabe o que é Data Wrangling?

By | Hackeando o R

Data wrangling é o processo de transformar e manipular dados em formatos "crus" para outro formato com a intenção de entregar as informações contidas no dados em informação útil, sendo o processo necessário para a construção de gráficos, estatísticas descritivas e também para a modelagem. O objetivo do processo é assegurar a qualidade e a usabilidade dos dados.  Neste post, apresentaremos os principais métodos e funções de Data Wrangling com a linguagem.

Existem funções que facilitam o processo de data wrangling, permitindo que a partir de um data frame, o usuário o transforme em um formato útil. As principais funções estão contidas no pacote dplyr, também chamadas de verbs. Alguns verbs uteis são:

  • filter() - permite que seja filtrado as linhas/observações de um data frame de acordo com uma condição;
  • summarize() - sumariza uma ou mais colunas/variáveis,  permitindo calcular uma estatísticas por meio de grupos;
  • group_by() - agrupa as linhas de acordo com um mesmo grupo/categorias. É utilizado em conjunto com summarize() de forma que seja possível calcular as estatísticas de um grupo separadamente;
  • mutate() - utiliza colunas existentes do data frame para criar novas colunas;
  • arrange() - permite ordenar as linhas em ordem ascendente ou descendente;
  • recode() -  permite alterar o nome das observações de uma coluna;
  • select() - seleciona as colunas especificadas (também permite alterar seus nomes).

Veja que os verbs são fáceis de lembrar por conta de que seus nomes remetem ao seu verdadeiro proposito. Há também a similaridade do nomes dos verbs com as funções da linguagem SQL.

Uma questão importante da utilização dos verbs são os operadores pipes (%>% ou |>). Estes operadores permite "acorrentar" o uso das funções e seus resultados, de forma que facilite o uso do código, bem como a leitura. O pipe é colocado a frente da linha do código de um determinada função e em seguida, "coloca" o resultado do código da linha no primeiro argumento da função da segunda linha. Veremos adiante nos exemplos melhor como funciona o pipe.

Para mostrar o uso destas funções, utilizaremos como exemplo os dados de mercado de trabalho do Brasil, coletando-os através do Sidra. O propósito será mostrar que a partir de um data frame importado em formato "cru" e "sujo", podemos utilizar as funções citadas para realizar a sua transformação.

Abaixo, os dois pacotes que iremos utilizar: {sidrar} para coletar os dados e {dplyr} para o data Data wrangling.

No código abaixo, importados os dados para demonstração. Não há necessidade de entender esse processo, apenas o resultado do data frame na imagem. Veja que o data frame está "sujo", com os tipos de dados reconhecidos de forma errada, colunas desnecessárias, observações com pouca informação útil.

Para começar o processo de Data wrangling, iniciamos com a função select(), selecionando apenas as colunas de interesse, e de quebra, alterando os nomes das colunas para um mais simplificado. Veja a utilização do pipe (|>). O seu propósito nesse pedaço de código foi colocar o objeto "raw_ocupados_desocupados" dentro do primeiro argumento da função select(). Também é utilizado para colocar o resultado da função select() dentro da função as_tibble(), este alterando a classe do objeto para tibble.

Em seguida, iremos alterar o tipo do dado da coluna date, uma vez que o R não a reconheceu adequadamente, e utilizar a função recode() para alterar as observações da coluna variable.  Para realizar estas alterações, utilizamos a função mutate(), renomeando as colunas para o seu mesmo nome (para não criar um nova coluna com formato diferente). Para alterar o tipo da coluna date, utilizamos a função ym() do pacote {lubridate}. Também dividimos o valor da coluna value por 1000.

Para alterar as linhas do data frama dada certa condição, utilizamos a função filter(). No caso, queremos apenas dados após a data de 01-01-2015. Utilizamos o operador > para dizer que queremos valores maiores que a data citada.

Por fim, podemos calcular a média de cada ano de acordo com cada categoria do data frame. Para isso, agrupados os dados com group_by. Veja que o agrupamento é feito transformando as data mensais em ano com a função year do pacote {lubridate} e identificando a coluna variable. Em seguida, a função summarize permite calcular a média da coluna value para esses linhas agrupadas.

O resultado pode ser visto abaixo, utilizando o pacote ggplot2 para criar um gráfico de forma a verificar o aumento dos valores ao longos dos anos.

______________________

Quer saber mais?

Veja nossos cursos de R e Python aplicados para a Análise de Dados e Economia

Receba diretamente em seu e-mail gratuitamente nossas promoções especiais
e conteúdos exclusivos sobre Análise de Dados!

Assinar Gratuitamente