top of page

Inteligência Artificial (IA) aplicada à Economia (Exercício Python)

  • Foto do escritor: Adilson Padovan Junior
    Adilson Padovan Junior
  • 8 de dez. de 2025
  • 5 min de leitura


Link do Tutorial - YouTube (@profadilson):


Script (Python) da Aula:


#########################################################
# Inteligência Artificial aplicada à Economia
# Ministrado por: Dr. Adilson Padovan Jr.
#########################################################
# =============================================================================
# Exercício – Previsão de Preços de Imóveis na Califórnia
# 
# Você é um consultor contratado por uma grande empresa imobiliária que deseja 
# estimar o preço médio das casas na Califórnia com base em características 
# preferidas por seus clientes.
# 
# O objetivo é entender melhor o mercado e definir preços mais competitivos, 
# utilizando um modelo de machine learning que apoie decisões como:
# 
# - Otimizar o preço anunciado dos imóveis em seu site;
# - Simular cenários, como o impacto de adicionar um cômodo/ reformar o imóvel;
# - Aumentar a taxa de conversão, atraindo mais visitas com preços realistas;
# - Identificar oportunidades de compra, como imóveis subvaloriz. no mercado.
# 
# Desenvolva e avalie o modelo, identificando também as variáveis que mais 
# influenciam o preço dos imóveis. Utilize o conjunto de dados California 
# Housing e apresente o valor estimado para um imóvel com as seguintes 
# características:
# 
# MedInc: 8.32 (renda mediana)
# HouseAge: 41.0 (idade média das casas)
# AveRooms: 6.98413 (média de cômodos)
# AveBedrms: 1.02381 (média de quartos)
# Population: 322.0 (população local)
# AveOccup: 2.5556 (média de ocupantes)
# Latitude: 37.88
# Longitude: -122.23
# =============================================================================
################################
# %% Random Forest aplicado ao California Housing Dataset (sklearn)
################################
# =============================================================================
# Passo a passo
#
# 1. Importar bibliotecas
# 2. Carregar o dataset California Housing
# 3. Análise descritiva dos dados
# 4. Normalizar as variáveis (StandardScaler)
# 5. Separar os dados em treino e teste
# 6. Treinar o modelo Random Forest Regressor
# 7. Avaliar o desempenho do modelo
# 8. Analisar a importância das variáveis
# 9. Plotar a importância das variáveis (gráfico de barras)
# 10. Fazer previsão manual com novos valores
# =============================================================================
################################
# %% 1. Importar bibliotecas
################################
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import r2_score, mean_absolute_error, mean_squared_error
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
################################
# %% 2. Carregar o dataset
################################
# Comando para carregar automaticamente o dataset
data = fetch_california_housing(as_frame=True)
print(data)
data_descript = data.DESCR
print(data_descript)
# Features (características)
print(X.head())
# Target (alvo)
print(y)
print(X)
# Criar DataFrame com X e y juntos
df_full = data.frame.copy()  # já vem com todas as colunas e o target
print("\nDados carregados com sucesso!")
print(f"Número de observações: {X.shape[0]}")
print(f"Número de variáveis: {X.shape[1]}")
print("Variáveis:", list(X.columns))
# =============================================================================
# **Data Set Characteristics:**
# 
# :Number of Instances: 20640
# 
# :Number of Attributes: 8 numeric, predictive attributes and the target
# 
# :Attribute Information:
# MedInc – renda mediana no grupo de quarteirões
# HouseAge – idade mediana das casas no grupo de quarteirões
# AveRooms – número médio de cômodos por domicílio
# AveBedrms – número médio de quartos por domicílio
# Population – população do grupo de quarteirões
# AveOccup – número médio de moradores por domicílio
# Latitude – latitude do grupo de quarteirões
# Longitude – longitude do grupo de quarteirões
# 
# O valor mediano das casas nos distritos da Califórnia (alvo), expresso em 
# centenas de milhares de dólares (isto é, cada unidade representa US$ 100.000)
# 
# :Missing Attribute Values: None
# 
# This dataset was obtained from the StatLib repository.
# 
# The target variable is the median house value for California districts,
# expressed in hundreds of thousands of dollars ($100,000).
# 
# This dataset was derived from the 1990 U.S. census, using one row per census
# block group. A block group is the smallest geographical unit for which the U.S.
# Census Bureau publishes sample data (a block group typically has a population
# of 600 to 3,000 people).
# =============================================================================
################################
# %% 3. Análise descritiva
################################
print("\nEstatísticas descritivas:")
print(X.describe().T)
print(y.describe().T)
print("\nInformações gerais do dataframe:")
print(X.info())
print("\nHá dados faltantes?")
# Isso mostra quantos NaN existem em cada variável.
print(X.isnull().sum())
print(y.isnull().sum())
print("\nMatriz de correlação:")
corr = X.corr()
plt.figure(figsize=(10,8))
sns.heatmap(corr, annot=True, fmt=".2f", cmap="coolwarm", square=True)
plt.title("Matriz de Correlação das Variáveis (California Housing)")
plt.tight_layout()
# Gráficos individuais para cada variável
for col in X.columns:
    plt.figure(figsize=(10, 4))
    # Histograma com linha de densidade
    plt.subplot(1, 2, 1)
    sns.histplot(X[col], kde=True, color='steelblue')
    plt.title(f"Distribuição de {col}")
    plt.xlabel(col)
    plt.ylabel("Frequência")
    # Boxplot (detecção de outliers)
    plt.subplot(1, 2, 2)
    sns.boxplot(x=X[col], color='lightcoral')
    plt.title(f"Boxplot de {col}")
    plt.tight_layout()
    plt.show()
# Gráfico y
plt.figure(figsize=(10,4))
plt.subplot(1,2,1)
sns.histplot(y, kde=True, color='steelblue')
plt.title("Distribuição do Preço Médio das Casas (Target)")
plt.xlabel("Valor médio")
plt.ylabel("Frequência")
plt.subplot(1,2,2)
sns.boxplot(x=y, color='lightcoral')
plt.title("Boxplot do Preço Médio das Casas")
plt.tight_layout()
################################
# %% 4. Normalizar variáveis
################################
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
print("\nDados normalizados com StandardScaler.")
################################
# %% 5. Separar treino e teste
################################
X_train, X_test, y_train, y_test = train_test_split(
    X_scaled, y, test_size=0.3, random_state=42
)
help(train_test_split)
# =============================================================================
# random_state : int, RandomState instance or None, default=None
#     Controls the shuffling applied to the data before applying the split.
#     Pass an int for reproducible output across multiple function calls.
#     See :term:`Glossary <random_state>`.
# 
#     Controla o embaralhamento aplicado aos dados antes da divisão.
#     Passe um número inteiro para obter resultados reproduzíveis em 
#     várias chamadas de função.
# =============================================================================
################################
# %% 6. Treinar modelo Random Forest
################################
rf = RandomForestRegressor(n_estimators=200, random_state=42)
rf.fit(X_train, y_train)
################################
# %% 7. Avaliar desempenho
################################
y_pred = rf.predict(X_test)
r2 = r2_score(y_test, y_pred)
mae = mean_absolute_error(y_test, y_pred)
rmse = np.sqrt(mean_squared_error(y_test, y_pred))
print("\nMétricas de desempenho do Random Forest:")
print(f"R²   = {r2:.4f}")
print(f"MAE  = {mae:.4f}")
print(f"RMSE = {rmse:.4f}")
################################
# %% 8. Importância das variáveis
################################
importances = pd.DataFrame({
    "Variável": X.columns,
    "Importância": rf.feature_importances_
}).sort_values(by="Importância", ascending=False)
print("\nImportância das variáveis (ordem decrescente):")
print(importances)
################################
# %% 9. Plotar importância das variáveis
################################
plt.figure(figsize=(6,4))
sns.barplot(x="Importância", y="Variável", data=importances, palette="viridis")
plt.title("Importância das Variáveis - Random Forest")
plt.xlabel("Importância Relativa")
plt.ylabel("Variável")
plt.tight_layout()
print("\nScript finalizado com sucesso!")
################################
# %% 10. Fazer previsão manual com novos valores
################################
# Exemplo de novos valores (você pode alterar)
# Ordem das variáveis: conforme X.columns
novos_dados = pd.DataFrame([{
    "MedInc": 8.32,        # renda mediana
    "HouseAge": 41.0,     # idade média das casas
    "AveRooms": 6.98413,      # média de cômodos
    "AveBedrms": 1.02381,     # média de quartos
    "Population": 322.0, # população local
    "AveOccup": 2.5556,      # média de ocupantes
    "Latitude": 37.88,     # latitude
    "Longitude": -122.23   # longitude
}])
print("\nValores novos inseridos manualmente:")
print(novos_dados)
# Normalizar usando o mesmo scaler do treino!
novos_dados_scaled = scaler.transform(novos_dados)
# Prever valor com o modelo treinado
y_novo_pred = rf.predict(novos_dados_scaled)
print(f"\nValor estimado pelo modelo: {y_novo_pred[0]:.3f}")
# %% Conteúdo extra
# Outras transformações de variáveis — criar interações, log-transformações, 
# tratamento de outliers e clusters geográficos.
# Otimização de hiperparâmetros — usar GridSearchCV ou RandomizedSearchCV 
# para ajustar n_estimators, max_depth, etc.
# Análise de resíduos e diagnósticos — checar distribuição, 
# homocedasticidade e padrões de erro.
# Comparar modelos alternativos — XGBoost, LightGBM, Lasso, Ridge, MLP.
# Documentar e registrar métricas — guardar parâmetros, data de treino 
# e resultados.

 
 
 

Comentários


Faça parte da nossa lista de emails

Obrigado(a)!

Sejam bem vindos!

Não se esqueça de se inscrever no canal:

bottom of page