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:
Tree - fatores ordenados indicando a árvore na qual a medição foi realizada.
Age - observações numéricas com a idade da árvore (dias desde 31/12/1968 e a data que foi realizada a coleta dos dados)
Circumference - observações numéricas com a circunferência do tronco (mm). Esta é provavelmente o diâmetro “at breast height (DBH)”, que é uma medida padrão para medir árvores e refere-se ao diâmetro da árvore medido a 4,5 pés acima do solo.
Nosso objetivo é verificar se podemos criar um modelo preditivo capaz de prever a circunferência da árvore com base na sua idade.
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 ...
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.
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
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.
Call: informações sobre função que foi criada, mostra as variáveis que foram utilizadas.
Residuals: informações sobre os resíduos do modelo, mostra o resíduo mínimo, máximo, 1º quartil, 3º quartil e a mediana. O resíduo é a diferença entre o valor previsto e o valor real, um modelo adequado possui resíduos com distribuição normal e média dos resíduos próximo de zero.
Coeficients: A coluna Estimate contém os coeficientes que formam a equação gerada pelo modelo onde:
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).
Residual Standar Error: representa o desvio padrão dos resíduos.
Degrees of Freddom: diferença entre o número de observações da amostra e o número de variáveis no modelo.
Multiple R-squared e Adjusted R-squared: definem a representatividade da variável x para prever a variável y, quanto maior melhor.
F-statistics: É um teste que compara o desempenho de um modelo com mais parâmetros (variáveis preditoras) com um modelo com menos parâmetros. O p-value será alto se o modelo com menos parâmetros tiver desempenho melhor que um modelo com mais parâmetros e o p-value será mais baixo se o seu modelo com mais parâmetros tiver um desempenho melhor que um modelo com menos parâmetros. Em geral um modelo com mais parâmetros tem um desempenho melhor.
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
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)
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.
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.
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.
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.