Programa de Pós-graduação em Computação Aplicada – PPCA (UnB)
Análise Estatística de Dados e Informações - Prova Final
Professor: João Gabriel de Moraes Souza
Aluno: Angelo Donizete Buso Júnior
import warnings
warnings.filterwarnings("ignore")
# Manipulação de Dados
import pandas as pd
from IPython.display import display
import numpy as np
# Visualização de Dados
import matplotlib.pyplot as plt
import matplotlib.patches as mpatches
import seaborn as sns
# Estatística e Testes Estatísticos
import shap
from scipy import stats
from scipy.stats import kurtosis, skew, f_oneway, shapiro, levene, kruskal
import statsmodels.api as sm
from statsmodels.formula.api import ols
from statsmodels.stats.outliers_influence import variance_inflation_factor
# Pré-Processamento de Dados
from sklearn.model_selection import KFold, cross_validate
from sklearn.preprocessing import StandardScaler, LabelEncoder, MinMaxScaler, OneHotEncoder
from imblearn.under_sampling import RandomUnderSampler
from imblearn.over_sampling import SMOTE
from collections import Counter
# Algoritmos de Machine Learning
from sklearn.linear_model import LinearRegression, LogisticRegression
from sklearn.svm import SVC
# Treinamento e Validação de Modelos
from sklearn.model_selection import train_test_split, cross_val_score, GridSearchCV, StratifiedKFold
# Avaliação de Modelos
from sklearn.metrics import (
mean_squared_error, mean_absolute_error, r2_score,
confusion_matrix, accuracy_score, precision_score, recall_score,
classification_report, roc_auc_score, roc_curve, ConfusionMatrixDisplay
)
from scikitplot.metrics import plot_confusion_matrix, plot_roc
# Configurações Opcionais
pd.set_option('display.float_format', '{:.2f}'.format)
sns.set_theme(style="whitegrid")
plt.rc("figure", figsize=(10, 6))
# Verificação de Versões
print("Versão do Seaborn:", sns.__version__)
print("Versão do Pandas:", pd.__version__)
Versão do Seaborn: 0.13.2 Versão do Pandas: 2.2.3
Questão 1¶
1. Compreensão do Problema de Negócio¶
O mercado imobiliário é um setor altamente competitivo, onde a precificação correta dos imóveis desempenha um papel crucial na tomada de decisões de compradores, vendedores e investidores. A utilização de modelos preditivos permite estimar os preços das propriedades com base em características estruturais e de localização, oferecendo uma vantagem estratégica para os envolvidos no setor.
Neste estudo, exploraremos os fatores que influenciam os preços de venda de imóveis na região de King County, nos Estados Unidos. Utilizaremos a Regressão Linear como técnica principal para prever os preços das propriedades e identificar as variáveis que mais impactam a valorização imobiliária. Para garantir uma abordagem estruturada e metodologicamente sólida, aplicaremos a metodologia CRISP-DM (Cross-Industry Standard Process for Data Mining), um framework amplamente reconhecido em projetos de ciência de dados.
O CRISP-DM é composto por seis etapas principais:
- Compreensão do Problema de Negócio: Definir os objetivos e requisitos do projeto.
- Compreensão dos Dados: Explorar, descrever e identificar padrões no conjunto de dados.
- Preparação dos Dados: Limpar, transformar e selecionar variáveis relevantes.
- Modelagem: Construir e ajustar modelos preditivos.
- Avaliação: Validar se os modelos atendem aos objetivos do negócio.
- Implementação: Integrar os resultados para apoio à tomada de decisão.
Para esta análise, utilizamos o conjunto de dados House Sales in King County, USA, disponível no Kaggle. O dataset contém informações sobre imóveis vendidos entre maio de 2014 e maio de 2015 na região de King County, incluindo Seattle. As variáveis incluem características como número de quartos, área do terreno, presença de vista para o mar, idade da construção, entre outras.
Além da construção do modelo preditivo, realizaremos uma análise exploratória e testes estatísticos para avaliar se os pressupostos da Regressão Linear (como linearidade, normalidade dos resíduos e homocedasticidade) são atendidos. Dessa forma, este estudo visa não apenas prever preços de imóveis, mas também gerar insights interpretáveis sobre os principais fatores que influenciam a precificação no mercado imobiliário. Adicionalmente, busca-se demonstrar os desafios inerentes ao desenvolvimento de modelos de Machine Learning, uma vez que a obtenção de um modelo ideal pode demandar diversas iterações e refinamentos ao longo do processo.
1.1 Dicionário dados¶
Abaixo transcrevemos o significado de cada um dos colunas do dataset.
- id: Identificador único de cada imóvel.
- date: Data da venda do imóvel.
- price: Preço pelo qual o imóvel foi vendido. **Variável *Target***
- bedrooms: Número de quartos no imóvel.
- bathrooms: Número de banheiros no imóvel.
- sqft_living: Área habitável em pés quadrados.
- sqft_lot: Tamanho total do lote em pés quadrados.
- floors: Número de andares do imóvel.
- waterfront: Indica se o imóvel tem vista para a água (1) ou não (0).
- view: Índice de 0 a 4 que classifica a qualidade da vista do imóvel.
- condition: Classificação da condição atual do imóvel, variando de 1 a 5.
- grade: Classificação da qualidade da construção e design do imóvel, variando de 1 a 13.
- sqft_above: Área em pés quadrados acima do solo.
- sqft_basement: Área em pés quadrados do porão.
- yr_built: Ano em que o imóvel foi construído.
- yr_renovated: Ano em que o imóvel foi reformado pela última vez.
- zipcode: Código postal onde o imóvel está localizado.
- lat: Latitude da localização do imóvel.
- long: Longitude da localização do imóvel.
- sqft_living15: Área habitável média dos 15 imóveis mais próximos, em pés quadrados.
- sqft_lot15: Tamanho médio do lote dos 15 imóveis mais próximos, em pés quadrados.
2. Coleta Dados¶
path = "/home/buso/mestrado/aedi-ppca/dados/kc_house_data.csv"
2.1 Carga dados¶
data = pd.read_csv(path)
data.head()
| id | date | price | bedrooms | bathrooms | sqft_living | sqft_lot | floors | waterfront | view | ... | grade | sqft_above | sqft_basement | yr_built | yr_renovated | zipcode | lat | long | sqft_living15 | sqft_lot15 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 7129300520 | 20141013T000000 | 221900.00 | 3 | 1.00 | 1180 | 5650 | 1.00 | 0 | 0 | ... | 7 | 1180 | 0 | 1955 | 0 | 98178 | 47.51 | -122.26 | 1340 | 5650 |
| 1 | 6414100192 | 20141209T000000 | 538000.00 | 3 | 2.25 | 2570 | 7242 | 2.00 | 0 | 0 | ... | 7 | 2170 | 400 | 1951 | 1991 | 98125 | 47.72 | -122.32 | 1690 | 7639 |
| 2 | 5631500400 | 20150225T000000 | 180000.00 | 2 | 1.00 | 770 | 10000 | 1.00 | 0 | 0 | ... | 6 | 770 | 0 | 1933 | 0 | 98028 | 47.74 | -122.23 | 2720 | 8062 |
| 3 | 2487200875 | 20141209T000000 | 604000.00 | 4 | 3.00 | 1960 | 5000 | 1.00 | 0 | 0 | ... | 7 | 1050 | 910 | 1965 | 0 | 98136 | 47.52 | -122.39 | 1360 | 5000 |
| 4 | 1954400510 | 20150218T000000 | 510000.00 | 3 | 2.00 | 1680 | 8080 | 1.00 | 0 | 0 | ... | 8 | 1680 | 0 | 1987 | 0 | 98074 | 47.62 | -122.05 | 1800 | 7503 |
5 rows × 21 columns
3. Análise Exploratória¶
3.1 Visão Geral dos dados¶
A análise exploratória de dados (EDA) é um passo essencial em projetos de ciência de dados, pois permite uma melhor compreensão das características, distribuições e possíveis anomalias nos dados. Este processo não apenas ajuda a identificar padrões relevantes, mas também fornece uma base sólida para a seleção de variáveis e construção de modelos preditivos. Ao explorar os dados, é possível descobrir relações implícitas entre as variáveis e verificar se os dados disponíveis são suficientes e adequados para atingir os objetivos do estudo.
Ter uma consciência situacional dos dados permite identificar outliers, valores faltantes e distribuições inesperadas que podem impactar negativamente a modelagem. Por exemplo, a identificação de uma variável com alta variância ou multicolinearidade é fundamental para evitar problemas como a instabilidade do modelo. Além disso, a EDA auxilia na escolha de transformações apropriadas para as variáveis, ajustando os dados para atender aos pressupostos do modelo. Este passo inicial é crucial para garantir a validade e a confiabilidade das análises subsequentes, além de direcionar melhor os esforços do projeto.
def visaogeral(df, messagem):
print(f'{messagem}:\n')
print("Qtd Observações:", df.shape[0])
print("\nQtd Atributos:", df.shape[1])
print("\nAtributos:")
print(df.columns.tolist())
print("\nQtd Valores missing:", df.isnull().sum().values.sum())
print("\nValores Unicos: indicativo de valores categóricos")
print(df.nunique().sort_values(ascending=True).head(40))
visaogeral(data,'Visão Geral dataSet treino')
Visão Geral dataSet treino: Qtd Observações: 21613 Qtd Atributos: 21 Atributos: ['id', 'date', 'price', 'bedrooms', 'bathrooms', 'sqft_living', 'sqft_lot', 'floors', 'waterfront', 'view', 'condition', 'grade', 'sqft_above', 'sqft_basement', 'yr_built', 'yr_renovated', 'zipcode', 'lat', 'long', 'sqft_living15', 'sqft_lot15'] Qtd Valores missing: 0 Valores Unicos: indicativo de valores categóricos waterfront 2 view 5 condition 5 floors 6 grade 12 bedrooms 13 bathrooms 30 zipcode 70 yr_renovated 70 yr_built 116 sqft_basement 306 date 372 long 752 sqft_living15 777 sqft_above 946 sqft_living 1038 price 4028 lat 5034 sqft_lot15 8689 sqft_lot 9782 id 21436 dtype: int64
data.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 21613 entries, 0 to 21612 Data columns (total 21 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 id 21613 non-null int64 1 date 21613 non-null object 2 price 21613 non-null float64 3 bedrooms 21613 non-null int64 4 bathrooms 21613 non-null float64 5 sqft_living 21613 non-null int64 6 sqft_lot 21613 non-null int64 7 floors 21613 non-null float64 8 waterfront 21613 non-null int64 9 view 21613 non-null int64 10 condition 21613 non-null int64 11 grade 21613 non-null int64 12 sqft_above 21613 non-null int64 13 sqft_basement 21613 non-null int64 14 yr_built 21613 non-null int64 15 yr_renovated 21613 non-null int64 16 zipcode 21613 non-null int64 17 lat 21613 non-null float64 18 long 21613 non-null float64 19 sqft_living15 21613 non-null int64 20 sqft_lot15 21613 non-null int64 dtypes: float64(5), int64(15), object(1) memory usage: 3.5+ MB
A análise exploratória das características do conjunto de dados é uma etapa fundamental para compreender sua estrutura, identificar padrões e detectar potenciais desafios, como a presença de valores ausentes ou a necessidade de transformação de variáveis categóricas. Esses aspectos são essenciais para a construção de um modelo preditivo robusto e confiável.
O dataset utilizado contém aproximadamente 21,6 mil observações e 21 atributos, que representam diversas características das propriedades imobiliárias em King County, Washington (EUA). Durante a inspeção inicial, não foram identificados valores ausentes. No entanto, é importante destacar que operações de transformação e engenharia de features podem gerar dados faltantes ao longo do pipeline. Portanto, é crucial monitorar e mitigar possíveis impactos desses possíveis dados faltantes, no intuito de preservar a qualidade do modelo.
Além disso, algumas variáveis apresentam poucos valores únicos, como waterfront, view, condition, floors e grade, indicando um comportamento categórico, apesar de estarem representadas numericamente. Esse fator exige atenção especial na modelagem, pois pode demandar estratégias de tratamento como variáveis ordinais, dependendo da natureza dos dados.
A variável date foi carregada do tipo object, muito embora deveria estar no formado de data, há um indício que teremos que transformar essa variável em seu formato para realizar algumas anaálises.
Essa análise preliminar fornece insights estratégicos que orientam as próximas etapas de preparação, transformação e modelagem dos dados, garantindo um fluxo de trabalho mais eficiente e direcionado à melhoria do desempenho preditivo.
3.1.1 Variáveis Explanatórias e Variável Dependente¶
Em modelos de Machine Learning supervisionado, as variáveis são classificadas em variáveis explanatórias (ou independentes) e variável dependente (ou alvo). As variáveis explanatórias representam os fatores utilizados para prever ou explicar a variável dependente, que é o resultado que se deseja modelar. No caso de um modelo aplicado à previsão de preços de imóveis, as variáveis explanatórias incluem atributos como tamanho do imóvel, número de quartos, localização e idade da construção, enquanto a variável dependente é o preço de venda. A escolha e o tratamento adequado dessas variáveis são essenciais para garantir a qualidade preditiva e interpretabilidade do modelo.
data.columns
Index(['id', 'date', 'price', 'bedrooms', 'bathrooms', 'sqft_living',
'sqft_lot', 'floors', 'waterfront', 'view', 'condition', 'grade',
'sqft_above', 'sqft_basement', 'yr_built', 'yr_renovated', 'zipcode',
'lat', 'long', 'sqft_living15', 'sqft_lot15'],
dtype='object')
X = data.drop("price", axis=1)
y = data["price"]
3.1.2 Missing Values¶
def missing_values_table(df):
mis_val = df.isnull().sum()
mis_val_percent = 100 * df.isnull().sum() / len(df)
mis_val_table = pd.concat([mis_val, mis_val_percent], axis=1)
mis_val_table_ren_columns = mis_val_table.rename(
columns = {0 : 'Missing Values', 1 : '% of Total Values'})
mis_val_table_ren_columns = mis_val_table_ren_columns[
mis_val_table_ren_columns.iloc[:,1] != 0].sort_values(
'% of Total Values', ascending=False).round(1)
print ("Seu dataframe tem " + str(df.shape[1]) + " colunas.\n"
"Há " + str(mis_val_table_ren_columns.shape[0]) +
" colunas que possuem valores ausentes.")
return mis_val_table_ren_columns
y.isnull().sum()
0
A varíavel dependente não possui nenhum valor missing!
missing_values_table(X)
Seu dataframe tem 20 colunas. Há 0 colunas que possuem valores ausentes.
| Missing Values | % of Total Values |
|---|
Embora o conjunto de dados inicial não apresente valores ausentes, é fundamental considerar que transformações e engenharia de features podem introduzir dados faltantes ao longo do pipeline. Assim, é essencial monitorar e tratar essas ocorrências para garantir a integridade e a qualidade do modelo preditivo.
3.1.3 Análise Variável Dependente¶
y.describe()
count 21613.00 mean 540088.14 std 367127.20 min 75000.00 25% 321950.00 50% 450000.00 75% 645000.00 max 7700000.00 Name: price, dtype: float64
A variável dependente price representa o preço de venda dos imóveis e é a feature que queremos modelar e explicar. Com base no resumo estatístico, tem-se:
Média (mean): O preço médio das propriedades é de aproximadamente $540.088, refletindo o valor médio praticado na venda de caas nessa região de Washington.
Desvio Padrão (std): $367.127, indicando uma alta variabilidade nos preços, o que sugere a presença de imóveis significativamente mais caros ou mais baratos em relação à média.
Valores Mínimo e Máximo (min e max): O menor preço registrado foi de $75.000, enquanto o maior chegou a $7.700.000, mostrando uma grande amplitude nos valores das propriedades.
Quartis (25%, 50% e 75%):
- 25% (primeiro quartil): 25% das propriedades têm preços abaixo de $321.950.
- 50% (mediana): O preço mediano é $450.000, indicando que metade das propriedades custa mais que esse valor e que metade custa menos.
- 75% (terceiro quartil): 25% das propriedades mais caras têm preços acima de $645.000, limitado a $7.700.000.
Esses dados mostram que os preços de venda têm possuem uma grande dispersão e provável assimetria, visto que a média é consideravelmente maior que a mediana, refletindo diferenças significativas nas características das propriedades. Essa variabilidade será explorada durante a modelagem para identificar quais fatores influenciam mais fortemente os preços.
y.quantile([0.80,0.90,0.93,0.94,0.99])
0.80 700108.00 0.90 887000.00 0.93 998000.00 0.94 1063560.00 0.99 1964400.00 Name: price, dtype: float64
Conforme acima, podemos dizer que 93% das propriedades estão distribuídas entre o preço de venda de $75.000 e $998.000. E 7% ultrapassa os 6 digitos (milhões). Essa distribuição reflete que os valores mais altos representam propriedades de luxo ou com características muito diferenciadas não indicando uma região elitizada. Sugere ainda que dado o percentil 99 o valor máximo de venda observado foge muito dos padrões.
Sendo assim, os dados sugerem que os preços de venda têm uma distribuição assimétrica à direita, ou seja, há uma concentração maior de imóveis com preços mais baixos, refletindo diferenças significativas nas características das propriedades.
3.1.3.1 Amplitude¶
plt.figure(figsize=(10, 6))
plt.plot(np.sort(y), label="Preço Venda", color='blue')
plt.title("Amplitude de Preço Venda")
plt.ylabel("Preço de Venda")
plt.legend()
plt.xticks([])
plt.ticklabel_format(style='plain', axis='y')
plt.tight_layout()
plt.show()
Ordenando a variável price identificamos uma curva fortemente inclinada para cima no final, indicando que a maioria dos imóveis possui preços relativamente baixos e apenas uma pequena parcela apresenta valores extremamente altos. No final da curva, os valores disparam rapidamente, sugerindo a existência de imóveis de alto luxo que podem atuar como outliers, influenciando a média geral.
Essa característica pode afetar negativamente o desempenho do modelo de regressão linear, tornando necessário o uso de transformações (logaritmo do preço) ou a análise segmentada do mercado imobiliário.
3.1.3.2 Plot - boxplot¶
sns.set_style("whitegrid")
plt.figure(figsize=(10, 6))
sns.boxplot(y=y, color='blue')
plt.title("Boxplot do preço de venda")
plt.xlabel("Preço Venda")
plt.ticklabel_format(style='plain', axis='y')
plt.tight_layout()
plt.show()
O boxplot da variável alvo (preço de venda do imóvel) revela uma distribuição assimétrica à direita, com a maioria dos preços concentrados entre $321.950 e $645.000. A mediana dos preços é de aproximadamente $450.000, indicando que metade dos imóveis custa menos que esse valor.
A presença de outliers acima de $1.000.000, chegando até $7.700.000, sugere a existência de imóveis de alto padrão na região. Esses valores extremos podem impactar a modelagem, especialmente em técnicas sensíveis a outliers, como a Regressão Linear.
Para melhorar o desempenho do modelo, recomenda-se a aplicação de transformações (como logarítmica) na variável price ou a segmentação do mercado em categorias distintas (ex.: imóveis comuns vs. imóveis de luxo). Essas estratégias podem ajudar a normalizar a distribuição dos dados e aumentar a precisão das previsões.
3.1.3.3 Plots Variável Dependente¶
O QQ-Plot (Quantile-Quantile Plot) é uma ferramenta gráfica usada para verificar se os dados seguem uma distribuição normal. Ele compara os quantis dos dados observados com os quantis de uma distribuição teórica (normal, no caso).
plt.figure(figsize=(10, 6))
sm.qqplot(y, line='s', fit=True)
plt.title("QQ-Plot de SalePrice")
plt.tight_layout()
plt.show()
<Figure size 1000x600 with 0 Axes>
O QQ-Plot da variável price (preço de venda dos imóveis) revela que os dados não seguem uma distribuição normal. Os pontos se afastam da linha diagonal nas extremidades, especialmente na cauda direita, indicando uma assimetria positiva (cauda direita mais pesada). Esse comportamento é consistente com a presença de outliers e a distribuição assimétrica observada no boxplot.
A não normalidade dos dados pode impactar a validade do modelo de Regressão Linear, uma vez que um dos pressupostos dessa técnica é que os resíduos devem seguir uma distribuição normal. Para corrigir esse problema, recomenda-se a aplicação de uma transformação logarítmica na variável price, que ajudará a reduzir a assimetria e aproximar os dados de uma distribuição normal. Essa abordagem melhorará a qualidade do modelo e a confiabilidade das inferências estatísticas.
3.1.3.4 Distribuição Dados - skw/Kurt¶
A assimetria mede o quanto a distribuição dos dados é inclinada para a direita ou para a esquerda em relação à média.
A curtose mede a forma da distribuição em relação às suas caudas (se os valores extremos são mais ou menos frequentes do que em uma distribuição normal).
# Estatísticas descritivas adicionais
print("Skewness (Assimetria):", skew(y))
print("Kurtosis (Curtose):", kurtosis(y))
Skewness (Assimetria): 4.023789858140135 Kurtosis (Curtose): 34.577262255687536
A variável price apresenta uma assimetria (skewness) de 4,02, o que indica uma assimetria positiva forte. Isso significa que a distribuição dos preços dos imóveis tem uma cauda longa à direita, com muitos valores extremos acima da média. Além disso, a curtose (kurtosis) de 34,58 sugere uma distribuição leptocúrtica, com caudas extremamente pesadas e um pico muito agudo. Esses valores confirmam a presença de outliers e a necessidade de transformações para normalizar a distribuição, como a aplicação de uma transformação logarítmica.
3.1.3.5 Histograma Variável Dependente¶
plt.figure(figsize=(10, 6))
sns.histplot(y, kde=True, bins=30, color='blue')
plt.title("Histograma de preço de venda")
plt.xlabel("Preço de Venda")
plt.ylabel("Frequência")
plt.ticklabel_format(style='plain', axis='x')
plt.tight_layout()
plt.show()
O histograma confirma que a distribuição da variável preço de venda não é normal, apresentando alta assimetria à direita e curtose elevada. Esse comportamento reforça a necessidade de ajustes para garantir que os modelos preditivos tenham um desempenho mais robusto e interpretem corretamente a relação entre os atributos do imóvel e seu preço.
A presença de outliers pode impactar negativamente o modelo de Regressão Linear, tornando-o menos preciso. Para mitigar esse problema, recomenda-se a aplicação de uma transformação logarítmica na variável price, que ajudará a normalizar a distribuição e reduzir o impacto dos valores extremos. Além disso, a segmentação do mercado em categorias distintas (ex.: imóveis comuns vs. imóveis de luxo) pode ser uma estratégia eficaz para melhorar a precisão do modelo, abaixo demonstramos como a transformação logaritmica auxiliará nas premissas de normailidade dos dados, assumindo que usaremos regressão logistica.
log_price = np.log1p(y) # log1p evita problemas com log(0)
# Criando o histograma
plt.figure(figsize=(10, 6))
sns.histplot(log_price, bins=20, kde=True, color='blue', alpha=0.6)
plt.xlabel("Log(Preço de Venda)")
plt.ylabel("Frequência")
plt.title("Histograma do Log do Preço de Venda")
plt.grid(True)
plt.show()
3.1.4 Análise da Variáveis Explanatórias¶
Uma variável independente X explica a variação em outra variável, que é chamada variável dependente y. Este relacionamento existe em apenas uma direção:
variável independente (X) -> variável dependente (y)
X.head()
| id | date | bedrooms | bathrooms | sqft_living | sqft_lot | floors | waterfront | view | condition | grade | sqft_above | sqft_basement | yr_built | yr_renovated | zipcode | lat | long | sqft_living15 | sqft_lot15 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 7129300520 | 20141013T000000 | 3 | 1.00 | 1180 | 5650 | 1.00 | 0 | 0 | 3 | 7 | 1180 | 0 | 1955 | 0 | 98178 | 47.51 | -122.26 | 1340 | 5650 |
| 1 | 6414100192 | 20141209T000000 | 3 | 2.25 | 2570 | 7242 | 2.00 | 0 | 0 | 3 | 7 | 2170 | 400 | 1951 | 1991 | 98125 | 47.72 | -122.32 | 1690 | 7639 |
| 2 | 5631500400 | 20150225T000000 | 2 | 1.00 | 770 | 10000 | 1.00 | 0 | 0 | 3 | 6 | 770 | 0 | 1933 | 0 | 98028 | 47.74 | -122.23 | 2720 | 8062 |
| 3 | 2487200875 | 20141209T000000 | 4 | 3.00 | 1960 | 5000 | 1.00 | 0 | 0 | 5 | 7 | 1050 | 910 | 1965 | 0 | 98136 | 47.52 | -122.39 | 1360 | 5000 |
| 4 | 1954400510 | 20150218T000000 | 3 | 2.00 | 1680 | 8080 | 1.00 | 0 | 0 | 3 | 8 | 1680 | 0 | 1987 | 0 | 98074 | 47.62 | -122.05 | 1800 | 7503 |
Para facilitar as análises gráficas das variáveis explanatóras, iremos categorizá-las em grupos temáticos, permitindo comparações mais intuitivas
3.1.4.1 Localização¶
Variáveis relacionadas à posição geográfica do imóvel:
zipcode: CEPlat: Latitudelong: Longitude
localizacao = ['zipcode', 'lat', 'long', 'price']
df_localizacao = data[localizacao]
def atribuir_cor_preco(preco):
if preco <= 500000:
return 'green' # Verde para preços até 500 mil
elif preco <= 1000000:
return 'yellow' # Amarelo para preços entre 500 mil e 1 milhão
elif preco <= 3000000: # Laranja para preços entre 1 milhão e 3 milhões
return 'orange'
elif preco <= 5000000: # Roxo para preços entre 3 milhões e 5 milhões
return 'purple'
else:
return 'red' # Vermelho para preços acima de 1 milhão
mapa = folium.Map(location=[df_localizacao['lat'].mean(), df_localizacao['long'].mean()], zoom_start=10)
for index, row in df_localizacao.iterrows():
# Chama a função para obter a cor do preço
cor = atribuir_cor_preco(row['price'])
folium.CircleMarker(
location=[row['lat'], row['long']],
# tamanho do círculo
radius=5,
# define a cor dado o valor da linha
color=cor,
fill=True,
fill_color=cor,
fill_opacity=0.6,
# exibe o preço no popup (quando clicar no círculo)
popup=f"Preço: R${row['price']}"
).add_to(mapa)
mapa