Alura > Cursos de Data Science > Cursos de Machine Learning > Conteúdos de Machine Learning > Primeiras aulas do curso Regressão: construindo Árvores de Regressão

Regressão: construindo Árvores de Regressão

Trabalhando com os dados - Apresentação

Se você deseja aprender a construir modelos de regressão baseados em árvores no ambiente Python, venha conosco!

Quem nos acompanhará nesse curso é a instrutora Mirla Costa.

Audiodescrição: Mirla Costa se identifica como uma mulher branca, de cabelos cacheados e pretos, abaixo da altura dos ombros. Tem olhos castanhos e usa um óculos de grau com armação redonda e aparelho dental. Está com uma blusa verde clara sem mangas e batom vermelho. Ao fundo, parede branca com duas pequenas prateleiras com decorações e iluminação degradê do verde para o azul.

O que vamos aprender?

Durante este curso, trabalharemos como cientistas de dados em uma transportadora. Nosso novo cliente, um estúdio que constrói esculturas luxuosas, está nos sobrecarregando de pedidos, a ponto da equipe não conseguir atender a demanda de precificação de cada pedido, de cada obra enviada.

Para o desenvolvimento de todo o projeto, utilizaremos Python e bibliotecas como Pandas, NumPy, Matplotlib, Seaborn e SKLearn, para preparar e visualizar os dados, além de construir e avaliar nossos modelos.

Pré-requisitos

Para que você tenha um bom aproveitamento deste curso, recomendamos que já tenha conhecimento de Python, com foco nas bibliotecas Pandas e NumPy, para preparar os dados, além de bibliotecas de visualização de dados, como Matplotlib, Seaborn.

Também sugerimos um conhecimento básico de Machine Learning (Aprendizado de Máquina) e algoritmos mais simples de regressão.

Vamos começar?

Trabalhando com os dados - Conhecendo nosso problema

Trabalhamos em uma transportadora especializada no transporte de obras de arte e artigos de luxo. Muitos estúdios que produzem essas obras de arte nos contratam para realizar o transporte de suas peças, até mesmo internacionalmente.

Conhecendo o problema

Um estúdio em particular, focado na construção e comercialização de esculturas, nos contratou para realizar as entregas de suas peças. Sempre realizamos essas entregas com muito cuidado, pois são peças únicas, originais e que jamais podem chegar com avarias para a clientela da empresa.

Como essas peças são únicas e originais, elas variam bastante de tamanho, peso e tipo de transporte. E, devido à grande demanda do estúdio de esculturas, nossa equipe está tendo dificuldades para calcular todo o custo, gerar o relatório de entrega e enviá-lo ao estúdio de forma rápida e com preços acessíveis dentro do mercado.

Ponto-chave: como calcular o custo da operação?

Para solucionar esse problema, vamos construir um modelo de regressão baseado em árvores, que receberá todo o conjunto de dados e precificará o frete, ou seja, o custo da nossa entrega para o estúdio de esculturas.

No entanto, para fazer isso, precisamos de dados. Os dados que recebemos contêm informações sobre o custo de frete calculado, juntamente com informações sobre as entregas que foram feitas durante o tempo de contrato do estúdio de esculturas.

Vamos ao Google Colab para acessar esses dados em Python. O notebook do nosso projeto está disponibilizado dentro das atividades dessa aula.

Acessando os dados

Vamos começar a analisar a primeira célula de código do Colab.

Para acessar esses dados, precisamos de um link de acesso aos arquivos, os quais também estão disponíveis nas atividades junto com esse notebook. Copie e cole o código com o seu link de acesso na célula abaixo:

url = 'link_github/entregas.csv'

url_teste = 'link_github/teste_entregas.csv'

Nesse caso, temos dois arquivos. O primeiro, que está na variável url, é o arquivo entregas.csv. Esse arquivo será utilizado durante quase todo o projeto.

Mas, tem um arquivo que está na variável url_test, que é o arquivo teste_entregas.csv. Precisamos precificar esse arquivo, porque já é a demanda que a nossa equipe está enfrentando.

Para poder salvar os caminhos nessas variáveis, vamos executar essa célula com "Shift + Enter". Feito isso, já podemos importar as bibliotecas que serão utilizadas durante o nosso projeto.

As bibliotecas mais comuns para lidar com os dados são Pandas e NumPy. Para importá-las, vamos colocar import pandas as pd para utilizar o nome pd para essa biblioteca. Faremos o mesmo com NumPy, usando import numpy as np.

import pandas as pd
import numpy as np

Agora que já executamos essas células, podemos, finalmente, coletar os nossos dados.

O dado que utilizaremos serão os dados de entrega. Portanto, vamos criar a variável dados que vai receber os dados de pd.read_csv(). Dentro dos parênteses, vamos digitar url, que contém o caminho para entregas.csv.

Na próxima linha, vamos digitar dados para poder visualizar algumas linhas e colunas desse DataFrame (DF).

dados = pd.read_csv(url)
dados
#id_clientenome_artistareputacao_artistaalturalargurapesomaterialpreco_esculturapreco_base_enviointernacionalenvio_expressoinstalacao_incluidatransportefragilpedido_extra_clientelocalizacao_remotadata_agendadadata_entregacusto
0e9dff114-bc2b-47e9-9f5c-669e32ad9bbeBilly Jenkins0.260005.18161.82881872.427776Latão73027.585.4175SimSimNãoAéreoNãoSimNão07/06/1903/06/191487.2725
1ba3b707f-b123-4eec-93f4-1fbebfe72b68Jean Bryant0.280000.91440.914427.669112Latão35857.578.7500NãoNãoNãoRodoviárioNãoSimNão06/03/2105/03/21839.7900
2c4212086-3e22-489e-bc2e-0d5092ef0526Laura Miller0.070002.43841.5240107.501304Argila26040.0111.1950NãoNãoNãoRodoviárioSimSimSim09/03/1908/03/19810.0225
4460a380ff88-2c96-4d70-919a-af0bc8caeed7Karen Bayles0.450006.09608.53444921.926792Alumínio161857.5355.4250NãoNãoSimRodoviárioNãoSimNão19/04/2021/04/205653.4625
446126fea648-9cc1-4a2b-9458-0b2d35957803Denise Worth0.680005.79122.4384266.258504Argila36330.054.4950SimNãoNãoNão especificadoSimNãoNão10/04/2309/04/231861.3875

Conseguimos observar que há algumas variáveis textuais e outras variáveis numéricas.

Para saber o que se refere cada uma dessas colunas, deixaremos uma tabela com os dicionários de dados, que também está nas atividades desse curso:

Nome da ColunaDescrição
id_clienteRepresenta o número de identificação único dos clientes
nome_artistaRepresenta o nome do artista
reputacao_artistaRepresenta a reputação de um artista no mercado (quanto maior o valor da reputação, maior a reputação do artista no mercado)
alturaRepresenta a altura da escultura em metros
larguraRepresenta a largura da escultura em metros
pesoRepresenta o peso da escultura em quilos
materialRepresenta o material do qual a escultura é feita
preco_esculturaRepresenta o preço da escultura
preco_base_envioRepresenta o preço base para o envio de uma escultura
internacionalIndica se o envio é internacional
envio_expressoIndica se o envio foi no modo expresso (rápido)
instalacao_incluidaIndica se a instalação estava incluída na compra da escultura
transporteRepresenta o modo de transporte do pedido
fragilIndica se o pedido é frágil
pedido_extra_clienteRepresenta se o cliente deixou detalhes a mais para entrega
data_agendadaRepresenta a data de previsão de entrega
data_entregaRepresenta a data de entrega do pedido
custoRepresenta o custo do envio do pedido

Para ter uma noção de como estão distribuídos esses textos e também saber se existem variáveis nulas nesse DF, vamos utilizar o método info() do Pandas.

dados.info()

<class 'pandas.core.frame.DataFrame'>

RangeIndex: 4462 entries, 0 to 4461

Data columns (total 19 columns):

#ColumnNon-Null CountDtype
0id_cliente4462 non-nullobject
1nome_artista4462 non-nullobject
2reputacao_artista4462 non-nullfloat64
3altura4462 non-nullfloat64
4largura4462 non-nullfloat64
5peso4462 non-nullfloat64
6material4462 non-nullobject
7preco_escultura4462 non-nullfloat64
8preco_base_envio4462 non-nullfloat64
9internacional4462 non-nullobject
10envio_expresso4462 non-nullobject
11instalacao_incluida4462 non-nullobject
12transporte4462 non-nullobject
13fragil4462 non-nullobject
14pedido_extra_cliente4462 non-nullobject
15localizacao_remota4462 non-nullobject
16data_agendada4462 non-nullobject
17data_entrega4462 non-nullobject
18custo4462 non-nullfloat64

dtypes: float64(7), object(12)

memory usage: 662.5+ KB

O que conseguimos observar? Temos 4462 linhas com 19 colunas. Dessas 19 colunas, nenhuma tem valores nulos, porque todas as linhas têm a mesma quantidade de variáveis não nulas que a quantidade de linhas total do DataFrame.

Também conseguimos observar que existem várias variáveis textuais e algumas numéricas, de tipo float.

Vamos entender essas colunas, a partir de um pequeno resumo:

As colunas de datas são um ponto de atenção, porque atualmente estão como tipo textual, que é o tipo object.

Aviso: No vídeo, aparece a coluna data_pedido como data, porém, o nome correto é data_agendada. Mas, não se preocupe, o nome já está corrigido na transcrição e no notebook do curso.

Próximos passos

Já conhecemos o problema em que estamos inseridos e também os dados com os quais vamos trabalhar. No próximo vídeo, precisamos verificar essas colunas categóricas textuais e também trabalhar com essas datas.

Trabalhando com os dados - Ajustando valores de tipo data

Durante o estudo dos tipos de dados, dentro do nosso conjunto de dados, identificamos que tínhamos várias colunas de tipos textuais, incluindo as datas.

No entanto, as datas podem nos trazer informações muito úteis para o nosso modelo regressivo, para ele poder prever os custos de entrega.

Por isso, não é muito interessante que estejam como variáveis textuais, pois esses modelos regressivos não conseguem lidar com valores textuais, apenas valores numéricos.

Então, uma ação que pode nos ajudar a não perder essas informações, é transformar os dados referentes às datas em valores numéricos.

Transformando valores para tipo data

Voltando para o nosso notebook, vamos agora iniciar o nosso código.

Primeiramente, devemos criar uma nova variável, um novo DataFrame, igual ao DataFrame que já estamos trabalhando, para poder modificá-lo, preservando também os dados originais.

Esse DataFrame vai se chamar df. Então, vamos digitar df igual a dados.copy() e apertar e "Shift + Enter" para executar.

df = dados.copy()

Agora, vamos começar a trabalhar e modificar o df - e não mais dados.

Vamos executar a transformação das nossas colunas, data_agendada e data_entrega, no tipo de coluna datetime, que é o tipo de dado que permite manipular aquela informação como uma data, isto é, um valor temporal.

Para isso, vamos escrever df e, entre colchetes e aspas simples, o nome da coluna que queremos transformar. A primeira será data_agendada.

Portanto, df['data_agendada'] será igual à função pd.to_datetime() para transformar ao tipo datatime. Entre os parênteses, vamos especificar novamente o nome da coluna df['data_agendada'] como primeiro parâmetro.

Fora dos colchetes, vamos colocar vírgula para acrescentar o segundo parâmetro que especifica o formato das datas. Nesse caso, o formato é dia, mês e ano, separados por barras. Por isso, colocamos o parâmetro format igual à %d/%m/%y, entre aspas simples.

As letras antes dos símbolos de porcentagens representam, respectivamente, a letra inicial das palavras para dia, mês e ano em inglês, e devem estar em minúsculo.

Faremos também o mesmo para a coluna de entregas. Basta duplicar essa linha e substituir a coluna data_agendada pela data_entrega.

df['data_agendada'] = pd.to_datetime(df['data_agendada'], format = '%d/%m/%y')
df['data_entrega'] = pd.to_datetime(df['data_entrega'], format='%d/%m/%y')

Após executar a célula, realizamos a transformação.

Calculando diferença entre datas

E agora, o que vamos fazer? Podemos coletar a diferença entre essas duas datas, a data agendada para a chegada do pedido e a data no qual foi entregue.

Para isso, criaremos uma nova coluna chamada diferenca_dias_entrega para receber essa informação da diferença de dias entre essas duas datas.

A coluna df['diferenca_dias_entrega'] será igual a abre e fecha parênteses. Entre parênteses, colocamos a diferença entre a coluna data_entrega e data_agendada. Isto é, df['data_entrega'] - df['data_agendada'].

Para transformar isso em um valor numérico de dias, devemos acrescentar, fora dos parênteses, .dt.days.

df['diferenca_dias_entrega'] = (df['data_entrega'] - df['data_agendada']).dt.days

Após apertar "Shift + Enter", geramos a nova coluna.

Guardando valor inteiro de dia, mês e ano

Para salvar o valor do dia da data_agendada, podemos criar uma coluna chamada data_agendada_dias. Assim, df['data_agendada_dias'] será igual a df['data_agendada'].dt.day. Desse modo, vamos salvar o valor inteiro do dia.

Também podemos fazer o mesmo para mês e ano. Assim, devemos criar a coluna df['data_agendada_mes'] que será igual a df['data_agendada'].dt.month e a coluna df['data_agendada_ano'] que será igual à df['data_agendada'].dt.year.

df['data_agendada_dias'] = df['data_agendada'].dt.day
df['data_agendada_mes'] = df['data_agendada'].dt.month
df['data_agendada_ano'] = df['data_agendada'].dt.year

Para guardar esses valores inteiros também para a coluna de entrega, podemos copiar esse código, colar na célula de baixo, e apenas modificar o nome data_agendada para data_entrega.

Basta selecionar a palavra agendada, apertar "Ctrl + Shift + L" para selecionar cada aparição dessa palavra nessa célula e escrever entrega.

df['data_entrega_dias'] = df['data_entrega'].dt.day
df['data_entrega_mes'] = df['data_entrega'].dt.month
df['data_entrega_ano'] = df['data_entrega'].dt.year

Lembre-se de executar as duas células.

Excluindo as colunas de data

Por fim, vamos excluir as colunas data_agendada e data_entrega, que estão no formato datetime, porque o nosso modelo não entende valores desse tipo.

Então, vamos colocar a função df.drop(). Entre parênteses, colocamos colchetes para passar os nomes, entre aspas simples, das duas colunas, data_agendada e data_entrega.

Fora dos colchetes, colocamos uma vírgula para acrescentar o parâmetro axis que considera se a função será aplicada nas linhas ou nas colunas. Nesse caso, especificamos como 1, já que queremos deletar as colunas.

Por fim, adicionamos mais uma vírgula para especificar o terceiro parâmetro, inplace igual a True. Podemos executar a célula.

df.drop(['data_agendada','data_entrega'], axis = 1, inplace = True)

Ao fim, vamos colocar um df.info() para verificar as alterações.

df.info()

<class 'pandas.core.frame.DataFrame'>

RangeIndex: 4462 entries, 0 to 4461

Data columns (total 24 columns):

#ColumnNon-Null CountDtype
0id_cliente4462 non-nullobject
1nome_artista4462 non-nullobject
2reputacao_artista4462 non-nullfloat64
3altura4462 non-nullfloat64
4largura4462 non-nullfloat64
5peso4462 non-nullfloat64
6material4462 non-nullobject
7preco_escultura4462 non-nullfloat64
8preco_base_envio4462 non-nullfloat64
9internacional4462 non-nullobject
10envio_expresso4462 non-nullobject
11instalacao_incluida4462 non-nullobject
12transporte4462 non-nullobject
13fragil4462 non-nullobject
14pedido_extra_cliente4462 non-nullobject
15localizacao_remota4462 non-nullobject
16custo4462 non-nullfloat64
17diferenca_dias_entrega4462 non-nullint64
18data_agendada_dias4462 non-nullint32
19data_agendada_mes4462 non-nullint32
20data_agendada_ano4462 non-nullint32
21data_entrega_dias4462 non-nullint32
22data_entrega_mes4462 non-nullint32
23data_entrega_ano4462 non-nullint32

dtypes: float64(7), int32(6), int64(1), object(10)

memory usage: 732.2+ KB

Temos as nossas novas colunas criadas, como tipo inteiro.

Próximos passos

Agora que temos as informações das datas em um formato numérico, podemos dar continuidade ao tratamento das colunas textuais.

Sobre o curso Regressão: construindo Árvores de Regressão

O curso Regressão: construindo Árvores de Regressão possui 115 minutos de vídeos, em um total de 45 atividades. Gostou? Conheça nossos outros cursos de Machine Learning em Data Science, ou leia nossos artigos de Data Science.

Matricule-se e comece a estudar com a gente hoje! Conheça outros tópicos abordados durante o curso:

Aprenda Machine Learning acessando integralmente esse e outros cursos, comece hoje!

Conheça os Planos para Empresas