<jupyter_start><jupyter_text>Data Science - Regressão Linear  Conhecendo o Dataset  Importando bibliotecas<jupyter_code>import pandas as pd
import numpy as np
import matplotlib.pyplot as plt<jupyter_output><empty_output><jupyter_text>O Dataset e o Projeto Fonte: https://www.kaggle.com/greenwing1985/housepricing Descrição:Nosso objetivo neste exercício é criar um modelo de machine learning, utilizando a técnica de Regressão Linear, que faça previsões sobre os preços de imóveis a partir de um conjunto de características conhecidas dos imóveis.Vamos utilizar um dataset disponível no Kaggle que foi gerado por computador para treinamento de machine learning para iniciantes. Este dataset foi modificado para facilitar o nosso objetivo, que é fixar o conhecimento adquirido no treinamento de Regressão Linear.Siga os passos propostos nos comentários acima de cada célular e bons estudos. Dados:    precos - Preços do imóveis    area - Área do imóvel    garagem - Número de vagas de garagem    banheiros - Número de banheiros    lareira - Número de lareiras    marmore - Se o imóvel possui acabamento em mármore branco (1) ou não (0)    andares - Se o imóvel possui mais de um andar (1) ou não (0)  Leitura dos dadosDataset está na pasta "Dados" com o nome "HousePrices_HalfMil.csv" em usa como separador ";".<jupyter_code>dados = pd.read_csv('./dados/HousePrices_HalfMil.csv', sep=';')<jupyter_output><empty_output><jupyter_text>Visualizar os dados<jupyter_code>dados.head()<jupyter_output><empty_output><jupyter_text>Verificando o tamanho do dataset<jupyter_code>dados.shape<jupyter_output><empty_output><jupyter_text>Análises Preliminares  Estatísticas descritivas<jupyter_code>dados.describe().round()<jupyter_output><empty_output><jupyter_text>Matriz de correlaçãoO coeficiente de correlação é uma medida de associação linear entre duas variáveis e situa-se entre -1 e +1 sendo que -1 indica associação negativa perfeita e +1 indica associação positiva perfeita. Observe as correlações entre as variáveis:    Quais são mais correlacionadas com a variável dependete (Preço)?    Qual o relacionamento entre elas (positivo ou negativo)?    Existe correlação forte entre as variáveis explicativas?<jupyter_code>dados.corr().round(4)<jupyter_output><empty_output><jupyter_text>- Quais são mais correlacionadas com a variável dependete (Preço)?    - Banheiro    - Marmore    - Andares- Qual o relacionamento entre elas (positivo ou negativo)?    - O relacionamento é possitivo- Existe correlação forte entre as variáveis explicativas?    - Não  Comportamento da Variável Dependente (Y)  Análises gráficas   Importando biblioteca seaborn<jupyter_code>import seaborn as sns<jupyter_output><empty_output><jupyter_text>Configure o estilo e cor dos gráficos (opcional)<jupyter_code>sns.set_palette('Accent')
sns.set_style('darkgrid')<jupyter_output><empty_output><jupyter_text>Box plot da variável *dependente* (y) Avalie o comportamento da distribuição da variável dependente:    Parecem existir valores discrepantes (outliers)?    O box plot apresenta alguma tendência? https://seaborn.pydata.org/generated/seaborn.boxplot.html?highlight=boxplotseaborn.boxplot<jupyter_code>ax = sns.boxplot(x='precos', data=dados, width=0.2)
ax.figure.set_size_inches(12,6)
ax.set_title('Preco dos Imoveis', fontsize=20)
ax.set_xlabel('Valor', fontsize=16)<jupyter_output><empty_output><jupyter_text>- Parecem existir valores discrepantes (outliers)?  - Não consegui identificar nenhum outlier até o momento- O box plot apresenta alguma tendência?  - O plot tem uma leve inclinação a esquerda  Investigando a variável *dependente* (y) juntamente com outras característicaFaça um box plot da variável dependente em conjunto com cada variável explicativa (somente as categóricas). Avalie o comportamento da distribuição da variável dependente com cada variável explicativa categórica:    As estatísticas apresentam mudança significativa entre as categorias?    O box plot apresenta alguma tendência bem definida?  Box-plot (Preço X Garagem)<jupyter_code>ax = sns.boxplot(x='garagem', y='precos', data=dados, width=0.2)
ax.figure.set_size_inches(12,6)
ax.set_title('Preco dos Imoveis', fontsize=20)
ax.set_xlabel('Garagem', fontsize=16)
ax.set_ylabel('Valor', fontsize=16)<jupyter_output><empty_output><jupyter_text>Box-plot (Preço X Banheiros)<jupyter_code>ax = sns.boxplot(x='banheiros', y='precos', data=dados, width=0.2)
ax.figure.set_size_inches(12,6)
ax.set_title('Preco dos Imoveis', fontsize=20)
ax.set_xlabel('Quantidade de Banheiros', fontsize=16)
ax.set_ylabel('Valor', fontsize=16)<jupyter_output><empty_output><jupyter_text>Box-plot (Preço X Lareira)<jupyter_code>ax = sns.boxplot(x='lareira', y='precos', data=dados, width=0.2)
ax.figure.set_size_inches(12,6)
ax.set_title('Preco dos Imoveis', fontsize=20)
ax.set_xlabel('Quantidade de Lareiras', fontsize=16)
ax.set_ylabel('Valor', fontsize=16)<jupyter_output><empty_output><jupyter_text>Box-plot (Preço X Acabamento em Mármore)<jupyter_code>ax = sns.boxplot(x='marmore', y='precos', data=dados, width=0.2)
ax.figure.set_size_inches(12,6)
ax.set_title('Preco dos Imoveis', fontsize=20)
ax.set_xlabel('marmore', fontsize=16)
ax.set_ylabel('Valor', fontsize=16)<jupyter_output><empty_output><jupyter_text>Box-plot (Preço X Andares)<jupyter_code>ax = sns.boxplot(x='andares', y='precos', data=dados, width=0.2)
ax.figure.set_size_inches(12,6)
ax.set_title('Preco dos Imoveis', fontsize=20)
ax.set_xlabel('Andares', fontsize=16)
ax.set_ylabel('Valor', fontsize=16)<jupyter_output><empty_output><jupyter_text>Distribuição de frequências da variável *dependente* (y)Construa um histograma da variável dependente (Preço). Avalie:    A distribuição de frequências da variável dependente parece ser assimétrica?    É possível supor que a variável dependente segue uma distribuição normal? https://seaborn.pydata.org/generated/seaborn.distplot.html?highlight=distplotseaborn.distplot<jupyter_code>sns.histplot(dados['precos'], kde=True)<jupyter_output><empty_output><jupyter_text>- A distribuição de frequências da variável dependente parece ser assimétrica?     - Sim - É possível supor que a variável dependente segue uma distribuição normal?     - Pela visualização em histograma vemos que e possível sim  Gráficos de dispersão entre as variáveis do dataset  Plotando o pairplot fixando somente uma variável no eixo yhttps://seaborn.pydata.org/generated/seaborn.pairplot.html?highlight=pairplotseaborn.pairplotPlote gráficos de dispersão da variável dependente contra cada variável explicativa. Utilize o pairplot da biblioteca seaborn para isso.Plote o mesmo gráfico utilizando o parâmetro kind='reg'. Avalie:    É possível identificar alguma relação linear entre as variáveis?    A relação é positiva ou negativa?    Compare com os resultados obtidos na matriz de correlação.<jupyter_code>sns.pairplot(dados,
             x_vars=['garagem', 'banheiros', 'marmore', 'andares', 'lareira'],
             y_vars=['precos'])
sns.pairplot(dados,
             x_vars=['garagem', 'banheiros', 'marmore', 'andares', 'lareira'],
             y_vars=['precos'],
             kind='reg')<jupyter_output><empty_output><jupyter_text>- É possível identificar alguma relação linear entre as variáveis?     - Sim, principalmente quando comparamos com as variáveis marmore e andares - A relação é positiva ou negativa?     - Positiva com todas as variáveis  Estimando um Modelo de Regressão Linear  Importando o *train_test_split* da biblioteca *scikit-learn*https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html<jupyter_code>from sklearn.model_selection import train_test_split<jupyter_output><empty_output><jupyter_text>Criando uma Series (pandas) para armazenar a variável dependente (y)<jupyter_code>y = dados['precos']
y<jupyter_output><empty_output><jupyter_text>Criando um DataFrame (pandas) para armazenar as variáveis explicativas (X)<jupyter_code>X = dados[['garagem', 'banheiros',  'lareira', 'marmore', 'andares']]
X<jupyter_output><empty_output><jupyter_text>Criando os datasets de treino e de teste<jupyter_code>X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.30, random_state=2811)<jupyter_output><empty_output><jupyter_text>Importando *LinearRegression* e *metrics* da biblioteca *scikit-learn*https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LinearRegression.htmlhttps://scikit-learn.org/stable/modules/classes.htmlregression-metrics<jupyter_code>from sklearn.linear_model import LinearRegression
from sklearn import metrics<jupyter_output><empty_output><jupyter_text>Instanciando a classe *LinearRegression()*<jupyter_code>modelo = LinearRegression()<jupyter_output><empty_output><jupyter_text>Utilizando o método *fit()* para estimar o modelo linear utilizando os dados de TREINO (y_train e X_train)https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LinearRegression.htmlsklearn.linear_model.LinearRegression.fit<jupyter_code>modelo.fit(X_train, y_train)<jupyter_output><empty_output><jupyter_text>Obtendo o coeficiente de determinação (R²) do modelo estimado com os dados de TREINOhttps://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LinearRegression.htmlsklearn.linear_model.LinearRegression.score Avalie:    O modelo apresenta um bom ajuste?    Você lembra o que representa o R²?    Qual medida podemos tomar para melhorar essa estatística?<jupyter_code>print('R² = {} '.format(modelo.score(X_train, y_train).round(2)))<jupyter_output>R² = 0.62<jupyter_text>- O modelo apresenta um bom ajuste?     - Esta com um ajuste acima de 60% relativamente bom - Você lembra o que representa o R²?     - A relação de acertividade do modelo "quando maior melhor" - Qual medida podemos tomar para melhorar essa estatística?     - Testar com outras variaveis explicativas  Gerando previsões para os dados de TESTE (X_test) utilizando o método *predict()*https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LinearRegression.htmlsklearn.linear_model.LinearRegression.predict<jupyter_code>y_predict = modelo.predict(X_test)<jupyter_output><empty_output><jupyter_text>Obtendo o coeficiente de determinação (R²) para as previsões do nosso modelohttps://scikit-learn.org/stable/modules/generated/sklearn.metrics.r2_score.htmlsklearn.metrics.r2_score<jupyter_code>print('R² previsto = {}'.format(metrics.r2_score(y_test, y_predict).round(2)))<jupyter_output>R² previsto = 0.66<jupyter_text>Obtendo Previsões Pontuais  Criando um simulador simplesCrie um simulador que gere estimativas de preço a partir de um conjunto de informações de um imóvel.<jupyter_code>dados[0:1]
garagem=3
banheiros=4
lareira=3
marmore=0
andares=1

entrada = [[garagem,banheiros,lareira,marmore,andares]]

preco = modelo.predict(entrada)[0]
print('O preço previsto para o imovel é: R$ {0:.2f}'.format(preco))<jupyter_output>O preço previsto para o imovel é: R$ 49612.72<jupyter_text>Métricas de Regressão  Métricas da regressãofonte: https://scikit-learn.org/stable/modules/model_evaluation.htmlregression-metricsAlgumas estatísticas obtidas do modelo de regressão são muito úteis como critério de comparação entre modelos estimados e de seleção do melhor modelo, as principais métricas de regressão que o scikit-learn disponibiliza para modelos lineares são as seguintes: Erro Quadrático MédioMédia dos quadrados dos erros. Ajustes melhores apresentam $EQM$ mais baixo.$$EQM(y, \hat{y}) = \frac 1n\sum_{i=0}^{n-1}(y_i-\hat{y}_i)^2$$ Raíz do Erro Quadrático MédioRaíz quadrada da média dos quadrados dos erros. Ajustes melhores apresentam $\sqrt{EQM}$ mais baixo.$$\sqrt{EQM(y, \hat{y})} = \sqrt{\frac 1n\sum_{i=0}^{n-1}(y_i-\hat{y}_i)^2}$$ Coeficiente de Determinação - R²O coeficiente de determinação (R²) é uma medida resumida que diz quanto a linha de regressão ajusta-se aos dados. É um valor entra 0 e 1.$$R^2(y, \hat{y}) = 1 - \frac {\sum_{i=0}^{n-1}(y_i-\hat{y}_i)^2}{\sum_{i=0}^{n-1}(y_i-\bar{y}_i)^2}$$  Obtendo métricas para o modelo com Temperatura Máxima<jupyter_code>𝐸𝑄𝑀 = metrics.mean_squared_error(y_test, y_predict).round(2)
REQM = np.sqrt(metrics.mean_squared_error(y_test, y_predict)).round(2)
R_2 = metrics.r2_score(y_test, y_predict).round(2)

medidas = pd.DataFrame([EQM, REQM, R_2], ['EQM', 'REQM', 'R²'], columns=['Metrics'])
medidas<jupyter_output><empty_output><jupyter_text>Salvando e Carregando o Modelo Estimado  Importando a biblioteca pickle<jupyter_code>import pickle<jupyter_output><empty_output><jupyter_text>Salvando o modelo estimado<jupyter_code>output = open('modelo_exercicio', 'wb')
pickle.dump(modelo,output)
output.close()<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.09926383281880788, 'fraction_numerical': 0.010923771075753978, 'mean_word_length': 6.66626213592233, 'pattern_counts': {'":': 0, '<': 118, '<?xml version=': 0, '>': 118, 'https://': 12, 'lorem ipsum': 0, 'www.': 1, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '30', 'dir': 'jupyter-structured-clean-dedup', 'id': '278637', 'license': 'MIT', 'n_tokens_mistral': 4742, 'n_tokens_neox': 4595, 'n_words': 1088, 'path': 'Exercicio/.ipynb_checkpoints/Regressao Linear - Exercicio-checkpoint.ipynb', 'repo_name': 'Caiocof/regrecao_linear_01', 'size': '12633'}