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

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_housingfrom sklearn.model_selection import train_test_splitfrom sklearn.preprocessing import StandardScalerfrom sklearn.ensemble import RandomForestRegressorfrom sklearn.metrics import r2_score, mean_absolute_error, mean_squared_errorimport pandas as pdimport numpy as npimport matplotlib.pyplot as pltimport seaborn as sns
################################# %% 2. Carregar o dataset################################
# Comando para carregar automaticamente o datasetdata = fetch_california_housing(as_frame=True)print(data)
data_descript = data.DESCRprint(data_descript)
# Features (características)X = data.dataprint(X.head())
# Target (alvo)y = data.targetprint(y)print(X)
# Criar DataFrame com X e y juntosdf_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()plt.show()
# Gráficos individuais para cada variávelfor 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 yplt.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()plt.show()
################################# %% 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()plt.show()
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.columnsnovos_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 treinadoy_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