Desafio de Perda de Clientes e Preparação de Dados
Uma empresa de telecomunicações enfrenta um grande desafio de perda de clientes. Para conhecer melhor esses clientes e evitar essa perda, a empresa decidiu implementar um modelo de Machine Learning que realize a previsão de churn. No entanto, a base de dados que será utilizada possui muitas inconsistências, dados faltantes e também dados com formato inadequado. Além disso, é uma base de dados muito extensa que requer um grande poder de processamento.
Limpeza e Tratamento de Dados
Nosso papel neste projeto é realizar a limpeza e o tratamento desses dados para que possam ser utilizados no modelo de Machine Learning. Mas como podemos realizar essa limpeza e tratamento de forma otimizada, considerando que se trata de uma base de dados muito extensa?
Utilização da Biblioteca Polars
Vamos utilizar a biblioteca Polars, que é muito eficiente em trabalhar com um grande volume de dados. Com o Google Colab aberto, o primeiro passo é fazer o upload do arquivo que será utilizado como nossa base de dados. Para isso, selecionamos à esquerda o menu de arquivos, clicamos no botão "Fazer Upload para armazenamento da sessão" e selecionamos o arquivo disponível na atividade "Preparando Ambiente". Antes de iniciar o projeto, é importante fazer o download desse arquivo.
Importação e Leitura de Dados
Após clicar duas vezes no arquivo, uma barra circular abaixo indicará o upload do arquivo. Enquanto o arquivo está sendo carregado no Colab, vamos importar a biblioteca que utilizaremos, que é a Polars. Na primeira célula, escrevemos:
Essa biblioteca já está instalada no Colab, então basta escrever esse código e pressionar Ctrl + Enter para executá-lo.
Escaneamento da Base de Dados
Na segunda célula, faremos a leitura da base de dados, mas é importante aguardar o término do carregamento antes de executar a célula. Podemos já digitar o código responsável por realizar essa leitura. Utilizaremos uma ferramenta muito interessante da biblioteca Polars, que é a Lazy API. Essa Lazy API permite que utilizemos bases de dados mais extensas de forma otimizada. Em vez de carregar toda a base de dados para a memória, ela utiliza queries para fazer consultas na base de dados e retorna o resultado somente quando necessário.
Após o carregamento da base de dados, podemos clicar nos três pontos ao lado do nome do arquivo e selecionar a opção "Copiar Caminho". Feito isso, podemos fechar o menu lateral de arquivos e, na próxima célula, escrever o código que fará o escaneamento dessa base de dados. Não faremos a leitura para a memória, mas sim um escaneamento em que o Polars consegue fazer essa query para consultas à base de dados. Para isso, escrevemos:
dados = pl.scan_csv('/content/dados_churn.csv')
Visualização Inicial dos Dados
A diferença entre a função scan_csv e a função read_csv é que a função read_csv faz a leitura da base de dados e armazena toda a base em memória, utilizando a memória RAM do computador.
No caso do scan_csv, ele escaneia o formato e a estrutura da base de dados, retornando uma query que permite realizar consultas a partir dessa base. Vamos executar essa célula com Ctrl + Enter. Na próxima célula, verificaremos o que foi armazenado na variável dados. Escrevemos:
E pressionamos Ctrl + Enter para executar.
O retorno é um Navy Query Plan que executa um Lazy Frame. Armazenamos nossa base de dados em um Lazy Frame, que mostra um grafo para visualizar a versão otimizada dessa query. Até o momento, ele apenas escaneou todo o conteúdo da base de dados. O pi * 20 indica que ele está selecionando todas as colunas da base de dados, totalizando 20 colunas. No entanto, ainda não conseguimos visualizar a base de dados. Como podemos visualizar esses dados? Precisamos retornar o resultado em memória para visualizar as informações.
Otimização e Coleta de Dados
Podemos escrever:
Para otimizar uma query que retorna apenas os cinco primeiros resultados. Executando essa célula com Ctrl + Enter, a query é otimizada para retornar apenas os cinco primeiros resultados e, com o collect, o resultado é exibido na tela.
Agora, temos uma visualização inicial da base de dados, com todas as colunas, o tipo de cada coluna e as informações de cada linha. Para visualizar de forma resumida o nome de todas as colunas e os primeiros elementos, podemos utilizar a função glimpse. Na próxima célula, utilizamos:
dados.collect().glimpse()
Ao executar com Ctrl + Enter, ele retorna a quantidade de linhas na base de dados, que é mais de um milhão, 20 colunas, e exibe o nome de cada coluna, o tipo de dado e os dez primeiros registros. Assim, temos uma ideia geral da nossa base de dados.
Análise das Colunas e Próximos Passos
Incluímos um texto em Markdown com as principais informações sobre cada coluna. Temos informações sobre o cliente, serviço de telefonia, serviço de internet e conta. Cada coluna indica uma informação diferente. Por exemplo, a coluna de churn indica se o cliente deixou de assinar o serviço, com valor 1 para sim e 0 para não. A coluna de gênero indica masculino ou feminino. Temos também a informação de idoso, se o cliente tem idade superior a 65 anos, parceiro, se o cliente possui uma parceira ou parceiro, dependentes, se o cliente possui dependentes, e assim por diante.
Agora, temos uma visão geral de cada informação e podemos compreender como realizar os tratamentos dessa base de dados em relação a cada coluna. Nossa tarefa agora é realizar a limpeza e o tratamento dessa base de dados para que ela possa ser utilizada em um modelo que fará a previsão da coluna de churn. Vamos começar esse tratamento no próximo vídeo.