Artigo escrito com a colaboração de Carolina Barcelos

A análise de regressão tem por objetivo desvendar o comportamento entre uma variável dependente (resposta) e as consideradas independentes (explicativas).

Análise de Regressão Simples

A análise de regressão linear simples é responsável por avaliar a relação linear entre duas variáveis, sendo uma resposta e uma explicativa (um preditor). Quando é realizada a comparação das duas variáveis, é possível prever um valor de resposta com uma precisão maior que o simples acaso.

Na regressão linear simples, a relação entre duas variáveis pode ser representada por uma linha reta, criando uma relação direta de causa e efeito. Assim, será possível prever os valores de uma variável dependente com base nos resultados da variável independente.

É estabelecida uma equação

equação de análise de regressão simples

Onde

  • Y é a variável dependente (resposta);
  • X é a variável independente (explicativa);
  • β0 é o intercepto em Y. É o valor esperado de Y quando X = 0;
  • β1 é a inclinação (taxa de mudança). É o aumento esperado em Y quando X aumenta uma unidade;
  • E é um erro aleatório, onde se procuram incluir todas as influências no comportamento da variável Y que não podem ser explicadas linearmente pelo comportamento da variável X. E ∼ N (0, σ2).

Exemplo

Estamos interessados em saber se o índice de desemprego de um município determina (explica, prediz, interfere no) nível de criminalidade (roubo/furto) do município? Ou seja, se quanto maior os índices de desemprego de um município, maior a taxa de criminalidade.

Análise de Regressão Múltipla

Muitas vezes uma única variável explicativa (preditora) não será capaz de explicar tudo a respeito da variável resposta. Se em vez de uma, forem incorporadas várias variáveis independentes, passa-se a ter uma análise de regressão linear múltipla.

Nesse caso, a equação estabelecida é

equação análise de regressão múltipla

Onde

  • Y é a variável dependente (resposta);
  • X1, …, Xk são as variáveis independentes (explicativas);
  • β0, …, βk são os parâmetros desconhecidos do modelo (a estimar). β0 é o valor esperado de Y quando todas variáveis são iguais a zero. Determinado βj (j diferente de 0) representa a variação no Y quando Xj aumenta em uma unidade (mantendo constantes todos Xi com exceção do Xj). Se βj > 0, Y aumenta e se βj < 0, Y diminui;
  • E é um erro aleatório, onde se procuram incluir todas as influências no comportamento da variável Y que não podem ser explicadas linearmente pelo comportamento das variáveis X1, …, Xk. E ∼ N (0, σ2).

Exemplo

Pretendemos determinar se a taxa de criminalidade de um município pode ser medida em função do índice de desemprego e do índice de escolaridade.

Aplicação no R

  • Leitura dos pacotes que serão necessários
library(dplyr)     #manipulação de dados
library(openxlsx)  #leitura dos dados em uma planilha excel
library(corrgram)  #correlograma

Modelo de Regressão Linear Simples

Para o nosso exemplo de regressão linear simples, usaremos o conjunto de dados “cars”. Ele é composto por 50 observações da velocidade de diferentes carros da década de 20 e da respectiva distância alcançada pelo carros durante o experimento.

dados <- cars
names(dados)
## [1] "speed" "dist"
  • Alterando o nome das variáveis para o português
dados <- dados %>% rename(Velocidade = speed, Distancia = dist)
head(dados)
##   Velocidade Distancia
## 1          4         2
## 2          4        10
## 3          7         4
## 4          7        22
## 5          8        16
## 6          9        10
  • Analisando o comportamento dos dados
summary(dados)
##    Velocidade     Distancia     
##  Min.   : 4.0   Min.   :  2.00  
##  1st Qu.:12.0   1st Qu.: 26.00  
##  Median :15.0   Median : 36.00  
##  Mean   :15.4   Mean   : 42.98  
##  3rd Qu.:19.0   3rd Qu.: 56.00  
##  Max.   :25.0   Max.   :120.00

Se queremos um modelo, é esperado que a variável resposta e a preditora possuam uma boa correlação entre si. Para isso, plotamos os valores de velocidade contra as distâncias:

plot(x = dados$Velocidade, 
     y = dados$Distancia,
     xlab = "Velocidade (mph)", 
     ylab = "Distancia (ft)",
     pch = 16)
gráfico de distância por velocidade

O gráfico acima apresenta uma boa relação entre a velocidade do carro e a distância percorrida por eles no experimento.

cor.test(dados$Velocidade, dados$Distancia)
## 
##  Pearson's product-moment correlation
## 
## data:  dados$Velocidade and dados$Distancia
## t = 9.464, df = 48, p-value = 1.49e-12
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.6816422 0.8862036
## sample estimates:
##       cor 
## 0.8068949

O coeficiente de correlação de pearson concorda com o gráfico, obtendo um valor igual a 0,81.

  • Construção do modelo linear
modelo_simples = lm(dados$Distancia ~ dados$Velocidade)
summary(modelo_simples)
## 
## Call:
## lm(formula = dados$Distancia ~ dados$Velocidade)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -29.069  -9.525  -2.272   9.215  43.201 
## 
## Coefficients:
##                  Estimate Std. Error t value Pr(>|t|)    
## (Intercept)      -17.5791     6.7584  -2.601   0.0123 *  
## dados$Velocidade   3.9324     0.4155   9.464 1.49e-12 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 15.38 on 48 degrees of freedom
## Multiple R-squared:  0.6511, Adjusted R-squared:  0.6438 
## F-statistic: 89.57 on 1 and 48 DF,  p-value: 1.49e-12

Com base nas informações acima, podemos afirmar que o modelo é estatisticamente significante (valor-p<0,05), ou seja, a cada aumento em uma unidade na velocidade, espera-se um aumento em 3,93 na distância.

Distância = – 17,58 + 3,93 * Velocidade

O intercepto não tem interpretação prática.

O coeficiente de determinação (R2) foi de 0,6511, indicando que 65,11% da variabilidade dos dados é explicada pelo modelo.

  • Verificando a adequação do modelo

Gráfico dos resíduos versus valores ajustados: verifica a homoscedasticidade do modelo, isto é, σ2 constante.

plot(modelo_simples,1) #O ideal é que os pontos estejam distribuídos em torno de uma média 0.

Teste de Breusch-Pagan e Goldfeld-Quandt

H0: os resíduos são homoscedásticos.

H1: os resíduos não são homoscedásticos.

lmtest::bptest(modelo_simples)
## 
##  studentized Breusch-Pagan test
## 
## data:  modelo_simples
## BP = 3.2149, df = 1, p-value = 0.07297

Como o valor-p 0,073 foi maior do que 5% de significância, temos a não rejeição de H0. Assim, a suposição de homocedasticidade foi atendida.

Gráfico dos resíduos versus a ordem de coleta dos dados: avaliar a hipótese de independência dos dados

Teste de Durbin-Watson

H0: os valores dos resíduos do modelo são independentes.

H1: os resíduos são autocorrelacionados.

car::durbinWatsonTest(modelo_simples)
##  lag Autocorrelation D-W Statistic p-value
##    1       0.1604322      1.676225   0.188
##  Alternative hypothesis: rho != 0

Como o valor p 0,202 foi maior do que 5% de significância, temos a não rejeição de H0. Assim, a suposição de independência foi atendida.

Papel de probabilidade normal: verificar a normalidade dos dados.

plot(modelo_simples, 2)  #O ideal é que os pontos estejam próximos da linha tracejada.

Teste de Shapiro-Wilk

H0: a distribuição Normal modela adequadamente os resíduos do modelo.

H1: a distribuição Normal não modela adequadamente os resíduos do modelo.

shapiro.test(modelo_simples$residuals)
## 
##  Shapiro-Wilk normality test
## 
## data:  modelo_simples$residuals
## W = 0.94509, p-value = 0.02152

Como o valor-p 0,022 foi menor do que 5% de significância, temos a rejeição de H0. Assim, a suposição de normalidade não foi atendida.

Nesse caso, temos que os erros padrões não estão corretos, o que implica em valores-p incorretos. Uma possível solução para isso seria utilizar erros padrões robustos, mas se o interesse for apenas nas estimativas, por exemplo, o modelo está adequado para uso, uma vez que a condição de homocedasticidade e independência foram atendidas.

Vale ressaltar que se existe normalidade, automaticamente existe homocedasticidade, mas o contrário não é válido!

Modelo de Regressão Linear Múltipla

Para o nosso exemplo de regressão linear múltipla, usaremos uma amostra aleatória do conjunto de dados da TRAVEL, uma empresa de transporte independente no sul da Califórnia, onde grande parte dos negócios envolve entregas em toda a sua área local.

O banco de dados é composto por 10 observações referentes à distância (número de milhas percorridas nas entregas), ao número de entregas e ao tempo total de viagem diário (em horas) de diferentes entregadores da empresa.

df <- read.xlsx("dados_multipla.xlsx", startRow = 1)
df
##    Entregador Distancia Entregas Tempo
## 1           1       100        4   9.3
## 2           2        50        3   4.8
## 3           3       100        4   8.9
## 4           4       100        2   6.5
## 5           5        50        2   4.2
## 6           6        80        2   6.2
## 7           7        75        3   7.4
## 8           8        65        4   6.0
## 9           9        90        3   7.6
## 10         10        90        2   6.1
  • Analisando o comportamento dos dados
summary(df)
##    Entregador      Distancia        Entregas        Tempo      
##  Min.   : 1.00   Min.   : 50.0   Min.   :2.00   Min.   :4.200  
##  1st Qu.: 3.25   1st Qu.: 67.5   1st Qu.:2.00   1st Qu.:6.025  
##  Median : 5.50   Median : 85.0   Median :3.00   Median :6.350  
##  Mean   : 5.50   Mean   : 80.0   Mean   :2.90   Mean   :6.700  
##  3rd Qu.: 7.75   3rd Qu.: 97.5   3rd Qu.:3.75   3rd Qu.:7.550  
##  Max.   :10.00   Max.   :100.0   Max.   :4.00   Max.   :9.300

Se queremos um modelo, é esperado que a variável resposta e as preditoras possuam uma boa correlação entre si. Para isso, plotamos um correlograma das variáveis de interesse:

x <- df[,-1]     #excluindo a coluna "Entregador"

corrgram(x, 
         #upper.panel=panel.cor,
         upper.panel=panel.conf,
         cex.labels=1.5, cex=1.2)

O gráfico acima apresenta uma boa relação entre o tempo e a distância (r = 0,81), bem como entre o tempo e o número de entregas (r = 0,62).

  • Construção do modelo linear
modelo_multipla = lm(Tempo ~ Distancia + Entregas, data = df)
summary(modelo_multipla)
## 
## Call:
## lm(formula = Tempo ~ Distancia + Entregas, data = df)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.79875 -0.32477  0.06333  0.29739  0.91333 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -0.868701   0.951548  -0.913 0.391634    
## Distancia    0.061135   0.009888   6.182 0.000453 ***
## Entregas     0.923425   0.221113   4.176 0.004157 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.5731 on 7 degrees of freedom
## Multiple R-squared:  0.9038, Adjusted R-squared:  0.8763 
## F-statistic: 32.88 on 2 and 7 DF,  p-value: 0.0002762

Com base nas informações acima, podemos afirmar que tanto a distância, quanto o número de entregas são estatisticamente significantes no modelo (valor-p<0,05).

Quando o número de entregas é mantido constante, 0,06 horas é uma estimativa do aumento esperado no tempo de viagem, quando ha um aumento de uma milha na distância percorrida.

Da mesma forma, quando a distância é mantida constante, 0,92 horas é uma estimativa do aumento esperado no tempo de viagem, quando ha um aumento de uma entrega.

Tempo = – 0,87 + 0,06 * Distância + 0,92 * Entregas

O intercepto não tem interpretação prática.

O coeficiente de determinação ajustado (R2 ajustado) foi de 0,8763, indicando que 87,63% da variabilidade dos dados é explicada pelo modelo. Ressalta-se que para modelos de regressão que contêm diferentes números de preditores, utiliza-se o coeficiente de determinação ajustado, que é uma versão modificada do coeficiente de determinação, que foi ajustada para o número de preditores no modelo. O R2 ajustado aumenta somente se o novo termo melhorar o modelo mais do que seria esperado pelo acaso. Ele diminui quando um preditor melhora o modelo menos do que o esperado por acaso. O R2 ajustado é sempre menor que o R2.

  • Verificando a adequação do modelo

Gráfico dos resíduos versus valores ajustados: verifica a homoscedasticidade do modelo, isto é, σ2 constante.

plot(modelo_multipla,1) #O ideal é que os pontos estejam distribuídos em torno de uma média 0.

Teste de Breusch-Pagan e Goldfeld-Quandt

H0: os resíduos são homoscedásticos.

H1: os resíduos não são homoscedásticos.

lmtest::bptest(modelo_multipla)
## 
##  studentized Breusch-Pagan test
## 
## data:  modelo_multipla
## BP = 0.36899, df = 2, p-value = 0.8315

Como o valor-p 0,832 foi maior do que 5% de significância, temos a não rejeição de H0. Assim, a suposição de homocedasticidade foi atendida.

Gráfico dos resíduos versus a ordem de coleta dos dados: avaliar a hipótese de independência dos dados

plot(modelo_multipla$residuals) #espera-se que os pontos estejam distribuídos de forma aleatória.

Teste de Durbin-Watson

H0: os valores dos resíduos do modelo são independentes.

H1: os resíduos são autocorrelacionados.

car::durbinWatsonTest(modelo_multipla)
##  lag Autocorrelation D-W Statistic p-value
##    1       -0.317467      2.515204   0.392
##  Alternative hypothesis: rho != 0

Como o valor p 0,39 foi maior do que 5% de significância, temos a não rejeição de H0. Assim, a suposição de independência foi atendida.

Papel de probabilidade normal: verificar a normalidade dos dados.

plot(modelo_multipla, 2)  #O ideal é que os pontos estejam próximos da linha tracejada.

Teste de Shapiro-Wilk

H0: a distribuição Normal modela adequadamente os resíduos do modelo.

H1: a distribuição Normal não modela adequadamente os resíduos do modelo.

shapiro.test(modelo_multipla$residuals)
## 
##  Shapiro-Wilk normality test
## 
## data:  modelo_multipla$residuals
## W = 0.97848, p-value = 0.9565

Como o valor-p 0,957 foi maior do que 5% de significância, temos a não rejeição de H0. Assim, a suposição de normalidade foi atendida.

Curiosidade

A Regressão Linear é uma das técnicas mais utilizadas em Aprendizagem de Máquina!

Curtiu o nosso conteúdo? Siga-nos nas redes sociais para ficar por dentro de toda as novidades do blog! Estamos no Linkedin, Instagram e Facebook.

0 respostas

Deixe uma resposta

Quer participar dessa discussão?
Sinta-se livre para contribuir!

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *