Autor: Mauro Pichiliani - pichiliani@uol.com.br

Data Mining na Prática: Regressão Linear

Olá, pessoal. Nesta matéria vamos iniciar o estudo de algoritmos de Data Mining. Veremos como utilizar a regressão linear para prever valores de uma determinada série de dados utilizando uma procedure do SQL Server.

Com o objetivo de fornecer uma visão geral sobre as possíveis aplicações destes algoritmos, preferi utilizar uma abordagem prática seguida de vários exemplos que podem ser facilmente implementados por quem utiliza o SQL Server.

A princípio o SQL Server 2000 contém apenas dois algoritmos implementados junto ao Analisys Services, o Microsoft Decision Tree (árvores de decisão) e o Microsoft Clustering. Estes algoritmos são fornecidos junto com uma ferramenta gráfica para a visualização dos resultados para que os especialistas no domínio e analistas possam obter alguma informação útil do resultado da execução dos algoritmos. Apesar de serem limitados, vou procurar abordar pelo menos um deles em futuros artigos.

O SQL Server 2005 possui novos algoritmos de Data Mining, além de uma melhoria significativa na elaboração dos modelos e dos resultados. Porém, mesmo com as novas funcionalidades, ainda é muito complexo utilizar os algoritmos com um objetivo prático.

É bom deixar claro logo no início que Data Mining envolve várias etapas como, por exemplo, o planejamento, a modelagem, o processo de ETL e análises dos resultados. Neste artigo e nos próximos, vou me concentrar no uso de algoritmos específicos e nas situações onde eles podem ser utilizados para agregar algum valor ao negócio ou mesmo auxiliar no processo de tomada de decisão, sempre buscando uma maneira prática de apresentá-los.

As ferramentas utilizadas para a exploração do algoritmo são o SQL Server 2000 e o Excel, pois este último fornece recursos para a elaboração de gráficos. Os algoritmos, os dados e demais recursos apresentados serão disponibilizados para download no final do artigo. Apesar de fornecer implementações dos algoritmos em T-SQL (a linguagem do SQL Server) o código pode ser utilizado como base para a conversão em linguagens de outros bancos de dados.

Iniciaremos o estudo de algoritmos de Data Minining por um algoritmo que nem sempre é considerado como algoritmo de Data Mining. Estou falando da Regressão Linear, que geralmente é um assunto mais ligado à estatística do que à computação. Deixando de lado a área de estudo, a Regressão Linear tem como objetivo fornecer uma previsão de certos dados de acordo com uma série histórica, que deve seguir um modelo linear, ou seja, deve se ‘encaixar’ melhor por uma reta que representa os dados. Geralmente, os problemas que a Regressão Linear auxilia estão relacionados à previsão da quantidade de itens em um determinado momento ou à previsão populacional.

Para entendermos melhor como a regressão linear funciona, veremos um exemplo. Considerem a Tabela 01, que apresenta a evolução anual do preço unitário de um produto e também a quantidade de unidades vendidas deste produto.

image001.jpg
Tabela 01. Histórico do preço unitário e da quantidade de vendas de um produto.

Os dados desta tabela são fictícios. Com base nos dados apresentados na Tabela 01, deseja-se saber qual será a previsão da quantidade de produtos vendidos quando o preço alcançar o valor unitário de 2,0. Esta previsão deve considerar apenas os dados da Tabela, sem levar em consideração outros fatores.

Para respondermos esta pergunta, podemos aplicar a Regressão Linear. Contudo, nada garante que a Regressão Linear vai fazer uma ‘boa’ previsão, ou seja, que o modelo linear se adapte bem aos dados. Para entender melhor como isso funciona, vamos colocar os dados apresentados na Tabela 01 em um gráfico de pontos. A Figura 01 apresenta este gráfico onde os valores da coluna preço unitário foram colocados no eixo X (horizontal) e os valores da coluna de quantidade vendida foram colocados no eixo Y (vertical).

image002.jpg
Figura 01. Gráfico de pontos contendo a quantidade vendida de um produto e o preço unitário

.

Analisando visualmente os dados do gráfico da Figura 01, podemos mentalmente traçar uma reta que se ajusta aos pontos. A regressão linear faz justamente isso: ela analisa os dados e monta a equação da reta para que possamos prever os próximos pontos. Uma questão importante a ser discutida é: o quão bom é esta reta? Não apenas uma linha pode ser gerada a partir dos dados. Podemos imaginar que uma curva (talvez gerada por uma equação exponencial) que também se adapta aos dados. Nos casos onde nem sempre uma curva se adapta bem aos dados, precisamos utilizar um modelo não-linear. Para verificar se os dados se adaptam bem ao modelo linear, você deve utilizar o teste chamado de R² que indica numericamente se vale a pena ou não utilizar o modelo linear para o conjunto de dados.

Temos várias maneiras de utilizar a regressão linear. O próprio Excel permite a adição de uma linha no gráfico a partir dos pontos criados, assim como a geração da equação da rede correspondente. Porém o SQL Server 2000 (e nem o 2005) não possui nenhum recurso para geração da equação linear. Neste artigo, vou apresentar uma stored procedure, de minha autoria, que implementa o algoritmo da Regressão Linear. Para mais informações sobre os cálculos por trás da regressão linear, eu recomendo aos leitores uma visita no site de Kardi Teknomo encontrado no endereço abaixo: http://people.revoledu.com/kardi/tutorial/Regression/RegresionExample.html

Vamos supor que temos a Tabela 01 armazenada dentro de uma tabela do SQL Server chamada TB_HIST_PRECO que contém uma coluna do tipo VARCHAR(50) chamada ANO, uma coluna do tipo NUMERIC(20,4) chamada PREC_UNIT e uma coluna chamada QTD_VENDIDA do tipo NUMERIC(10,4). Baseado nos dados desta tabela, desejamos obter uma previsão da quantidade de unidade vendidas quando o preço alcançar o valor de R $ 2,00 por unidade.

Para obtermos esta previsão, utilizaremos a stored procedure ST_REG_LIN, passando como parâmetro o nome da tabela, o nome da coluna independente (X), que no nosso caso chama-se PREC_UNIT, o nome da coluna dependente (Y), que no nosso caso chama-se QTD_VENDIDA, e o valor da variável na qual desejamos prever, que no nosso exemplo é 2,0. A chamada da stored procedure é mostrada na Listagem 01.

image003.jpg
Listagem 01. Chamada à stored procedure ST_REG_LIN.

O resultado da execução da stored procedure é apresentado na Figura 02.

image004.jpg
Figura 02. Resultado da execução da stored procedure ST_REG_LIN para os dados de exemplo.

O da execução resultado da stored procedure ST_REG_LIN retornou três colunas, sendo que a primeira traz a equação da reta, a segunda traz o valor calculado 189,4408 para a quantidade de unidades vendidas quando o preço unitário for R$ 2,0. A terceira coluna traz o valor da métrica R quadrado. A quarta coluna é uma interpretação do valor R quadrado: se este valor for menor que 0.8, recomenda-se a utilização de um modelo não linear. Caso contrário, a regressão linear pode apresentar uma boa previsão.
 
Um detalhe a ser considerado é que, devido à precisão da stored procedure, com quatro casas decimais, pode ser que os valores sejam diferentes da equação apresentada pelo Excel. Também vale a pena notar que o SQL Server sempre utilizada o ponto (.) como separador decimal e nenhum separador para o milhar.

Também não devemos esquecer que esta equação gerada não necessariamente fornece todos os pontos do gráfico, ou seja, por meio da equação não podemos obter exatamente os pontos anteriores, pois a equação gerada pela regressão linear gera uma aproximação dos valores. A Figura 03 apresenta o gráfico com novo valor calculado, que é apresentado por um ponto vermelho no gráfico.

image005.jpg
Figura 03. Novo ponto gerado pela regressão linear do exemplo.

Neste exemplo, consideramos que a quantidade vendida depende do preço unitário do produto. A partir desta suposição, trabalhamos com um preço de R$ 2,0 para cada unidade e calculamos a quantidade aproximada pelo modelo de ventas.

Para fazer o download do script contendo a stored procedure ST_REG_LIN e os dados do exemplo é só clicar aqui.

Um grande abraço e até a próxima coluna.