Inteligência Artificial (IA) aplicada à Economia (Exercício Python)
- 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_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 targetprint("\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