a relação entre duas variáveis
Regressão linear simples modela a relação entre uma variável independente e uma dependente. A variável independente (x) serve para prever o valor da variável dependente (y). Por exemplo, podemos prever o preço de um imóvel (y) com base na metragem (x). Primeiramente, o algoritmo busca a linha reta que melhor se ajusta aos dados observados. A equação resultante tem forma y = a + bx, onde a é intercepto e b é inclinação. Diferente de modelos complexos, essa abordagem oferece interpretabilidade direta dos resultados. Portanto, regressão linear simples é o ponto de partida natural para quem aprende sobre regressão.
encontrando a linha de melhor ajuste
O método dos mínimos quadrados constitui a técnica padrão para encontrar os coeficientes da reta. Primeiramente, calculamos a diferença entre cada ponto real e o valor previsto pela reta. Depois, elevamos essas diferenças ao quadrado para tratar valores positivos e negativos igualmente. O algoritmo busca os valores de a e b que minimizam essa soma total. Por exemplo, em dados de preço por metragem, a inclinação b representa o preço por metro quadrado. Além disso, o intercepto a representa o valor base quando a metragem é zero. Esse processo matemático garante a reta que melhor representa os dados observados.
interpretando os coeficientes
Os coeficientes da regressão linear simples carregam significados práticos importantes para análise. A inclinação (b) indica quantas unidades y muda para cada unidade de x. Por exemplo, b = 5000 significa que cada metro quadrado adicional aumenta o preço em R$5.000. O intercepto (a) representa o valor de y quando x é igual a zero. Além disso, devemos avaliar se esse valor faz sentido no contexto do problema. Primeiramente, calculamos também o coeficiente de determinação R² para avaliar o ajuste. R² próximo de 1 indica que a variável x explica bem a variação de y. Essa interpretabilidade torna a regressão linear simples valiosa para tomada de decisão.
avaliando a qualidade do modelo
Avaliar um modelo de regressão linear simples exige análise de múltiplas métricas complementares. Primeiramente, o R² indica a proporção da variância de y explicada pela variável x. Valores acima de 0,7 geralmente indicam um bom ajuste aos dados observados. Além disso, analisamos os resíduos (diferenças entre valores reais e previstos). Resíduos devem se distribuir aleatoriamente sem padrões visíveis no gráfico. Adicionalmente, verificamos se os resíduos seguem aproximadamente uma distribuição normal. Outra métrica importante é o erro padrão dos coeficientes estimados. Por fim, a significância estatística dos coeficientes valida se a relação observada não ocorreu por acaso.
aplicações práticas no cotidiano
Regressão linear simples aparece em diversas situações práticas do dia a dia. Primeiramente, imobiliárias usam metragem para estimar preços de apartamentos em uma região. Além disso, varejistas analisam como gastos com publicidade influenciam o volume de vendas. Na agricultura, modelos relacionam quantidade de fertilizante com produtividade das colheitas. Escolas podem estudar a relação entre horas de estudo e notas obtidas pelos alunos. Empresas de transporte correlacionam distância percorrida com custo de combustível. Para iniciantes, este modelo demonstra como uma variável pode prever outra de forma simples. Consequentemente, é a ferramenta fundamental para entender relações causais básicas entre fenômenos.
Problema: Previsão de Salário com base em Anos de Experiência
Contexto: Uma empresa deseja entender a relação entre os anos de experiência de um funcionário e seu salário anual. Com base nessa relação, eles querem prever o salário de novos candidatos.
Objetivo: Construir um modelo de Regressão Linear que aprenda a relação entre X (Anos de Experiência) e Y (Salário em R$).
O que é Regressão Linear Simples?
É um algoritmo de aprendizado supervisionado que modela a relação entre uma variável independente (X) e uma variável dependente (Y) através de uma linha reta.
Onde:
• y = variável alvo (Salário)
• x = variável preditora (Anos de Experiência)
• β₀ = intercepto (bias)
• β₁ = coeficiente angular (peso)
• ε = erro (residual)
🏗️ Arquitetura do Modelo
• Input Layer: 1 neurônio (Anos de Experiência)
• Output Layer: 1 neurônio (Salário previsto)
• Função de Ativação: Linear (identity)
• Camadas Ocultas: Nenhuma (modelo linear simples)
⚙️ Hiperparâmetros Principais
Determina se o modelo calcula o intercepto (β₀). Default = True.
Normaliza os dados antes da regressão (depreciado no sklearn 1.0+).
Se True, cria uma cópia dos dados de entrada.
Número de jobs paralelos para computação (-1 usa todos os processadores).
📐 Métricas de Avaliação
- R² (Coeficiente de Determinação): Mede quanto o modelo explica a variabilidade dos dados (0 a 1).
- MSE (Erro Quadrático Médio): Penaliza erros grandes.
- MAE (Erro Absoluto Médio): Mais robusto a outliers.
💡 Interpretação
O modelo encontrará uma reta que minimiza a soma dos quadrados dos resíduos (diferença entre valores reais e previstos).
Coeficiente β₁ positivo: relação positiva (mais experiência = maior salário)
Coeficiente β₁ negativo: relação inversa
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 |
# ============================================ # REGRESSÃO LINEAR SIMPLES - EXEMPLO COMPLETO # ============================================ # Este código demonstra um modelo de regressão linear simples # para prever salário baseado em anos de experiência # ===== 1. IMPORTAÇÃO DAS BIBLIOTECAS ===== import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns from sklearn.model_selection import train_test_split from sklearn.linear_model import LinearRegression from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score # Configurações de visualização plt.style.use('seaborn-v0_8-darkgrid') sns.set_palette("husl") plt.rcParams['figure.figsize'] = (12, 6) # ===== 2. CRIAÇÃO DO DATASET SIMULADO ===== print("="*50) print("1. CRIANDO DATASET SIMULADO") print("="*50) # Dados simulados: Anos de experiência vs Salário (em R$ mil) np.random.seed(42) # Para reprodutibilidade n_samples = 100 anos_experiencia = np.random.uniform(0, 15, n_samples) # Relação real: Salário = 30 + 5 * anos_experiencia + ruído salario_real = 30 + 5 * anos_experiencia + np.random.normal(0, 5, n_samples) # Criando DataFrame df = pd.DataFrame({ 'Anos_Experiencia': anos_experiencia, 'Salario': salario_real }) print(f"Dataset criado com {len(df)} registros") print("\nPrimeiros 5 registros:") print(df.head()) # Estatísticas descritivas print("\nEstatísticas descritivas:") print(df.describe()) # ===== 3. VISUALIZAÇÃO DOS DADOS ===== print("\n" + "="*50) print("2. ANÁLISE EXPLORATÓRIA") print("="*50) # Criando figura com subplots fig, axes = plt.subplots(1, 2, figsize=(14, 5)) # Gráfico de dispersão axes[0].scatter(df['Anos_Experiencia'], df['Salario'], alpha=0.6, edgecolors='black') axes[0].set_xlabel('Anos de Experiência', fontsize=12) axes[0].set_ylabel('Salário (R$ mil)', fontsize=12) axes[0].set_title('Relação entre Anos de Experiência e Salário', fontsize=14) axes[0].grid(True, alpha=0.3) # Boxplot df.boxplot(column='Salario', ax=axes[1]) axes[1].set_title('Distribuição dos Salários', fontsize=14) axes[1].set_ylabel('Salário (R$ mil)') axes[1].grid(True, alpha=0.3) plt.tight_layout() plt.show() # Histograma plt.figure(figsize=(10, 5)) plt.hist(df['Salario'], bins=20, edgecolor='black', alpha=0.7) plt.xlabel('Salário (R$ mil)', fontsize=12) plt.ylabel('Frequência', fontsize=12) plt.title('Distribuição dos Salários - Histograma', fontsize=14) plt.grid(True, alpha=0.3) plt.show() # ===== 4. SEPARAÇÃO TREINO/TESTE ===== print("\n" + "="*50) print("3. SEPARANDO DADOS DE TREINO E TESTE") print("="*50) X = df[['Anos_Experiencia']] # Variável independente (features) y = df['Salario'] # Variável dependente (target) # Divisão: 80% treino, 20% teste X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.2, random_state=42 ) print(f"Tamanho do conjunto de treino: {len(X_train)} amostras") print(f"Tamanho do conjunto de teste: {len(X_test)} amostras") # ===== 5. CRIAÇÃO E TREINAMENTO DO MODELO ===== print("\n" + "="*50) print("4. TREINANDO O MODELO") print("="*50) # Criando o modelo de regressão linear # Hiperparâmetros: # - fit_intercept=True: calcula o intercepto (β₀) # - copy_X=True: mantém os dados originais modelo = LinearRegression(fit_intercept=True, copy_X=True) # Treinando o modelo modelo.fit(X_train, y_train) # Obtendo os coeficientes intercepto = modelo.intercept_ coeficiente = modelo.coef_[0] print(f"Modelo treinado com sucesso!") print(f"\nEquação da reta encontrada:") print(f"Salário = {intercepto:.2f} + {coeficiente:.2f} * Anos_Experiencia") # ===== 6. AVALIAÇÃO DO MODELO ===== print("\n" + "="*50) print("5. AVALIANDO O MODELO") print("="*50) # Fazendo predições y_train_pred = modelo.predict(X_train) y_test_pred = modelo.predict(X_test) # Métricas para treino r2_train = r2_score(y_train, y_train_pred) mse_train = mean_squared_error(y_train, y_train_pred) mae_train = mean_absolute_error(y_train, y_train_pred) # Métricas para teste r2_test = r2_score(y_test, y_test_pred) mse_test = mean_squared_error(y_test, y_test_pred) mae_test = mean_absolute_error(y_test, y_test_pred) print("MÉTRICAS - CONJUNTO DE TREINO:") print(f"R² (Coeficiente de Determinação): {r2_train:.4f}") print(f"MSE (Erro Quadrático Médio): {mse_train:.2f}") print(f"MAE (Erro Absoluto Médio): {mae_train:.2f}") print("\nMÉTRICAS - CONJUNTO DE TESTE:") print(f"R² (Coeficiente de Determinação): {r2_test:.4f}") print(f"MSE (Erro Quadrático Médio): {mse_test:.2f}") print(f"MAE (Erro Absoluto Médio): {mae_test:.2f}") # ===== 7. VISUALIZAÇÃO DOS RESULTADOS ===== print("\n" + "="*50) print("6. VISUALIZANDO RESULTADOS") print("="*50) # Gráfico da regressão plt.figure(figsize=(12, 6)) # Dados de treino plt.scatter(X_train, y_train, alpha=0.6, label='Treino', color='blue') # Dados de teste plt.scatter(X_test, y_test, alpha=0.6, label='Teste', color='green') # Linha de regressão X_range = np.linspace(X.min(), X.max(), 100).reshape(-1, 1) y_range_pred = modelo.predict(X_range) plt.plot(X_range, y_range_pred, 'r-', linewidth=2, label='Regressão Linear') plt.xlabel('Anos de Experiência', fontsize=12) plt.ylabel('Salário (R$ mil)', fontsize=12) plt.title('Regressão Linear: Anos de Experiência vs Salário', fontsize=14) plt.legend() plt.grid(True, alpha=0.3) plt.show() # Gráfico de resíduos residuos = y_test - y_test_pred plt.figure(figsize=(12, 5)) plt.subplot(1, 2, 1) plt.scatter(y_test_pred, residuos, alpha=0.6, edgecolors='black') plt.axhline(y=0, color='r', linestyle='--', linewidth=2) plt.xlabel('Valores Previstos (R$ mil)', fontsize=12) plt.ylabel('Resíduos (R$ mil)', fontsize=12) plt.title('Análise de Resíduos', fontsize=14) plt.grid(True, alpha=0.3) plt.subplot(1, 2, 2) plt.hist(residuos, bins=15, edgecolor='black', alpha=0.7) plt.xlabel('Resíduos (R$ mil)', fontsize=12) plt.ylabel('Frequência', fontsize=12) plt.title('Distribuição dos Resíduos', fontsize=14) plt.grid(True, alpha=0.3) plt.tight_layout() plt.show() # ===== 8. FAZENDO PREDIÇÕES ===== print("\n" + "="*50) print("7. FAZENDO PREDIÇÕES") print("="*50) # Exemplos de predição experiencias_teste = [2, 5, 8, 10, 12] print("Previsões de salário para novos candidatos:") print("-" * 50) for exp in experiencias_teste: salario_previsto = modelo.predict([[exp]])[0] print(f"Candidato com {exp} anos de experiência: " f"Salário previsto = R$ {salario_previsto:.2f} mil") # ===== 9. COMPARAÇÃO COM VALORES REAIS ===== print("\n" + "="*50) print("8. COMPARAÇÃO PREVISÃO vs REAL (Teste)") print("="*50) comparacao = pd.DataFrame({ 'Anos_Experiencia': X_test.values.flatten(), 'Salário_Real': y_test.values, 'Salário_Previsto': y_test_pred, 'Erro_Absoluto': np.abs(y_test.values - y_test_pred) }) print("\nPrimeiras 10 comparações:") print(comparacao.head(10).round(2)) # ===== 10. ANÁLISE FINAL ===== print("\n" + "="*50) print("9. ANÁLISE FINAL E INTERPRETAÇÃO") print("="*50) print(f"\n📊 Interpretação dos Coeficientes:") print(f"• Intercepto (β₀ = {intercepto:.2f}): " f"Salário base para um funcionário sem experiência") print(f"• Coeficiente (β₁ = {coeficiente:.2f}): " f"A cada ano adicional de experiência, o salário aumenta em R$ {coeficiente:.2f} mil") print(f"\n📈 Qualidade do Modelo:") print(f"• O modelo explica {r2_test*100:.1f}% da variabilidade dos salários") if r2_test > 0.8: print("• ✅ Excelente ajuste! O modelo capturou bem a relação linear") elif r2_test > 0.6: print("• 👍 Bom ajuste! O modelo explica razoavelmente os dados") else: print("• ⚠️ Ajuste moderado. Considere adicionar mais features") print(f"\n💡 Conclusão:") print(f"O modelo encontrou uma relação {'positiva' if coeficiente > 0 else 'negativa'} " f"entre anos de experiência e salário, como esperado.") # Salvando o modelo (opcional) import joblib joblib.dump(modelo, 'modelo_regressao_linear.pkl') print("\n✅ Modelo salvo como 'modelo_regressao_linear.pkl'") print("\n" + "="*50) print("🎉 EXEMPLO CONCLUÍDO COM SUCESSO!") print("="*50) |