Skip to content

Instantly share code, notes, and snippets.

@borgeslt
Created July 29, 2020 12:43
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save borgeslt/1c0ccacf706782e978389993f4db58af to your computer and use it in GitHub Desktop.
Save borgeslt/1c0ccacf706782e978389993f4db58af to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"name": "IGTI_Desafio_1.ipynb",
"provenance": [],
"collapsed_sections": [],
"authorship_tag": "ABX9TyP9SdUa8SQ6eHGLV9M9Y7jv"
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3"
}
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "Ni_8aduuXqBH",
"colab_type": "text"
},
"source": [
"# *Bootcamp* IGTI - Analista de *Machine Learning*: Desafio Módulo 1 -- Fundamentos\n",
"\n",
"Aplicação dos conceitos de análise e modelamento de Machine Learning aprendidos no Módulo 1 do Bootcamp.\n",
"\n",
"**Objetivos:**\n",
"* *Exploratory Data Analysis* (EDA) - Análise exploratória dos dados\n",
"* Preparação dos dados\n",
"* Análise de modelos - Regressão Linear / Árvore de Decisão "
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "aIxxhTdYcqSP",
"colab_type": "text"
},
"source": [
"## **Introdução ao Desafio**\n",
"\n",
"Neste desafio iremos utilizar uma versáo modificada do *dataset* *\"Bike Sharing\"* disponível no [***UCI Machine Learning Repository***](https://archive.ics.uci.edu/ml/datasets/Bike+Sharing+Dataset). Serão abordados todos os conceitos apresentados durante a disciplina **Fundamentos de *Machine Learning* (FAM)**.\n",
"\n",
"No arquivo iremos trabalhar com um conjunto de informações sobre o compartilhamento de bicicletas, com dados sobre as condições climáticas, localização das bicicletas, entre outros.\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "tVML3nnGfX6i",
"colab_type": "text"
},
"source": [
"#### Dicionário de Variáveis\n",
"\n",
">```instant``` - index do registro\n",
">\n",
"> ```dteday``` - data\n",
">\n",
"> ```season``` - estação do ano (1: winter, 2: spring, 3: summer, 4: fall)\n",
">\n",
"> ```yr``` - ano (0: 2011, 1: 2012)\n",
">\n",
"> ```mnth``` - mês (1 a 12)\n",
">\n",
"> ```hr``` - hora (0 a 23)\n",
">\n",
"> ```holiday``` - se o dia é um feriado ou não\n",
">\n",
"> ```weekday``` - dia de semana\n",
">\n",
"> ```workingday``` - se o dia é um fim de semana e não feriado = 1, se não for = 0\n",
">\n",
"> ```temp``` - temperatura normalizada em Celsius\n",
">\n",
">```atemp``` - sensação térmica normalizada em Celsius.\n",
">\n",
"> ```hum``` - Umidade normalizada. Os valores são divididos em 100 (máx)\n",
">\n",
"> ```windspeed``` - velocidade do vento normalizada. Os valores são divididos em 67 (máx)\n",
">\n",
"> ```casual``` - contagem de usuários casuais\n",
">\n",
"> ```registered``` - contagem de usuários registrados\n",
">\n",
"> ```cnt``` - contagem total de alugéis de bicicletas entre casuais e resgistrados"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "LGV_ILiujmew",
"colab_type": "text"
},
"source": [
"## **Mãos-à-Obra**"
]
},
{
"cell_type": "code",
"metadata": {
"id": "MhrQfD6Sg4zr",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 72
},
"outputId": "5b051374-9b42-4d1b-f6ae-efcb3a9f9dee"
},
"source": [
"# importar as bibliotecas e métodos utilizados\n",
"from sklearn import datasets #sklearn é uma das lib mais utilizadas em ML, ela contém, além dos \n",
" #datasets, várias outras funções úteis para a análise de dados\n",
" # essa lib será sua amiga durante toda sua carreira\n",
"import pandas as pd # importa a lib Pandas. Essa lib é utilizada para lidar com dataframes (TABELAS) \n",
" #de forma mais amigável. \n",
"from sklearn.model_selection import train_test_split,KFold,cross_val_score, cross_val_predict # esse método é utilizado para dividir o \n",
" # conjunto de dados em grupos de treinamento e test\n",
"from sklearn.svm import SVC #importa o algoritmo svm para ser utilizado \n",
"from sklearn import tree # importa o algoritmo arvore de decisão\n",
"from sklearn.linear_model import LogisticRegression #importa o algoritmo de regressão logística\n",
"from sklearn.metrics import mean_absolute_error #utilizada para o calculo do MAE\n",
"from sklearn.metrics import mean_squared_error #utilizada para o calculo do MSE\n",
"from sklearn.metrics import r2_score #utilizada para o calculo do R2\n",
"from sklearn import metrics #utilizada para as métricas de comparação entre os métodos\n",
"import matplotlib.pyplot as plt\n",
"import seaborn as sns\n",
"import numpy as np\n",
"from sklearn.ensemble import RandomForestClassifier\n",
"from sklearn.tree import DecisionTreeClassifier \n",
"from sklearn.neighbors import KNeighborsClassifier\n",
"from sklearn import svm"
],
"execution_count": 1,
"outputs": [
{
"output_type": "stream",
"text": [
"/usr/local/lib/python3.6/dist-packages/statsmodels/tools/_testing.py:19: FutureWarning: pandas.util.testing is deprecated. Use the functions in the public API at pandas.testing instead.\n",
" import pandas.util.testing as tm\n"
],
"name": "stderr"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "O2eQVX1RhGzg",
"colab_type": "code",
"colab": {
"resources": {
"http://localhost:8080/nbextensions/google.colab/files.js": {
"data": "Ly8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQwovLwovLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgovLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLy8KLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLy8KLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQovLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAovLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAovLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IEhlbHBlcnMgZm9yIGdvb2dsZS5jb2xhYiBQeXRob24gbW9kdWxlLgogKi8KKGZ1bmN0aW9uKHNjb3BlKSB7CmZ1bmN0aW9uIHNwYW4odGV4dCwgc3R5bGVBdHRyaWJ1dGVzID0ge30pIHsKICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwogIGVsZW1lbnQudGV4dENvbnRlbnQgPSB0ZXh0OwogIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHN0eWxlQXR0cmlidXRlcykpIHsKICAgIGVsZW1lbnQuc3R5bGVba2V5XSA9IHN0eWxlQXR0cmlidXRlc1trZXldOwogIH0KICByZXR1cm4gZWxlbWVudDsKfQoKLy8gTWF4IG51bWJlciBvZiBieXRlcyB3aGljaCB3aWxsIGJlIHVwbG9hZGVkIGF0IGEgdGltZS4KY29uc3QgTUFYX1BBWUxPQURfU0laRSA9IDEwMCAqIDEwMjQ7CgpmdW5jdGlvbiBfdXBsb2FkRmlsZXMoaW5wdXRJZCwgb3V0cHV0SWQpIHsKICBjb25zdCBzdGVwcyA9IHVwbG9hZEZpbGVzU3RlcChpbnB1dElkLCBvdXRwdXRJZCk7CiAgY29uc3Qgb3V0cHV0RWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKG91dHB1dElkKTsKICAvLyBDYWNoZSBzdGVwcyBvbiB0aGUgb3V0cHV0RWxlbWVudCB0byBtYWtlIGl0IGF2YWlsYWJsZSBmb3IgdGhlIG5leHQgY2FsbAogIC8vIHRvIHVwbG9hZEZpbGVzQ29udGludWUgZnJvbSBQeXRob24uCiAgb3V0cHV0RWxlbWVudC5zdGVwcyA9IHN0ZXBzOwoKICByZXR1cm4gX3VwbG9hZEZpbGVzQ29udGludWUob3V0cHV0SWQpOwp9CgovLyBUaGlzIGlzIHJvdWdobHkgYW4gYXN5bmMgZ2VuZXJhdG9yIChub3Qgc3VwcG9ydGVkIGluIHRoZSBicm93c2VyIHlldCksCi8vIHdoZXJlIHRoZXJlIGFyZSBtdWx0aXBsZSBhc3luY2hyb25vdXMgc3RlcHMgYW5kIHRoZSBQeXRob24gc2lkZSBpcyBnb2luZwovLyB0byBwb2xsIGZvciBjb21wbGV0aW9uIG9mIGVhY2ggc3RlcC4KLy8gVGhpcyB1c2VzIGEgUHJvbWlzZSB0byBibG9jayB0aGUgcHl0aG9uIHNpZGUgb24gY29tcGxldGlvbiBvZiBlYWNoIHN0ZXAsCi8vIHRoZW4gcGFzc2VzIHRoZSByZXN1bHQgb2YgdGhlIHByZXZpb3VzIHN0ZXAgYXMgdGhlIGlucHV0IHRvIHRoZSBuZXh0IHN0ZXAuCmZ1bmN0aW9uIF91cGxvYWRGaWxlc0NvbnRpbnVlKG91dHB1dElkKSB7CiAgY29uc3Qgb3V0cHV0RWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKG91dHB1dElkKTsKICBjb25zdCBzdGVwcyA9IG91dHB1dEVsZW1lbnQuc3RlcHM7CgogIGNvbnN0IG5leHQgPSBzdGVwcy5uZXh0KG91dHB1dEVsZW1lbnQubGFzdFByb21pc2VWYWx1ZSk7CiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShuZXh0LnZhbHVlLnByb21pc2UpLnRoZW4oKHZhbHVlKSA9PiB7CiAgICAvLyBDYWNoZSB0aGUgbGFzdCBwcm9taXNlIHZhbHVlIHRvIG1ha2UgaXQgYXZhaWxhYmxlIHRvIHRoZSBuZXh0CiAgICAvLyBzdGVwIG9mIHRoZSBnZW5lcmF0b3IuCiAgICBvdXRwdXRFbGVtZW50Lmxhc3RQcm9taXNlVmFsdWUgPSB2YWx1ZTsKICAgIHJldHVybiBuZXh0LnZhbHVlLnJlc3BvbnNlOwogIH0pOwp9CgovKioKICogR2VuZXJhdG9yIGZ1bmN0aW9uIHdoaWNoIGlzIGNhbGxlZCBiZXR3ZWVuIGVhY2ggYXN5bmMgc3RlcCBvZiB0aGUgdXBsb2FkCiAqIHByb2Nlc3MuCiAqIEBwYXJhbSB7c3RyaW5nfSBpbnB1dElkIEVsZW1lbnQgSUQgb2YgdGhlIGlucHV0IGZpbGUgcGlja2VyIGVsZW1lbnQuCiAqIEBwYXJhbSB7c3RyaW5nfSBvdXRwdXRJZCBFbGVtZW50IElEIG9mIHRoZSBvdXRwdXQgZGlzcGxheS4KICogQHJldHVybiB7IUl0ZXJhYmxlPCFPYmplY3Q+fSBJdGVyYWJsZSBvZiBuZXh0IHN0ZXBzLgogKi8KZnVuY3Rpb24qIHVwbG9hZEZpbGVzU3RlcChpbnB1dElkLCBvdXRwdXRJZCkgewogIGNvbnN0IGlucHV0RWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlucHV0SWQpOwogIGlucHV0RWxlbWVudC5kaXNhYmxlZCA9IGZhbHNlOwoKICBjb25zdCBvdXRwdXRFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQob3V0cHV0SWQpOwogIG91dHB1dEVsZW1lbnQuaW5uZXJIVE1MID0gJyc7CgogIGNvbnN0IHBpY2tlZFByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gewogICAgaW5wdXRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIChlKSA9PiB7CiAgICAgIHJlc29sdmUoZS50YXJnZXQuZmlsZXMpOwogICAgfSk7CiAgfSk7CgogIGNvbnN0IGNhbmNlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpOwogIGlucHV0RWxlbWVudC5wYXJlbnRFbGVtZW50LmFwcGVuZENoaWxkKGNhbmNlbCk7CiAgY2FuY2VsLnRleHRDb250ZW50ID0gJ0NhbmNlbCB1cGxvYWQnOwogIGNvbnN0IGNhbmNlbFByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gewogICAgY2FuY2VsLm9uY2xpY2sgPSAoKSA9PiB7CiAgICAgIHJlc29sdmUobnVsbCk7CiAgICB9OwogIH0pOwoKICAvLyBXYWl0IGZvciB0aGUgdXNlciB0byBwaWNrIHRoZSBmaWxlcy4KICBjb25zdCBmaWxlcyA9IHlpZWxkIHsKICAgIHByb21pc2U6IFByb21pc2UucmFjZShbcGlja2VkUHJvbWlzZSwgY2FuY2VsUHJvbWlzZV0pLAogICAgcmVzcG9uc2U6IHsKICAgICAgYWN0aW9uOiAnc3RhcnRpbmcnLAogICAgfQogIH07CgogIGNhbmNlbC5yZW1vdmUoKTsKCiAgLy8gRGlzYWJsZSB0aGUgaW5wdXQgZWxlbWVudCBzaW5jZSBmdXJ0aGVyIHBpY2tzIGFyZSBub3QgYWxsb3dlZC4KICBpbnB1dEVsZW1lbnQuZGlzYWJsZWQgPSB0cnVlOwoKICBpZiAoIWZpbGVzKSB7CiAgICByZXR1cm4gewogICAgICByZXNwb25zZTogewogICAgICAgIGFjdGlvbjogJ2NvbXBsZXRlJywKICAgICAgfQogICAgfTsKICB9CgogIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykgewogICAgY29uc3QgbGkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaScpOwogICAgbGkuYXBwZW5kKHNwYW4oZmlsZS5uYW1lLCB7Zm9udFdlaWdodDogJ2JvbGQnfSkpOwogICAgbGkuYXBwZW5kKHNwYW4oCiAgICAgICAgYCgke2ZpbGUudHlwZSB8fCAnbi9hJ30pIC0gJHtmaWxlLnNpemV9IGJ5dGVzLCBgICsKICAgICAgICBgbGFzdCBtb2RpZmllZDogJHsKICAgICAgICAgICAgZmlsZS5sYXN0TW9kaWZpZWREYXRlID8gZmlsZS5sYXN0TW9kaWZpZWREYXRlLnRvTG9jYWxlRGF0ZVN0cmluZygpIDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ24vYSd9IC0gYCkpOwogICAgY29uc3QgcGVyY2VudCA9IHNwYW4oJzAlIGRvbmUnKTsKICAgIGxpLmFwcGVuZENoaWxkKHBlcmNlbnQpOwoKICAgIG91dHB1dEVsZW1lbnQuYXBwZW5kQ2hpbGQobGkpOwoKICAgIGNvbnN0IGZpbGVEYXRhUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7CiAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7CiAgICAgIHJlYWRlci5vbmxvYWQgPSAoZSkgPT4gewogICAgICAgIHJlc29sdmUoZS50YXJnZXQucmVzdWx0KTsKICAgICAgfTsKICAgICAgcmVhZGVyLnJlYWRBc0FycmF5QnVmZmVyKGZpbGUpOwogICAgfSk7CiAgICAvLyBXYWl0IGZvciB0aGUgZGF0YSB0byBiZSByZWFkeS4KICAgIGxldCBmaWxlRGF0YSA9IHlpZWxkIHsKICAgICAgcHJvbWlzZTogZmlsZURhdGFQcm9taXNlLAogICAgICByZXNwb25zZTogewogICAgICAgIGFjdGlvbjogJ2NvbnRpbnVlJywKICAgICAgfQogICAgfTsKCiAgICAvLyBVc2UgYSBjaHVua2VkIHNlbmRpbmcgdG8gYXZvaWQgbWVzc2FnZSBzaXplIGxpbWl0cy4gU2VlIGIvNjIxMTU2NjAuCiAgICBsZXQgcG9zaXRpb24gPSAwOwogICAgd2hpbGUgKHBvc2l0aW9uIDwgZmlsZURhdGEuYnl0ZUxlbmd0aCkgewogICAgICBjb25zdCBsZW5ndGggPSBNYXRoLm1pbihmaWxlRGF0YS5ieXRlTGVuZ3RoIC0gcG9zaXRpb24sIE1BWF9QQVlMT0FEX1NJWkUpOwogICAgICBjb25zdCBjaHVuayA9IG5ldyBVaW50OEFycmF5KGZpbGVEYXRhLCBwb3NpdGlvbiwgbGVuZ3RoKTsKICAgICAgcG9zaXRpb24gKz0gbGVuZ3RoOwoKICAgICAgY29uc3QgYmFzZTY0ID0gYnRvYShTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIGNodW5rKSk7CiAgICAgIHlpZWxkIHsKICAgICAgICByZXNwb25zZTogewogICAgICAgICAgYWN0aW9uOiAnYXBwZW5kJywKICAgICAgICAgIGZpbGU6IGZpbGUubmFtZSwKICAgICAgICAgIGRhdGE6IGJhc2U2NCwKICAgICAgICB9LAogICAgICB9OwogICAgICBwZXJjZW50LnRleHRDb250ZW50ID0KICAgICAgICAgIGAke01hdGgucm91bmQoKHBvc2l0aW9uIC8gZmlsZURhdGEuYnl0ZUxlbmd0aCkgKiAxMDApfSUgZG9uZWA7CiAgICB9CiAgfQoKICAvLyBBbGwgZG9uZS4KICB5aWVsZCB7CiAgICByZXNwb25zZTogewogICAgICBhY3Rpb246ICdjb21wbGV0ZScsCiAgICB9CiAgfTsKfQoKc2NvcGUuZ29vZ2xlID0gc2NvcGUuZ29vZ2xlIHx8IHt9OwpzY29wZS5nb29nbGUuY29sYWIgPSBzY29wZS5nb29nbGUuY29sYWIgfHwge307CnNjb3BlLmdvb2dsZS5jb2xhYi5fZmlsZXMgPSB7CiAgX3VwbG9hZEZpbGVzLAogIF91cGxvYWRGaWxlc0NvbnRpbnVlLAp9Owp9KShzZWxmKTsK",
"ok": true,
"headers": [
[
"content-type",
"application/javascript"
]
],
"status": 200,
"status_text": ""
}
},
"base_uri": "https://localhost:8080/",
"height": 73
},
"outputId": "34208633-eff3-4605-a43f-df544086dabe"
},
"source": [
"from google.colab import files\n",
"upload = files.upload()"
],
"execution_count": 2,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/html": [
"\n",
" <input type=\"file\" id=\"files-7e8be7ff-a3db-45f4-b052-028748257913\" name=\"files[]\" multiple disabled\n",
" style=\"border:none\" />\n",
" <output id=\"result-7e8be7ff-a3db-45f4-b052-028748257913\">\n",
" Upload widget is only available when the cell has been executed in the\n",
" current browser session. Please rerun this cell to enable.\n",
" </output>\n",
" <script src=\"/nbextensions/google.colab/files.js\"></script> "
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {
"tags": []
}
},
{
"output_type": "stream",
"text": [
"Saving comp_bikes_mod.csv to comp_bikes_mod.csv\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "29K6IyqbhUBZ",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 202
},
"outputId": "56f5e193-0af8-48e7-8ed3-8a9b796d6c9f"
},
"source": [
"# importar o dataset\n",
"df = pd.read_csv('comp_bikes_mod.csv')\n",
"\n",
"# visualizar as primeiras 5 entradas do dataset\n",
"df.head()"
],
"execution_count": 4,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>instant</th>\n",
" <th>dteday</th>\n",
" <th>season</th>\n",
" <th>yr</th>\n",
" <th>mnth</th>\n",
" <th>hr</th>\n",
" <th>holiday</th>\n",
" <th>weekday</th>\n",
" <th>workingday</th>\n",
" <th>weathersit</th>\n",
" <th>temp</th>\n",
" <th>atemp</th>\n",
" <th>hum</th>\n",
" <th>windspeed</th>\n",
" <th>casual</th>\n",
" <th>registered</th>\n",
" <th>cnt</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1.0</td>\n",
" <td>NaN</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>6.0</td>\n",
" <td>0.0</td>\n",
" <td>1.0</td>\n",
" <td>NaN</td>\n",
" <td>0.2879</td>\n",
" <td>0.81</td>\n",
" <td>0.0</td>\n",
" <td>3.0</td>\n",
" <td>13.0</td>\n",
" <td>16.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>2.0</td>\n",
" <td>2011-01-01</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" <td>6.0</td>\n",
" <td>0.0</td>\n",
" <td>NaN</td>\n",
" <td>0.22</td>\n",
" <td>0.2727</td>\n",
" <td>0.80</td>\n",
" <td>0.0</td>\n",
" <td>8.0</td>\n",
" <td>32.0</td>\n",
" <td>40.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>3.0</td>\n",
" <td>2011-01-01</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" <td>1.0</td>\n",
" <td>2.0</td>\n",
" <td>0.0</td>\n",
" <td>6.0</td>\n",
" <td>0.0</td>\n",
" <td>1.0</td>\n",
" <td>0.22</td>\n",
" <td>0.2727</td>\n",
" <td>0.80</td>\n",
" <td>0.0</td>\n",
" <td>5.0</td>\n",
" <td>27.0</td>\n",
" <td>32.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>4.0</td>\n",
" <td>2011-01-01</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" <td>1.0</td>\n",
" <td>3.0</td>\n",
" <td>0.0</td>\n",
" <td>6.0</td>\n",
" <td>0.0</td>\n",
" <td>1.0</td>\n",
" <td>0.24</td>\n",
" <td>0.2879</td>\n",
" <td>0.75</td>\n",
" <td>0.0</td>\n",
" <td>3.0</td>\n",
" <td>10.0</td>\n",
" <td>13.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>5.0</td>\n",
" <td>2011-01-01</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" <td>1.0</td>\n",
" <td>4.0</td>\n",
" <td>0.0</td>\n",
" <td>6.0</td>\n",
" <td>NaN</td>\n",
" <td>1.0</td>\n",
" <td>0.24</td>\n",
" <td>0.2879</td>\n",
" <td>0.75</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" instant dteday season yr ... windspeed casual registered cnt\n",
"0 1.0 NaN 1.0 0.0 ... 0.0 3.0 13.0 16.0\n",
"1 2.0 2011-01-01 1.0 0.0 ... 0.0 8.0 32.0 40.0\n",
"2 3.0 2011-01-01 1.0 0.0 ... 0.0 5.0 27.0 32.0\n",
"3 4.0 2011-01-01 1.0 0.0 ... 0.0 3.0 10.0 13.0\n",
"4 5.0 2011-01-01 1.0 0.0 ... 0.0 0.0 1.0 1.0\n",
"\n",
"[5 rows x 17 columns]"
]
},
"metadata": {
"tags": []
},
"execution_count": 4
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "55WGAGTEhtkC",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 433
},
"outputId": "40e63252-280e-431d-b94f-b06e60f82914"
},
"source": [
"# visualizar as informações do dataset\n",
"df.info()"
],
"execution_count": 5,
"outputs": [
{
"output_type": "stream",
"text": [
"<class 'pandas.core.frame.DataFrame'>\n",
"RangeIndex: 17379 entries, 0 to 17378\n",
"Data columns (total 17 columns):\n",
" # Column Non-Null Count Dtype \n",
"--- ------ -------------- ----- \n",
" 0 instant 15641 non-null float64\n",
" 1 dteday 15641 non-null object \n",
" 2 season 15641 non-null float64\n",
" 3 yr 15641 non-null float64\n",
" 4 mnth 15641 non-null float64\n",
" 5 hr 15641 non-null float64\n",
" 6 holiday 15641 non-null float64\n",
" 7 weekday 15641 non-null float64\n",
" 8 workingday 15641 non-null float64\n",
" 9 weathersit 15641 non-null float64\n",
" 10 temp 15641 non-null float64\n",
" 11 atemp 15641 non-null float64\n",
" 12 hum 15641 non-null float64\n",
" 13 windspeed 15641 non-null float64\n",
" 14 casual 15641 non-null float64\n",
" 15 registered 15641 non-null float64\n",
" 16 cnt 15641 non-null float64\n",
"dtypes: float64(16), object(1)\n",
"memory usage: 2.3+ MB\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "D45EQVhJh7Rg",
"colab_type": "text"
},
"source": [
"#### **Quantas instâncias e atributos existem, respectivamente?**"
]
},
{
"cell_type": "code",
"metadata": {
"id": "zEx6rLKoiHUm",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 35
},
"outputId": "678edcf0-66d6-4937-eb22-7320df4a70ce"
},
"source": [
"df.shape"
],
"execution_count": 6,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"(17379, 17)"
]
},
"metadata": {
"tags": []
},
"execution_count": 6
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Bg_wIGkzjeuN",
"colab_type": "text"
},
"source": [
"#### **Quantos tipos de dados existem no dataset?**"
]
},
{
"cell_type": "code",
"metadata": {
"id": "xQi-EIpqjrxv",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 35
},
"outputId": "029ddc6f-e411-4c32-96b9-7aa550d9cacf"
},
"source": [
"print(\"Tipos de dados existentes: {}\".format(df.dtypes.nunique()))"
],
"execution_count": 7,
"outputs": [
{
"output_type": "stream",
"text": [
"Tipos de dados existentes: 2\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "2UjwhgnBiIr7",
"colab_type": "text"
},
"source": [
"#### **Qual é a proporção (em %) de valores nulos na coluna \"temp\" (temperatura ambiente normalizada)?**"
]
},
{
"cell_type": "code",
"metadata": {
"id": "BMnWSD9niYUP",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 35
},
"outputId": "11c0d6a6-01d4-4d30-d794-8588a946ad76"
},
"source": [
"print(\"Valore nulos:\\t{}\".format(round(((df.temp.isnull().sum()/df.shape[0]) * 100),2)) + \"%\")"
],
"execution_count": 8,
"outputs": [
{
"output_type": "stream",
"text": [
"Valore nulos:\t10.0%\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "0kZ2QHobl25Q",
"colab_type": "text"
},
"source": [
"#### **Eliminar as linhas que contenham valores nulos para a coluna \"dteday\"**"
]
},
{
"cell_type": "code",
"metadata": {
"id": "2x7R4QODijRE",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 52
},
"outputId": "00eeeafc-a75d-4b7a-e325-51f412ddf464"
},
"source": [
"# eliminando as entradas\n",
"df_clean = df.dropna(subset=['dteday'], axis=0)\n",
"\n",
"# comparação\n",
"print(\"Antes:\\t{}\".format(df.shape))\n",
"print(\"Depois:\\t{}\".format(df_clean.shape))"
],
"execution_count": 9,
"outputs": [
{
"output_type": "stream",
"text": [
"Antes:\t(17379, 17)\n",
"Depois:\t(15641, 17)\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "aWOCqVG7kLLC",
"colab_type": "text"
},
"source": [
"#### **Qual o valor médio para os dados da coluna \"temp\" depois de retirar as linhas que continham valores nulos?**"
]
},
{
"cell_type": "code",
"metadata": {
"id": "Xo0ro22Kkzye",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 35
},
"outputId": "c6f7db9e-1265-47dd-c547-c9fb17f33241"
},
"source": [
"print(\"média:\\t{}\".format(round(df_clean.temp.mean(),4)))"
],
"execution_count": 10,
"outputs": [
{
"output_type": "stream",
"text": [
"média:\t0.4969\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "ONAqU2y5k6ly",
"colab_type": "text"
},
"source": [
"#### **Qual o desivio padrão para os dados da coluna \"windspeed\" após a retirada das linhas com valores nulos da coluna \"dteday\"?**"
]
},
{
"cell_type": "code",
"metadata": {
"id": "6K2ig-OXlP43",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 35
},
"outputId": "a37cdf43-a53b-4fda-9f0f-08b59e74d633"
},
"source": [
"print(\"Desvio:\\t{}\".format(round(df_clean.windspeed.std(),4)))"
],
"execution_count": 11,
"outputs": [
{
"output_type": "stream",
"text": [
"Desvio:\t0.1223\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "LAsOKQnfltwM",
"colab_type": "text"
},
"source": [
"#### **Após a eliminação das linhas com valores nulos na coluna \"dteday\", transforme a coluna \"season\" em valores categóricos. Quantas categorias diferentes existem?**"
]
},
{
"cell_type": "code",
"metadata": {
"id": "L0vBifN19LXq",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 243
},
"outputId": "e940debf-8df8-4650-d934-f7e9610ea8d1"
},
"source": [
"df_clean.loc[:,'season'].astype(\"category\")"
],
"execution_count": 12,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"1 1.0\n",
"2 1.0\n",
"3 1.0\n",
"4 1.0\n",
"5 1.0\n",
" ... \n",
"17373 1.0\n",
"17374 NaN\n",
"17375 1.0\n",
"17377 1.0\n",
"17378 NaN\n",
"Name: season, Length: 15641, dtype: category\n",
"Categories (4, float64): [1.0, 2.0, 3.0, 4.0]"
]
},
"metadata": {
"tags": []
},
"execution_count": 12
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "-XJH5Yhf9128",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 433
},
"outputId": "6b73e2fe-a696-4473-ea09-63bd6e10bdf5"
},
"source": [
"# confirmando a mudança\n",
"df_clean.info()"
],
"execution_count": 13,
"outputs": [
{
"output_type": "stream",
"text": [
"<class 'pandas.core.frame.DataFrame'>\n",
"Int64Index: 15641 entries, 1 to 17378\n",
"Data columns (total 17 columns):\n",
" # Column Non-Null Count Dtype \n",
"--- ------ -------------- ----- \n",
" 0 instant 14060 non-null float64\n",
" 1 dteday 15641 non-null object \n",
" 2 season 14061 non-null float64\n",
" 3 yr 14076 non-null float64\n",
" 4 mnth 14062 non-null float64\n",
" 5 hr 14068 non-null float64\n",
" 6 holiday 14076 non-null float64\n",
" 7 weekday 14078 non-null float64\n",
" 8 workingday 14097 non-null float64\n",
" 9 weathersit 14078 non-null float64\n",
" 10 temp 14066 non-null float64\n",
" 11 atemp 14076 non-null float64\n",
" 12 hum 14070 non-null float64\n",
" 13 windspeed 14082 non-null float64\n",
" 14 casual 14071 non-null float64\n",
" 15 registered 14090 non-null float64\n",
" 16 cnt 14079 non-null float64\n",
"dtypes: float64(16), object(1)\n",
"memory usage: 2.1+ MB\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "tfiBN0w4_Gj1",
"colab_type": "text"
},
"source": [
"Agora podemos ver que o tipo da coluna \"season\" foi mudada corretamente para category"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "0h4XHz3onqRa",
"colab_type": "text"
},
"source": [
"#### **Transforme a coluna \"dteday\" no tipo \"datetime\", utilizando o dataset limpo de valores nulos. Qual é a última data presente no dataset(YYYY-MM-DD)?**"
]
},
{
"cell_type": "code",
"metadata": {
"id": "tO38Ch2Bo0Lw",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 35
},
"outputId": "4a43bda8-7ce9-4790-e4a3-2fc82deffc63"
},
"source": [
"type(df_clean.dteday) # confirmando o tipo de dado na coluna"
],
"execution_count": 14,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"pandas.core.series.Series"
]
},
"metadata": {
"tags": []
},
"execution_count": 14
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "NHbgkNYFraDL",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 121
},
"outputId": "f757ddce-2bcc-43be-ae3b-a717dda4cee6"
},
"source": [
"# converter os tipos de dados da coluna\n",
"#df_clean['dteday']=pd.to_datetime(df_clean.loc[:,'dteday'],format=\"%Y-%m-%d\")\n",
"\n",
"df_clean['dteday'] = pd.to_datetime(df_clean['dteday'], format=\"%Y-%m-%d\")\n",
"#pd.to_datetime(df_clean['dteday'],format=\"%Y-%m-%d\")"
],
"execution_count": 15,
"outputs": [
{
"output_type": "stream",
"text": [
"/usr/local/lib/python3.6/dist-packages/ipykernel_launcher.py:4: SettingWithCopyWarning: \n",
"A value is trying to be set on a copy of a slice from a DataFrame.\n",
"Try using .loc[row_indexer,col_indexer] = value instead\n",
"\n",
"See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
" after removing the cwd from sys.path.\n"
],
"name": "stderr"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "jslxtECx_QmT",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 433
},
"outputId": "55acfe92-b181-4116-e9df-80cfd6c40fc4"
},
"source": [
"# confirmando a mudança\n",
"df_clean.info()"
],
"execution_count": 16,
"outputs": [
{
"output_type": "stream",
"text": [
"<class 'pandas.core.frame.DataFrame'>\n",
"Int64Index: 15641 entries, 1 to 17378\n",
"Data columns (total 17 columns):\n",
" # Column Non-Null Count Dtype \n",
"--- ------ -------------- ----- \n",
" 0 instant 14060 non-null float64 \n",
" 1 dteday 15641 non-null datetime64[ns]\n",
" 2 season 14061 non-null float64 \n",
" 3 yr 14076 non-null float64 \n",
" 4 mnth 14062 non-null float64 \n",
" 5 hr 14068 non-null float64 \n",
" 6 holiday 14076 non-null float64 \n",
" 7 weekday 14078 non-null float64 \n",
" 8 workingday 14097 non-null float64 \n",
" 9 weathersit 14078 non-null float64 \n",
" 10 temp 14066 non-null float64 \n",
" 11 atemp 14076 non-null float64 \n",
" 12 hum 14070 non-null float64 \n",
" 13 windspeed 14082 non-null float64 \n",
" 14 casual 14071 non-null float64 \n",
" 15 registered 14090 non-null float64 \n",
" 16 cnt 14079 non-null float64 \n",
"dtypes: datetime64[ns](1), float64(16)\n",
"memory usage: 2.1 MB\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "lbwVi587kXm9",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 35
},
"outputId": "b6aa8a2a-3edb-4fa3-b474-153b64190d85"
},
"source": [
"print(\"Última Data:\\t{}\".format(df_clean['dteday'].iloc[-1]))"
],
"execution_count": 17,
"outputs": [
{
"output_type": "stream",
"text": [
"Última Data:\t2012-12-31 00:00:00\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "mFG_TwV6sgre",
"colab_type": "text"
},
"source": [
"#### **Após a retirada das linhas que continham valores nulos para a coluna \"dteday\". Considerando o boxplot da variável \"windspeed\"**"
]
},
{
"cell_type": "code",
"metadata": {
"id": "fnoTVSqOxnah",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 265
},
"outputId": "29a4b07a-27a0-4f74-cad2-510f518d28b8"
},
"source": [
"df_clean.boxplot(['windspeed']);"
],
"execution_count": 18,
"outputs": [
{
"output_type": "display_data",
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"tags": [],
"needs_background": "light"
}
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "YQawPmsHyrT7",
"colab_type": "text"
},
"source": [
"#### **Considere o dataset após a retirada das linhas que continham valores nulos para a coluna \"dteday\". Selecione as colunas \"season\", \"temp\", \"atemp\", \"hum\", \"windspeed\". Plot a matriz de correlação.**"
]
},
{
"cell_type": "code",
"metadata": {
"id": "03W4mXey1jKt",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 367
},
"outputId": "94792de2-fa85-4016-8f4b-4ef96fddb551"
},
"source": [
"# criar um novo dataframe com as colunas pedidas\n",
"df_correlacao = df_clean[['season','temp','atemp','hum','windspeed','cnt']]\n",
"\n",
"matriz_corr = df_correlacao.corr() # cria a matriz de correlação\n",
"\n",
"import seaborn as sn\n",
"\n",
"#plotar a matriz\n",
"plt.figure(figsize=(6,6))\n",
"sn.heatmap(matriz_corr,annot=True,vmin=-1,vmax=1,center=0,cmap='RdBu',fmt='.2f',square=True,linecolor='white');"
],
"execution_count": 19,
"outputs": [
{
"output_type": "display_data",
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x432 with 2 Axes>"
]
},
"metadata": {
"tags": [],
"needs_background": "light"
}
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "LYaTnaYSC7bP",
"colab_type": "text"
},
"source": [
"#### **Preencha os valores nulos das colunas \"hum\",\"cnt\" e \"casual\" com os valores médios. Utilize as variáveis \"hum\" e \"casual\" como independentes e a \"cnt\" como dependente. Aplique uma regressão linear. Qual o valor de R2? Utilize as entradas como teste.**"
]
},
{
"cell_type": "code",
"metadata": {
"id": "S37QP3fjDwuC",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 104
},
"outputId": "b02ef9c3-35c2-44b3-b8e4-c837db32a62d"
},
"source": [
"#substituir os valores nulos pela média\n",
"df_clean.loc[:,'hum'].fillna(df_clean.loc[:,'hum'].mean(), inplace=True)\n",
"df_clean.loc[:,'cnt'].fillna(df_clean.loc[:,'cnt'].mean(), inplace=True)\n",
"df_clean.loc[:,'casual'].fillna(df_clean.loc[:,'casual'].mean(), inplace=True)"
],
"execution_count": 20,
"outputs": [
{
"output_type": "stream",
"text": [
"/usr/local/lib/python3.6/dist-packages/pandas/core/generic.py:6245: SettingWithCopyWarning: \n",
"A value is trying to be set on a copy of a slice from a DataFrame\n",
"\n",
"See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
" self._update_inplace(new_data)\n"
],
"name": "stderr"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "JZkS6g3rIKUw",
"colab_type": "code",
"colab": {}
},
"source": [
"# realizando a análise da regressão\n",
"x1 = df_clean['hum'].values #variável independente\n",
"x2 = df_clean['casual'].values #variavel independente\n",
"y = df_clean['cnt'].values # variável dependente"
],
"execution_count": 21,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "2S7jSChDJu-i",
"colab_type": "code",
"colab": {}
},
"source": [
"x1_reshaped = x1.reshape(-1,1) # coloca os dados em 2D\n",
"x2_reshaped = x2.reshape(-1,1) # coloca os dados em 2D\n",
"\n",
"x = np.column_stack((x1_reshaped,x2_reshaped)) # agrupa as variaveis preditoras"
],
"execution_count": 22,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "WYl0tw-6GM-S",
"colab_type": "code",
"colab": {}
},
"source": [
"# importar o modelo de regressão linear univariada\n",
"from sklearn.linear_model import LinearRegression"
],
"execution_count": 23,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "W_6cn8EBIp6e",
"colab_type": "code",
"colab": {}
},
"source": [
"# realiza a construção do modelo de regressão\n",
"reg = LinearRegression()\n",
"regressao = reg.fit (x, y) # encontra ps coeficientes"
],
"execution_count": 24,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "ktfukC6uI_9X",
"colab_type": "code",
"colab": {}
},
"source": [
"# realiza a previsão\n",
"previsao = reg.predict(x)"
],
"execution_count": 25,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "upv8JVIpKWI4",
"colab_type": "code",
"colab": {}
},
"source": [
"# análise do modelo\n",
"from sklearn.metrics import r2_score"
],
"execution_count": 26,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "Isu6PtxBKb7I",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 52
},
"outputId": "f5b330a6-79c5-4bb0-a9c1-918f7ffd7ab5"
},
"source": [
"# parâmetros encontrados\n",
"print('Y = {}X {}'.format(reg.coef_, reg.intercept_))\n",
"\n",
"R_2 = r2_score(y, previsao) #calcula R2\n",
"\n",
"print(\"Coeficiente de Determinação (R2):\", (round(R_2,3)))"
],
"execution_count": 27,
"outputs": [
{
"output_type": "stream",
"text": [
"Y = [-99.75012328 2.21512197]X 173.29337505135362\n",
"Coeficiente de Determinação (R2): 0.406\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "lSC2dkkcKur6",
"colab_type": "text"
},
"source": [
"#### **Utilize os mesmos dados da questão anterior (\"hum\" e \"casual\" como variáveis independentes e \"cnt\" como variavel dependente). Aplique a árvore de decisão como regressão. Qual é o valor aproximado de R2? Utilize as entradas como teste e valores \"default\".**"
]
},
{
"cell_type": "code",
"metadata": {
"id": "9DSgZLaZusIv",
"colab_type": "code",
"colab": {}
},
"source": [
"from sklearn.preprocessing import MinMaxScaler\n",
"scaler = MinMaxScaler()\n",
"scaled_df = scaler.fit_transform(x)"
],
"execution_count": 28,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "iRkOpQQC64EB",
"colab_type": "code",
"colab": {}
},
"source": [
"from sklearn.tree import DecisionTreeRegressor # importar a árvore de decisão como regressor"
],
"execution_count": 29,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "PDY6zrJlBtrt",
"colab_type": "code",
"colab": {}
},
"source": [
"entrada_arvore = scaled_df[:,1].reshape(-1,1) # entrada para a regressão via árvore\n",
"saida_arvore = scaled_df[:,1].reshape(-1,1) # saída para a regressão via árvore"
],
"execution_count": 30,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "bVtnNeIZFHvG",
"colab_type": "code",
"colab": {}
},
"source": [
"x_train, x_teste, y_train, y_test = train_test_split(x, y)"
],
"execution_count": 31,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "CaEwRj9ma6ZU",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 121
},
"outputId": "d1f91468-8515-4b75-8a14-a23751391938"
},
"source": [
"arvore_regressora = DecisionTreeRegressor() # define o objeto para a árvore\n",
"arvore_regressora.fit(x, y) # aplica a regressao"
],
"execution_count": 32,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"DecisionTreeRegressor(ccp_alpha=0.0, criterion='mse', max_depth=None,\n",
" max_features=None, max_leaf_nodes=None,\n",
" min_impurity_decrease=0.0, min_impurity_split=None,\n",
" min_samples_leaf=1, min_samples_split=2,\n",
" min_weight_fraction_leaf=0.0, presort='deprecated',\n",
" random_state=None, splitter='best')"
]
},
"metadata": {
"tags": []
},
"execution_count": 32
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "iVBhwn4fb1r3",
"colab_type": "code",
"colab": {}
},
"source": [
"# realiza a previsao\n",
"previsao_arvore = arvore_regressora.predict(x)"
],
"execution_count": 33,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "7ALblwSSb-VR",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 52
},
"outputId": "2ded5eb4-f91c-4a05-f6c4-071f7b4590ac"
},
"source": [
"print(\"Erro Absoluto:\", metrics.mean_absolute_error(y, previsao_arvore))\n",
"print(\"Mean Squared Error:\", metrics.mean_squared_error(y, previsao_arvore))"
],
"execution_count": 34,
"outputs": [
{
"output_type": "stream",
"text": [
"Erro Absoluto: 58.54911405435064\n",
"Mean Squared Error: 8577.336772824097\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "se95etwAcmAY",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 35
},
"outputId": "e81dc8c9-5f4a-4806-bcbd-70f216058ee8"
},
"source": [
"R_2_a = r2_score(y, previsao_arvore) #calcula R2\n",
"\n",
"print(\"Coeficiente de Determinação (R2):\", (R_2_a))"
],
"execution_count": 35,
"outputs": [
{
"output_type": "stream",
"text": [
"Coeficiente de Determinação (R2): 0.7098339715834964\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "CDytk1AOjg0F",
"colab_type": "text"
},
"source": [
"#### **Qual *insight* podemos encontrar comparando os valores de R2 encontrado com a regressão linear e com a árvore de decisão?**"
]
},
{
"cell_type": "code",
"metadata": {
"id": "6IGzsSd4kFZu",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 52
},
"outputId": "7cb5d7b7-4099-4b8b-9e2d-e00a297e115f"
},
"source": [
"print(\"Coeficiente de Determinação (R2) - Regressão:\", R_2)\n",
"print(\"Coeficiente de Determinação (R2) - Árvore de Decisão:\", R_2_a)"
],
"execution_count": 36,
"outputs": [
{
"output_type": "stream",
"text": [
"Coeficiente de Determinação (R2) - Regressão: 0.4059859251122173\n",
"Coeficiente de Determinação (R2) - Árvore de Decisão: 0.7098339715834964\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "3dy_DHeOsVCb",
"colab_type": "text"
},
"source": [
"Comparando os dois resultandos, podemos chega à conclusão que o valor encontrado pela Árvore de Decisão possui maior valor, se aproximando mais de 1."
]
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment