Regressão Linear

Linguagem R



Regressão Linear



Em estatística ou econometria, **regressão linear** é uma equação para se estimar a condicional (valor esperado) de uma variável y, dado os valores de algumas outras variáveis x.
A regressão linear é chamada "linear" porque a relação da resposta às variáveis é uma função linear de alguns parâmetros. Os modelos de regressão que não são uma função linear dos parâmetros se chamam modelos de regressão não-linear. Sendo uma das primeiras formas de análise regressiva a ser estudada rigorosamente, é usada extensamente em aplicações práticas. Isso acontece porque modelos que dependem de forma linear dos seus parâmetros desconhecidos, são mais fáceis de ajustar que os modelos não-lineares aos seus parâmetros, e porque as propriedades estatísticas dos estimadores resultantes são fáceis de determinar.
Modelos de regressão linear são frequentemente ajustados usando a abordagem dos mínimos quadrados, mas que também pode ser montada de outras maneiras, tal como minimizando a "falta de ajuste" em alguma outra norma (com menos desvios absolutos de regressão), ou através da minimização de uma penalização da versão dos mínimos quadrados. Por outro lado, a abordagem de mínimos quadrados pode ser utilizado para ajustar o modelos que não são modelos lineares. Assim, embora os termos "mínimos quadrados" e "modelo linear" estejam intimamente ligados, eles não são sinônimos.


Carregando Conjunto de Dados


Vamos utilizar um conjunto de dados, conhecido, para conseguirmos demonstrar na prática o que seria uma regreção linear. Iremos utilizar a função read.csv(), para carregar nosso conjunto de dados. Abaixo demonstraremos como carregar um conjunto de dados, lembrando que é preciso determinar alguns parâmetros, file ou path, caminho do diretório do arquivo em seu computador, header indica se o conjunto de dados tem ou não o nome das variáveis e como é um arquivo csv temos que demonstrar qual é o separador, nesse dataset é a vírgula.
Abaixo temos 02 exemplo, o primeiro, baixar o arquivo, e salva em seu computador. Ou Caso preferir pode utilizar a segunda opção que pega o arquivo direto do repositório do GitHub.

# Primeira Opção
df <- read.csv(file = 'C:/Users/Downloads/dados/kc_house_data.csv', header = TRUE, sep = ",")
df

Ou

# Segunda Opção
df <- read.csv(file = 'https://github.com/rodolffoterra/rodolffoterra.github.io/blob/main/dados/kc_house_data.csv', header = TRUE, sep = ",")
df

O nosso conjunto de dados é composto por 21 variáveis (tamanho da casa, quantidade de quartos, banheiros, entre outros) e o valor vendido da casa entre o período de Maio de 2014 a Maio de 2015, variável dependendo, ou seja, a variável que queremos que o nosso modelo nos apresente.


Ao se pensar no valor de uma casa, a primeira variável que podemos imaginar irá influenciar principalmenteno valor do imóvel seria a área da construção. Antes de criarmos uma regressão linear para identificar o valor da casa em relação a área construida, iremos construir um gráfico para visualisarmos a correlação entre estas duas variáveis.
Primeiramente precisamos carregar a biblioteca que irá construir nossos gráficos

library(ggplot2)
library(corrplot)
library(tidyverse)

Construindo o gráfico de correlação entre o valor da casa e a áre construida.

ggplot(df, aes(x= sqft_living, y =price/100000)) +
geom_point(color = 'lightblue') +
theme_classic() +
labs(title = "Correlação entre o Preço X Área de casa",
x = 'Área (sqfl)',
y = 'Preço')

Conforme podemos observar no eixo x, Área (sqfl) aumenta, o preço também tende a aumenta. Quanto usamos apenas uma única variável (Área da casa) para chegarmos no valor da variável dependente, ou seja o preço da casa, podemos criar uma regressão Linear Simples.


Regressão Linear Simples


Toda Regressão linear simples a variável X, ou seja uma única variável, tentará explicar a variação de y.

Então ao voltarmos para o nosso exemplo, é possível saber o valor de "a" (chamado intercepto) e também o valor de "b"" (que representa a inclinação da reta).

lm(price/100000 ~ sqft_living, data = df)
##   
##    Call:
##    lm(formula = price/1e+05 ~ sqft_living, data = df)
##   
##    Coeficients:
##    (Intercept)                      sqft_living
##           -0.436034                0.002806

conforme demonstrado em nosso conjunto de dados podemos afirmar que:

f(y)          =            ax           +     b
Valor_da_casa = -0.002806 x sqft_living - 0.436034

Lembramos que o peço da casa está divido por 105, como exemplo uma casa que tenha 5000 sqft custará um valor de R$ 135.996,60. Vejamos o nosso código f(y) = 0.002806 * 5000 - 0.46034. Podemos demonstrar a regressão linear simples no gráfico para ficar mais fácil a compreensão.

ggplot(df, aes(x= sqft_living, y =price/100000)) +
geom_point(color = 'lightblue') +
geom_smooth(method = lm, size=0.5, se = FALSE,color = "red") +
theme_classic() +
labs(title = "Regressão linear Simples entre Preço e Área da Casa",
x = "Área (sqfl)",
y = "Preço")

Conforme podemos observar a equação acima, e o gráfico abaixo, esta equação representa exatamente a linha reta demonstrada em vermelho no gráfico abaixo.

Ao observar este pequeno exemplo, todos mundo sabe que o valor de uma casa não está somente relacionado a sua área de construção. Existe outras variáveis, que agregam valor no preço da casa. É o que passaremos a estudar nesse exata momento. Porém antes de acrescentarmos mais variáveis em nosso modelo gostaria de apresentar um outro gráfico, de correção entre as variávies.

Nesse gráfico temos diversas variáveis tais como:

  • Price: Preço da Casa
  • Bedrooms: Quantidade de quarta que a casa possui;
  • Bathrooms: Quantidade de banheiros que a casa possui;
  • sqft_living: Metragem quadrados da casa;
  • sqlt_lot: Metragem quadrada do lote;
  • floors: Quantidade de andares que a casa possui;
  • Waterfront: Se a casa possui vista para o mar;
  • View: Visualização da casa;
  • Condition: Condição geral da casa;
  • Grade: Classificação geral de atributos de unidade residual;
  • sqft_above: Metragem quadrada além do porão;
  • sqft_basement: metragem quadrada do basamento;
  • Construction_Time: Quantidade de Anos que a casa possui na data de venda

  • Todas as variáveis acima, exceto a Construction_Time estão representados com um circulo azul no gráfico. O motivo de estar com a coloração azul, significa que todas estas variáveis possui uma correlação positiva com o valor da casa, ou seja, quanto maior a área da casa, maios a quantidade de banheiros, maiores a quantidade de quartas, etc, correspende respectivamente um tendencia de aomento no valor da casa.
    Porém ai se falar em quantidade de anos que esta casa possui, quanto mais velha for a casa esperamos que tal variável, denter a reduzir o valor de venda da casa.

    Para conseguirmos demonstrar uma correlação negativa, podemos pegar duas variáveis, Quantidade de Banheiros em relação a quantidade de anos que a casa foi construida.

    ggplot(df_data, aes(x= Construction_Time, y =bathrooms)) +
    geom_point(color = 'lightblue') +
    theme_classic() +
    geom_smooth(method = lm, size=0.5, se = FALSE,color = "red") +
    labs(title = "Correlação entre o Qunatidade de Banheiros X Quantidade de Anos que a casa foi construida",
    x = 'Qta de Anos',
    y = 'Quantidade de Banheiros')

    Esse gráfico nos mostra que as casa mais recentes possui uma tendência de ter mais banheiro comparado com as casa mais velhas.


    Regressão Linear Múltipla


    Acima demostramos o que seria uma regressão linear simples, a variável X, ou seja uma única variável, tentará explicar a variação de y. A regressão linear múltipla, mais do que uma variável tenta explicar a variável y. Ou seja, em nosso modelo para conseguirmos chegar mais próximo ao valor real da casa, não basta apenas, basiarmos, na metragem da área, mas também na quantidade de quartos, quantidade de banheiros, tempo da casa, quantidade de andares, entre outras.

    Iremos agora testar o modelo, ou seja, o quanto é a variável explicativo de uma regressão linear simples apenas da área da casa em relação ao valor da casa?

    library(randomForest)
    model1 <- randomForest(price ~ sqft_living15,
    data = df_data,
    ntree = 40,
    nodesize = 5)
    print(model1)

    Ao criarmos uma regressão linear simples, utilizando apenas a área da casa para conseguirmos prever o valor da casa, o código acima está mostrando que somente a área consegue explicar 33,14% o valor da casa. Nesse artigo, não entraremos mais em detalhes no tema randomForest, falaremos um artigo somente desta ferrameta. O que é importante para este momento é saber que temos que usar mais variáveis para conseguirmos prever com o menor erro possível o valor da casa. Então utilimaremos 04 variáveis, e veremos a sua variável explicativa.

    model2 <- randomForest(price ~ sqft_living15 + yr_built + grade + bathrooms,
    data = df_data,
    ntree = 40,
    nodesize = 5)
    print(model2)

    Ao utilizar a área construida, ano de contsrução, classificação geral e quantidade de banheiros, a variável explicativa do modelo dobrou, para 66,42%.

    Abaixo teremos a equação de uma regressão linear múltipla

    lm(price/100000 ~ sqft_living15 + yr_built + grade + bathrooms, data = df_data)

    A Equação fica dessa seguinte forma:
    f(valor_casa) = 1.2182280(bathrooms) + 1.6780753(grade) -0.0467126(yr_built) + 0.0009584(sqft_living15) + 80.1427967

    Para finalizar construiremos um modelo com todas as variáveis em nosso conjunto de dados, para demonstrarmos que queremos todas as variáveis, utilizaremos no modelo a variável dependente a esquerda e um price ~ . a direita, o acento serve para seprarar as variáveis dependente das idependente.

    model3 <- randomForest(price ~ .,
    data = df_data,
    ntree = 40,
    nodesize = 5)
    print(model3)

    Podemos observar que o nosso terceiro modelo, usando todas as variáveis de nosso conjunto de dados, foi o modelo que mais conseguiu explicar a variação do preço das casa. O tema desse artigo é regressão linear, e teve como objetivo explicar a diferença entre a regressão linear simples e a regressão linear múltipla. Porém quero deixar aqui bem claro que nem sempre o melhor modelo é aquele que possui todas as variávels. Abaixo mostrarei uma técnica que trabalhamos em ciência de dados que se chama Feature Selection, irei entrar em detalhes em um outro artigo,

    Feature Selection

    A seleção de Atributos, ou o Feature Selection tem como objetivo a simpleficação do modelo, para facilitar sua interpretação, dedução do tempo de treinamento do modelo e melhoria da generalização do modelo, evitando overfitting. Utilizaremos a tecnicas de feaure selection para automitizar a seleção de variáveis com maior potencial para variáveis preditoras. Sendo uma espécie de filtro, que remove do seu dataset as variáveis que não serão úteis para a criação do modelo preditivo. Tem como principal objetivo a criação de um modelo preditivo com a maior precisão possível e que seja generalizável. As técnicas de Feaure Selection basicamente calculam o nível de signifiância de cada variável e eliminam aquelas com significância mais baixa.

    Modelo <- randomForest(price ~ .,
    - id
    - Hora
    - zipcode
    - lat
    - long,
    data = df_data,
    ntree = 100,
    nodesize = 10,
    importance = TRUE)

    # Demonstrando o Modelo
    varImpPlot(Modelo)

    Acima o gráfico mostra as variveias que mais são significativas para a criação do modelo por dois métodos diferente. As variáveis que possui seu ponto mais a direita são as que mais explica o valor da casa. Como podemos observar pelo método IncNodePurity a variável grade e a variável sqft_living são as mais importantes. Já com a metodologia %IncMSE, existe 06 variáveis com maior importância para a explicação do peço da casa, que são: sqft_lot15, yr_built, sqft_living15,sqft_lot,Construction_Time e grade.

    Apenas para completar o entendimento do artigo, utilizaremos o modelo3 , o modelo que utilizamos todas as variáveis, para demonstrar rapidamente o valor real do preço da casa com o valor preditivo, criado pelo modelo.
    Como ciêntista de dados, é preciso ainda realizarmos outras etapas que não foram mencionadas neste artigo, que serão explicada com maiores detalhes.

    scores <- data.frame(actual = df_data$price,
    prediction = predict(model4, newdata = df_data))

    inFrame <- scores[, c("actual", "prediction")]
    refFrame <- df_data

    df_error <- rbind(head(scores), tail(scores))

    df_error <- df_error %>%
    mutate(df_error = ifelse(df_error$actual > df_error$prediction,
    (df_error$actual - df_error$prediction) ,
    (df_error$prediction - df_error$actual)))

    rbind(head(df_error), tail(df_error))

    round(sum(df_error$df_error)/nrow(df_error), digits = 2)
    ##    [1]    26276.04

    Podemos ver o valor real em nosso conjunto de dado, na primeira coluna, e na segunda coluna o valor estimado em nosso modelo, e a variação do valor, na terceira coluna, ou seja o erro. Em média, temos um variação de erro do valor da casa em modelo de R$ 26.276,04. Ou seja nosso modelo modelo poderá errar esse valor tanto para cima, quando para baixo.

  • Existe possibilidades de melhorar ainda mais o modelo?
  • Qual o percentual de acurácia que devo atingir para terminar meu projeto?
  • Qual é a acurácia mínima que eu devo atingir?
  • Quantos modelos eu devo criar?
  • Só existe randomFlorest?

  • Todas estas perguntas serão respondida, conforme os artigos forem progredindo. Existe estas e muitas outras perguntas a serem respondidas. Mas uma coisa precisamos ter certeza, quanto mais simples for o seu modelo, melhor será.


    Projeto - Modelo Preditivo: Valor de Casa


    O Kaggle é uma plataforma gratuita que tem como objetivo inicial promover desafios entre profissionais da área de análise, porém atualmente se tornou uma grande comunidade de Data Sciente. Para demonstrar o trabalho de modelagem de dados, foi coletado um dataset fornecido no campeonato “House Sales in King Country, USA” da plataforma Kaggle. Temos como objetivo principal deste projeto, realizar Bussiness Analyst no conjunto de dados. E como segundo objetivo desenvolver um modelo de regressão que possa prever o valor de um imóvel com base nas variáveis apresentadas no banco de dados.Primeiramente coletamos o dataset fornecido pelo Kaggles. Ao coletar tais informações percebemos que o conjunto de dados é composto por 21 variáveis (tamanho da casa, quantidade de quartos, banheiros, entre outros) e o valor vendido da casa entre o período de Maio de 2014 a Maio de 2015, variável dependendo, ou seja, a variável que queremos que o nosso modelo nos apresente.

    Projeto