Back-End

22 mai, 2017

Data Science – Regressões com Python

Publicidade

Olá, pessoal!

Regressões constituem uma ferramenta importantíssima em ciência de dados. O objetivo principal do estudo de regressões, em Estatística, é predizer o valor de uma ou mais variáveis em função de outras. Pretende-se prever, por exemplo, o faturamento de uma empresa baseado em seu histórico de investimentos em marketing, ou o consumo de combustível de um veículo em função do tempo. A modelagem matemática da relação entre duas ou mais variáveis é, portanto, a base do estudo de regressões.

Regressões e correlações são técnicas próximas entre si e que envolvem, via de regra, alguma forma de estimar valores futuros de variáveis. Basicamente, a análise de correlação retorna um valor que gradua o nível de relacionamento entre uma variável X e outra variável Y; a análise de regressão retorna um modelo matemático que descreve o relacionamento entre as variáveis X e Y e que usaremos para estimar valores futuros.

Os tipos de correlação e, por consequência, de regressão, podem ser representados didaticamente pela seguinte representação:

O primeiro exemplo mostra uma correlação entre variáveis em modelo linear. No segundo exemplo, temos uma caso onde não poderemos correlacionar duas variáveis e, portanto, não conseguiremos modelar matematicamente a relação entre elas. Por fim, no último exemplo, temos um caso mais complexo onde podemos visualizar que existe algum grau de correlação entre variáveis, porém o modelo matemático não é linear.

Neste artigo, veremos implementações em Python de regressões lineares apenas. Regressões não-lineares, que na prática constituem nosso ambiente de trabalho mais comum no mercado, serão abordadas em artigos posteriores. É importante ressaltar que não nos aprofundaremos com o devido rigor científico nos conceitos de regressões e correlações, pois nosso objetivo é focar nas implementações práticas destes tópicos usando Python.

O objetivo de uma análise linear, como vimos, é relacionar duas variáveis de modo que, a partir da correlação entre ambas, possamos predizer valores futuros. Desta forma, vamos estruturar uma pequena base de dados CSV em que relacionamos o consumo de combustível de um veículo (em km/l) versus tempo para nosso primeiro exemplo:

Mês Consumo
1 14,5
2 13,2
3 12,4
4 11,8
5 10,7
6 10,1

 

 

 

Para esse dataset, vamos plotar um gráfico bidimensional:

from numpy import loadtxt, zeros, ones, array, linspace, logspace
from pylab import scatter, show, title, xlabel, ylabel, plot, contour

# carregamos o dataset
data = loadtxt('base.csv', delimiter=';')

# plotamos o gráfico
scatter(data[:, 0], data[:, 1], marker='o', c='b')
title('Consumo ao longo do tempo')
xlabel('Mes')
ylabel('Consumo')
show()

O script nos retorna:

Observamos uma clara relação linear inversa entre tempo e consumo, ou seja, o consumo do veículo aumenta (ou, em raciocínio inverso, a performance diminui) à medida que o tempo passa.

Para uma análise mais aprofundada da aplicação de regressão linear, vamos usar alguns datasets conhecidos fornecidos pelo pacote sklearn. O uso de datasets didáticos é bastante útil quando estudamos conceitos estatísticos em Python. Podemos, inclusive, tratar o uso destes datasets já estruturados facilmente através de sklearn.datasets aplicando datasets.load.[dataset](). 

Neste artigo, usaremos dois datasets bastante usados para fins didáticos: iris e diabetes.

import matplotlib.pyplot as plt
import numpy as np
from sklearn import datasets, linear_model
from sklearn.cross_validation import train_test_split
  
# carregamos os datasets
dados = datasets.load_diabetes()
  
# utilizamos um recurso
x = dados.data[:, np.newaxis]
x_temp = x[:, :, 2]
y = dados.target
  
# dividimos a base de dados entre treino e teste
x_train, x_test, y_train, y_test = train_test_split(x_temp, y)
  
# aplicamos o modelo de regressão linear usando LinearRegression()
modelo = linear_model.LinearRegression()
  
# treinamos o modelo usando os dados de treinamento
modelo.fit(x_train, y_train)
  
# coeficientes...
modelo.coef_                       # array([ 938.23786125])
  
# erro quadrático médio
np.mean((modelo.predict(x_test) - y_test) ** 2) # 4039.98152578

# variância
modelo.score(x_test, y_test)       # 0.37048553047
  
# plotamos os resultados definindo algumas características do gráfico
plt.scatter(x_test, y_test,  color='black')
plt.plot(x_test, modelo.predict(x_test), color='blue', linewidth=3)
  
plt.xticks(())
plt.yticks(())
  
plt.show()

O script acima nos retorna:

Podemos observar que esse é um caso clássico de correlação positiva, como vimos no início deste texto. Usamos LinearRegression() para aplicar a plotagem bidimensional do modelo de regressão linear. A função tenta desenhar uma linha reta com o objetivo de minimizar a soma residual de quadrados entre as respostas observadas no conjunto de dados e as respostas previstas na aproximação linear.

Podemos aproveitar a capacidade analítica dos datasets sobre os quais falamos anteriormente para verificarmos o resultado usando o conjunto de dados Iris:

dados = datasets.load_iris()

O resultado, neste caso, será:

Novamente, o objetivo de LinearRegression() é encontrar um caminho linear para o modelo. Ao compararmos os dois gráficos, temos:

O dataset Iris possui universo de amostra mais reduzido. Observamos que o retorno do erro quadrático médio (MSE, Mean Square Error) em np.mean((modelo.predict(x_test) – y_test) ** 2) é da grandeza de 0.07 para Iris, enquanto o dataset Diabetes o mesmo retorno é da grandeza de 4039.98. Isso traduz exatamente a impressão visual que temos ao colocar lado a lado ambas as regressões e visualizarmos o residual das amostras.

O estudo de regressões é fundamental no campo da ciência de dados e Big Data. Os modelos matemáticos baseados em regressões constituem a forma mais tradicional de iniciar um projeto de data science e possuem uma infinidade de variações e abordagens. A base de aplicações de machine learning, conceito fundamental em Big Data e sobre o qual nos aprofundaremos nos próximos artigos, é a construção de um modelo matemático capaz de regular a relação entre variáveis de um universo de dados reais para que um algoritmo seja capaz de ensinar um sistema a tomar decisões futuras.

Em nossos próximos textos, seguiremos abordando novos tipos de regressões em exemplos práticos. Até lá!