Regressão Linear com Sklearn: Conceito e Aplicação

Lamartine Santana
9 min readJul 28, 2020

--

Aplicando a Regressão Linear para prever custo com planos de saúde.

Despesas médicas são uma das principais despesas no dia a dia da vida humana. Muitos fatores contribuem para a evolução destes gastos, estilos de vidas e parâmetros físicos podem trazer doenças e enfermidades que causam esses aumentos em planos de saúde. Além disso, alguns estudos indicam que, os principais fatores que contribuem para maiores gastos em cuidados médicos pessoais incluem tabagismo, envelhecimento e IMC.

Faremos então, uma análise de dados de planos de saúde dos EUA. Os dados são secundários, e podem ser encontrados aqui. Contêm 1338 linhas e 6 colunas que trazem as seguintes informações: idade, sexo, crianças, fumante, região e total gasto com o seguro. O objetivo desta análise é determinar quais os fatores e efeitos elevam o custo de seguro e criar um modelo de Regressão Linear Múltipla que possa prever o custo do seguro de saúde com base nos fatores que o influenciam.

Então, vamos preparar um sumário do que veremos nesta análise.

  1. O que é Regressão?
  2. Análise Exploratória dos Dados
  3. Modelo de Regressão Linear
  4. Performance do Modelo

1. Regressão Linear

Um dos primeiros modelos estatísticos e de Machine Learning que temos contato ao entrar nesse universo de análise de dados é o de Regressão Linear.

Regressão Linear é uma equação para se estimar um alvo (variável y ou dependente), dados os valores de outras variáveis (variáveis x ou independentes). Um algoritmo simples, mas que usado com os parâmetros corretos é capaz de oferecer uma grande capacidade preditiva somente com a relação das suas variáveis.

Um exemplo, suponhamos que uma escola avalie a nota de seus alunos por horas dedicadas ao estudo, com esses dados em mãos, traçam uma relação entre as variáveis, onde a nota seria a variável alvo (y) e as horas de estudo a variável independentes (x).

Basicamente, o que o algoritmo de regressão linear faz é ajustar várias linhas nos pontos de dados e retornar a linha que resulta no menor erro. Tudo isso em uma equação matemática.

O modelo de regressão linear

Para representar a relação entre uma variável dependente (y) e uma variável independente (x), usamos o modelo:

y=a+bx

Onde:

Y = Alvo

a = Intercepto

b = Inclinação da reta

x = variável independente

Em casos em que existam mais de duas variáveis, este conceito pode ser estendido, temos assim a regressão linear múltipla. Por exemplo, considere um cenário em que você deve prever o preço da casa com base em sua área, número de quartos, renda média das pessoas na área, idade da casa e assim por diante. Nesse caso, a variável dependente (variável de destino) depende de várias variáveis independentes.

2. Análise Exploratória dos dados

Com a regressão linear explicada, e sem mais delongas, vamos colocar a mão no código!

Primeiramente, vamos importar as bibliotecas necessárias e logo após, vamos fazer a análise exploratória dos dados, para entendermos melhor com o que estamos trabalhando.

Feito isso, vamos importar os dados:

#Breve descrição dos dadosdf.describe()

Repararam que na tabela de descrição não tem todas as variáveis?

Então, se olharmos um pouco mais acima para a tabela com os dados, vemos algumas colunas que estão com dados não numéricos. E como vamos passar essas informações para nosso algoritmo?

Para isso a biblioteca sklearn possui uma feature de pré processamento chamada LabelEncoder que classifica essas informações em numérica. Vamos aplica-lá as colunas de Sexo, Fumante e Região.

#Vamos conferir como ficou o tipo de cada coluna
df.info()

Pronto, dados normalizados, vamos começar a análise exploratória.

A primeira coisa que vamos verificar é a correlação entre as variáveis.

O que a correlação procura entender é como uma variável se comporta em um cenário onde outra está variando, visando identificar se existe alguma relação entre a variabilidade de ambas. Embora não implique em causalidade, o coeficiente de correlação exprime em números essa relação, ou seja, quantifica a relação entre as variáveis.

#Tabela de correlaçãocorr = df.corr()
corr
#Vamos ver a correlação graficamentef, ax = plt.subplots(figsize=(10, 8))sns.heatmap(corr, cmap=sns.color_palette("Blues"), linewidths=.5, annot=True);

Fumantes tem uma forte correlação com os gastos em saúde.Surpreende a baixa correlação com o índice de massa corporal.

Vamos olhar como está a distribuição dos gastos e depois vamos analisar mais a fundo a variável fumante.

#Distribuição dos custosplt.figure(figsize=(12,5))plt.title("Distribuição dos custos")ax = sns.distplot(df["charges"], color = 'b')

De fato, os gráficos nos mostram que fumantes possuem uma forte tendencia a terem mais gastos com saúde.

Vamos prosseguir visualizando a idade dos contratantes.

plt.figure(figsize=(12,5))plt.title("Distribuição de idade")ax = sns.distplot(df["age"], color = 'b')

A maioria dos pacientes do nosso dataset possuem menos de 20 anos, sendo o menor 18 anos e o maior com 64 anos.

Vamos ver como os custos estão distribuídos entre a idade e os fumantes.

Acho que esse gráfico já deixa bem claro como os fumantes possuem custos maiores com sua saúde.

Ok, já vimos que fumar causa grandes problemas a nossa saúde e também ao nosso bolso, mas vamos analisar as demais variáveis.

Outra variável que logo pensamos que pode influenciar os custos hospitalares é de índice de massa corporal (IMC) ou Body mass index (BMI) como se encontra em nossos dados. Vamos então olhar mais a fundo para eles e ver, de fato, seu impacto nos custos.

plt.figure(figsize=(12,5))plt.title("Distribuição de IMC")ax = sns.distplot(df["bmi"], color = 'b')

A distribuição de IMC está concentrado na casa dos 30. Acredito que para uma melhor compreensão desta informação devemos relembrar da tabela IMC. Por isso estou a disponibilizando abaixo:

Sim, grande maioria dos pacientes do nosso dataset estão ou obesos ou super obesos!

Agora uma parada rápida no estudo para verificarmos nosso IMC! Cuide de sua saúde!

plt.figure(figsize=(12,5))plt.title("Distribuição de custos com pacientes com IMC maior que 30")ax = sns.distplot(df[(df.bmi >= 30)]['charges'], color = 'b')
plt.figure(figsize=(12,5))plt.title("Distribuição de custos com pacientes com IMC menor que 30")ax = sns.distplot(df[(df.bmi < 30)]['charges'], color = 'b')

Como esperado, o custo para pessoas com IMC maior que 30 é maior!

Agora vamos ver como os filhos entram nessa análise.

sns.catplot(x="children", kind="count", palette="Blues", data=df, size = 5);
#Distruição de Gastos por Fumantes e não fumantesplt.figure(figsize=(12,5))plt.title("Distribuição de custos por idade e por fumantes")#Distribuição de gastos por fumante e não fumante por sexosns.scatterplot(x=df.children,y=df.charges, sizes=(12,5),  palette="ch:r=-.2,d=.3_r");

Não fica claro nenhum padrão de custo sobre a quantidade de filhos.

Poderíamos aprofundar ainda mais a análise, combinar as variáveis e aplicar outros conceitos, mas como o objetivo principal deste projeto é apresentar um modelo de regressão linear, vamos parar por aqui.

Vamos agora colocar nosso modelo para rodar!

3. Modelo de Regressão Linear

Antes de rodar nosso modelo e verificar quais seus resultados, precisamos preparar os dados para ele.

Para isso precisamos separar os valores gastos por cada paciente, já que queremos predizer esses valores não podemos que o modelo saiba quais são!

Vamos criar dois datasets, um com todas as variáveis, exceto a de gastos, e outro somente com os gastos.

#Separando os dadosx = df.drop(['charges'], axis = 1)y = df.charges

Agora usaremos uma função da biblioteca scikit-learn que é a train_test_split, esta função separa nossos dados entre treino e teste de forma aleatória, sendo treinado com uma parte dos dados e testados com a outra.

Usaremos 80% dos dados para treino e 20% para teste, esta divisão é feita através da feature test_size=0.2

Pronto! Está feito! Criamos e treinamos um modelo de Regressão Linear.

Vamos ver seus resultados.

#Verificando o resultado
r_sq = lr.score(x, y)
print('Coeficiente de Determinação (R²):', r_sq)

Coeficiente de Determinação (R²): 0.7503652768429028

É um belo resultado se levar em consideração que não foi feita nenhuma alteração nos parâmetros dos dados.

Vamos fazer agora uma análise da regressão.

4. Performance do Modelo

Nesta etapa, que será a última, avaliaremos o modelo de regressão e explicar os conceitos de avaliação.

Primeiro, vamos olhar o Intercepto e os Coeficientes da Regressão.

print('Intercepto:', lr.intercept_)

Intercepto: -11821.525228002496

coeff_df = pd.DataFrame(lr.coef_,x.columns,columns=['Coefficient'])coeff_df

O Intercepto representa o valor de b0 da equação da regressão linear. O valor de -11821.52 é a previsão do modelo quando o valor de X é zero.

O Coeficiente, neste caso, os coeficientes representam os “pesos” das variáveis nos modelos, neste caso, na equação os identificamos como os b1, b2, b3…bn. O significado de cada valor é previsão da adição de cada valor dos coeficientes quando o valor de x é aumentado em um. Exemplo, Quando X aumenta em 1 é adicionado o valor de 250.76 no coeficiente da idade sobre o valor a ser previsto.

Com as informações dos “pesos” da sua regressão você pode avaliar quais variáveis afetam o seu modelo, podendo assim aumentar sua eficácia. Outra forma de verificar isso é através o teste de p-valor.

Olhando para os Erros

Uma forma de saber a performance da Regressão Linear é olharmos para nossos erros! Pois é errando que se aprende.

Para isso a biblioteca sklearn nos oferece uma função muito útil que resultado na impressão das principais métricas: MAE, MSE e RMSE. Vamos olhar os valores dessas métricas aplicadas ao modelo e depois discutiremos mais.

Mean Absolute Error (MAE) é a média do valor absoluto dos erros.

Erro Quadrático Médio (MSE) é a média dos erros quadráticos

Erro médio quadrático da raiz (RMSE) é a raiz quadrada da média dos erros quadráticos

y_pred = lr.predict(x_test)print('MAE:', metrics.mean_absolute_error(y_test, y_pred))print('MSE:', metrics.mean_squared_error(y_test, y_pred))print('RMSE:', np.sqrt(metrics.mean_squared_error(y_test, y_pred)))

MAE: 3943.410151219757

MSE: 31937211.865719117

RMSE: 5651.301785050867

Com o MAE podemos ver que nosso algoritmo erra o custo hospitalar em 3943.41 dólares.

O RMSE têm o benefício em penalizar os erros de maior magnitude. Esta métrica pode não descrever sozinha o erro médio. Mas a diferença das métricas pode auxiliar no diagnóstico de predições muito ruins ou outliers. Se o RMSE ficar muito maior que MAE então esta suposição deve ser verificada. É o que acontece com o modelo :(

Neste caso teríamos que avaliar quais variáveis penalizam nosso modelo, exclui-las ou transforma-las em combinação com outras variáveis. Além de verificar se há outliers ou se possuímos poucos dados para o modelo.

5. Conclusão

É isto! Chegamos ao fim do tutorial de regressão linear no python com a biblioteca Sklearn. Explicamos conceitos e colocamos em pratica um modelo para prever os custos com plano de saúde. Obtivemos bons resultados, mas para colocar este modelo em prática, precisamos realizar diversos ajustes nele, além é claro de melhores dados de entrada, mas não era a acurácia do modelo que estava em foco, e sim, a apresentação desse simples modelo que pode ser um grande aliado na análise de dados.

Precisamos da regressão para responder se e como um fenômeno influencia o outro ou como várias variáveis ​​estão relacionadas. A regressão também é útil quando você deseja prever uma resposta usando um novo conjunto de preditores. Por exemplo, você pode tentar prever o consumo de eletricidade de uma família pela próxima hora, considerando a temperatura externa, a hora do dia e o número de residentes nessa família.

A regressão é usada em muitos campos diferentes: economia, ciência da computação, ciências sociais e assim por diante. Sua importância aumenta todos os dias com a disponibilidade de grandes quantidades de dados e o aumento da conscientização sobre o valor prático dos dados.

Em Breve mostrarei outros modelos de Regressão e também como podemos melhorar os parâmetros dos modelos.

O dataset e código podem ser encontrados no meu Github aqui.

--

--