{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h1 style='color: green; font-size: 36px; font-weight: bold;'>Data Science - Regressão Linear</h1>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# <font color='red' style='font-size: 30px;'>Conhecendo o Dataset</font>\n",
    "<hr style='border: 2px solid red;'>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Importando bibliotecas"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## O Dataset e o Projeto\n",
    "<hr>\n",
    "\n",
    "### Fonte: https://www.kaggle.com/greenwing1985/housepricing\n",
    "\n",
    "### Descrição:\n",
    "<p style='font-size: 18px; line-height: 2; margin: 10px 50px; text-align: justify;'>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.</p>\n",
    "\n",
    "<p style='font-size: 18px; line-height: 2; margin: 10px 50px; text-align: justify;'>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.</p>\n",
    "\n",
    "<p style='font-size: 18px; line-height: 2; margin: 10px 50px; text-align: justify;'>Siga os passos propostos nos comentários acima de cada célular e bons estudos.</p>\n",
    "\n",
    "### Dados:\n",
    "<ul style='font-size: 18px; line-height: 2; text-align: justify;'>\n",
    "    <li><b>precos</b> - Preços do imóveis</li>\n",
    "    <li><b>area</b> - Área do imóvel</li>\n",
    "    <li><b>garagem</b> - Número de vagas de garagem</li>\n",
    "    <li><b>banheiros</b> - Número de banheiros</li>\n",
    "    <li><b>lareira</b> - Número de lareiras</li>\n",
    "    <li><b>marmore</b> - Se o imóvel possui acabamento em mármore branco (1) ou não (0)</li>\n",
    "    <li><b>andares</b> - Se o imóvel possui mais de um andar (1) ou não (0)</li>\n",
    "</ul>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Leitura dos dados\n",
    "\n",
    "Dataset está na pasta \"Dados\" com o nome \"HousePrices_HalfMil.csv\" em usa como separador \";\"."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Visualizar os dados"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Verificando o tamanho do dataset"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# <font color='red' style='font-size: 30px;'>Análises Preliminares</font>\n",
    "<hr style='border: 2px solid red;'>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Estatísticas descritivas"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Matriz de correlação\n",
    "\n",
    "<p style='font-size: 18px; line-height: 2; margin: 10px 50px; text-align: justify;'>O <b>coeficiente de correlação</b> é uma medida de associação linear entre duas variáveis e situa-se entre <b>-1</b> e <b>+1</b> sendo que <b>-1</b> indica associação negativa perfeita e <b>+1</b> indica associação positiva perfeita.</p>\n",
    "\n",
    "### Observe as correlações entre as variáveis:\n",
    "<ul style='font-size: 16px; line-height: 2; text-align: justify;'>\n",
    "    <li>Quais são mais correlacionadas com a variável dependete (Preço)?</li>\n",
    "    <li>Qual o relacionamento entre elas (positivo ou negativo)?</li>\n",
    "    <li>Existe correlação forte entre as variáveis explicativas?</li>\n",
    "</ul>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# <font color='red' style='font-size: 30px;'>Comportamento da Variável Dependente (Y)</font>\n",
    "<hr style='border: 2px solid red;'>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Análises gráficas"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<img width='700px' src='../Dados/img/Box-Plot.png'>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Importando biblioteca seaborn"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Configure o estilo e cor dos gráficos (opcional)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Box plot da variável *dependente* (y)\n",
    "\n",
    "\n",
    "### Avalie o comportamento da distribuição da variável dependente:\n",
    "<ul style='font-size: 16px; line-height: 2; text-align: justify;'>\n",
    "    <li>Parecem existir valores discrepantes (outliers)?</li>\n",
    "    <li>O box plot apresenta alguma tendência?</li>\n",
    "</ul>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "https://seaborn.pydata.org/generated/seaborn.boxplot.html?highlight=boxplot#seaborn.boxplot"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Investigando a variável *dependente* (y) juntamente com outras característica\n",
    "\n",
    "Faça um box plot da variável dependente em conjunto com cada variável explicativa (somente as categóricas).\n",
    "\n",
    "### Avalie o comportamento da distribuição da variável dependente com cada variável explicativa categórica:\n",
    "<ul style='font-size: 16px; line-height: 2; text-align: justify;'>\n",
    "    <li>As estatísticas apresentam mudança significativa entre as categorias?</li>\n",
    "    <li>O box plot apresenta alguma tendência bem definida?</li>\n",
    "</ul>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Box-plot (Preço X Garagem)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Box-plot (Preço X Banheiros)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Box-plot (Preço X Lareira)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Box-plot (Preço X Acabamento em Mármore)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Box-plot (Preço X Andares)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Distribuição de frequências da variável *dependente* (y)\n",
    "\n",
    "Construa um histograma da variável dependente (Preço).\n",
    "\n",
    "### Avalie:\n",
    "<ul style='font-size: 16px; line-height: 2; text-align: justify;'>\n",
    "    <li>A distribuição de frequências da variável dependente parece ser assimétrica?</li>\n",
    "    <li>É possível supor que a variável dependente segue uma distribuição normal?</li>\n",
    "</ul>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "https://seaborn.pydata.org/generated/seaborn.distplot.html?highlight=distplot#seaborn.distplot"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Gráficos de dispersão entre as variáveis do dataset"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Plotando o pairplot fixando somente uma variável no eixo y\n",
    "\n",
    "https://seaborn.pydata.org/generated/seaborn.pairplot.html?highlight=pairplot#seaborn.pairplot\n",
    "\n",
    "Plote gráficos de dispersão da variável dependente contra cada variável explicativa. Utilize o pairplot da biblioteca seaborn para isso.\n",
    "\n",
    "Plote o mesmo gráfico utilizando o parâmetro kind='reg'.\n",
    "\n",
    "### Avalie:\n",
    "<ul style='font-size: 16px; line-height: 2; text-align: justify;'>\n",
    "    <li>É possível identificar alguma relação linear entre as variáveis?</li>\n",
    "    <li>A relação é positiva ou negativa?</li>\n",
    "    <li>Compare com os resultados obtidos na matriz de correlação.</li>\n",
    "</ul>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# <font color='red' style='font-size: 30px;'>Estimando um Modelo de Regressão Linear</font>\n",
    "<hr style='border: 2px solid red;'>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Importando o *train_test_split* da biblioteca *scikit-learn*\n",
    "\n",
    "https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Criando uma Series (pandas) para armazenar a variável dependente (y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Criando um DataFrame (pandas) para armazenar as variáveis explicativas (X)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Criando os datasets de treino e de teste"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Importando *LinearRegression* e *metrics* da biblioteca *scikit-learn*\n",
    "\n",
    "https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LinearRegression.html\n",
    "\n",
    "https://scikit-learn.org/stable/modules/classes.html#regression-metrics"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Instanciando a classe *LinearRegression()*"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Utilizando o método *fit()* para estimar o modelo linear utilizando os dados de TREINO (y_train e X_train)\n",
    "\n",
    "https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LinearRegression.html#sklearn.linear_model.LinearRegression.fit"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Obtendo o coeficiente de determinação (R²) do modelo estimado com os dados de TREINO\n",
    "\n",
    "https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LinearRegression.html#sklearn.linear_model.LinearRegression.score\n",
    "\n",
    "\n",
    "### Avalie:\n",
    "<ul style='font-size: 16px; line-height: 2; text-align: justify;'>\n",
    "    <li>O modelo apresenta um bom ajuste?</li>\n",
    "    <li>Você lembra o que representa o R²?</li>\n",
    "    <li>Qual medida podemos tomar para melhorar essa estatística?</li>\n",
    "</ul>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Gerando previsões para os dados de TESTE (X_test) utilizando o método *predict()*\n",
    "\n",
    "https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LinearRegression.html#sklearn.linear_model.LinearRegression.predict"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Obtendo o coeficiente de determinação (R²) para as previsões do nosso modelo\n",
    "\n",
    "https://scikit-learn.org/stable/modules/generated/sklearn.metrics.r2_score.html#sklearn.metrics.r2_score"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# <font color='red' style='font-size: 30px;'>Obtendo Previsões Pontuais</font>\n",
    "<hr style='border: 2px solid red;'>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Criando um simulador simples\n",
    "\n",
    "Crie um simulador que gere estimativas de preço a partir de um conjunto de informações de um imóvel."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# <font color='red' style='font-size: 30px;'>Métricas de Regressão</font>\n",
    "<hr style='border: 2px solid red;'>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Métricas da regressão\n",
    "<hr>\n",
    "\n",
    "fonte: https://scikit-learn.org/stable/modules/model_evaluation.html#regression-metrics\n",
    "\n",
    "Algumas 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:\n",
    "\n",
    "### Erro Quadrático Médio\n",
    "\n",
    "Média dos quadrados dos erros. Ajustes melhores apresentam $EQM$ mais baixo.\n",
    "\n",
    "$$EQM(y, \\hat{y}) = \\frac 1n\\sum_{i=0}^{n-1}(y_i-\\hat{y}_i)^2$$\n",
    "\n",
    "### Raíz do Erro Quadrático Médio\n",
    "\n",
    "Raíz quadrada da média dos quadrados dos erros. Ajustes melhores apresentam $\\sqrt{EQM}$ mais baixo.\n",
    "\n",
    "$$\\sqrt{EQM(y, \\hat{y})} = \\sqrt{\\frac 1n\\sum_{i=0}^{n-1}(y_i-\\hat{y}_i)^2}$$\n",
    "\n",
    "### Coeficiente de Determinação - R²\n",
    "\n",
    "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.\n",
    "\n",
    "$$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}$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Obtendo métricas para o modelo com Temperatura Máxima"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# <font color='red' style='font-size: 30px;'>Salvando e Carregando o Modelo Estimado</font>\n",
    "<hr style='border: 2px solid red;'>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Importando a biblioteca pickle"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Salvando o modelo estimado"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Em um novo notebook/projeto Python\n",
    "\n",
    "<h4 style='color: blue; font-weight: normal'>In [1]:</h4>\n",
    "\n",
    "```sh\n",
    "import pickle\n",
    "\n",
    "modelo = open('modelo_preço','rb')\n",
    "lm_new = pickle.load(modelo)\n",
    "modelo.close()\n",
    "\n",
    "area = 38\n",
    "garagem = 2\n",
    "banheiros = 4\n",
    "lareira = 4\n",
    "marmore = 0\n",
    "andares = 1\n",
    "\n",
    "entrada = [[area, garagem, banheiros, lareira, marmore, andares]]\n",
    "\n",
    "print('$ {0:.2f}'.format(lm_new.predict(entrada)[0]))\n",
    "```\n",
    "\n",
    "<h4 style='color: red; font-weight: normal'>Out [1]:</h4>\n",
    "\n",
    "```\n",
    "$ 46389.80\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
