- Análise inicial com PairPlot da Seaborn
python
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
Carregar os dados
df = pd.read_csv('dados_hoteis.csv') # ajustar nome do arquivo
Visualizar primeiras linhas e informações
print(df.head())
print(df.info())
print(df.describe())
PairPlot para ver relações e distribuições
sns.pairplot(df)
plt.suptitle('PairPlot das Variáveis', y=1.02)
plt.show()
PairPlot com foco na variável alvo (ex: 'preco')
sns.pairplot(df, y_vars=['preco'], x_vars=df.columns.drop('preco'))
plt.show()
Objetivo aqui:
Identificar relações lineares / não-lineares entre variáveis.
Ver distribuições e possíveis outliers.
Escolher candidatos a variáveis explicativas.
- Construir modelos de regressão linear
Vou criar dois modelos para comparação:
Modelo 1: com algumas variáveis selecionadas do pairplot.
Modelo 2: com transformação logarítmica ou mais variáveis.
python
import statsmodels.api as sm
from sklearn.model_selection import train_test_split
from sklearn.metrics import r2_score, mean_squared_error
Supondo que 'preco' é a variável alvo
X = df[['area_quarto', 'distancia_centro', 'avaliacao', 'quartos_hotel']] # variáveis exemplo
y = df['preco']
Adicionar constante para statsmodels
X_com_const = sm.add_constant(X)
Dividir em treino e teste
X_train, X_test, y_train, y_test = train_test_split(X_com_const, y, test_size=0.3, random_state=42)
Modelo 1: regressão linear com statsmodels
modelo1 = sm.OLS(y_train, X_train).fit()
print(modelo1.summary())
Previsões no teste
y_pred1 = modelo1.predict(X_test)
Métricas
r2_1 = r2_score(y_test, y_pred1)
rmse_1 = mean_squared_error(y_test, y_pred1, squared=False)
print(f'Modelo 1 - R²: {r2_1:.3f}, RMSE: {rmse_1:.3f}')
Modelo 2: com transformação log na variável alvo (se adequado)
import numpy as np
y_log = np.log1p(y) # log(1+y) para evitar log(0)
X_train2, X_test2, y_train2, y_test2 = train_test_split(X_com_const, y_log, test_size=0.3, random_state=42)
modelo2 = sm.OLS(y_train2, X_train2).fit()
print(modelo2.summary())
Converter previsões de volta para escala original
y_pred_log = modelo2.predict(X_test2)
y_pred2 = np.expm1(y_pred_log)
Métricas na escala original
r2_2 = r2_score(np.expm1(y_test2), y_pred2)
rmse_2 = mean_squared_error(np.expm1(y_test2), y_pred2, squared=False)
print(f'Modelo 2 - R²: {r2_2:.3f}, RMSE: {rmse_2:.3f}')
- Realizar a comparação desses modelos
python
Comparação visual: valores reais vs. previstos
plt.figure(figsize=(12,5))
Modelo 1
plt.subplot(1,2,1)
plt.scatter(y_test, y_pred1, alpha=0.6)
plt.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], 'r--', lw=2)
plt.xlabel('Real')
plt.ylabel('Previsto')
plt.title('Modelo 1: Linear Simples')
Modelo 2
plt.subplot(1,2,2)
plt.scatter(np.expm1(y_test2), y_pred2, alpha=0.6)
plt.plot([np.expm1(y_test2).min(), np.expm1(y_test2).max()],
[np.expm1(y_test2).min(), np.expm1(y_test2).max()], 'r--', lw=2)
plt.xlabel('Real')
plt.ylabel('Previsto')
plt.title('Modelo 2: com log(y)')
plt.tight_layout()
plt.show()
Tabela comparativa
comparacao = pd.DataFrame({
'Modelo': ['Linear Simples', 'Log-Transformado'],
'R²': [r2_1, r2_2],
'RMSE': [rmse_1, rmse_2],
'AIC': [modelo1.aic, modelo2.aic]
})
print(comparacao)
Teste de resíduos
residuos1 = y_test - y_pred1
residuos2 = np.expm1(y_test2) - y_pred2
fig, axes = plt.subplots(2, 2, figsize=(12,8))
axes[0,0].hist(residuos1, bins=30, edgecolor='black')
axes[0,0].set_title('Histograma Resíduos - Modelo 1')
axes[0,1].scatter(y_pred1, residuos1, alpha=0.6)
axes[0,1].axhline(y=0, color='r', linestyle='--')
axes[0,1].set_title('Resíduos vs. Previsto - Modelo 1')
axes[1,0].hist(residuos2, bins=30, edgecolor='black')
axes[1,0].set_title('Histograma Resíduos - Modelo 2')
axes[1,1].scatter(y_pred2, residuos2, alpha=0.6)
axes[1,1].axhline(y=0, color='r', linestyle='--')
axes[1,1].set_title('Resíduos vs. Previsto - Modelo 2')
plt.tight_layout()
plt.show()
- Conclusão da comparação
Você deve avaliar:
R² e RMSE → qual modelo tem melhor poder explicativo e menor erro.
Resíduos → verificar se estão aleatórios e homocedásticos.
Significância estatística (p-valores) → ver quais variáveis são relevantes.
AIC → menor AIC indica melhor ajuste relativo.
Normalmente, escolhe-se o modelo com maior R² ajustado, menor RMSE e resíduos bem-comportados.