Awari

Aprendendo Data Science na prática

Muita gente concorda que a melhor forma de aprender Data Science é a partir de um projeto real na área. Nesse contexto, há uma série de etapas que contribuem de maneira significativa para a criação de um planejamento ideal baseado na ciência de dados. Mas como desenvolvê-lo na prática? 

Imagine que você trabalha em uma startup do setor imobiliário e um dos objetivos de sua empresa é agilizar o cálculo de valores de aluguéis para os seus clientes, deixando os números mais precisos. Para isso, será necessária uma calculadora de aluguéis, como esta, encontrada na plataforma do Quinto Andar

O objetivo deste artigo é descrever de maneira clara como construir uma calculadora de aluguéis similar à citada acima. Este é o exemplo prático utilizado no Curso Intensivo de Data Science da Awari para demonstrar aos alunos um projeto completo, desde a coleta de dados até a transformação de todo o procedimento em um web app utilizável por qualquer pessoa na internet.

Vamos aprender?

Que tipo de problema tenho aqui?

O primeiro passo para desenvolver um projeto de ciência de dados é a compreensão do problema a ser resolvido. Neste caso, de acordo com a problemática mencionada acima, construiremos uma calculadora de imóveis durante as aulas. Em termos mais específicos, podemos dizer que nossa tarefa é: utilizar características (features) de imóveis como área, número de quartos, número de banheiros, região da cidade onde se encontra (entre outras) para prever preços de aluguéis condizentes com o que é praticado no mercado atualmente de maneira automatizada. 

O projeto será desenvolvido do começo ao fim das aulas e, a partir dele, vamos demonstrar diversas técnicas utilizadas em todas as etapas de um projeto de ciência de dados. Durante o curso, utilizaremos da linguagem de programação Python.

Cadê os dados?

Quando precisamos resolver um problema ou criar uma aplicação com base em Data Science, nossa matéria prima são os dados. Muitas vezes, quando participamos de cursos na área, nos deparamos com bases de dados surgidas milagrosamente em nossas mãos. 

Na vida real de um cientista de dados, porém, isso não é comum. 

A depender do problema, temos acesso a dados públicos por meio de bases ou de APIs. Dentro de uma empresa com dados organizados, por exemplo, é possível fazer consultas nas bases de dados internas. 

Mas e se não tivermos dados? 

No caso da calculadora de imóveis, utilizaremos o procedimento de Web Scraping, ou seja, criaremos uma espécie de robô que nos permite navegar por páginas especializadas da web selecionando as informações desejadas sobre os imóveis. Assim, você não só aprenderá como conectar-se a APIs ou como construir uma base para o seu problema a partir de dados já disponibilizados por sua empresa, mas também saberá o que fazer quando não possuir esses dados disponíveis e organizados, tornando-se responsável pela criação da base de dados.

A partir desta etapa, também usaremos bibliotecas de Data Science, que são ferramentas utilizadas para o processamento, tradução, análise e criação de gráficos com base nos dados obtidos. 

No geral, cada biblioteca tem uma função específica. Para essa etapa, as opções são: requests, json, beautifulsoup, pandas.

Quantos quartos tem esse apartamento?

Depois de realizar o processo de raspagem da web e transformar as informações coletadas em uma base organizada, iniciaremos um procedimento de limpeza de dados.

Um dos primeiros problemas que precisamos lidar em um projeto de Data Science são os dados faltantes. Imagine que fizemos a raspagem de um site com diversos imóveis visando obter a área, o número de quartos, o número de banheiros, a região da cidade onde o imóvel se encontra e seu respectivo valor de aluguel. Quando concluirmos essa etapa, nem sempre os imóveis são cadastrados no site com todas essas informações. 

Soma-se a isso o fato de que os algoritmos não estão preparados para lidar com dados que não estejam coletados. 

Precisamos de uma estratégia! 

O que faremos? 

Excluiremos os imóveis cujos dados não estão completos? Pode ser!

E se tivermos muitos dados faltantes? Alguns imóveis, por exemplo, não possuem o número de quartos. Se isso acontecer, podemos reduzir demais nossa base de dados. Uma boa alternativa é o preenchimento dos dados faltantes. 

Mas como faremos isso? Alguns pontos devem ser analisados:

  • Utilizaremos uma média geral daquela característica para todos os imóveis coletados? 
  • Utilizaremos a mediana deste mesmo atributo para preencher os slots faltantes? 
  • Será possível que apartamentos de uma região sigam uma tendência de apresentar uma maior quantidade de quartos do que apartamentos de outras regiões? 
  • Seria possível treinar um algoritmo que leve em conta a região, o tamanho e o valor do aluguel para preencher os dados faltantes da forma mais condizente possível? 

Valeria a pena o esforço?

Durante as aulas, te ajudaremos a entender cada um desses processos, fazendo com que suas decisões em projetos futuros sejam as mais adequadas possíveis.

Quais bibliotecas poderemos utilizar nesta etapa: numpy, pandas, entre outras. 

Esse gráfico está um pouco estranho… 

Certo, agora não faltam dados! É hora de tentar ganhar uma certa intimidade com nossa base. 

Para isso, geraremos alguns gráficos. Desta forma, as colunas, linhas e células passarão a ser resumidas de maneira visual, facilitando a compreensão de possíveis relações entre os dados coletados, que serão encarados como variáveis. 

O próximo passo será procurar correlações entre essa variáveis, especialmente entre as variáveis e os preços dos imóveis coletados. Qual variável você acha que afeta diretamente o preço de um apartamento? 

  • Sua localização?
  • A quantidade de quartos? 
  • Sua área total?  

Essas são algumas das informações obtidas nesta etapa. 

Na etapa seguinte, observaremos a distribuição dos dados coletados. 

  • Será que as distribuições obtidas se aproximam mais de uma distribuição normal? 
  • Será que estão concentradas em um certo intervalo de valores? 
  • Será que se concentram em mais de um ponto?

Ops! Um aluguel de R$1.000.000,00? Esquisito!

  • Será que temos mais dados assim ou foi um erro de digitação? 
  • E se não for um erro de digitação e tivermos outros dados “fora da curva”? 

Como vamos proceder?

É possível que tenhamos que lidar com outliers em nosso projeto, que são observações que se encontram a uma distância anormal de outros valores em uma amostra aleatória. 

Por isso, precisamos compreender os efeitos desses dados em nossos algoritmos e o efeito que os possíveis tratamentos a esses dados (exclusão, por exemplo) também podem trazer em nosso modelo final.


A depender da distribuição dos dados mencionada acima, podemos ter que reescalá-los (adaptá-los à escala logarítmica, por exemplo) e essas adaptações podem, de certa forma, suavizar o efeito desses dados “fora da curva”.

Possíveis bibliotecas para essa etapa: numpy, pandas, matplotlib, seaborn

Meu algoritmo não entende a região da cidade…

Em um projeto que lida com dados tabulares, teremos que lidar com dois tipos de variáveis: numéricas e categóricas. 

Com o primeiro tipo de variável, os algoritmos funcionam bem. Com o segundo, não. 

Sim, grande parte dos algoritmos não vai entender que aquele apartamento fica no centro ou na zona norte pois não estão preparados para reproduzir dados categóricos.

Para lidar com essa problemática, precisaremos de um pouco mais de manipulação de dados para que, de alguma forma, possamos transformar essas informações em dados numéricos, de modo que o algoritmo consiga lidar com elas. 

Certo, mas que tipo de transformação deverá ser aplicada a esses dados? 

  • Transformaremos cada região da cidade em um número na mesma coluna da base de dados? 
  • Criaremos diversas colunas, cada uma com um nome de região e utilizaremos 0 e 1 para informar se aquele imóvel se encontra ou não naquela região? 
  • Qual seria o impacto de cada uma dessas transformações em nossa base de dados? Qual delas afetaria de maneira mais positiva a qualidade das predições realizadas por nossos algoritmos?

Sim, o tratamento de dados categóricos e suas implicações também será uma de nossas preocupações durante a construção de nossa calculadora. Ao final da atividade você compreenderá o que cada decisão a respeito desse quesito representa para seguirmos para a próxima etapa. 

Possíveis bibliotecas para essa etapa: pandas, scikit-learn

Base limpa, tudo pronto?

Não! O que faremos a seguir é deixar a base preparada para o algoritmo que virá a ser usado. De modo geral, queremos criar predições que sejam as mais generalizáveis que conseguirmos.

E o que significa isso?

Significa que queremos altas taxas de acerto, mas que funcionem não apenas para os dados que temos em mãos. 

E como podemos assegurar que isso vai acontecer?

Não vamos assegurar, mas faremos procedimentos que trarão uma noção de quão bem performarmos com dados novos.

Para que isso aconteça, é necessário uma quebra inicial da base de dados em duas partes. Esse é um passo crucial nesse processo, pois não queremos fazer previsões/projeções utilizando dados já conhecidos para avaliar a performance do algoritmo. Não queremos ser profetas do passado!  

Dessa maneira, as duas partes serão a base de treino e a base de teste. A primeira fatia deste corte será a parte em que adaptaremos os parâmetros do algoritmo escolhido até que as métricas de mensuração de performance estejam boas e o algoritmo esteja adaptado aos dados da melhor forma possível. A segunda ficará intocada, e será utilizada como se fossem dados novos, desconhecidos pelo algoritmo. 

Os pesos, profundidades, números máximos de árvores e quaisquer outros parâmetros dos algoritmos não terão utilizado tais dados para a sua adaptação. Essa fatia de nossa base de dados mostrará a performance de nosso algoritmo com dados desconhecidos testando, dessa forma, a generalização das predições ou até mesmo se adaptamos o algoritmo de forma incorreta à base de treino.

Agora sim, com as bases separadas, podemos seguir para o próximo passo. 

Possíveis bibliotecas para essa etapa: pandas, scikit-learn

Treinar o modelo? Que modelo?

Por lidar com a predição de valores de aluguéis baseados em características de imóveis, temos um projeto de regressão. 

Certo! Mas a biblioteca que utilizamos tem vários algoritmos com essa finalidade. 

Qual devemos usar? Ou melhor, que estratégia devemos utilizar para escolher o modelo?

Checar os modelos disponíveis e buscar entender cada um deles para definir qual o melhor a partir de suas características e das características dos nossos dados? É uma opção.

Importar vários modelos de uma vez só e, mesmo sem a compreensão de como cada um deles funciona separadamente, escolher o que apresentar a melhor métrica relativa a nosso desafio a ser resolvido? É outra opção.

Certo. Encontramos um modelo de base!

Mas será que é possível melhorar sua performance ainda mais?

Sim, os algoritmos possuem parâmetros modificáveis e podemos verificar o quanto a alteração desses parâmetros afeta a qualidade de nossas predições. 

Faremos isso manualmente? É provável que não. 

Podemos fazer loops (ou utilizar funções pré-estabelecidas que façam isso por nós) para combinar esses parâmetros e verificar qual a configuração mais se adapta aos dados que temos. 

Após encontrar as configurações e adaptar nosso algoritmo, utilizaremos a base de teste para que possamos compreender o quão bem nosso algoritmo está performando com dados desconhecidos e, caso esteja funcionando, prosseguiremos para a etapa final.

Possíveis bibliotecas para essa etapa: scikit learn, xgboost, statsmodels

Deploying?

Ok, agora temos nosso modelo e ele está suficientemente calibrado. O que faremos?  

É no momento que transformamos todo o tratamento realizado nos dados em uma ferramenta utilizável por outras pessoas que extraímos o real valor de um projeto de Data Science. Este é, sem dúvidas, outro ponto pouquíssimo visitado em cursos de ciência de dados.

O próximo passo é escolher e refinar o algoritmo de maneira satisfatória. Pode ser que seja nossa função, como cientistas de dados, transformar todo esse processo desenvolvido em Python em algo que pessoas que não programam ou não tenham acesso aos dados que temos possam utilizar. 

Em nosso exemplo, faremos uma implementação de nosso modelo em forma de um web app, um site com campos em que os usuários preencherão com números de quartos, banheiros e zona da cidade. Com esses dados, o aplicativo retornará a estimativa do valor de aluguel que deverá ser pago por um imóvel com as características informadas.

Para isso, salvaremos o modelo criado de modo que possamos importá-lo posteriormente. Em seguida, citaremos novos arquivos em Python e HTML e trabalharemos na conexão entre os campos reservados à entrada de dados pelos usuários finais na página HTML e as funções que interpretarão os dados e os utilizarão para alimentar o modelo salvo. Desta forma, teremos como retorno a predição do valor do aluguel demonstrada ao usuário na página do aplicativo.

Após a criação das conexões, o passo final é a hospedagem de todo esse processo em um servidor remoto. Para isso, criaremos alguns arquivos auxiliares para instalar as bibliotecas necessárias e iniciar o aplicativo quando solicitado. 

Por fim, utilizaremos nosso repositório no GitHub, que contará com todos os arquivos necessários para “subir” nosso web app para o servidor onde ficará hospedado, finalizando assim o processo. 

Possíveis bibliotecas para essa etapa: Pickle, Flask e Stremalit 

Conclusão

Um projeto completo na área de ciência de dados envolve muitos processos além da aplicação de algoritmos em bases de dados pré-processadas. Muito do hype (e por consequência, dos cursos) em torno da ciência de dados esteja em cima da aplicação dos algoritmos e da modelagem dos dados, por ser a parte do processo conceitualmente mais complexa.

Se nos atentarmos a esta pesquisa, porém, veremos que a coleta e a manipulação de dados são responsáveis, respectivamente por 19 e 60% do tempo de trabalho dos cientistas de dados, sendo as atividades que consomem maior tempo desses profissionais. 

E não é por acaso. Embora conceitualmente mais simples, esses procedimentos são trabalhosos e responsáveis por trazer ao cientista de dados o material que vai alimentar os algoritmos. 

Além disso, os algoritmos só terão resultados excelentes se tivermos dados representativos para o problema que queremos resolver. E essa questão é resolvida na coleta e na manipulação (com o processo de feature engineering, por exemplo). 

Por isso, todas as etapas relativas a um projeto de ciência de dados são importantes e devem ser realizadas da melhor forma possível.

Na Awari, desenvolveremos um projeto do início ao fim, para certificar que nossos alunos estejam cientes da maioria dos passos a serem dados em projetos de ciência de dados, não apenas os mais conhecidos.

Possíveis bibliotecas para essa etapa: Intensivo de Data Science da Awari.

Vinicius Gomes

Escrito por

Vinicius Gomes

é Data Scientist e doutor em psicologia da música. Atualmente é instrutor de Data Science e responsável por parte da criação do conteúdo da área na Awari.