Objetivos da Aula

Introdução: Por que usar variáveis dummies?

Modelos de regressão frequentemente envolvem variáveis explicativas qualitativas:

Para que possam ser incluídas em uma regressão linear, essas variáveis são codificadas como variáveis binárias, assumindo valores 0 ou 1.

Conceito:

Uma variável dummy é uma variável que assume o valor 1 para indicar a presença de uma característica e 0 caso contrário.

Exemplo:

As variáveis dummies são particularmente úteis para comparar médias entre grupos.

Modelo com Dummy Simples

Considere o modelo:

\[ y_i = \beta_0 + \beta_1 D_i + u_i \]

onde:

Interpretação: \(\beta_0\) é a média do grupo base (\(D_i = 0\)), e \(\beta_0 + \beta_1\) é a média do grupo com \(D_i = 1\).

Exemplo prático em R

data(wage1)
modelo1 <- lm(wage ~ female, data = wage1)
summary(modelo1)
## 
## Call:
## lm(formula = wage ~ female, data = wage1)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -5.5995 -1.8495 -0.9877  1.4260 17.8805 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)   7.0995     0.2100  33.806  < 2e-16 ***
## female       -2.5118     0.3034  -8.279 1.04e-15 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 3.476 on 524 degrees of freedom
## Multiple R-squared:  0.1157, Adjusted R-squared:  0.114 
## F-statistic: 68.54 on 1 and 524 DF,  p-value: 1.042e-15


  • O coeficiente de female mostra a diferença salarial entre mulheres e homens.
  • O intercepto é o salário médio dos homens.


Visualização da diferença entre grupos usando boxplot:

ggplot(wage1, aes(x = as.factor(female), y = wage)) +
  geom_boxplot() +
  labs(x = "Female (0 = Homem, 1 = Mulher)", y = "Salário")



Dummies Múltiplas: Evitando a Armadilha da Dummy

Se uma variável qualitativa possui \(m\) categorias, devemos incluir apenas \(m - 1\) dummies no modelo, deixando uma como referência.

Exemplo: Região geográfica com 3 categorias

Incluir as três dummies causaria multicolinearidade perfeita.

Modelo com Dummies Múltiplas:

Table9_1 <- gujarati::Table9_1 %>%
  rename(
    `Norte e Centro-Norte` = D2,
    Sul = D3     
  )

# Transformando as variáveis em numéricas:
Table9_1$Salary    <- as.numeric(as.character(Table9_1$Salary))
Table9_1$Spending  <- as.numeric(as.character(Table9_1$Spending ))

modelo <- lm(Salary ~  `Norte e Centro-Norte` + Sul, data = Table9_1)
summary(modelo)
## 
## Call:
## lm(formula = Salary ~ `Norte e Centro-Norte` + Sul, data = Table9_1)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -14161  -4566  -1638   4632  15625 
## 
## Coefficients:
##                         Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                48015       1857  25.853   <2e-16 ***
## `Norte e Centro-Norte`1     1524       2363   0.645    0.522    
## Sul1                       -1721       2467  -0.698    0.489    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 6696 on 48 degrees of freedom
## Multiple R-squared:  0.04397,    Adjusted R-squared:  0.004134 
## F-statistic: 1.104 on 2 and 48 DF,  p-value: 0.3399


O intercepto representa a média da categoria de referência (oeste). Os coeficientes mostram as diferenças relativas.

Figura 11.1 - Gujarati



Modelo com Dummies e variáveis contínuas

Exemplo prático em R

data(wage1)
modelo1 <- lm(wage ~ educ + female, data = wage1)
summary(modelo1)
## 
## Call:
## lm(formula = wage ~ educ + female, data = wage1)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -5.9890 -1.8702 -0.6651  1.0447 15.4998 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  0.62282    0.67253   0.926    0.355    
## educ         0.50645    0.05039  10.051  < 2e-16 ***
## female      -2.27336    0.27904  -8.147 2.76e-15 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 3.186 on 523 degrees of freedom
## Multiple R-squared:  0.2588, Adjusted R-squared:  0.256 
## F-statistic: 91.32 on 2 and 523 DF,  p-value: < 2.2e-16
  • A regressão com variáveis contínuas e uma dummy, como neste exemplo, significa que estamos estimando o efeito da escolaridade (educ, contínua) e do gênero (female, dummy) sobre o salário (wage), usando um modelo de regressão linear múltipla.

  • A dummy agora é:

o salário médio de uma mulher, em relação à categoria de referência (homem), descontado o efeito da escolaridade.

Interpretação dos coeficientes:

  • \(\beta_0\) (intercepto): salário esperado de um homem com 0 anos de escolaridade (pois female = 0, educ = 0);

  • \(\beta_1\): variação média no salário associada a 1 ano adicional de escolaridade, mantendo o sexo constante (ou seja, para o mesmo gênero);

  • \(\beta_2\): diferença média no salário entre mulheres e homens, mantendo a escolaridade constante.

Figura 7.1 - Wooldrige
Figura 7.1 - Wooldrige

⚠️ Atenção:

  • Só faça inferência para valores que estão dentro do domínio observado das variáveis explicativas. Afinal, você não sabe como os dados se comportam fora dali.

  • No caso em tela, não temos na nossa amostra homens com zero ano de estudo:

Distribuição de Educação por Gênero
Anos_Educacao Homens Mulheres Total
0 0 2 2
2 1 0 1
3 1 0 1
4 3 0 3
5 0 1 1
6 4 2 6
7 2 2 4
8 15 7 22
9 8 9 17
10 13 17 30
11 17 12 29
12 85 113 198
13 14 25 39
14 31 22 53
15 12 9 21
16 45 23 68
17 10 2 12
18 13 6 19
Note: Dados de wage1 (wooldridge).
  • Dessa forma, apesar de, em teoria \(\beta_0\) ser o salário médio de homens com zero ano de educação, essa informação contêm um viés de não observação para esse grupo e, portanto, sua estimativa não é confiável!
modelo2 <- lm(Salary ~  Spending + `Norte e Centro-Norte` + Sul, data =Table9_1)
summary(modelo2)
## 
## Call:
## lm(formula = Salary ~ Spending + `Norte e Centro-Norte` + Sul, 
##     data = Table9_1)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -10556  -2471    106   2066  15084 
## 
## Coefficients:
##                           Estimate Std. Error t value Pr(>|t|)    
## (Intercept)             28694.9180  3262.5213   8.795 1.70e-11 ***
## Spending                    2.3404     0.3592   6.515 4.45e-08 ***
## `Norte e Centro-Norte`1 -2954.1268  1862.5756  -1.586   0.1194    
## Sul1                    -3112.1948  1819.8725  -1.710   0.0938 .  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 4905 on 47 degrees of freedom
## Multiple R-squared:  0.4977, Adjusted R-squared:  0.4656 
## F-statistic: 15.52 on 3 and 47 DF,  p-value: 3.762e-07

Figura 09.2 - Gujarati



Interação: Dummies x Variáveis Quantitativas

\[ y_i = \beta_0 + \beta_1 x_i + \beta_2 D_i + \beta_3 x_i \cdot D_i + u_i \]

modelo3 <- lm(wage ~ educ * female, data = wage1)
summary(modelo3)
## 
## Call:
## lm(formula = wage ~ educ * female, data = wage1)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -6.1611 -1.8028 -0.6367  1.0054 15.5258 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  0.20050    0.84356   0.238    0.812    
## educ         0.53948    0.06422   8.400 4.24e-16 ***
## female      -1.19852    1.32504  -0.905    0.366    
## educ:female -0.08600    0.10364  -0.830    0.407    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 3.186 on 522 degrees of freedom
## Multiple R-squared:  0.2598, Adjusted R-squared:  0.2555 
## F-statistic: 61.07 on 3 and 522 DF,  p-value: < 2.2e-16

No contexto do exemplo:

  • \(x_i = \text{educ}_i\) (anos de estudo)

  • \(D_i = \text{female}_i\) (1 se mulher, 0 se homem)

  • \(y_i = \text{wage}_i\) (salário)

Interpretação:

  • Para homens (\(D_i = 0\)): \[ y_i = \beta_0 + \beta_1 x_i + u_i \]
    1. Intercepto: \(\beta_0\)
    2. Inclinação (efeito da educação): \(\beta_1\)


  • Para mulheres (\(D_i = 1\)): \[ y_i = (\beta_0 +\beta_2) + (\beta_1 + \beta_3) x_i + u_i \]
    1. Intercepto: \(\beta_0 + \beta_2\)
    2. Inclinação: \(\beta_1 + \beta_3\)


  • Portanto, cada grupo (homens e mulheres) tem sua própria reta de regressão, com intercepto e inclinação distintos.

  • O que este gráfico mostra?

    • Dois grupos distintos de linhas de tendência:

      • Uma para female = 0 (homens)

      • Outra para female = 1 (mulheres)

  • Diferenças:

    • No nível (intercepto): as linhas começam em alturas diferentes.

    • Na inclinação: as linhas podem ter inclinações diferentes, indicando que o retorno à educação varia entre homens e mulheres.



Avaliando efeitos de políticas públicas

As variáveis dummies são poderosas ferramentas para avaliar políticas públicas e programas sociais.

Modelo típico:

\[ y_i = \beta_0 + \beta_1 D_i + \beta_2 x_i + u_i \]


Interpretação de \(\beta_1\): efeito médio do tratamento (ATE).

Exemplo em R

Vamos avaliar se participar de um programa de treinamento afeta o salário. Para isso, exploraremos o conjunto de dados jtrain2. O conjunto de dados tem as seguintes características:

  • Unidade de observação: indivíduo

  • Objetivo: Estimar o impacto do treinamento (train) sobre o salário no ano posterior ao programa (re78)

  • Tipo de dado: dados observacionais com grupo de tratamento e grupo de controle


Variável Descrição
train Dummy: 1 se participou do programa de treinamento; 0 se não
re78 Salário total em 1978 (após o programa)
re74 Salário total em 1974 (antes do programa)
re75 Salário total em 1975 (antes do programa)
age Idade do indivíduo
educ Anos de escolaridade
black Dummy: 1 se indivíduo é negro
hisp Dummy: 1 se hispânico
married Dummy: 1 se casado
nodegree Dummy: 1 se não completou o ensino médio
unem74 Dummy: 1 se esteve desempregado em 1974
unem75 Dummy: 1 se esteve desempregado em 1975


Um modelo simples pode ser obtido a partir de:

data(jtrain2)
modelo_policy <- lm(re78 ~ train + age + educ, data = jtrain2)
summary(modelo_policy)
## 
## Call:
## lm(formula = re78 ~ train + age + educ, data = jtrain2)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -7.654 -4.749 -1.591  3.032 53.603 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)   
## (Intercept) -0.54140    2.09135  -0.259   0.7959   
## train        1.65874    0.63226   2.624   0.0090 **
## age          0.04500    0.04384   1.027   0.3052   
## educ         0.39339    0.17387   2.262   0.0242 * 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 6.548 on 441 degrees of freedom
## Multiple R-squared:  0.03158,    Adjusted R-squared:  0.02499 
## F-statistic: 4.794 on 3 and 441 DF,  p-value: 0.002686


Uma outra forma de averiguar esse efeito, seria modelarmos a variação nos salários em função da participação no programa. Isso evitaria alguns vieses:

  1. Vieses de Heterogeneidade Não Observada (efeitos fixos individuais):
  • Pessoas diferentes têm características não observadas (motivação, habilidade, conexões) que afetam o salário.

  • Essas características são constantes ao longo do tempo, mas influenciam re78 e também a decisão de participar (train).

  • Ao usar diferenças (\(\Delta\)salário = re78 - re75), essas características fixas são canceladas (desde que elas sejam estáveis entre 1975 e 1978).

    ✅ Evitamos viés por omissão de variáveis inobserváveis constantes ao longo do tempo.

  1. Vieses de Nível Inicial (salário inicial distinto)
  • Participantes do programa podem ter salários muito diferentes já em 1975, antes do programa.

  • Se isso não for controlado, a regressão de re78 ~ train pode atribuir a essas diferenças pré-existentes um falso “efeito do programa”.

    ✅ Ao usar a diferença re78 - re75, controlamos implicitamente os níveis salariais anteriores.

  1. Variação no tempo comum (choques agregados)
  • O período 1975–1978 pode ter sido afetado por políticas econômicas, inflação, crises etc.

  • Se isso afetou todos os indivíduos igualmente, a diferença no salário já incorpora isso como um “fator comum”, que não contamina a estimação do efeito diferencial do tratamento.

    ✅ Controla choques macroeconômicos comuns aos grupos.


suppressMessages(library(lmtest))
suppressMessages(library(sandwich))

# Estimar o modelo
data(jtrain2)
jtrain2$delta_salario <- jtrain2$re78 - jtrain2$re75
modelo_policy_delta <- lm(delta_salario ~ train + age + educ, data = jtrain2)

# Erros padrão robustos
coeftest(modelo_policy_delta, vcov = vcovHC(modelo_policy_delta, type = "HC1"))
## 
## t test of coefficients:
## 
##              Estimate Std. Error t value Pr(>|t|)  
## (Intercept) -0.859505   2.006145 -0.4284  0.66854  
## train        1.420547   0.696259  2.0403  0.04192 *
## age          0.022752   0.038964  0.5839  0.55957  
## educ         0.354600   0.160121  2.2146  0.02730 *
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1


A Dummy como Alternativa ao Teste de Chow (Gujarati, seção 9.5)


Figura 9.3 - Gujarati
Figura 9.3 - Gujarati


\[ Y_t = \alpha_1 + \alpha_2 D_t + \beta_1 X_t + \beta_2 (X_t \cdot D_t) + u_t \]


dados <- gujarati::Table8_9
dados$YEAR    <- as.numeric(as.character(dados$YEAR))
dados$SAVINGS <- as.numeric(as.character(dados$SAVINGS))
dados$INCOME  <- as.numeric(as.character(dados$INCOME))

dados <- dados %>%
  mutate(DUMMY = ifelse(YEAR < 1982, 0, 1))

dados
##    YEAR SAVINGS INCOME DUMMY
## 1  1970    61.0  727.1     0
## 2  1971    68.6  790.2     0
## 3  1972    63.6  855.3     0
## 4  1973    89.6  965.0     0
## 5  1974    97.6 1054.2     0
## 6  1975   104.4 1159.2     0
## 7  1976    96.4 1273.0     0
## 8  1977    92.5 1401.4     0
## 9  1978   112.6 1580.1     0
## 10 1979   130.1 1769.5     0
## 11 1980   161.8 1973.3     0
## 12 1981   199.1 2200.2     0
## 13 1982   205.5 2347.3     1
## 14 1983   167.0 2522.4     1
## 15 1984   235.7 2810.0     1
## 16 1985   206.2 3002.0     1
## 17 1986   196.5 3187.6     1
## 18 1987   168.4 3363.1     1
## 19 1988   189.1 3640.8     1
## 20 1989   187.8 3894.5     1
## 21 1990   208.7 4166.8     1
## 22 1991   246.4 4343.7     1
## 23 1992   272.6 4613.7     1
## 24 1993   214.4 4790.2     1
## 25 1994   189.4 5021.7     1
## 26 1995   249.3 5320.8     1
modelo <- lm(SAVINGS ~ INCOME*DUMMY, data = dados)
summary(modelo)
## 
## Call:
## lm(formula = SAVINGS ~ INCOME * DUMMY, data = dados)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -38.729 -14.777  -1.398  11.689  50.535 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)    1.01612   20.16483   0.050 0.960266    
## INCOME         0.08033    0.01450   5.541 1.44e-05 ***
## DUMMY        152.47855   33.08237   4.609 0.000136 ***
## INCOME:DUMMY  -0.06547    0.01598  -4.096 0.000477 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 23.15 on 22 degrees of freedom
## Multiple R-squared:  0.8819, Adjusted R-squared:  0.8658 
## F-statistic: 54.78 on 3 and 22 DF,  p-value: 2.268e-10
# Podemos usar matrizes robustas:
coeftest(modelo, vcov = vcovHC(modelo, type = "HC1"))
## 
## t test of coefficients:
## 
##                 Estimate  Std. Error t value  Pr(>|t|)    
## (Intercept)    1.0161174  10.5235867  0.0966 0.9239531    
## INCOME         0.0803319   0.0091156  8.8126 1.142e-08 ***
## DUMMY        152.4785526  33.1936700  4.5936 0.0001415 ***
## INCOME:DUMMY  -0.0654694   0.0124153 -5.2733 2.725e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1


Como implementar essa estrutura se tivermos mais de uma variável explicativa?


Neste caso, precisaremos fazer a interação da dummy com todas as variáveis explicativas!


Exemplo em R


Vamos estudar os determinantes do preço de casas em uma amostra de dados cross-section.


Variável Descrição Unidade
price Preço de venda da casa $1.000s
assess Valor avaliado (para fins de imposto) $1.000s
bdrms Número de quartos unidades
lotsize Tamanho do lote pés quadrados
sqrft Área construída da casa pés quadrados
colonial Dummy: 1 se o estilo da casa é colonial, 0 caso contrário binária


data(hprice1)
modelo_1 <- lm(log(price) ~ log(bdrms) + log(lotsize) + log(sqrft), data = hprice1)
coeftest(modelo_1, vcov = vcovHC(modelo_1, type = "HC1"))
## 
## t test of coefficients:
## 
##               Estimate Std. Error t value  Pr(>|t|)    
## (Intercept)  -1.428817   0.771762 -1.8514   0.06763 .  
## log(bdrms)    0.099245   0.115959  0.8559   0.39451    
## log(lotsize)  0.169537   0.041141  4.1209 8.811e-05 ***
## log(sqrft)    0.716869   0.106258  6.7465 1.815e-09 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Modelo com interação:

modelo_2 <- lm(log(price) ~ colonial*(log(bdrms) + log(lotsize) + log(sqrft)), data = hprice1)

modelo_2
## 
## Call:
## lm(formula = log(price) ~ colonial * (log(bdrms) + log(lotsize) + 
##     log(sqrft)), data = hprice1)
## 
## Coefficients:
##           (Intercept)               colonial             log(bdrms)  
##              -0.99626               -0.78167               -0.11328  
##          log(lotsize)             log(sqrft)    colonial:log(bdrms)  
##               0.12380                0.74051                0.23989  
## colonial:log(lotsize)    colonial:log(sqrft)  
##               0.07285               -0.01210
coeftest(modelo_2, vcov = vcovHC(modelo_2, type = "HC1"))
## 
## t test of coefficients:
## 
##                        Estimate Std. Error t value  Pr(>|t|)    
## (Intercept)           -0.996263   1.491176 -0.6681   0.50599    
## colonial              -0.781667   1.758422 -0.4445   0.65786    
## log(bdrms)            -0.113278   0.207231 -0.5466   0.58616    
## log(lotsize)           0.123803   0.062216  1.9899   0.05002 .  
## log(sqrft)             0.740513   0.167787  4.4134 3.148e-05 ***
## colonial:log(bdrms)    0.239887   0.257629  0.9311   0.35459    
## colonial:log(lotsize)  0.072852   0.102029  0.7140   0.47729    
## colonial:log(sqrft)   -0.012103   0.225493 -0.0537   0.95733    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1


Dummies na Análise Sazonal (Gujarati, seção 9.7)


Em séries temporais, muitas vezes os fenômenos apresentam sazonalidade.

No âmbito da Econometria, a sazonalidade refere-se a padrões de flutuação repetitivos e previsíveis em uma série temporal, que ocorrem em períodos fixos e conhecidos, geralmente dentro de um ano. Esses padrões são influenciados por fatores relacionados à época do ano, meses, trimestres, dias da semana, ou até mesmo feriados e eventos culturais.

  1. Periodicidade Fixa e Conhecida: A principal característica da sazonalidade é que ela se repete em intervalos regulares. Por exemplo:

    • Mensal: As vendas no varejo tendem a aumentar em dezembro (Natal) e diminuir em janeiro.

    • Trimestral: O consumo de energia elétrica pode ser maior nos trimestres de verão devido ao uso de ar-condicionado.

    • Semanal: O tráfego em rodovias pode ser maior nos fins de semana.

    • Diária: O uso de transporte público pode ter picos nas horas de rush (manhã e fim de tarde).

  2. Causas Determinísticas: A sazonalidade é geralmente causada por fatores externos sistemáticos, como:

    • Condições Climáticas: (Verão, inverno, estações chuvosas/secas).
    • Calendário: (Feriados, datas comemorativas, início/fim de anos letivos).
    • Hábitos Sociais/Culturais: (Férias, temporadas de compras, eventos esportivos).
    • Regulamentações Legais/Institucionais: (Período de declaração de imposto de renda, fechamento de balanços).

Gráficos de séries sazonais


  • Usamos 11 dummies mensais para representar efeitos sazonais (dezembro é referência):

\[ y_t = \beta_0 + \sum_{j=1}^{11} \delta_j D_{j,t} + u_t \]

Exemplo com dados sazonais (fictício)

set.seed(123)
meses <- rep(1:12, 5)
volume <- 100 + 10*sin(2*pi*meses/12) + rnorm(60,0,5)
data <- data.frame(mes = factor(meses), volume = volume)
head(data)
##   mes   volume
## 1   1 102.1976
## 2   2 107.5094
## 3   3 117.7935
## 4   4 109.0128
## 5   5 105.6464
## 6   6 108.5753


No exemplo acima, criamos as dummies usando o comando factor, mas podemos criar uma coluna para cada dummy (dá na mesma).

library(fastDummies)
## Thank you for using fastDummies!
## To acknowledge our work, please cite the package:
## Kaplan, J. & Schlegel, B. (2023). fastDummies: Fast Creation of Dummy (Binary) Columns and Rows from Categorical Variables. Version 1.7.1. URL: https://github.com/jacobkap/fastDummies, https://jacobkap.github.io/fastDummies/.
# Crie um vetor com os nomes abreviados dos meses para renomear as dummies
nomes_meses_abreviados <- c("Jan", "Fev", "Mar", "Abr", "Mai", "Jun", "Jul", "Ago", "Set", "Out", "Nov", "Dez")
data <- data %>%
  dummy_cols(
    select_columns = "mes",          # Coluna para criar dummies
    remove_first_dummy = FALSE,      # Queremos dummies para todos os meses (12 no total)
    remove_selected_columns = FALSE   # Remove a coluna 'mes_fator' original
  ) %>%
  # Agora, renomeie as novas colunas com os nomes dos meses
  rename_with(~ paste0(nomes_meses_abreviados), .cols = starts_with("mes_"))

head(data,12)
##    mes    volume Jan Fev Mar Abr Mai Jun Jul Ago Set Out Nov Dez
## 1    1 102.19762   1   0   0   0   0   0   0   0   0   0   0   0
## 2    2 107.50937   0   1   0   0   0   0   0   0   0   0   0   0
## 3    3 117.79354   0   0   1   0   0   0   0   0   0   0   0   0
## 4    4 109.01280   0   0   0   1   0   0   0   0   0   0   0   0
## 5    5 105.64644   0   0   0   0   1   0   0   0   0   0   0   0
## 6    6 108.57532   0   0   0   0   0   1   0   0   0   0   0   0
## 7    7  97.30458   0   0   0   0   0   0   1   0   0   0   0   0
## 8    8  85.01444   0   0   0   0   0   0   0   1   0   0   0   0
## 9    9  86.56574   0   0   0   0   0   0   0   0   1   0   0   0
## 10  10  89.11144   0   0   0   0   0   0   0   0   0   1   0   0
## 11  11 101.12041   0   0   0   0   0   0   0   0   0   0   1   0
## 12  12 101.79907   0   0   0   0   0   0   0   0   0   0   0   1


modelo_sazonal <- lm(volume ~ mes, data = data)
summary(modelo_sazonal)
## 
## Call:
## lm(formula = volume ~ mes, data = data)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -11.9960  -3.3262   0.3396   3.3548   9.1923 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  105.549      2.164  48.769  < 2e-16 ***
## mes2           1.160      3.061   0.379 0.706449    
## mes3           6.239      3.061   2.038 0.047044 *  
## mes4           4.713      3.061   1.540 0.130178    
## mes5          -1.798      3.061  -0.587 0.559723    
## mes6          -3.386      3.061  -1.106 0.274096    
## mes7         -10.452      3.061  -3.415 0.001307 ** 
## mes8         -12.557      3.061  -4.103 0.000157 ***
## mes9         -16.749      3.061  -5.472 1.59e-06 ***
## mes10        -14.533      3.061  -4.748 1.89e-05 ***
## mes11         -9.809      3.061  -3.205 0.002405 ** 
## mes12         -5.480      3.061  -1.791 0.079679 .  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 4.839 on 48 degrees of freedom
## Multiple R-squared:  0.7385, Adjusted R-squared:  0.6786 
## F-statistic: 12.32 on 11 and 48 DF,  p-value: 1.434e-10


Esses efeitos podem ser representados graficamente: