Te damos as boas-vindas a este curso, em que vamos nos aprofundar e desenvolver um projeto na área de Data Science (Ciência de Dados).
Antes de começar, permita-me apresentar. Meu nome é Valquíria Alencar e serei sua instrutora nesse curso.
Audiodescrição: Valquíria Alencar se identifica como uma mulher branca. Tem cabelos loiros e lisos abaixo dos ombros e olhos castanhos. Usa piercing no septo e uma blusa preta. Ao fundo, estúdio com iluminação colorida. À direita, uma estante com decorações e à esquerda um vaso de planta.
Realizaremos etapas de carregamento e também processamento de dados, análise exploratória e até a criação de um modelo preditivo.
Vamos atuar como cientistas de dados de uma empresa que aluga bicicletas. A ideia é entender quais fatores afetam a demanda por bicicletas para que a empresa possa criar planos de ação específicos para atender a clientela.
Além disso, a empresa também quer que criemos um modelo que consiga prever quantas bicicletas serão alugadas no dia seguinte ou no mês seguinte. Isto é, conseguiremos prever o futuro.
Essas previsões serão feitas utilizando uma biblioteca muito interessante chamada Prophet, criada pelo grupo Meta, o mesmo grupo do Instagram e do Facebook.
Para que você consiga acompanhar bem este curso, recomendamos que já tenha conhecimentos em: Pandas, visualização de dados, testes estatísticos e regressão.
Vamos começar?
Vamos começar a desenvolver nosso projeto? Atuaremos como cientistas de dados de uma empresa que oferece um serviço de aluguel de bicicletas.
Em cidades como São Paulo, é comum encontrar bicicletas para locação. Basta pegar o celular, abrir um aplicativo e alugar uma bicicleta por um determinado período. Pode ser para trabalhar, estudar, passear, entre outras atividades.
Nós atuaremos como uma empresa que presta esse serviço. Essa empresa tem várias unidades pelo mundo e uma delas é em Londres. Portanto, vamos analisar dados de Londres. Mas qual é o problema que precisamos resolver?
Quando nos referimos ao aluguel de bicicletas, vários fatores podem interferir na demanda. Dependendo do horário do dia, podemos ter horários de pico. Também pode haver a influência do clima. Por exemplo, em um dia chuvoso, haverá mais ou menos pessoas alugando a bicicleta?
Vamos analisar esses dados para obter insights e ajudar essa empresa a otimizar ainda mais o seu serviço.
Além disso, a empresa quer que criemos um modelo preditivo capaz de prever quantas bicicletas serão alugadas em um determinado período de tempo futuro. Tudo isso para que a empresa esteja mais preparada para as demandas e para atender a clientela.
Primeiro, começaremos carregando os dados, entendendo-os, analisando e tirando vários insights.
Estamos com o ambiente do Google Colab preparado para começar a executar os códigos.
O que precisamos para começar? Dos dados que estão disponíveis no repositório do curso no GitHub. Dentro da pasta "Dados", temos um arquivo chamado bicicletas.csv
.
Para importar esse arquivo no Google Colab, basta entrar nesse arquivo e clicar em "Raw" no canto superior direito da página. Feito isso, podemos copiar o endereço da URL dos dados brutos desse arquivo.
Antes de tudo, para fazer a importação, precisamos da biblioteca Pandas no Colab para poder ler o arquivo, processá-lo, etc. Para importá-la, digitamos import pandas as pd
, que é o apelido dela para facilitar a escrita dos códigos.
import pandas as pd
Após executar a célula com "Shift + Enter", podemos começar a utilizar a Biblioteca Pandas.
Em uma nova célula, podemos criar uma variável chamada df
. Essa variável vai armazenar aquele conjunto de dados sobre as bicicletas.
Basta escrever que df
recebe uma função do Pandas que faz a leitura de um arquivo CSV, a pd.read_csv()
. Entre parênteses e aspas, colamos o endereço do arquivo no GitHub.
df = pd.read_csv('https://raw.githubusercontent.com/alura-cursos/data_science_projeto/main/Dados/bicicletas.csv')
Feito isso, executamos a célula.
Agora, podemos fazer uma leitura das cinco primeiras linhas - só para conhecer os dados desse conjunto. Para isso, digitamos df.head()
.
df.head()
# | data_hora | contagem | temperatura | sensacao_termica | umidade | velocidade_vento | clima | feriado | fim_de_semana | estacao |
---|---|---|---|---|---|---|---|---|---|---|
0 | 2015-01-04 00:00:00 | 182 | 3.0 | 2.0 | 93.0 | 6.0 | Nublado | Não | Sim | Inverno |
1 | 2015-01-04 01:00:00 | 138 | NaN | NaN | 93.0 | 5.0 | Céu limpo | Não | Sim | Inverno |
2 | 2015-01-04 02:00:00 | 134 | 2.5 | 2.5 | 96.5 | 0.0 | Céu limpo | Não | Sim | Inverno |
3 | 2015-01-04 03:00:00 | 72 | 2.0 | 2.0 | 100.0 | 0.0 | Céu limpo | Não | Sim | Inverno |
4 | 2015-01-04 04:00:00 | 47 | NaN | NaN | 93.0 | 6.5 | Céu limpo | Não | Sim | Inverno |
Executando, teremos as cinco primeiras linhas do DataFrame.
A coluna data_hora
contém a data e o horário que a informação foi coletada. No primeiro registro, temos o dia 4 de janeiro de 2015 à meia-noite.
Nos próximos registros, temos o mesmo dia, mas o horário muda. A coleta foi feita às uma hora da manhã, depois às duas horas, depois às três horas e assim por diante. Certamente, temos a coleta das informações a cada hora do dia.
Do lado, temos uma coluna de contagem
, que é a contagem de bicicletas. À meia-noite, no dia 4 de janeiro, tivemos 182 bicicletas sendo alugadas. Conseguimos até observar que o número foi caindo conforme a madrugada foi chegando, o que faz sentido.
Seguindo, temos a temperatura em graus Celsius, a sensação térmica, a umidade em porcentagem e a velocidade do vento em quilômetros por hora. Depois desses dados numéricos, temos algumas colunas categóricas, como clima, feriado, final de semana e estação do ano.
A ideia é começar a analisar esses dados para obter insights, mas tem um detalhe bem aparente nesse conjunto. Quando analisamos os dados da segunda e quinta linha da coluna temperatura
e sensacao_termica
, existe um tal de NaN
(Not a Number) ao invés de um número, como nas outras linhas.
O que será que esse NaN
significa? Será que precisamos fazer algum tratamento para trabalhar com esses dados? Acredito que sim, e faremos isso no próximo vídeo.
No vídeo anterior, carregamos nossos dados e agora é o momento de entender melhor o que temos, o que precisamos tratar e se há algo errado.
Podemos começar checando a dimensão desse conjunto de dados, usando o atributo shape
:
df.shape
(17429, 10)
Após executar, confirmamos que existe um grande número de registros nesse conjunto de dados, com 17429 linhas e 10 colunas.
Será que existem dados nulos nesse conjunto? Lembra que, quando carregamos os dados anteriormente, observamos que alguns valores, ao invés de numéricos, eram NaN
?
Para saber mais detalhes, podemos usar o método info()
:
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 17429 entries, 0 to 17428
Data columns (total 10 columns):
# Column Non-Null Count Dtype 0 data_hora 17429 non-null object 1 contagem 17429 non-null int64 2 temperatura 17406 non-null float64 3 sensacao_termica 17406 non-null float64 4 umidade 17429 non-null float64 5 velocidade_vento 17429 non-null float64 6 clima 17429 non-null object 7 feriado 17429 non-null object 8 fim_de_semana 17429 non-null object 9 estacao 17429 non-null object dtypes: float64(4), int64(1), object(5) memory usage: 1.3+ MB
Com isso, teremos uma informação detalhada sobre os tipos de dados e a quantidade de dados que não são nulos, isto é, que não estão ausentes.
Em Non-Null Count
podemos conferir a informação de não-nulas de cada uma das colunas. Não temos dados nulos na maioria, pois existem 17429 dados na maioria deles. Mas, nas colunas temperatura
e sensacao_termica
, temos apenas 17406.
Outra informação importante é que a coluna data_hora
é do tipo objeto, já a coluna de contagem
é do tipo inteiro. As outras colunas numéricas são do tipo float (ponto flutuante), que é quando temos um ponto com a casa decimal. Por fim, as colunas categóricas também são do tipo objeto.
Em relação aos nulos, como podemos somar quantos nulos temos, por exemplo? Podemos digitar df
e usar a função isnull()
. Ela indica se tem nulo ou não, colocando um True (verdadeiro) ou False (falso).
Mas, podemos fazer uma soma para saber quantos nulos temos de fato. Basta acrescentar .sum()
e executar.
df.isnull().sum()
Retorno:
data_hora 0
contagem 0
temperatura 23
sensacao_termica 23
umidade 0
velocidade_vento 0
clima 0
feriado 0
fim_de_semana 0
estacao 0
dtype: int64
Temos zero dados nulos na maioria das colunas, como já havíamos inferido. Mas, temos 23 dados nulos tanto na temperatura
quanto na sensacao_termica
.
O
NaN
significa Not a Number (não é um número) e é colocado quando não temos uma informação.
Mas, como podemos trabalhar com isso e substituir esses Not a Number por um número? Existem vários métodos para lidar com isso segundo a documentação da biblioteca Pandas.
Dentre as alternativas para tratar dados nulos, a forma mais radical de tratamento é o dropna()
, que simplesmente exclui a linha inteira que contém uma informação nula. Não é o que queremos fazer nesse caso.
Além disso, existem algumas formas de preencher esses valores, ao invés de simplesmente excluí-los. Poderíamos usar o ffill()
, que preenche usando o valor anterior.
Por exemplo, como temos valores nulos na segunda linha de temperatura e sensação térmica, poderíamos repetir os valores da primeira linha, que seriam 3.0
e 2.0
graus, respectivamente.
Confira a atividade de "Para Saber Mais", onde explicamos outras alternativas para serem o tratamento de dados nulos. Não deixe de ler esse conteúdo para incrementar o conhecimento.
Vamos usar uma estratégia bem interessante com ajuda do método interpolate()
para interpolar valores.
O que isso significa? Vamos exemplificar com o nulo da segunda linha de temperatura
. Existem valores não-nulos entre esse dado nulo. Antes dele, temos o número 3.0
e, depois dele, 2.5
. Poderíamos simplesmente tirar uma média desses valores para substituir pelo valor nulo.
Para conseguir usar o método, vamos chamar qual é a coluna que queremos fazer essa interpolação.
Nesse caso, a df['temperatura']
será igual à aplicação do método. Chamaremos novamente a coluna df['temperatura']
e o método .interpolate()
. Entre os parênteses, podemos especificar o método de interpolação que queremos usar.
Na documentação do método interpolate, você pode encontrar a explicação de vários métodos de interpolação. Usaremos o padrão, que é o linear. Basta colocar o parâmetro method
que será igual a linear
, entre aspas.
Faremos o mesmo para a sensação térmica também. Basta chamar df['sensacao_termica']
igual ao df['sensacao_termica'].interpolate()
, passando o parâmetro method
igual a linear
.
df['temperatura'] = df['temperatura'].interpolate(method='linear')
df['sensacao_termica'] = df['sensacao_termica'].interpolate(method='linear')
Após executar a célula, vamos visualizar algumas linhas do DataFrame para verificar o que ocorreu ali dentro.
Para isso, digitamos df.head()
, passando as 10
primeiras linhas.
df.head(10)
# | data_hora | contagem | temperatura | sensacao_termica | umidade | velocidade_vento | clima | feriado | fim_de_semana | estacao |
---|---|---|---|---|---|---|---|---|---|---|
0 | 2015-01-04 00:00:00 | 182 | 3.00 | 2.00 | 93.0 | 6.0 | Nublado | Não | Sim | Inverno |
1 | 2015-01-04 01:00:00 | 138 | 2.75 | 2.25 | 93.0 | 5.0 | Céu limpo | Não | Sim | Inverno |
2 | 2015-01-04 02:00:00 | 134 | 2.50 | 2.50 | 96.5 | 0.0 | Céu limpo | Não | Sim | Inverno |
3 | 2015-01-04 03:00:00 | 72 | 2.00 | 2.00 | 100.0 | 0.0 | Céu limpo | Não | Sim | Inverno |
4 | 2015-01-04 04:00:00 | 47 | 2.00 | 2.00 | 93.0 | 6.5 | Céu limpo | Não | Sim | Inverno |
5 | 2015-01-04 05:00:00 | 46 | 2.00 | 2.00 | 93.0 | 4.0 | Céu limpo | Não | Sim | Inverno |
6 | 2015-01-04 06:00:00 | 51 | 1.00 | -1.00 | 100.0 | 7.0 | Parcialmente nublado | Não | Sim | Inverno |
7 | 2015-01-04 07:00:00 | 75 | 1.00 | -1.00 | 100.0 | 7.0 | Parcialmente nublado | Não | Sim | Inverno |
8 | 2015-01-04 08:00:00 | 131 | 1.50 | -1.00 | 96.5 | 8.0 | Parcialmente nublado | Não | Sim | Inverno |
9 | 2015-01-04 09:00:00 | 301 | 2.00 | -0.50 | 100.0 | 9.0 | Nublado | Não | Sim | Inverno |
Agora não temos mais dados nulos no resultado.
Lembra que na primeira linha a temperatura era 3.0
e a sensação térmica era de 2.0
, enquanto na terceira linha ambas eram 2.5
? O método interpolate()
simplesmente tirou a média desses valores e preencheu os dados nulos na segunda linha com o resultado.
Também tínhamos um valor nulo na quinta linha, cujo índice é 4, mas agora está preenchido com o número 2.0
, porque os números de antes e depois eram 2.0
tanto para temperatura quanto para a sensação térmica.
Com isso, conseguimos tratar os dados, mas, antes de começar a trabalhar, poderíamos checar outro detalhe.
Será que os registros estão todos corretos? Será que não existem dados duplicados, ou seja, colunas repetidas? No próximo vídeo, vamos checar essa informação.
O curso Data Science: analisando e prevendo séries temporais possui 200 minutos de vídeos, em um total de 60 atividades. Gostou? Conheça nossos outros cursos de Data Science 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:
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.
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.
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.
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.
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.
Aprenda um novo idioma e expanda seus horizontes profissionais. Cursos de Inglês, Espanhol e Inglês para Devs, 100% focado em tecnologia.
Escolha os ebooks da Casa do Código, a editora da Alura, que apoiarão a sua jornada de aprendizado para sempre.
Acesso completo
durante 1 ano
Estude 24h/dia
onde e quando quiser
Novos cursos
todas as semanas