1
resposta

[Projeto] Análise e Seleção de Modelos de Regressão Linear

  1. 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.

  1. 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}')

  1. 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()

  1. 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.

1 resposta

Olá, Marcus! Como vai?

Parabéns pela resolução da atividade!

Observei que você explorou o uso do pairplot para identificar relações entre variáveis, utilizou muito bem a regressão linear para comparar modelos distintos e ainda compreendeu a importância das métricas estatísticas e dos resíduos para avaliar a qualidade do ajuste.

Permaneça postando as suas soluções, com certeza isso ajudará outros estudantes e tem grande relevância para o fórum.

Fico à disposição! E se precisar, conte sempre com o apoio do fórum.

Abraço e bons estudos!

AluraConte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!