Estimando o Consumo de Cerveja com Ciência de Dados

Daniel Volponi
6 min readMar 20, 2021

--

Olá, sou o Daniel, sou graduado em Administração, no ínicio de 2020 comecei a trabalhar como Cientista de Dados e desde então venho fazendo vários cursos de aprimoramento.

Nesse meu primeiro texto vou falar sobre um modelo que desenvolvi no curso Regressão Linear: Testando Relações e Prevendo Resultados da Alura, mostrando como funciona o processo e o pensamento de um cientista de dados.

Me inspirei no texto do “O funcionário sairá da empresa? Fazendo previsões com Machine Learning!” do Hernandes Matias Junior. A propósito recomendo muito a leitura.

1. Problema de Negócio

Estimar um modelo de Machine Learning utilizando a técnica de Regressão Linear utilizando o Jupyter Notebook, a fim de realizar previsões para o consumo de cerveja, com base na temperatura, dia da semana e clima.

2. Obtenção e tratamento dos dados

A amostra de dados foi coletada em São Paulo — Brasil, no ano de 2015, em uma área universitária marcada por festas com grupos de alunos de 18 a 28 anos de idade em média.

Dados:

  • data — Data
  • temp_media — Temperatura Média (°C)
  • temp_min — Temperatura Mínima (°C)
  • temp_max — Temperatura Máxima (°C)
  • chuva — Precipitação (mm)
  • fds — Final de Semana (1 = Sim; 0 = Não)
  • consumo — Consumo de Cerveja (litros)

O DataSet utilizado foi extraído do Kaggle, uma plataforma de competição e de aprendizado de técnicas de Data Science (https://www.kaggle.com/dongeorge/beer-consumption-sao-paulo).

2.1 Importando os dados no Jupyter Notebook

# Importando as Bibliotecas

import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
import numpy as np

# Lendo os Dados

dados = pd.read_csv(‘../Dados/Consumo_cerveja.csv’, sep = ‘;’)

dados.head()

Exibindo os dados do dataset tem-se 365 linhas, uma por dia do ano, dispostas em 7 colunas, conforme segue:

3. Análise exploratória dos dados

Uma vez carregados os dados no Jupyter, vamos investigar como estão relacionados entre si.

3.1 Estatísticas Descritivas

Utilizando a função describe, extraímos as seguintes estatísticas descritivas:

dados.describe()

A conclusão é de que o consumo médio é de 25.401 litros por dia, com desvio padrão de 4.399 litros em relação a média.

3.2 Matriz de Correlação

O coeficiente de correlação é uma medida de associação linear entre duas variáveis e situa-se entre -1 e +1, de modo que -1 indica associação negativa perfeita e +1 indica associação positiva perfeita.

A matriz de correlação pode ser calculada por meio da função corr, abaixo indicada:

dados.corr().round(4)

A análise da variável consumo permite identificar um aumento de aproximadamente 50,60% no final de semana, e uma variação positiva de 64,27% com o aumento da temperatura máxima (temp_max).

Além disso, percebemos uma queda de -19,38% no consumo de cerveja quando chove, resultado da associação negativa da variável.

3.3 Análise Gráficas

Gráficos de dispersão entre as variáveis do dataset

ax = sns.pairplot(dados, y_vars=’consumo’, x_vars=[‘temp_min’, ‘temp_media’, ‘temp_max’, ‘chuva’, ‘fds’], kind = ‘reg’)
ax.fig.suptitle(‘Dispersão ente as variáveis’, fontsize=20, y = 1.10)
ax

O gráfico acima confirma as análises de correlação, revelando uma relação positiva entre consumo e temperatura e negativa entre consumo e chuva.

Variável Dependente X Variáveis Explicativas (jointplot)

ax= sns.lmplot(x=”temp_max”, y=”consumo”, data=dados, hue = “fds”, markers=[‘o’, ‘*’], legend = False)
ax.fig.suptitle(‘Reta de Regressao — Consumo X Temperatura’, fontsize=16, y=1.02)
ax.set_xlabels(“Temperatura Máxima (°C)”, fontsize=14)
ax.set_ylabels(“Consumo de Cerveja (litros)”, fontsize=14)
ax.add_legend(title = “Fim de Semana”)
ax

O diagrama aponta que a variável resposta consumo é impactada positivamente pela variável preditora fim de semana e duas retas de regressão ascendentes delineiam a interação entre tais variáveis.

4. Estimando um Modelo de Regressão Linear para o Consumo

A análise de regressão diz respeito ao estudo da dependência de determinada variável (no caso em questão, a variável dependente Consumo) em relação às variáveis explanatórias Temperatura Máxima, Chuva e Fim de Semana, com o propósito de estimar o valor médio da primeira em termos dos valores conhecidos ou fixados destas últimas.

Para produzir a regressão, recorreremos à biblioteca scikit-learn, um módulo Python especializado em soluções para machine learning (https://scikit-learn.org/stable/).

Nesse estudo, reservamos 30% dos nossos dados para teste do modelo e o restante para treino:

# Importando o train_test_split da biblioteca scikit-learn

from sklearn.model_selection import train_test_split

# Criando uma Series (pandas) para armazenar o Consumo de Cerveja (y)

X = dados[[‘temp_max’, ‘chuva’, ‘fds’]]

# Criando os datasets de treino e de teste

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=2811)

Dessa forma, temos os dados divididos em Y (consumo) e X (temperatura maxima, chuva e fds) de treino e de teste. E agora passamos ao modelo de regressão:

#Importando LinearRegression e metrics da biblioteca scikit-learn

from sklearn.linear_model import LinearRegression
from sklearn import metrics

# Instanciando a classe LinearRegression()

modelo = LinearRegression()

# Utilizando o método fit() do objeto “modelo” para estimar nosso modelo linear utilizando os dados de TREINO (y_train e X_train)

modelo.fit(X_train, y_train)

A partir do modelo calculado se infere o Coeficiente de Determinação — R², entendido como uma medida resumida que afere o quanto a linha de regressão ajusta-se aos dados. Trata-se de um valor entre 0 e 1, onde 0 acusa que a regressão e os dados em nada convergem, ao passo que 1 informa perfeita coalizão entre a regressão e os dados. Aqui, a execução do comando resulta em R² = 0,73.

print(‘R² = {}’.format(modelo.score(X_train, y_train).round(2)))

5. Interpretação dos Coeficientes Estimados

Obtendo o intercepto do modelo

O intercepto representa o efeito médio em 𝑌 (Consumo de Cerveja) tendo todas as variáveis explicativas excluídas do modelo. De forma mais simples, o intercepto retrata o efeito médio em 𝑌 (Consumo de Cerveja) quando a Temperatura Máxima, Chuva e Fim de Semana são iguais a zero.

modelo.intercept_

Excluindo o efeito das variáveis explicativas, o efeito médio no Consumo de Cerveja seria de 5951,98 litros.

Obtendo os coeficientes de regressão

modelo.coef_

Considerando o número de variáveis explicativas de nosso modelo, o significado deste coeficiente seria o seguinte: mede a variação no valor médio de Y (Consumo de Cerveja), por unidade de variação em Temperatura Máxima, mantendo-se os valores de Chuva e Final de Semana constantes. Os coeficientes de regressão são também conhecidos como coeficientes parciais de regressão ou coeficientes parciais angulares.

Temperatura Máxima (°C) → Mantendo-se os valores de Chuva e Final de Semana constantes, o acréscimo de 1°C na Temperatura Máxima gera uma variação média no Consumo de Cerveja de 684,74 litros.

Chuva (mm) → Mantendo-se os valores de Temperatura Máxima e Final de Semana constantes, o acréscimo de 1mm de Chuva gera uma variação média no Consumo de Cerveja de -60,78 litros.

Final de Semana (Sim/Não) → Mantendo-se os valores de Temperatura Máxima e Chuva constantes, o fato de o dia ser classificado como Final de Semana gera uma variação média no Consumo de Cerveja de 5401,08 litros.

Logo, a partir dos coeficientes estimados, é possível gerar previsões pontuais acerca do consumo, baseadas em dados da temperatura maxima, chuva e fim de semana. Podemos estimar que a partir de uma temperatura máxima de 30,5, chuva de 12,2mm em um dia de semana, resultado em consumo previsto de 26094 litros.

temp_max = 30.5
chuva = 12.2
fds = 0
entrada = [[temp_max, chuva, fds]]

print(‘{0:2f} litros’.format(modelo.predict(entrada)[0]))

--

--