Prevendo o consumo de cerveja em São Paulo
Artigo de conclusão do curso de data science pela awari
Introdução
A cerveja é uma das bebidas mais democráticas e consumidas do mundo. Ela é perfeita para quase todas as situações, desde happy hour até grandes festas de casamento. Se você pensar bem, já deu vontade de tomar uma cerveja não é mesmo? Bom, você não está sozinho.
O objetivo deste trabalho será demonstrar os impactos das variáveis sobre o consumo de cerveja em uma determinada região e a previsão de consumo para determinados cenários. Os dados (amostra) foram coletados em São Paulo - Brasil, em uma área universitária, onde acontecem algumas festas com turmas de alunos de 18 a 28 anos (média).
Você pode obter mais informações sobre o arquivo no site do kaggle:
Beer Consumption - Sao Paulo
Importando as bibliotecas
As bibliotecas facilitam o nosso estudo, pois foram criadas para explorar, analisar e manipular dados. Exatamente nesta ordem que importaremos:
Lendo o arquivo de dados
O nosso arquivo de dados é um arquivo CSV (Comma Separated Values) cujo separador utilizado nele é o ;(ponto e vírgula).
Usaremos o pandas para ler o dataset e usaremos o comando shape para medir o tamanho (Quantidade de linhas e colunas), além do comando head para visualizar as 10 primeiras linhas do nosso dataset.
Descrevendo as colunas:
- Data: é o dia que foram coletados os dados.
- Temperatura média (C): temperatura média para o respectivo dia.
- Temperatura mínima (C): temperatura mínima para o respectivo dia.
- Temperatura máxima (C): temperatura máxima para o respectivo dia.
- Precipitação (mm): quantidade em mililitros de chuva para o respectivo dia.
- Final de Semana: se o respectivo dia era final de semana
(1=sim, 0=não). - Consumo de cerveja (litros): consumo de cerveja em litros para o respectivo dia.
Observando o resultado acima, verificamos a quantidade total de registros com 941 linhas e 7 colunas.
Preparação e limpeza dos dados
Para começar a preparar os dados, primeiro faremos a verificação de quantos valores não são null (null implica valores faltantes) para cada coluna.
Temos 576 valores faltantes em cada coluna no nosso arquivo.
Vamos nos aprofundar um pouco mais para descobrir quais são esses valores.
Bingo! Por algum motivo o dataset possui registros somente até a linha 364 que corresponde aos 365 dias do ano já que em python a contagem começa a partir da linha 0. Vamos retirar estes valores faltantes e fazer a verificação para termos certeza de que realmente foram retirados do nosso arquivo.
Agora que o nosso dataset não possui valores faltantes, vamos observar algumas informações do nosso arquivo com o método info.
Observando as informações acima, podemos considerar que algumas colunas estão com o formato object e isso implicará em problemas no nosso dataset, pois não estão no formato padrão de cada tipo de dado. Para isto, vamos converter a coluna data em formato datetime e colunas de temperaturas e precipitação em float, além da coluna final de semana para inteiro, já que estamos trabalhando no formato americano onde os números utilizam ponto ao invés de vírgula.
Vamos utilizar o método info de novo para confirmar se as colunas foram convertidas para o formato que definimos anteriormente.
Pronto! Agora que já limpamos e definimos o nosso arquivo de dados, podemos incluir algumas informações para melhor visualização dos resultados.
Incluindo informações no dataset
Como nosso arquivo possui a data com dia, mês e ano, podemos desmembrar essas informações e criar algumas colunas:
- Criação da coluna do mês
- Criação da coluna de dia da semana
- Criação da coluna de se foi feriado no dia ou não
- Definição de dia útil ou não
Vamos começar importando o arquivo que contém os feriados do ano e convertendo o formato da data para datetime.
Agora que já possuímos quais os dias foram feriados, podemos criar as colunas mencionadas anteriormente.
Para melhor visualização dos dados posteriormente, também iremos trocar os valores inteiros para strings de algumas colunas.
Análises Estatísticas Preliminares
Estatísticas Descritivas
O intuito de se fazer uma análise preliminar utilizando as estatística descritivas é verificar se há dados discrepantes — que pode decorrer de uma digitação errada, esquecimento de registrar, falha no sistema ou qualquer outra coisa.
Então, fazemos:
Com essa análise, se víssemos, por exemplo, que o valor da temperatura máxima fosse 100.00 ou da mínima -50.00, observaríamos que há algo de errado, pois sabemos que em São Paulo normalmente não temos esse tipo de tempo. Além disso, precisamos ver se faz sentido a gradação de cada dado — os steps entre os quartis — e se não há salto absurdos neles, o que caracterizaria a existência de outliers. Quando ocorre a existência de outliers, precisamos tratar nosso dataset para que esses dados não impactem a nossa análise e a possibilidade de errarmos no nosso modelo estimado.
Visualizando o dataset
Nessa seção, vamos começar a analisar graficamente os nossos dados e fazer algumas perguntas a serem respondidas:
1- Qual a variável de menor e maior correlação no consumo de cerveja?
Observando a matriz de correlação, verificamos as correlações da variável consumo com as demais. Verificamos uma correlação negativa de ‘consumo’ com ‘precipitação’ e podemos tirar uma hipótese de que quando chove o consumo de cerveja diminui.
Verificamos também que há uma correlação positiva de ‘consumo’ com ‘temperatura máxima’ e podemos tirar uma hipótese de que quanto maior a temperatura, o consumo de cerveja também aumenta.
2- A temperatura média influencia no consumo?
Observando o gráfico de linha, podemos definir que sim, há uma variação dependendo do dia da semana, mas a temperatura influencia no consumo de cerveja.
3- Se consome mais cerveja em dias de semana, finais de semana, feriado ou dia útil?
Observando o gráfico de barras, podemos definir que o consumo ainda é maior nos finais de semana do que em feriados ou dias úteis.
4- Quais os dias da semana de maior consumo?
Observando o gráfico de boxplot, verificamos que os dias de maior consumo são sábado e domingo, também não há a presença de outliers ou dados discrepantes. A distribuição parece OK. Esporadicamente, apenas nas quintas feiras o consumo é um pouco maior fugindo um pouco da média consumida neste dia.
5- Qual mês que mais se consome cerveja?
Analisando o gráfico acima, verificamos que o mês de maior consumo é o mês de janeiro, seguido por outubro e dezembro.
Poderíamos parar nossa análise por aqui, já conseguimos tirar bastante insights bem legais não é? Mas vamos adiante para nossa última etapa que é a parte de machine learning onde nosso modelo irá fazer a nossa predição.
Transformando os dados em binários
Para fazer nossa predição, antes de converter nossos dados em treino e teste, primeiro iremos transformar nossos dados em binários com o método get_dummies que converte variáveis categóricas em variáveis indicadoras.
Separando as variáveis x e y
Antes de começarmos os testes, precisamos pegar o nosso dataset e separar as variáveis. Para isto, vamos criar uma variável com todas as informações removendo apenas a coluna Data.
Criando os datasets de treino e de teste
Para separar o nosso conjunto de dados, vamos separar da seguinte maneira, onde X vai ser todo nosso conjunto de dados retirando apenas a variável que queremos prever (consumo de cerveja) que vai ser o nosso y.
Agora que já temos nosso X e y definidos, vamos separar o nosso conjunto de treino e teste, onde 70% do nossos dados vão servir para treino e somente 30% para teste.
Sabemos que o total de registros que possuímos são 365. De fato, a função dividiu em dois datasets ( X_train e X_test) contendo, respectivamente 255 e 110 registros (255 + 110 = 365).
Multiple Linear Regression
A partir de agora vocês verão que aplicar machine learning possui quase sempre o mesmo padrão, aplicaremos a regressão linear múltipla, onde vamos guardar o nosso R² score na variável result, com isso, mais tarde podemos comparar todas as técnicas aplicadas e ver qual obteve melhor performance no nosso modelo.
Random Forest
Decision Tree Regression
Resultados
Agora que estimamos o modelo, vamos verificar o quão bom ou ruim foram os nossos modelos. Nosso parâmetro será o coeficiente de determinação (R²) que é uma medida resumida que diz quanto a reta de regressão ajusta-se aos dados.
Onde: 0 ≤ R² ≤ 1
Observando o resultado obtido, verificamos que o valor 0.70 nos diz que nosso modelo estimado é capaz de ter uma assertividade de 70% ao queremos calcular o quanto será o consumo de cerveja (em litros) dados os valores de chuva (em mililitros), temperatura (em Celsius) e se é final de semana ou não.
Quanto mais próximo do valor 1.0, melhor. Então, nosso objetivo é maximizar esse valor.
Usando o GridSearchCV
Essa função permite que a gente teste um bando de combinação de parâmetros nos nossos modelos, facilitando a gente achar o melhor. Vamos utilizar esta função no nosso modelo de Random Forest.
Agora que já sabemos quais os melhores parâmetros para nosso modelo, vamos verificar o score.
Obtivemos um score de 63% mas ainda sim a regressão linear continua sendo a melhor escolha como modelo, com um score de 70%.
Conclusão
Podemos concluir que a temperatura influencia no consumo de cerveja, o consumo ainda é maior nos finais de semana do que em feriados ou dias úteis, que os dias de maior consumo são sábado e domingo, que o mês de maior consumo é o mês de janeiro, seguido por outubro e dezembro e ainda conseguimos fazer uma predição com assertividade de 70% para os próximos dias.
Caso você se interesse em se aprofundar mais no assunto e explorar esses tópicos acima, recomendo que você se inscreva nos cursos da awari e inicie seus estudos na Formação Cientista de Dados! 😄
É isso aí! Muito obrigado e até a próxima!