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.
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.
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?
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.
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.
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_cliente | nome_artista | reputacao_artista | altura | largura | peso | material | preco_escultura | preco_base_envio | internacional | envio_expresso | instalacao_incluida | transporte | fragil | pedido_extra_cliente | localizacao_remota | data_agendada | data_entrega | custo |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | e9dff114-bc2b-47e9-9f5c-669e32ad9bbe | Billy Jenkins | 0.26000 | 5.1816 | 1.8288 | 1872.427776 | Latão | 73027.5 | 85.4175 | Sim | Sim | Não | Aéreo | Não | Sim | Não | 07/06/19 | 03/06/19 | 1487.2725 |
1 | ba3b707f-b123-4eec-93f4-1fbebfe72b68 | Jean Bryant | 0.28000 | 0.9144 | 0.9144 | 27.669112 | Latão | 35857.5 | 78.7500 | Não | Não | Não | Rodoviário | Não | Sim | Não | 06/03/21 | 05/03/21 | 839.7900 |
2 | c4212086-3e22-489e-bc2e-0d5092ef0526 | Laura Miller | 0.07000 | 2.4384 | 1.5240 | 107.501304 | Argila | 26040.0 | 111.1950 | Não | Não | Não | Rodoviário | Sim | Sim | Sim | 09/03/19 | 08/03/19 | 810.0225 |
… | … | … | … | … | … | … | … | … | … | … | … | … | … | … | … | … | … | … | … |
4460 | a380ff88-2c96-4d70-919a-af0bc8caeed7 | Karen Bayles | 0.45000 | 6.0960 | 8.5344 | 4921.926792 | Alumínio | 161857.5 | 355.4250 | Não | Não | Sim | Rodoviário | Não | Sim | Não | 19/04/20 | 21/04/20 | 5653.4625 |
4461 | 26fea648-9cc1-4a2b-9458-0b2d35957803 | Denise Worth | 0.68000 | 5.7912 | 2.4384 | 266.258504 | Argila | 36330.0 | 54.4950 | Sim | Não | Não | Não especificado | Sim | Não | Não | 10/04/23 | 09/04/23 | 1861.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 Coluna | Descrição |
---|---|
id_cliente | Representa o número de identificação único dos clientes |
nome_artista | Representa o nome do artista |
reputacao_artista | Representa a reputação de um artista no mercado (quanto maior o valor da reputação, maior a reputação do artista no mercado) |
altura | Representa a altura da escultura em metros |
largura | Representa a largura da escultura em metros |
peso | Representa o peso da escultura em quilos |
material | Representa o material do qual a escultura é feita |
preco_escultura | Representa o preço da escultura |
preco_base_envio | Representa o preço base para o envio de uma escultura |
internacional | Indica se o envio é internacional |
envio_expresso | Indica se o envio foi no modo expresso (rápido) |
instalacao_incluida | Indica se a instalação estava incluída na compra da escultura |
transporte | Representa o modo de transporte do pedido |
fragil | Indica se o pedido é frágil |
pedido_extra_cliente | Representa se o cliente deixou detalhes a mais para entrega |
data_agendada | Representa a data de previsão de entrega |
data_entrega | Representa a data de entrega do pedido |
custo | Representa 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):
# Column Non-Null Count Dtype 0 id_cliente 4462 non-null object 1 nome_artista 4462 non-null object 2 reputacao_artista 4462 non-null float64 3 altura 4462 non-null float64 4 largura 4462 non-null float64 5 peso 4462 non-null float64 6 material 4462 non-null object 7 preco_escultura 4462 non-null float64 8 preco_base_envio 4462 non-null float64 9 internacional 4462 non-null object 10 envio_expresso 4462 non-null object 11 instalacao_incluida 4462 non-null object 12 transporte 4462 non-null object 13 fragil 4462 non-null object 14 pedido_extra_cliente 4462 non-null object 15 localizacao_remota 4462 non-null object 16 data_agendada 4462 non-null object 17 data_entrega 4462 non-null object 18 custo 4462 non-null float64 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:
reputacao_artista
, altura
, largura
, peso
, preco_escultura
, preco_base_envio
;id_cliente
, nome_artista
, material
, internacional
, envio_expresso
, instalacao_incluida
, transporte
, fragil
, pedido_extra_cliente
, localizacao_remota
;data_agendada
, data_entrega
;custo
.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.
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.
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.
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.
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.
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.
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):
# Column Non-Null Count Dtype 0 id_cliente 4462 non-null object 1 nome_artista 4462 non-null object 2 reputacao_artista 4462 non-null float64 3 altura 4462 non-null float64 4 largura 4462 non-null float64 5 peso 4462 non-null float64 6 material 4462 non-null object 7 preco_escultura 4462 non-null float64 8 preco_base_envio 4462 non-null float64 9 internacional 4462 non-null object 10 envio_expresso 4462 non-null object 11 instalacao_incluida 4462 non-null object 12 transporte 4462 non-null object 13 fragil 4462 non-null object 14 pedido_extra_cliente 4462 non-null object 15 localizacao_remota 4462 non-null object 16 custo 4462 non-null float64 17 diferenca_dias_entrega 4462 non-null int64 18 data_agendada_dias 4462 non-null int32 19 data_agendada_mes 4462 non-null int32 20 data_agendada_ano 4462 non-null int32 21 data_entrega_dias 4462 non-null int32 22 data_entrega_mes 4462 non-null int32 23 data_entrega_ano 4462 non-null int32 dtypes: float64(7), int32(6), int64(1), object(10)
memory usage: 732.2+ KB
Temos as nossas novas colunas criadas, como tipo inteiro.
Agora que temos as informações das datas em um formato numérico, podemos dar continuidade ao tratamento das colunas textuais.
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:
Impulsione a sua carreira com os melhores cursos e faça parte da maior comunidade tech.
1 ano de Alura
Assine o PLUS e garanta:
Formações com mais de 1500 cursos atualizados e novos lançamentos semanais, em Programação, Inteligência Artificial, Front-end, UX & Design, Data Science, Mobile, DevOps e Inovação & Gestão.
A cada curso ou formação concluído, um novo certificado para turbinar seu currículo e LinkedIn.
No Discord, você tem acesso a eventos exclusivos, grupos de estudos e mentorias com especialistas de diferentes áreas.
Faça parte da maior comunidade Dev do país e crie conexões com mais de 120 mil pessoas no Discord.
Acesso ilimitado ao catálogo de Imersões da Alura para praticar conhecimentos em diferentes áreas.
Explore um universo de possibilidades na palma da sua mão. Baixe as aulas para assistir offline, onde e quando quiser.
Acelere o seu aprendizado com a IA da Alura e prepare-se para o mercado internacional.
1 ano de Alura
Todos os benefícios do PLUS e mais vantagens exclusivas:
Luri é nossa inteligência artificial que tira dúvidas, dá exemplos práticos, corrige exercícios e ajuda a mergulhar ainda mais durante as aulas. Você pode conversar com a Luri até 100 mensagens por semana.
Aprenda um novo idioma e expanda seus horizontes profissionais. Cursos de Inglês, Espanhol e Inglês para Devs, 100% focado em tecnologia.
Transforme a sua jornada com benefícios exclusivos e evolua ainda mais na sua carreira.
1 ano de Alura
Todos os benefícios do PRO e mais vantagens exclusivas:
Mensagens ilimitadas para estudar com a Luri, a IA da Alura, disponível 24hs para tirar suas dúvidas, dar exemplos práticos, corrigir exercícios e impulsionar seus estudos.
Envie imagens para a Luri e ela te ajuda a solucionar problemas, identificar erros, esclarecer gráficos, analisar design e muito mais.
Escolha os ebooks da Casa do Código, a editora da Alura, que apoiarão a sua jornada de aprendizado para sempre.