Coleta de dados de mercado de trabalho com o Python

By | Indicadores

Para realizar uma análise de conjuntura completa, é crucial dominar a habilidade de coletar dados sobre o Mercado de Trabalho. Esse processo pode ser facilitado utilizando o Python, sendo possível importar os dados direto do SIDRA. No post de hoje, mostraremos como é possível realizar essa coleta de forma reprodutível e automática.

Antes de tudo, é necessário escolher as tabelas do SIDRA dos indicadores que se deseja analisar. Aqui buscaremos a tabela 6318, que diz respeito a " Pessoas de 14+ anos (Mil pessoas): ocupados/desocupados na Força de trabalho". Existem diversas outras tabelas interessantes que entregam informações preciosíssimas sobre o Mercado de Trabalho, e que podem ser coletadas utilizando o mesmo método aqui praticado.

Para coletar os dados do SIDRA utilizaremos a biblioteca {sidrapy}, que através dos códigos dos parâmetros oferecidos pela API da plataforma, permite importar os dados para o Python.

Pessoas de 14+ anos (Mil pessoas): ocupados/desocupados na Força de trabalho: "/t/6318/n1/all/v/1641/p/all/c629/all"

Realizamos essa busca na seguinte URL:  https://sidra.ibge.gov.br/tabela/6318, escolhendo os parâmetros de interesse na plataforma e buscando a API em "Links para Compartilhar" no final da página.

Com isso, construímos o código no Python.

Quer saber mais?

Veja nossos cursos de Macroeconomia através da nossa trilha de Macroeconomia Aplicada.

Validação Cruzada de Séries Temporais

By | Data Science

Quando estimamos um modelo para previsão de séries temporais precisamos avaliar sua performance preditiva. Separar os dados em uma amostra de treino e outra de teste é a forma mais simples de verificar como o modelo performa em dados pseudo fora da amostra, através do cálculo do erro de previsão. Entretanto, a escolha das amostras é arbitrária, o que traz a tona um método mais sofisticado: a validação cruzada. Neste exercício abriremos a caixa preta por trás do assunto mostrando como implementar a técnica no R.

Neste método há uma série de amostras de teste, cada uma consistindo em h observações, ou seja, são os períodos usados para gerar previsões a partir do modelo. A amostra de treino correspondente, usada para estimação do modelo, consiste apenas de observações que ocorreram antes das observações que formam a amostra de teste. Assim, nenhuma observação futura pode ser usada na construção da previsão.

O diagrama a seguir ilustra um esquema de validação cruzada de séries temporais, com uma série de amostras de treino e de teste, para quando se deseja avaliar a performance preditiva do modelo em h = 1 períodos à frente, onde as observações azuis formam as amostras de treino e as observações laranja formam as amostras de teste.

Fonte: Hyndman e Athanasopoulos (2021).

Operacionalização

Dado esse esquema de separação de uma série de amostras de treino e de teste de uma série temporal, o método de validação cruzada pode ser resumido como um procedimento recursivo:

  1. Para cada amostra de treino estime o modelo;
  2. Utilize o modelo estimado para gerar previsões h períodos à frente;
  3. Calcule o erro de previsão com a amostra de teste e a saída da etapa 2.

Ao final, obtém-se a métrica de acurácia (ME, RMSE, MAE, etc.) do modelo pela média de cada iteração.

Esse método é relativamente simples, mas bastante útil para validar a performance de modelos independentemente da amostra de treino/teste escolhida, trazendo uma "visão global" do modelo. A validação cruzada é largamente utilizada por praticantes de machine learning, além de ser uma prática comum em papers que tratam de previsão de séries temporais. Vale pontuar que existem variações do método, que deixaremos para explorar em uma outra oportunidade.

Implementação no R

Mostraremos duas formas de implementar validação cruzada de séries temporais no R:

  1. Através da família de pacotes {tidyverts};
  2. Abrindo a caixa preta e escrevendo o código manualmente.

Em ambos os casos utilizaremos modelos univariados simples, apenas para demonstrar o método, aplicados ao principal índice de preços da economia brasileira, o IPCA, com a finalidade de avaliar as previsões 12 períodos à frente. A primeira amostra de validação cruzada conterá 180 observações e será acrescentado 1 observação sucessivamente até o total de observações excluindo as últimas 12.

Antes de começar você deve ter disponível os seguintes pacotes no seu ambiente de R:

O código abaixo prepara os dados de exemplo. Para saber mais sobre coleta de dados macroeconômicos confira este post no blog da Análise Macro.

Exemplo com {tidyverts}

O primeiro exemplo de implementação de validação cruzada utilizará os pacotes da família {tidyverts}, que é um ótimo framework para trabalhar com séries temporais no R (confira este post sobre o assunto). Sendo assim, o primeiro passo que precisamos fazer é criar as amostras de treino de validação cruzada (observações azuis na ilustração). Isso pode ser feito conforme abaixo (note que removemos as últimas 12 observações, para poder calcular o erro de previsão da última amostra corretamente):

Agora temos uma série de amostras, partindo de 180 observações e acrescentando 1 sucessivamente, que utilizaremos para estimar os modelos de exemplo e gerar previsões. Isso é feito conforme o código abaixo. Note que criamos uma coluna para salvar a informação do horizonte temporal da previsão (isso é opcional, sendo útil apenas quando você quer analisar a acurácia por horizonte preditivo).

Por fim, podemos calcular as métricas de acurácia média considerando todas as amostras e previsões geradas, conforme abaixo:

Como resultado podemos gerar a visualização abaixo, onde é possível analisar os modelos em termos de acurácia (RMSE) por horizonte preditivo:

Exemplo manual

Conforme visto, os procedimentos adotados para implementar o método de validação cruzada de séries temporais são extremamente simples utilizando os pacotes do {tidyverts}. Entretanto, nem sempre teremos à disposição, dentro deste ou outros frameworks, todos os modelos de interesse para implementação rápida através de um pacote. Na vida real, é comum que surjam novos modelos ou que os pacotes implementem e disponibilizem apenas uma parcela do que existe por aí. Nestes casos, será seu trabalho escrever um código que implemente a validação cruzada com tal modelo.

Para exemplificar, abaixo escrevo uma função que implementa o esquema de validação cruzada de forma semelhante ao que acabamos de ver. O modelo utilizado é, por conveniência, o ARIMA automatizado e a definições de amostras são idênticas ao exemplo anterior. Note que o código fica significativamente mais complexo, principalmente para iniciantes, mas é um destino natural de todo profissional que deseje se aventurar por estes caminhos.

A função implementa o que foi destacado previamente, referente ao método recursivo da validação cruzada, retornando uma lista com uma tabela do RMSE por horizonte preditivo e outra com as previsões geradas a cada iteração. Fique à vontade para adaptar ou melhorar a função conforme suas necessidades.

Com a função criada, basta utilizá-la junto aos dados para obter os resultados:

Por fim, plotamos os resultados desta abordagem manual com a abordagem anterior. Note que o RMSE calculado difere levemente. Não investiguei o motivo, mas acredito que seja decorrente de alguma parametrização diferente entre o algoritmo de forecast::auto.arima() e fable::ARIMA().

Saiba mais

Este exercício simples é um ponto de partida para você começar a implementar a validação cruzada em seus modelos de previsão de séries temporais. Caso deseje se aprofundar, confira o curso de Modelos Preditivos da Análise Macro, onde implementamos diversos modelos para séries temporais da economia brasileira.

Referências
Hyndman, R.J., & Athanasopoulos, G. (2021) Forecasting: principles and practice, 3rd edition, OTexts: Melbourne, Australia. OTexts.com/fpp3. Accessed on <2022-05-12>.

Modelos SARIMA

By | Comentário de Conjuntura

Modelos SARIMA são modelos da classe de modelos univariados de séries temporais. O acrônimo SARIMA significa modelos AutoRegressivos Integrados de Médias Móveis com Sazonalidade. São modelos bastante úteis para gerar previsão de séries temporais quando, em geral, não estão disponíveis variáveis preditoras. O aspecto mais interessante desse tipo de abordagem é justamente colocar a parte sazonal da série dentro do modelo.

Um processo autorregressivo de ordem p pode ser representado como

(1)   \begin{equation*} y_{t} = \beta_{0} + \beta_{1}y_{t-1} + \beta_{2}y_{t-2} + ... + \beta_{p}y_{t-p} + \varepsilon_{t} \end{equation*}

Ou, alternativamente, utilizando o operador defasagem L^{k}y_{t} = y_{t-k} como

(2)   \begin{equation*} (1-\beta_{1}L - \beta_{2}L^2 - ... \beta_{p}L^p)y_{t} = \beta_{0} + \varepsilon_{t} \end{equation*}

Ou ainda em notação polinomial

(3)   \begin{equation*} \beta_{p}(L)y_{t} = c + \varepsilon_{t}  \end{equation*}

Onde c=\beta_{0}.  Abaixo simulamos alguns processos autorregressivos de ordem 1 no R, com diferentes valores para \beta_{1}.

Considerando, assim, um processo AR(1), como

(4)   \begin{equation*} y_{t} = c + \beta_{1}y_{t-1} + \varepsilon_{t} \end{equation*}

teremos um \emph{ruído branco} quando \beta_{1} = 0, um \emph{passeio aleatório} quando \beta_{1} = 1 e c=0 ou, quando c \neq 0, um \emph{passeio aleatório com drift}. Analogamente, podemos representar um processo de média móvel MA(q) como

(5)   \begin{equation*} y_{t} = \mu + \varepsilon_{t} + \theta_{1}\varepsilon_{t-1} + ... + \theta_{q}\varepsilon_{t-q}  \end{equation*}

Ou, alternativamente, utilizando o operador defasagem, como

(6)   \begin{equation*} y_{t} = \mu + (1 + \theta_{1}L + \theta_{2}L^2 + ... \theta_{q}L^q)\varepsilon_{t}  \end{equation*}

Ou ainda em notação polinomial

(7)   \begin{equation*} y_{t} = \mu + \theta_{q}(L)\varepsilon_{t}  \end{equation*}

Utilizando o mesmo código acima, a propósito, podemos gerar alguns processos MA(1), modificando apenas o valor de \theta_{1}. Ademais, como vimos, podemos combinar as equações 1 e 5, construindo assim um processo ARMA(p,q), que pode ser representado como

(8)   \begin{equation*} y_{t} = c + \beta_{1}y_{t-1} + \beta_{2}y_{t-2} + ... + \beta_{p}y_{t-p} + \varepsilon_{t} + \theta_{1}\varepsilon_{t-1} + ... + \theta_{q}\varepsilon_{t-q}  \end{equation*}

Onde, novamente, c=\beta_{0}. Alternativamente, utilizando o operador defasagem

(9)   \begin{equation*} (1-\beta_{1}L - \beta_{2}L^2 - ... \beta_{p}L^p)y_{t} = c + (1 + \theta_{1}L + \theta_{2}L^2 + ... \theta_{q}L^q)\varepsilon_{t}  \end{equation*}

Ou ainda, em notação polinomial

(10)   \begin{equation*} \beta_{p}(L)y_{t} = c + \theta_{q}(L)\varepsilon_{t}  \end{equation*}

Podemos, enfim, generalizar nossa análise para um modelo ARIMA(p,d,q), onde d será a ordem de integração do processo. Ele pode ser representado em termos de notação polinomial como

(11)   \begin{equation*} \beta_{p}(L)(1 - L)^{d} y_{t} = c + \theta_{q}(L)\varepsilon_{t}  \end{equation*}

A equação 11 faz referência aos modelos ARIMA não sazonais. Os modelos ARIMA também são capazes de modelar uma ampla gama de dados sazonais. Um modelo ARIMA sazonal é formado pela inclusão de termos sazonais adicionais, na forma ARIMA (p,d,q) (P,D,Q)_m, onde o segundo componente faz referência à parte sazonal e m significa o número de períodos por estação. Em termos formais,

(12)   \begin{equation*} \phi_{P}(L^s) \beta_{p}(L) (1 - L^s)^D (1 - L)^{d} y_{t} = c + \theta_{q}(L) \Theta_{Q} (L^s) \varepsilon_{t}  \end{equation*}

_______________________________

(*) Para aprender mais, conheça nosso Curso de Análise de Séries Temporais.

O que é Análise Exploratória de Dados?

By | Hackeando o R

Nunca saberemos o que dizem os dados se nunca os analisarmos, este é o princípio da Análise Exploratória de Dados. A AED potencializa a pesquisa com dados, permitindo que analistas consigam entender o que de fato o conjunto de dados descreve. No post de hoje, introduzimos o conceito de AED e demonstramos um exemplo com o R.

O que é AED?

Como dito, a AED é um conjunto de métodos que o analista utiliza para descrever um determinado conjunto de dados, permitindo compreender o comportamento de diversas variáveis. Permite também solidificar uma base para criar hipóteses e modelos preditivos/causais.

Apesar de crucial, a AED causa dificuldades naqueles que querem entrar no mundo dos dados, e o motivo é simples: cada conjunto de dados se comporta de uma forma, portanto, apesar de uma metodologia, cada "ferramenta" da metodologia se encaixa melhor em determinado dataset, enquanto em outros não, portanto, saber diferenciar quais "ferramentas" devem ser utilizadas é parte de um conhecimento analítico e crítico.

Mas afinal, qual metodologia é essa ? De quais formas podemos "entrevistar" nossos dados e retirar insights? Os meios mais importantes são:

  • Classificar as variáveis em categóricas ou quantitativas;
  • Sumarizar os dados utilizando estatísticas descritivas;
  • Visualizar os dados utilizando gráficos.

Como dito, cada um desse processo pode haver inúmeras ferramentas, cada qual se encaixa melhor para um conjunto de dados em específico. Iremos realizar um exercício tomando como base o dataset peguins do pacote {palmerpenguins}, que possui dados de medidas dos corpos de pinguins, por espécies, por sexo e por ilha em Palmer Station na Antárctica.  Explicaremos como podemos ler o dataset, bem como cada qual ferramenta podemos utilizar inserido no contexto de cada processo acima.

Antes de começar a AED, precisamos olhar nosso conjunto de dados e assegurar que eles devem ter os seguintes requisitos: deve seguir uma forma retangular/tabular de colunas e linhas; cada linha deve representar uma observação; cada coluna representa uma variável. Abaixo, carregamos o pacote e vemos como é o dataset penguins.

Veja que o dataset segue uma forma retangular com colunas e linhas, o que facilita o uso da linguagem e de outro softwares para realizar uma análise dos dados. Como dito, chamamos a colunas de variáveis e linhas de observações, e qual o significado disto?

Observações remetem uma única observação do dataset e suas características, desde indivíduos, tempo, país e no caso do dataset acima, uma amostra sobre as informações de pinguins em Palmer Station, com um total de 334 linhas.

As características destes pinguins são representadas pelas colunas, chamadas de variáveis. Ocorre uma variação de cada observação ao longo das linhas, portanto, as variáveis provêm informações preciosas sobre algo. Há 8 variáveis no dataset penguins.

Cada variável possui um tipo diferente, e que para cada tipo existe uma ferramenta adequada para a análise. A classificação destas variáveis é realizada de forma relativamente arbitrária, com um certo padrão na escolha destes tipos. Elas podem ser:

  • Categóricas: Assume valores que dizem respeito sobre a qualidade ou característica de cada observação.  Os valores são não numéricos, como strings (caracteres) ou lógicos. É subdividido em binário, nominal e ordinal.
    • Binário: Assume apenas dois valores, normalmente como sim ou não; True ou False; 0 ou 1 ou qualquer outra característica de dois valores;
    • Nominal: Valores qualitativos que assumem mais de dois valores, como país, nome, espécie do pinguim, etc.
    • Ordinal: Valores qualitativos que assumem mais de dois valores e também possuem uma ordem intrínseca, como pequeno, médio, grande, dias da semana e etc.
  • Quantitativas: variáveis quantitativas são valores numéricos que dizem respeito a grandeza de uma variável. Assumem valores contínuos ou discretos.
    • Contínuo: em teoria, assumem uma distância não padrão entre uma observação e outra, bem como essa distância pode ser um número infinito de possíveis valores.
    • Discreto: assumem apenas valores fixos entre duas observações.

Classificação de variáveis

Vemos no dataset qual variável se encaixa melhor em cada classificação, remetemos novamente ao quadro anterior, e utilizamos a função glimpse() para entender como o R reconhece as variáveis. Veja que não é difícil tirar conclusões sobre.

  1. species (fct) - categóricos - nominal: Espécie do pinguim
  2. island (fct) - categórico - nominal: Ilha do pinguim
  3. bill_length_mm (double) - quantitativo - continuo: comprimento do cúlmen
  4. bill_depth_mm (double)  - quantitativo - continuo: profundidade do cúlmen
  5. flipper_length_mm - (integer) - quantitativo  - contínuo: comprimento da nadadeira
  6. body_mass_g (integer) - quantitativo - contínuo: massa corporal
  7. sex (fct) - categórico - binário: Sexo do Pinguim
  8. year (integer) - categórico - ordinal:  Ano

Explorando: variáveis categóricas

Antes de explorar os dados, devemos primeiro realizar uma pergunta a nós mesmos: o que eu quero analisar? De fato, podemos simplesmente realizar visualizações e construir estatísticas descritivas com todas as variáveis, mas antes, realizar a definição de uma pergunta sobre o que analisar facilita a direção do trabalho.

Com isso, podemos realizar a pergunta: Qual a distribuição de pinguins por espécies em cada ilha? E o sexo? Podemos explorar as variáveis categóricas a fim de obter as respostas.

As variáveis categóricas devem ser exploradas em formato de contagem, afinal, como não são numéricas não podemos utilizar de medidas estatísticas diretamente. Utilizamos a função count() do pacote {dplyr} para realizar o cálculo.

Em poucas linhas obtivemos os resultado das perguntas criadas acima. O interessante do count() é que é também útil para alegar um problema constante na AED: valores faltantes no dataset.  Não iremos lidar diretamente com este problema aqui, porém, tomaremos cuidado com eles na análise.

Outro método mais amigável para investigar variáveis categóricas é através da visualização. Utilizaremos o pacote ggplot2 para gerar um gráfico de barras, que é uma das melhores ferramentas para averiguar a distribuição dos dados categóricos.



Interessante, não? Podemos partir para como lidar com as variáveis quantitativas.

Explorando variáveis quantitativas

Será que pinguins de diferentes ilhas possuem tamanhos de bicos muito diferentes? Qual espécie possui, em média, uma massa corporal maior? Aqui podemos utilizar diretamente de medidas estatísticas. Para as perguntas, podemos realizar uma combinação da função group_by() para agrupar por categóricas, e em seguida utilizar a função summarise() para aplicar o cálculo de uma medida estatística para cada grupo.

Veja que ambas as perguntas foram respondidas, uma por meio do desvio padrão e outro por meio da média. Com cada resposta seria possível realizar ainda mais perguntas sobre os dados, como: A variação do comprimento do bico em cada ilha ocorre devido as distribuição de espécies por ilha? Além da espécie, é necessário levar em conta a distribuição do sexo de penguim por espécie para tirar conclusões sobre o peso? De fato, poderíamos criar cada vez mais perguntas e seguir uma caminho para Análise, por isso, é sempre necessário escolher um direcionamento antes de começar um AED.

Como seria exaustivo responder todas as perguntas aqui, continuaremos a utilizar diferentes ferramentas para entender as perguntas feitas anteriormente. Os gráficos podem ser nossos aliados.

____________________________________________

Essas são algumas das ferramentas que podemos utilizar para que possamos realizar uma Análise Exploratória de Dados. Existem inúmeras outras técnicas e que você pode aprender com nossos cursos de R e Python aplicados para a Análise de Dados e Economia. Confira:

Construindo o juro real e o juro neutro em Python

By | mercado financeiro

Uma importante medida para acompanhar o sentido da política monetária é comparar o Juro real com o Juro de equilíbrio da economia. A diferença entre os dois indicadores permite dizer se a política monetária está em sentido expansionista ou contracionista. No post de hoje mostraremos como é possível construir o Juro real e o Juro neutro utilizando o Python.

O juro real que considerei aqui é o juro real ex-ante, obtido a partir do juro do swap DI 360 deflacionado pela expectativa de inflação para os próximos 12 meses. Já o juro de equilíbrio segue uma proxy definida no Relatório de Inflação de dezembro de 2019, dada pela Selic esperada para t+3 deflacionada pela inflação esperada para t+3.

 

Para o cálculo, utilizamos a equação de Fisher, que nos dá a diferença entre o juro nominal e a expectativa de inflação.

_________________

Para saber mais sobre esse tema, acompanhe o lançamento do nosso Curso de Macroeconomia usando R e Python.

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

Assinar Gratuitamente