Awari

Prevendo o consumo de cerveja em São Paulo: estudo de caso em Data Science

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 shapepara medir o tamanho (Quantidade de linhas e colunas), além do comando head para visualizar as 10 primeiras linhas do nosso dataset.

Image for post

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.

Image for post

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.

Image for post

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.

Image for post

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:

Image for post

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.

# Somando a quantidade de valores NaN
df.isnull().sum()

Data                           576
Temperatura Media (C)          576
Temperatura Minima (C)         576
Temperatura Maxima (C)         576
Precipitacao (mm)              576
Final de Semana                576
Consumo de cerveja (litros)    576
dtype: int64

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?

Image for post

Observando a matriz de correlação, verificamos as correlações da variável consumocom 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?

Image for post

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?

Image for post

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?

Image for post

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?

Image for post

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_dummiesque converte variáveis ​​categóricas em variáveis ​​indicadoras.

Image for post

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 () que é uma medida resumida que diz quanto a reta de regressão ajusta-se aos dados.

Onde: 0 ≤ R² ≤ 1

Image for post

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!


Texto originalmente publicado por Gustavo Saturno em seu medium.

Gustavo Saturno

Escrito por

Gustavo Saturno

Gustavo foi aluno do curso de Data Science da Awari