Transformando Dados em Informações

Usando R nas Ciências Sociais

Dr Robson Oliveira

IFPB

Encontre esses slides em:

https://robsonol.github.io/workshop_r_ciencias_sociais/

Contando Histórias com Dados

Contando Histórias com Dados

Fonte: Allison Horst

  1. Planejar
  2. Adquirir dados
  3. Explorar:
    • Transformar

    • Visualizar

    • Modelar

  4. Comunicar

Contando Histórias com Dados

Pré-Requisitos

R

R

  1. Baixar e instalar R em https://cloud.r-project.org

RStudio

  1. Instalar o RStudio: https://www.rstudio.com

Pacotes

Conceitos Básicos

Banco de dados: data.frame

Um tipo especial de objeto é o data.frame:

# mtcars é um banco de dados com informações de veículos:
dados_carros <- mtcars

# podemos inspecionar o data frame:
dados_carros

Banco de dados: data.frame

Um tipo especial de objeto é o data.frame:

# mtcars é um banco de dados com informações de veículos:
dados_carros <- mtcars

# podemos inspecionar o data frame:
dados_carros
                     mpg cyl  disp  hp drat    wt  qsec vs am gear carb
Mazda RX4           21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag       21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
Datsun 710          22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
Hornet 4 Drive      21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
Hornet Sportabout   18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
Valiant             18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
Duster 360          14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4
Merc 240D           24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
Merc 230            22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2
Merc 280            19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4
Merc 280C           17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4
Merc 450SE          16.4   8 275.8 180 3.07 4.070 17.40  0  0    3    3
Merc 450SL          17.3   8 275.8 180 3.07 3.730 17.60  0  0    3    3
Merc 450SLC         15.2   8 275.8 180 3.07 3.780 18.00  0  0    3    3
Cadillac Fleetwood  10.4   8 472.0 205 2.93 5.250 17.98  0  0    3    4
Lincoln Continental 10.4   8 460.0 215 3.00 5.424 17.82  0  0    3    4
Chrysler Imperial   14.7   8 440.0 230 3.23 5.345 17.42  0  0    3    4
Fiat 128            32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    1
Honda Civic         30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2
Toyota Corolla      33.9   4  71.1  65 4.22 1.835 19.90  1  1    4    1
Toyota Corona       21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    1
Dodge Challenger    15.5   8 318.0 150 2.76 3.520 16.87  0  0    3    2
AMC Javelin         15.2   8 304.0 150 3.15 3.435 17.30  0  0    3    2
Camaro Z28          13.3   8 350.0 245 3.73 3.840 15.41  0  0    3    4
Pontiac Firebird    19.2   8 400.0 175 3.08 3.845 17.05  0  0    3    2
Fiat X1-9           27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    1
Porsche 914-2       26.0   4 120.3  91 4.43 2.140 16.70  0  1    5    2
Lotus Europa        30.4   4  95.1 113 3.77 1.513 16.90  1  1    5    2
Ford Pantera L      15.8   8 351.0 264 4.22 3.170 14.50  0  1    5    4
Ferrari Dino        19.7   6 145.0 175 3.62 2.770 15.50  0  1    5    6
Maserati Bora       15.0   8 301.0 335 3.54 3.570 14.60  0  1    5    8
Volvo 142E          21.4   4 121.0 109 4.11 2.780 18.60  1  1    4    2

Banco de dados: data.frame

Banco de dados: data.frame

Fonte: Allison Horst

Fonte: Allison Horst

Banco de dados: data.frame

Vamos trabalhar com dados no R no formato tidy:

Banco de dados: data.frame

Fonte: Allison Horst

1. Adquirindo Dados

Importando dados

Sugestão de fontes de dados:

Importando dados

Importando dados de consumo de energia usando a função read_csv():

# importar o pacote
library(tidyverse)

# salvar o arquivo csv como o objeto "despesas"
consumo_energia <- read_csv(file = "dados/consumo_energia_brasil.csv")

# mostrar apenas as primeiras linhas do banco de dados:
consumo_energia

Importando dados

Importando dados de consumo de energia usando a função read_csv():

# importar o pacote
library(tidyverse)

# salvar o arquivo csv como o objeto "consumo_energia"
consumo_energia <- read_csv(file = "dados/consumo_energia_brasil.csv")

# mostrar apenas as primeiras linhas do banco de dados:
consumo_energia

Importando dados

Importando dados de consumo de energia usando a função read_csv():

# importar o pacote
library(tidyverse)

# salvar o arquivo csv como o objeto "consumo_energia"
consumo_energia <- read_csv(file = "dados/consumo_energia_brasil.csv")

# mostrar apenas as primeiras linhas do banco de dados:
consumo_energia
# A tibble: 34,992 × 6
     ano   mes sigla_uf tipo_consumo numero_consumidores  consumo
   <dbl> <dbl> <chr>    <chr>                      <dbl>    <dbl>
 1  2004     1 RO       Total                         NA  112812 
 2  2004     1 AC       Total                         NA   34840.
 3  2004     1 AM       Total                         NA  274773 
 4  2004     1 RR       Total                         NA   31696.
 5  2004     1 PA       Total                         NA 1011353.
 6  2004     1 AP       Total                         NA   43084 
 7  2004     1 TO       Total                         NA   65877.
 8  2004     1 MA       Total                         NA  737033.
 9  2004     1 PI       Total                         NA  131052 
10  2004     1 CE       Total                         NA  518714 
# … with 34,982 more rows

Importando dados

2. Transformação de dados

Funções do dplyr

  1. filter() filtra apenas observações com valores específicos

  2. arrange() reordena as linhas da base

  3. select() seleciona apenas variáveis de interesse

  4. mutate() cria novas variáveis como função das demais

  5. summarise() cria estatísticas descritivas

A. Função filter

B. Função select()

C. Função mutate()

D. Função arrange()

E. Função summarise()

F. Função group_by()

Exemplo de Transformação

Exemplo de Transformação

Exemplo de Transformação

3. Visualização

“Apresentar dados com gráficos pode ajudar você a comunicar informações com clareza.”

Pacote ggplot2

Pacote ggplot2

Vamos criar nosso primeiro gráfico:

# camada de dados
energia_residencial_pb |> 
  # camada estética (mapeamento)
  ggplot(aes(x = data, y = consumo)) +
  # camada de geometria
  geom_point()

Pacote ggplot2

Vamos criar nosso primeiro gráfico:

# camada de dados
energia_residencial_pb |> 
  # camada estética (mapeamento)
  ggplot(aes(x = data, y = consumo)) +
  # camada de geometria
  geom_point()

Pacote ggplot2

Vamos criar nosso primeiro gráfico:

# camada de dados
energia_residencial_pb |> 
  # camada estética (mapeamento)
  ggplot(aes(x = data, y = consumo)) +
  # camada de geometria
  geom_point()

Pacote ggplot2

Geometrias

Geometrias

  • geom é o objeto geométrico que um gráfico usa para representar dados.

  • Gráficos de barras são construídos com geom_bar.

  • Gráficos de linhas são construídos com geom_line.

  • Assim, para mudar a geometria, só alterar o termo geom_*.

geom_point()

energia_residencial_pb |> 
  ggplot(mapping = aes(x = data, y = consumo)) +
  geom_point()

geom_line()

energia_residencial_pb |> 
  ggplot(mapping = aes(x = data, y = consumo)) +
  geom_line()

geom_smooth()

energia_residencial_pb |> 
  ggplot(mapping = aes(x = data, y = consumo)) +
  geom_smooth()

geom_hist

energia_residencial_pb |> 
  ggplot(aes(x = consumo)) +
  geom_histogram()

geom_boxplot

energia_residencial_pb |> 
  ggplot(aes(y = consumo)) +
  geom_boxplot()

geom_qq

energia_residencial_pb |> 
  ggplot(aes(sample = consumo)) +
  geom_qq() +
  geom_qq_line()

Múltiplos geom_*

energia_residencial_pb |> 
  ggplot(aes(x = data, y = consumo)) +
  geom_point() +
  geom_line()

Dplyr + ggplot

energia_residencial_pb |> 
  group_by(ano) |> 
  summarise(consumo_total = sum(consumo)) |> 
  ggplot(aes(x = ano, y = consumo_total)) + 
  geom_col()

Múltiplas faces com facet_wrap

energia_residencial_pb |> 
  filter(ano > 2012) |> 
  ggplot(aes(x = mes, y = consumo)) + 
  geom_line() + 
  facet_wrap(~ano)

Mais Informações

4. Modelar

Modelar

Uma lista (não exaustiva) de modelagem de dados que podem ser desenvolvidos nas ciências sociais:

  1. Estatística Básica
  2. Previsão de séries temporais
  3. Regressão
  4. Segmentação de clientes com clusterização
  5. Análise de Churn
  6. Análise financeira (portfólios)
  7. Análise fatorial

Estatística Básica: Estatísticas Descritivas

salario_pb <- read_rds("dados/salario-pb-Rais2013.rds")

salario_pb |> head()
# A tibble: 6 × 9
  id    salario idade mun_trab mun_res escolaridade  sexo meso_trab      semia…¹
  <chr>   <dbl> <dbl>    <int>   <int>        <dbl> <dbl> <chr>          <chr>  
1 1        678     49   250375  250375            1     1 Sertão Paraib… S      
2 2       1352.    36   251030  251030            1     1 Borborema      S      
3 3       2859.    39   251140  251140            1     1 Borborema      S      
4 4       1800.    46   251140  251140            1     1 Borborema      S      
5 5        712.    36   251140  251140            1     1 Borborema      S      
6 6        960.    41   251140  251140            1     1 Borborema      S      
# … with abbreviated variable name ¹​semiarido_trab

Estatística: Estatísticas Descritivas

Estatística: Estatísticas Descritivas

summary(salario_pb)
      id               salario            idade          mun_trab     
 Length:865841      Min.   :  203.4   Min.   : 0.00   Min.   :240810  
 Class :character   1st Qu.:  731.7   1st Qu.:27.00   1st Qu.:250400  
 Mode  :character   Median :  881.4   Median :34.00   Median :250750  
                    Mean   : 1422.8   Mean   :36.37   Mean   :250730  
                    3rd Qu.: 1328.3   3rd Qu.:45.00   3rd Qu.:250750  
                    Max.   :81597.3   Max.   :98.00   Max.   :251740  
    mun_res        escolaridade         sexo        meso_trab        
 Min.   :250010   Min.   : 1.000   Min.   :1.000   Length:865841     
 1st Qu.:250400   1st Qu.: 5.000   1st Qu.:1.000   Class :character  
 Median :250750   Median : 7.000   Median :1.000   Mode  :character  
 Mean   :250731   Mean   : 6.286   Mean   :1.395                     
 3rd Qu.:250750   3rd Qu.: 7.000   3rd Qu.:2.000                     
 Max.   :251740   Max.   :11.000   Max.   :2.000                     
 semiarido_trab    
 Length:865841     
 Class :character  
 Mode  :character  
                   
                   
                   

Estatística: Estatísticas Descritivas

salario_pb |> 
  summarise(across(c(salario, idade, escolaridade),
                   list(media = ~ mean(., na.rm = TRUE),
                        mediana = ~ median(., na.rm = TRUE),
                        dp = ~ sd(., na.rm = TRUE)))) |> 
  pivot_longer(cols = everything(),
               names_to = c("Variável", ".value"), 
               names_sep = "_") |> 
  rename("Média" = media,
         "Mediana" = mediana,
         "Desvio-Padrão" = dp) |> 
  knitr::kable()
Variável Média Mediana Desvio-Padrão
salario 1422.765775 881.4 1823.80258
idade 36.374189 34.0 11.49324
escolaridade 6.285835 7.0 1.99408

Estatística: Correlação

Calcular correlação pode ser executada com a função cor():

matriz_corr <- salario_pb |> 
  # selecionar variáveis numéricas
  select(salario, escolaridade, sexo) |> 
  cor()

matriz_corr
                 salario escolaridade        sexo
salario       1.00000000    0.2440811 -0.00844732
escolaridade  0.24408111    1.0000000  0.26036466
sexo         -0.00844732    0.2603647  1.00000000

Estatística: Correlação

# install.packages("ggcorrplot")
library(ggcorrplot)

matriz_corr |> 
  ggcorrplot()

Estatística: Correlação

# install.packages("ggcorrplot")
library(ggcorrplot)

matriz_corr |> 
  ggcorrplot(ggtheme = theme_grey, 
             lab = TRUE, 
             colors = c("#6D9EC1", "white", "#E46726"), 
             title = "Matriz de Correlação")

Estatística: Distribuição Normal

salario_pb |> 
  ggplot(aes(x = salario)) + 
  geom_histogram(breaks = seq(0,10000, by = 100),
                 fill = "red",
                 alpha = 0.3) +
  labs(x = "Salário", y = "", 
       title = "Histograma do Salário Nominal na Paraíba (2013)",
       caption = "Fonte: Elaborado pelo autor a partir de dados da RAIS (2013)") +
  theme_light()

Estatística: Distribuição Normal

salario_pb |> 
  sample_n(size = 1000) |> 
  ggplot(aes(sample = salario)) + 
  geom_qq() +
  geom_qq_line() +
  labs(x = "Salário", y = "", title = "QQ-Plot do Salário Nominal na Paraíba (2013)",
       subtitle = "A distribuição de salário não parece seguir uma distribuição Normal",
       caption = "Fonte: Elaborado pelo autor a partir de dados da RAIS (2013)")

Estatística: Diferença de Médias

salario_pb |> 
  mutate(sexo = case_when(
    sexo == 2 ~ "Mulher",
    sexo == 1 ~ "Homem")) |> 
  filter(salario < 3000) |> 
  ggplot(aes(salario, fill = fct_rev(as.factor(sexo)))) +
  geom_density(position = 'identity', alpha = 0.5) +
  facet_wrap(~sexo) +
  guides(fill = "none") +
  labs(x = "Salário (R$)", y = "", 
       title = "Distribuição de Salários na Paraíba por Gênero, 2013",
       subtitle = "Salários abaixo de R$ 3000",
       caption = "Fonte: Elaboração do autor a partir de dados da RAIS (2013)")

Estatística: Diferença de Médias

# calcular salário das mulheres
salario_mulheres <- salario_pb |> 
  filter(sexo == 1) |> 
  pull(salario)

# salário dos homens
salario_homens <- salario_pb |> 
  filter(sexo == 2) |> 
  pull(salario)

# teste t para diferença de médias
t.test(salario_mulheres, salario_homens)

    Welch Two Sample t-test

data:  salario_mulheres and salario_homens
t = 8.0402, df = 783668, p-value = 8.984e-16
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 23.83628 39.20365
sample estimates:
mean of x mean of y 
 1435.205  1403.685 

Regressão

Retornos salariais da educação segundo a equação de Mincer (1974):

\[ Y (\text{Salário}) = \beta_0 + \beta_1 \text{educação} + \beta_2 \text{exp} + \beta_3 \text{exp}^2 + u \]

Regressão

equacao <- "log(salario + 1) ~ sexo + idade + escolaridade + meso_trab + semiarido_trab"

modelo <- lm(equacao, data = salario_pb) 
modelo |> 
  broom::tidy()

Regressão

equacao <- "log(salario + 1) ~ sexo + idade + escolaridade + meso_trab + semiarido_trab"

modelo <- lm(equacao, data = salario_pb) 
modelo |> 
  broom::tidy()

Regressão

equacao <- "log(salario + 1) ~ sexo + idade + escolaridade + meso_trab + semiarido_trab"

modelo <- lm(equacao, data = salario_pb) 
modelo |> 
  broom::tidy()
# A tibble: 8 × 5
  term                      estimate std.error statistic   p.value
  <chr>                        <dbl>     <dbl>     <dbl>     <dbl>
1 (Intercept)                 5.79   0.00416      1391.  0        
2 sexo                       -0.137  0.00121      -113.  0        
3 idade                       0.0165 0.0000499     330.  0        
4 escolaridade                0.105  0.000297      352.  0        
5 meso_trabBorborema         -0.0743 0.00342       -21.7 2.07e-104
6 meso_trabMata Paraibana     0.197  0.00313        63.0 0        
7 meso_trabSertão Paraibano  -0.0889 0.00215       -41.4 0        
8 semiarido_trabS             0.0772 0.00329        23.5 1.36e-121

Regressão

\[ \log(\text{salário} ) = 5,78 - 0,13 \text{ Mulher} + 0,02 \text{ Idade} + 0.10 \text{ Escolaridade} \\[0.1in] - 0,07 \text{ Borborema} + 0.20 \text{ Zona Mata} - 0,09 \text{ Sertão} + 0,08 \text{Semiarido} \]

Regressão

pessoa_ficticia <- data.frame(
  idade = 25,
  escolaridade = 10,
  sexo = 2,
  meso_trab = "Mata Paraibana",
  semiarido_trab = "N"
)

Regressão

O modelo sugere que a renda dessa pessoa deve ser de R$ 1298,13:

modelo |> 
  predict(pessoa_ficticia) |> 
  exp()
       1 
1298.131 

Séries Temporais

Para análise de séries temporais no R vamos usar o pacote Modeltime

Séries Temporais

Vamos prever o valor futuro do consumo de energia residencial na Paraíba.

Séries Temporais

# Instalar pacote:
# install.packages("modeltime")
# install.packages("timetk")

# carregar pacote
library(tidymodels)
library(modeltime)
library(timetk)

# carregar dados
energia <- read_csv("dados/energia_residencial_paraiba.csv")

Séries Temporais

# Instalar pacote:
# install.packages("modeltime")
# install.packages("timetk")

# carregar pacote
library(tidymodels)
library(modeltime)
library(timetk)

# carregar dados
energia <- read_csv("dados/energia_residencial_paraiba.csv")

Séries Temporais

# Instalar pacote:
# install.packages("modeltime")
# install.packages("timetk")

# carregar pacote
library(tidymodels)
library(modeltime)
library(timetk)

# carregar dados
energia <- read_csv("dados/energia_residencial_paraiba.csv")

Séries Temporais

# Instalar pacote:
# install.packages("modeltime")
# install.packages("timetk")

# carregar pacote
library(tidymodels)
library(modeltime)
library(timetk)

# carregar dados
energia <- read_csv("dados/energia_residencial_paraiba.csv")

Séries Temporais

# Instalar pacote:
# install.packages("modeltime")
# install.packages("timetk")

# carregar pacote
library(tidymodels)
library(modeltime)
library(timetk)

# carregar dados
energia <- read_csv("dados/energia_residencial_paraiba.csv")

Séries Temporais

# Instalar pacote:
# install.packages("modeltime")
# install.packages("timetk")

# carregar pacote
library(tidymodels)
library(modeltime)
library(timetk)

# carregar dados
energia <- read_csv("dados/energia_residencial_paraiba.csv")

Séries Temporais

energia |> 
  ggplot(aes(x = data, y = consumo)) +
  geom_line(color = "red", size = 1, alpha = .4) + 
  labs(x = "Data", y = "Consumo", 
       title = "Consumo de Energia Residencial na Paraíba") +
  theme_bw()

Séries Temporais

energia |> 
  plot_time_series(data, 
                   consumo, 
                   .title = "Consumo de Energia Residencial na Paraíba"
                   )

Séries Temporais

Base de Treinamento e Base de Teste

Séries Temporais

set.seed(123)
# base de teste (20%) e treinamento (80%)
energia_treinamento_teste <- energia |> 
  initial_time_split(prop = 0.8)

tbl_energia_treinamento <- training(energia_treinamento_teste)
tbl_energia_teste <- testing(energia_treinamento_teste)

energia_treinamento_teste |> 
    tk_time_series_cv_plan() |> 
    plot_time_series_cv_plan(data, consumo)

Séries Temporais

set.seed(123)
# base de teste (20%) e treinamento (80%)
energia_treinamento_teste <- energia |> 
  initial_time_split(prop = 0.8)

tbl_energia_treinamento <- training(energia_treinamento_teste)
tbl_energia_teste <- testing(energia_treinamento_teste)

energia_treinamento_teste |> 
    tk_time_series_cv_plan() |> 
    plot_time_series_cv_plan(data, consumo)

Séries Temporais

set.seed(123)
# base de teste (20%) e treinamento (80%)
energia_treinamento_teste <- energia |> 
  initial_time_split(prop = 0.8)

tbl_energia_treinamento <- training(energia_treinamento_teste)
tbl_energia_teste <- testing(energia_treinamento_teste)

energia_treinamento_teste |> 
    tk_time_series_cv_plan() |> 
    plot_time_series_cv_plan(data, consumo)

Séries Temporais

set.seed(123)
# base de teste (20%) e treinamento (80%)
energia_treinamento_teste <- energia |> 
  initial_time_split(prop = 0.7)

tbl_energia_treinamento <- training(energia_treinamento_teste)
tbl_energia_teste <- testing(energia_treinamento_teste)

energia_treinamento_teste |> 
    tk_time_series_cv_plan() |> 
    plot_time_series_cv_plan(data, consumo)

Séries Temporais

Agora vamos informar quem são nossas variáveis explicativas: o consumo de energia residencial será explicado apenas pelos seus valores passados. Poderiamos incluir outras variáveis, como feriados, tarifa de energia, etc.

receita_energia <- recipe(consumo ~ data, tbl_energia_treinamento)

Séries Temporais

Por fim, definir o modelo, rodar e gerar previsões:

# definir o modelo a ser rodado (ARIMA)
modelo_arima <- arima_reg() %>% 
  set_engine("auto_arima")

# Rodar o modelo na base de treinamento
workflow_arima <- workflow() %>% 
  add_recipe(receita_energia) %>% 
  add_model(modelo_arima) %>% 
  fit(tbl_energia_treinamento)

# Gerar uma previsão e comparar com o que realmente 
# aconteceu no período de teste
tbl_energia_calibracao <- workflow_arima |> 
  modeltime_calibrate(new_data = tbl_energia_teste)

# gerar os valores previstos
tbl_energia_previsao <- tbl_energia_calibracao |> 
  modeltime_forecast(new_data = tbl_energia_teste,
                     actual_data = energia)

Séries Temporais

Por fim, definir o modelo, rodar e gerar previsões:

# definir o modelo a ser rodado (ARIMA)
modelo_arima <- arima_reg() %>% 
  set_engine("auto_arima")

# Rodar o modelo na base de treinamento
workflow_arima <- workflow() %>% 
  add_recipe(receita_energia) %>% 
  add_model(modelo_arima) %>% 
  fit(tbl_energia_treinamento)

# Gerar uma previsão e comparar com o que realmente 
# aconteceu no período de teste
tbl_energia_calibracao <- workflow_arima |> 
  modeltime_calibrate(new_data = tbl_energia_teste)

# gerar os valores previstos
tbl_energia_previsao <- tbl_energia_calibracao |> 
  modeltime_forecast(new_data = tbl_energia_teste,
                     actual_data = energia)

Séries Temporais

Por fim, definir o modelo, rodar e gerar previsões:

# definir o modelo a ser rodado (ARIMA)
modelo_arima <- arima_reg() %>% 
  set_engine("auto_arima")

# Rodar o modelo na base de treinamento
workflow_arima <- workflow() %>% 
  add_recipe(receita_energia) %>% 
  add_model(modelo_arima) %>% 
  fit(tbl_energia_treinamento)

# Gerar uma previsão e comparar com o que realmente 
# aconteceu no período de teste
tbl_energia_calibracao <- workflow_arima |> 
  modeltime_calibrate(new_data = tbl_energia_teste)

# gerar os valores previstos
tbl_energia_previsao <- tbl_energia_calibracao |> 
  modeltime_forecast(new_data = tbl_energia_teste,
                     actual_data = energia)

Séries Temporais

Por fim, definir o modelo, rodar e gerar previsões:

# definir o modelo a ser rodado (ARIMA)
modelo_arima <- arima_reg() %>% 
  set_engine("auto_arima")

# Rodar o modelo na base de treinamento
workflow_arima <- workflow() %>% 
  add_recipe(receita_energia) %>% 
  add_model(modelo_arima) %>% 
  fit(tbl_energia_treinamento)

# Gerar uma previsão e comparar com o que realmente 
# aconteceu no período de teste
tbl_energia_calibracao <- workflow_arima |> 
  modeltime_calibrate(new_data = tbl_energia_teste)

# gerar os valores previstos
tbl_energia_previsao <- tbl_energia_calibracao |> 
  modeltime_forecast(new_data = tbl_energia_teste,
                     actual_data = energia)

Séries Temporais

Gráfico da previsão comparada com o que ocorreu de fato:

tbl_energia_previsao |> 
  plot_modeltime_forecast()

Séries Temporais

É possível ainda criar uma série de medidas de performance. Elas são úteis para nos guiar sobre qual o melhor modelo:

tbl_energia_calibracao |> 
  modeltime_accuracy(new_data = tbl_energia_teste) |> 
  knitr::kable()
.model_id .model_desc .type mae mape mase smape rmse rsq
1 ARIMA(0,1,1)(0,1,1)[12] Test 7307.977 4.206429 0.9824635 4.254726 9406.222 0.8150693

Séries Temporais

Séries Temporais

# A tibble: 6 × 2
  .model_desc                                mape
  <chr>                                     <dbl>
1 SEASONAL DECOMP: ETS(M,A,N)                3.95
2 ARIMA(0,1,2)(0,1,1)[12] W/ XGBOOST ERRORS  4.17
3 ARIMA(0,1,1)(0,1,1)[12]                    4.21
4 REGRESSION WITH ARIMA(0,1,0) ERRORS        4.71
5 PROPHET W/ REGRESSORS                      4.91
6 TBATS(0, {0,0}, 1, {<12,5>})               6.32

Séries Temporais

Para mais informações sobre séries temporais:

Análise de Churn

Análise de Churn

A partir de informações dos clientes, podemos prever a probabilidade que um cliente abandone (churn) a empresa, nos permitindo desenvolver programas focados em retenção de clientes.

Análise de Churn

data(wa_churn, package = "modeldata")

Análise de Churn