Estimando o Consumo de Cerveja com Ciência de Dados
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]))