Lei de Okun em Python

Primeiro vou importar as bibliotecas padrão.

import os
os.environ['QT_QPA_PLATFORM_PLUGIN_PATH'] = '/path/to/Anaconda3/Library/plugins/platforms'
import numpy as np
import pandas as pd
import statsmodels.formula.api as sm

Criei uma função para pegar os dados do Banco Central.

def get_bcb(cod_bcb):
    url = 'http://api.bcb.gov.br/dados/serie/bcdata.sgs.{}/dados?formato=json'.format(cod_bcb)
    df = pd.read_json(url)
    df['data'] = pd.to_datetime(df['data'], dayfirst=True)
    df.set_index('data', inplace=True)
    return df 

Agora vou obter os dados do desemprego:

des = get_bcb(24369)/100  # 24369 is the code of PNADC
des.columns=['des']
des.head()  # head of data
##               des
## data             
## 2012-03-01  0.079
## 2012-04-01  0.077
## 2012-05-01  0.076
## 2012-06-01  0.075
## 2012-07-01  0.074

O próximo passo é obter a primeira diferença do desemprego.

ddes = des.diff()
ddes.describe()
##              des
## count  97.000000
## mean    0.000485
## std     0.002821
## min    -0.004000
## 25%    -0.002000
## 50%     0.000000
## 75%     0.003000
## max     0.007000

Agora vou obter dados do PIB brasileiro.

GDP = get_bcb(4385)
GDP = GDP['20120301':'20200401']
pd.DataFrame.describe(GDP)
##                valor
## count      98.000000
## mean   172041.448980
## std     27228.822663
## min    109696.000000
## 25%    150857.250000
## 50%    161064.000000
## 75%    203267.000000
## max    216197.000000

Então vou calcular o crescimento do PIB.

gy = GDP.pct_change()            # growth
gy.describe()
##            valor
## count  97.000000
## mean   -0.005110
## std     0.052594
## min    -0.278206
## 25%    -0.025265
## 50%    -0.001826
## 75%     0.017671
## max     0.099140

Vou concatenar os dois data frames para fazer um gráfico utilizando o ggplot.

dt = pd.concat([ddes, gy], axis=1)  # concatenate two dfs
dt.columns = ['ddes', 'gy']   # change colnames
dt.head()
##              ddes        gy
## data                       
## 2012-03-01    NaN       NaN
## 2012-04-01 -0.002 -0.041689
## 2012-05-01 -0.001  0.031541
## 2012-06-01 -0.001 -0.016582
## 2012-07-01 -0.001  0.041627

Umas das coisas mais legais do Rmarkdown é poder utilizar o ggplot com variáveis Python. Um pacote semelhante ao ggplot para o Python é o plotnine. Aqui, fiz um scatter plot entre variação do desemprego e crescimento do PIB brasileiro.

ggplot(py$dt, mapping=aes(x=ddes, y=gy)) +geom_point()+ geom_smooth(method = 'lm',formula = y~x, color='black', se=F) 

A regressão pode ser vista abaixo.

reg = sm.ols('ddes ~ gy', data=dt).fit()
print(reg.summary())
##                             OLS Regression Results                            
## ==============================================================================
## Dep. Variable:                   ddes   R-squared:                       0.001
## Model:                            OLS   Adj. R-squared:                 -0.010
## Method:                 Least Squares   F-statistic:                   0.07626
## Date:                Sat, 27 Jun 2020   Prob (F-statistic):              0.783
## Time:                        17:58:32   Log-Likelihood:                 432.34
## No. Observations:                  97   AIC:                            -860.7
## Df Residuals:                      95   BIC:                            -855.5
## Df Model:                           1                                         
## Covariance Type:            nonrobust                                         
## ==============================================================================
##                  coef    std err          t      P>|t|      [0.025      0.975]
## ------------------------------------------------------------------------------
## Intercept      0.0005      0.000      1.702      0.092   -8.19e-05       0.001
## gy             0.0015      0.006      0.276      0.783      -0.009       0.012
## ==============================================================================
## Omnibus:                       11.515   Durbin-Watson:                   0.651
## Prob(Omnibus):                  0.003   Jarque-Bera (JB):                9.547
## Skew:                           0.671   Prob(JB):                      0.00845
## Kurtosis:                       2.252   Cond. No.                         19.1
## ==============================================================================
## 
## Warnings:
## [1] Standard Errors assume that the covariance matrix of the errors is correctly specified.