Introdução

O objetivo deste trabalho é construir, interpretar e avaliar um modelo de regressão linear simples de maneira detalhada utilizando a linguagem R. O algoritmo de regressão linear é muito utilizado quando se quer medir o efeito de uma variável contínua sobre outra variável contínua, mais a frente detalharemos o algoritmo de regressão e seus pressupostos para criarmos um modelo que represente o conjunto de dados e que seja capaz de realizar predições.

Iremos utilizar o conjunto de dados “Orange” que já vem pré-instalado no R e pode ser carregado diretamente pelo usuário.

O conjunto de dados Orange possuí 35 linhas e 3 colunas contendo registros sobre o crescimento de laranjeiras, abaixo breve descrição sobre suas colunas:

Nosso objetivo é verificar se podemos criar um modelo preditivo capaz de prever a circunferência da árvore com base na sua idade.

Coletando os dados

head(Orange)

Vamos eliminar a variável “Tree” e visualizar a estrutura das colunas restantes que utilizaremos para o modelo.

cols <- c(colnames(Orange[-1]))

Orange <- Orange[,cols]
str(Orange)
## Classes 'nfnGroupedData', 'nfGroupedData', 'groupedData' and 'data.frame':   35 obs. of  2 variables:
##  $ age          : num  118 484 664 1004 1231 ...
##  $ circumference: num  30 58 87 115 120 142 145 33 69 111 ...

Análise Exploratória

Vamos realizar uma breve análise exploratória para visualizar algumas característica relevantes dos dados.

Com o histograma podemos ver a distribuição de frequência dos dados

par(mfrow = c(1,2), mar = c(4,4,4,4))
hist(x = Orange$age, xlab = "Idade", ylab = "Frequência", col = "gray")
hist(x = Orange$circumference, xlab = "Circunferência", ylab = "Frequência", col = "red")

O comando abaixo nos mostra um pouco mais sobre a distribuição dos dados e seus valores interquartis.

summary(Orange)
##       age         circumference  
##  Min.   : 118.0   Min.   : 30.0  
##  1st Qu.: 484.0   1st Qu.: 65.5  
##  Median :1004.0   Median :115.0  
##  Mean   : 922.1   Mean   :115.9  
##  3rd Qu.:1372.0   3rd Qu.:161.5  
##  Max.   :1582.0   Max.   :214.0

Vamos agora observar os possíveis outliers (pontos extremos) no nosso conjunto de dados.

boxplot(Orange$age, Orange$circumference, names = c('Idade', 'Circunferência'), 
        col = c('gray', 'red'), main = 'Boxplot')

Não há outliers no nosso conjunto de dados, mas se eles existissem deveríamos dar uma atenção especial á eles, nos perguntando se representam o nosso conjunto de dados e devem fazer parte do modelo ou se são valores pertencentes a outro grupo, por exemplo, a circunferência medida de outro tipo de árvore que não é uma laranjeira ou algum erro no conjunto de dados. Devemos analisar o outlier e decidir a melhor forma de tratá-lo para que não prejudique a criação do modelo preditivo.

Outro ponto importante que podemos facilmente ver no boxplot é que os dados não estão na mesma escala, isso pode gerar problemas na precisão do modelo de regressão linear, principalmente se estivermos trabalhando com regressão múltipla. Como estamos trabalhando com regressão simples isso não será um problema para o nosso trabalho.

Criação do Modelo

A regressão linear é uma técnica que gera uma equação para descrever a relação estatística entre uma ou mais variáveis preditoras e a variável target. O algoritmo encontra a linha que melhor representa a relação entre as variáveis preditoras com a variável target (que queremos prever).

Sabendo que as variáveis preditoras são as variáveis independentes, ou seja, a que iremos utilizar para treinar o modelo de regressão, e a variável target é a variável dependente, ou seja, a variável de interesse que queremos encontrar.

A regressão linear pode ser:

Simples: y = a + bx (possui apenas uma variável preditora) ou Múltipla: y = a + b0x0 + b1x1 (possui uma ou mais variáveis preditoras)

Onde “a”" é o ponto em que a linha intercepta o eixo y e “b”" é o coeficiente angular da reta para cada variável preditora.

Utilizamos a função nativa do R para criar o modelo de regressão. Lembrando que nosso objetivo é verificar se podemos prever a circunferência do tronco de uma laranjeira utilizando a sua idade para criar um modelo preditivo com regressão linear.

#passamos para o modelo a variável "circumference" como variável target e a "age" como variável preditora
modelo <- lm(Orange$circumference ~ Orange$age)

Resumo do modelo:

summary(modelo)
## 
## Call:
## lm(formula = Orange$circumference ~ Orange$age)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -46.310 -14.946  -0.076  19.697  45.111 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 17.399650   8.622660   2.018   0.0518 .  
## Orange$age   0.106770   0.008277  12.900 1.93e-14 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 23.74 on 33 degrees of freedom
## Multiple R-squared:  0.8345, Adjusted R-squared:  0.8295 
## F-statistic: 166.4 on 1 and 33 DF,  p-value: 1.931e-14

Interpretação do Modelo

A função summary faz um resumo do modelo, irei detalhar as informações do summary e depois avaliaremos se o nosso modelo é adequado para realizar predições.

Intercept: é o ponto onde a linha cruza o eixo y, ou o valor de “a” na equação de regressão.

“Orange$age”: é o coeficiente angular da equação de regressão, ou “b” na equação de regressão (o nome que aparece na linha é o mesmo da variável preditora).

A coluna Std. Error é o erro padrão, uma medida de variabilidade na estimativa do coeficiente angular “a”, idealmente este valor deve ser menor que o do coeficiente.

A coluna t value possui valores que são usados para calcular o p-value e os níveis de significância, eles definem a significância do coeficiente da variável considerada.

A coluna Pr(>|t|) é o p-value do teste t, o p-value representa a probabilidade que a variável não seja relevante para o modelo, normalmente utiliza-se: p-valor < 0,05, a correlação entre as duas variáveis é significativa, p-valor > 0,05, a correlação entre as duas variáveis não é significativa.

Os símbolos apresentados do lado direito do p-value mostram para qual significância os coeficientes são significativos, quanto mais asteriscos, maior a significância de acordo com o p-value, ou seja, quanto mais asteriscos maior a probabilidade de existir relacionamento entre as variáveis.

A linha Signif. codes mostra os códigos utilizados para a significância, do mais significante (3 asteriscos) ao menos significante (espaço vazio).

Como garantir que o modelo de regressão é adequado?

Após realizarmos a regressão linear, devemos avaliar o modelo para garantir que os dados utilizados são adequados, que o modelo consegue representar os dados e principalmente devemos garantir que o modelo seja generalizável, ou seja, ser capaz de realizar predições para novos dados.

Alguns pontos devem ser avaliados se quisermos garantir a precisão do modelo, o método dos mínimos quadrados nos fornece algumas diretrizes. Vamos avaliar o nosso modelo com os seguintes critérios:

1 - Significância

2 - Linearidade

3 - Homocedasticidade dos resíudos (Variância constante dos erros experimentais)

4 - Normalidade dos resíduos

Avaliação do Modelo

1 - Significância

Significância é representada pelo p-value e conforme explicado acima, o p-value representa a probabilidade que a variável não seja relevante para o modelo, vamos utilizar a análise de variância (ANOVA) para visualizarmos o p value. Podemos ver que nosso p-value (Pr(>F)) é quase nulo e tem um valor menor que 0,05, ou seja, a relação entre as duas variáveis é significativa.

anova(modelo)

2 - Linearidade

A linearidade indica o grau de associação entre as variáveis testadas e pode ser representada pelo coeficiente de determinação R², vamos utilizar o comando “cor” nativo do R.

cor(Orange)
##                     age circumference
## age           1.0000000     0.9135189
## circumference 0.9135189     1.0000000

Podemos ver que existe uma correlação de 0,91 (muito forte) entre as variáveis, normalmente utilizamos essa regra para avaliar os coeficientes de correlação:

#Quanto maior for a correlação linear entre as variáveis, mais o gráfico de dispersão irá se parecer com uma reta
plot(x = Orange$age, y = Orange$circumference,xlab = 'Idade',ylab = 'Circunferência', pch = 19, main = 'Gráfico de Dispersão')

A linearidade também é representada pelo “R-squared e Adjusted R-squared” no commando summary do modelo que realizamos acima. Quanto maior o coeficiente de determinação (R), maior a representatividade da variável x para predizer o comportamento da variável y.

3 - Homocedasticidade dos resíduos

Podemos avaliar graficamente a hipótese da variância constante (homocedasticidade dos resíduos), criando um gráfico dos valores previstos e dos resíduos de cada previsão, os resíduos não devem apresentar nenhum padrão ou tendência.

plot(rstudent(modelo) ~ fitted(modelo), pch = 19)
abline(h = 0, lty = 2, col = "red")

Com base nesse gráfico podemos observar que os residuos se distribuem de maneira aleatória ao redor dos valores previstos, fazendo com que nosso modelo passe nesse critério de avaliação.

É interessante também verificarmos os resíduos para cada uma das variáveis que estamos trabalhando.

plot(x = Orange$circumference,y = modelo$residuals, col = 'gray',pch = 19,
     xlab = 'Circunferência', ylab = "Resíduos")

De maneira análoga ao anterior, não identificamos nenhum padrão nos resíduos.

4 - Normalidade dos Resíduos

Um modelo de regressão linear deve apresentar também normalidade dos resíduos, ou seja, a distribuição dos resíduos deve se aproximar de uma distribuição normal. Primeiro vamos plotar os resíduos num gráfico e verificarmos se ele se parece com uma distribuição normal.

hist(x = modelo$residuals, col = 'gray', xlab = 'Resíduos', ylab = 'Densidade de Probabilidade',
     probability = TRUE) 
lines(density(modelo$residuals))

Podemos ver pelo histograma que os resíduos não indicam nenhuma assimetria e possuem a aparência de uma curva normal.

Outro forma de verificar a normalidade dos resíduos é pelo teste de Shapiro-Wilk, que tem como objetivo avaliar se uma amostra tem distribuição normal.

shapiro.test(modelo$residuals)
## 
##  Shapiro-Wilk normality test
## 
## data:  modelo$residuals
## W = 0.97289, p-value = 0.5273

A hipótese nula do teste de Shapiro-Wil é de que os dados vem de uma distribuição normal, então para um nível de significância de 5%, se o resultado do p-value no teste for menor que 0,05, indica que rejeitamos a hipótese nula e que a amostra não vem de uma distribuição normal.

Concluímos que para um nível de significância de 5%, nossos dados possuem uma distribuição normal.

Conclusão

A avaliação do modelo demonstrou que todos os critérios estabelecidos pelo métodos dos mínimos quadrados foram atendidos, e que o modelo será capaz de realizar previsões para novos dados.

Cumprimos os objetivos do trabalho que era construir, interpretar e avaliar um modelo de regressão linear com a linguagem R, essas mesmas regras podem ser utilizadas para outros conjuntos de dados ou para qualquer problema que envolva previsões com variáveis contínuas.

A precisão do modelo e as métricas de avaliação sempre devem parametrizadas pelas definições do problema de negócio que estivermos trabalhando. Muitas vezes os dados deverão sofrer diversas transformações antes de serem alimentados no algoritmo, podemos também ver a necessidade de obter mais dados ou utilizar outros algoritmos, pois a regressão linear é um entre dezenas de algoritmos capazes de realizar esse tipo de previsão. É por isso que todas as nossas decisões no processo de análise devem ser guiadas pelo objetivo que estamos tentando alcançar.

Referências

https://www.datascienceacademy.com.br