{
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "SFKpZAp1Bsrm"
      },
      "source": [
        "Pontificia Universidad Católica de Chile <br>\n",
        "Departamento de Ciencia de la Computación <br>\n",
        "IIC2613 - Inteligencia Artificial <br>\n",
        "<br>\n",
        "\n",
        "---\n",
        "<center>\n",
        "    <h1> Ayudantía 7: Intro a ML, uso de pandas, numpy, y sklearn </h1>\n",
        "    <h3>\n",
        "        Ayudantes: Bernardita Alliende y Celeste Vargas<br>\n",
        "        Primer Semestre 2025<br>    \n",
        "        12 de mayo de 2025\n",
        "    </h3>\n",
        "    <br>\n",
        "</center>\n",
        "\n",
        "<br>\n",
        "\n",
        "---\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "ihvQd6N5q0Pe"
      },
      "source": [
        "### 1 Importar las librerías necesarias"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "PT8GG144tz8P"
      },
      "outputs": [],
      "source": [
        "# Liberías para manejar los datos\n",
        "import pandas as pd\n",
        "import seaborn as sns # librería para obtener el conjunto de datos que usaremos\n",
        "from sklearn.model_selection import train_test_split\n",
        "\n",
        "# Libería para graficar\n",
        "import matplotlib.pyplot as plt\n",
        "\n",
        "# Libería para calcular las métricas de los modelos\n",
        "from sklearn.metrics import classification_report, accuracy_score\n",
        "\n",
        "# Libería para obtener la matriz de confusión\n",
        "from sklearn.metrics import confusion_matrix\n",
        "\n",
        "# Librería para usar KNN\n",
        "from sklearn.neighbors import KNeighborsClassifier"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "gMFnBO8uuVU7"
      },
      "source": [
        "### 2 Cargar el conjunto de datos"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "KO8eFBW-6j4J"
      },
      "source": [
        "Vamos a usar un dataset que viene precargado en la librería sns. Este es un buen conjunto de datos para hacer pruebas rápidas."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 206
        },
        "id": "BdHIx_bOt5xP",
        "outputId": "d91b82c7-255a-41ae-c01e-ccd73438691f"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "   survived  pclass     sex   age  sibsp  parch     fare embarked  class  \\\n",
              "0         0       3    male  22.0      1      0   7.2500        S  Third   \n",
              "1         1       1  female  38.0      1      0  71.2833        C  First   \n",
              "2         1       3  female  26.0      0      0   7.9250        S  Third   \n",
              "3         1       1  female  35.0      1      0  53.1000        S  First   \n",
              "4         0       3    male  35.0      0      0   8.0500        S  Third   \n",
              "\n",
              "     who  adult_male deck  embark_town alive  alone  \n",
              "0    man        True  NaN  Southampton    no  False  \n",
              "1  woman       False    C    Cherbourg   yes  False  \n",
              "2  woman       False  NaN  Southampton   yes   True  \n",
              "3  woman       False    C  Southampton   yes  False  \n",
              "4    man        True  NaN  Southampton    no   True  "
            ],
            "text/html": [
              "\n",
              "  <div id=\"df-6b30ef1a-1870-4443-8e05-6535c931878b\" class=\"colab-df-container\">\n",
              "    <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>survived</th>\n",
              "      <th>pclass</th>\n",
              "      <th>sex</th>\n",
              "      <th>age</th>\n",
              "      <th>sibsp</th>\n",
              "      <th>parch</th>\n",
              "      <th>fare</th>\n",
              "      <th>embarked</th>\n",
              "      <th>class</th>\n",
              "      <th>who</th>\n",
              "      <th>adult_male</th>\n",
              "      <th>deck</th>\n",
              "      <th>embark_town</th>\n",
              "      <th>alive</th>\n",
              "      <th>alone</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>0</th>\n",
              "      <td>0</td>\n",
              "      <td>3</td>\n",
              "      <td>male</td>\n",
              "      <td>22.0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>7.2500</td>\n",
              "      <td>S</td>\n",
              "      <td>Third</td>\n",
              "      <td>man</td>\n",
              "      <td>True</td>\n",
              "      <td>NaN</td>\n",
              "      <td>Southampton</td>\n",
              "      <td>no</td>\n",
              "      <td>False</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1</th>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>female</td>\n",
              "      <td>38.0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>71.2833</td>\n",
              "      <td>C</td>\n",
              "      <td>First</td>\n",
              "      <td>woman</td>\n",
              "      <td>False</td>\n",
              "      <td>C</td>\n",
              "      <td>Cherbourg</td>\n",
              "      <td>yes</td>\n",
              "      <td>False</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2</th>\n",
              "      <td>1</td>\n",
              "      <td>3</td>\n",
              "      <td>female</td>\n",
              "      <td>26.0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>7.9250</td>\n",
              "      <td>S</td>\n",
              "      <td>Third</td>\n",
              "      <td>woman</td>\n",
              "      <td>False</td>\n",
              "      <td>NaN</td>\n",
              "      <td>Southampton</td>\n",
              "      <td>yes</td>\n",
              "      <td>True</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>3</th>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>female</td>\n",
              "      <td>35.0</td>\n",
              "      <td>1</td>\n",
              "      <td>0</td>\n",
              "      <td>53.1000</td>\n",
              "      <td>S</td>\n",
              "      <td>First</td>\n",
              "      <td>woman</td>\n",
              "      <td>False</td>\n",
              "      <td>C</td>\n",
              "      <td>Southampton</td>\n",
              "      <td>yes</td>\n",
              "      <td>False</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>4</th>\n",
              "      <td>0</td>\n",
              "      <td>3</td>\n",
              "      <td>male</td>\n",
              "      <td>35.0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>8.0500</td>\n",
              "      <td>S</td>\n",
              "      <td>Third</td>\n",
              "      <td>man</td>\n",
              "      <td>True</td>\n",
              "      <td>NaN</td>\n",
              "      <td>Southampton</td>\n",
              "      <td>no</td>\n",
              "      <td>True</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "</div>\n",
              "    <div class=\"colab-df-buttons\">\n",
              "\n",
              "  <div class=\"colab-df-container\">\n",
              "    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-6b30ef1a-1870-4443-8e05-6535c931878b')\"\n",
              "            title=\"Convert this dataframe to an interactive table.\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n",
              "    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n",
              "  </svg>\n",
              "    </button>\n",
              "\n",
              "  <style>\n",
              "    .colab-df-container {\n",
              "      display:flex;\n",
              "      gap: 12px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert {\n",
              "      background-color: #E8F0FE;\n",
              "      border: none;\n",
              "      border-radius: 50%;\n",
              "      cursor: pointer;\n",
              "      display: none;\n",
              "      fill: #1967D2;\n",
              "      height: 32px;\n",
              "      padding: 0 0 0 0;\n",
              "      width: 32px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert:hover {\n",
              "      background-color: #E2EBFA;\n",
              "      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "      fill: #174EA6;\n",
              "    }\n",
              "\n",
              "    .colab-df-buttons div {\n",
              "      margin-bottom: 4px;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert {\n",
              "      background-color: #3B4455;\n",
              "      fill: #D2E3FC;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert:hover {\n",
              "      background-color: #434B5C;\n",
              "      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
              "      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
              "      fill: #FFFFFF;\n",
              "    }\n",
              "  </style>\n",
              "\n",
              "    <script>\n",
              "      const buttonEl =\n",
              "        document.querySelector('#df-6b30ef1a-1870-4443-8e05-6535c931878b button.colab-df-convert');\n",
              "      buttonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "\n",
              "      async function convertToInteractive(key) {\n",
              "        const element = document.querySelector('#df-6b30ef1a-1870-4443-8e05-6535c931878b');\n",
              "        const dataTable =\n",
              "          await google.colab.kernel.invokeFunction('convertToInteractive',\n",
              "                                                    [key], {});\n",
              "        if (!dataTable) return;\n",
              "\n",
              "        const docLinkHtml = 'Like what you see? Visit the ' +\n",
              "          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
              "          + ' to learn more about interactive tables.';\n",
              "        element.innerHTML = '';\n",
              "        dataTable['output_type'] = 'display_data';\n",
              "        await google.colab.output.renderOutput(dataTable, element);\n",
              "        const docLink = document.createElement('div');\n",
              "        docLink.innerHTML = docLinkHtml;\n",
              "        element.appendChild(docLink);\n",
              "      }\n",
              "    </script>\n",
              "  </div>\n",
              "\n",
              "\n",
              "    <div id=\"df-7482bb89-0700-4623-9f27-9dbe72a05d3a\">\n",
              "      <button class=\"colab-df-quickchart\" onclick=\"quickchart('df-7482bb89-0700-4623-9f27-9dbe72a05d3a')\"\n",
              "                title=\"Suggest charts\"\n",
              "                style=\"display:none;\">\n",
              "\n",
              "<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
              "     width=\"24px\">\n",
              "    <g>\n",
              "        <path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z\"/>\n",
              "    </g>\n",
              "</svg>\n",
              "      </button>\n",
              "\n",
              "<style>\n",
              "  .colab-df-quickchart {\n",
              "      --bg-color: #E8F0FE;\n",
              "      --fill-color: #1967D2;\n",
              "      --hover-bg-color: #E2EBFA;\n",
              "      --hover-fill-color: #174EA6;\n",
              "      --disabled-fill-color: #AAA;\n",
              "      --disabled-bg-color: #DDD;\n",
              "  }\n",
              "\n",
              "  [theme=dark] .colab-df-quickchart {\n",
              "      --bg-color: #3B4455;\n",
              "      --fill-color: #D2E3FC;\n",
              "      --hover-bg-color: #434B5C;\n",
              "      --hover-fill-color: #FFFFFF;\n",
              "      --disabled-bg-color: #3B4455;\n",
              "      --disabled-fill-color: #666;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart {\n",
              "    background-color: var(--bg-color);\n",
              "    border: none;\n",
              "    border-radius: 50%;\n",
              "    cursor: pointer;\n",
              "    display: none;\n",
              "    fill: var(--fill-color);\n",
              "    height: 32px;\n",
              "    padding: 0;\n",
              "    width: 32px;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart:hover {\n",
              "    background-color: var(--hover-bg-color);\n",
              "    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "    fill: var(--button-hover-fill-color);\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart-complete:disabled,\n",
              "  .colab-df-quickchart-complete:disabled:hover {\n",
              "    background-color: var(--disabled-bg-color);\n",
              "    fill: var(--disabled-fill-color);\n",
              "    box-shadow: none;\n",
              "  }\n",
              "\n",
              "  .colab-df-spinner {\n",
              "    border: 2px solid var(--fill-color);\n",
              "    border-color: transparent;\n",
              "    border-bottom-color: var(--fill-color);\n",
              "    animation:\n",
              "      spin 1s steps(1) infinite;\n",
              "  }\n",
              "\n",
              "  @keyframes spin {\n",
              "    0% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "      border-left-color: var(--fill-color);\n",
              "    }\n",
              "    20% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    30% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    40% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    60% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    80% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "    90% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "  }\n",
              "</style>\n",
              "\n",
              "      <script>\n",
              "        async function quickchart(key) {\n",
              "          const quickchartButtonEl =\n",
              "            document.querySelector('#' + key + ' button');\n",
              "          quickchartButtonEl.disabled = true;  // To prevent multiple clicks.\n",
              "          quickchartButtonEl.classList.add('colab-df-spinner');\n",
              "          try {\n",
              "            const charts = await google.colab.kernel.invokeFunction(\n",
              "                'suggestCharts', [key], {});\n",
              "          } catch (error) {\n",
              "            console.error('Error during call to suggestCharts:', error);\n",
              "          }\n",
              "          quickchartButtonEl.classList.remove('colab-df-spinner');\n",
              "          quickchartButtonEl.classList.add('colab-df-quickchart-complete');\n",
              "        }\n",
              "        (() => {\n",
              "          let quickchartButtonEl =\n",
              "            document.querySelector('#df-7482bb89-0700-4623-9f27-9dbe72a05d3a button');\n",
              "          quickchartButtonEl.style.display =\n",
              "            google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "        })();\n",
              "      </script>\n",
              "    </div>\n",
              "\n",
              "    </div>\n",
              "  </div>\n"
            ],
            "application/vnd.google.colaboratory.intrinsic+json": {
              "type": "dataframe",
              "variable_name": "titanic",
              "summary": "{\n  \"name\": \"titanic\",\n  \"rows\": 891,\n  \"fields\": [\n    {\n      \"column\": \"survived\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0,\n        \"min\": 0,\n        \"max\": 1,\n        \"num_unique_values\": 2,\n        \"samples\": [\n          1,\n          0\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"pclass\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0,\n        \"min\": 1,\n        \"max\": 3,\n        \"num_unique_values\": 3,\n        \"samples\": [\n          3,\n          1\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"sex\",\n      \"properties\": {\n        \"dtype\": \"category\",\n        \"num_unique_values\": 2,\n        \"samples\": [\n          \"female\",\n          \"male\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"age\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 14.526497332334044,\n        \"min\": 0.42,\n        \"max\": 80.0,\n        \"num_unique_values\": 88,\n        \"samples\": [\n          0.75,\n          22.0\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"sibsp\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 1,\n        \"min\": 0,\n        \"max\": 8,\n        \"num_unique_values\": 7,\n        \"samples\": [\n          1,\n          0\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"parch\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0,\n        \"min\": 0,\n        \"max\": 6,\n        \"num_unique_values\": 7,\n        \"samples\": [\n          0,\n          1\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"fare\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 49.693428597180905,\n        \"min\": 0.0,\n        \"max\": 512.3292,\n        \"num_unique_values\": 248,\n        \"samples\": [\n          11.2417,\n          51.8625\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"embarked\",\n      \"properties\": {\n        \"dtype\": \"category\",\n        \"num_unique_values\": 3,\n        \"samples\": [\n          \"S\",\n          \"C\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"class\",\n      \"properties\": {\n        \"dtype\": \"category\",\n        \"num_unique_values\": 3,\n        \"samples\": [\n          \"Third\",\n          \"First\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"who\",\n      \"properties\": {\n        \"dtype\": \"category\",\n        \"num_unique_values\": 3,\n        \"samples\": [\n          \"man\",\n          \"woman\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"adult_male\",\n      \"properties\": {\n        \"dtype\": \"boolean\",\n        \"num_unique_values\": 2,\n        \"samples\": [\n          false,\n          true\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"deck\",\n      \"properties\": {\n        \"dtype\": \"category\",\n        \"num_unique_values\": 7,\n        \"samples\": [\n          \"C\",\n          \"E\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"embark_town\",\n      \"properties\": {\n        \"dtype\": \"category\",\n        \"num_unique_values\": 3,\n        \"samples\": [\n          \"Southampton\",\n          \"Cherbourg\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"alive\",\n      \"properties\": {\n        \"dtype\": \"category\",\n        \"num_unique_values\": 2,\n        \"samples\": [\n          \"yes\",\n          \"no\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"alone\",\n      \"properties\": {\n        \"dtype\": \"boolean\",\n        \"num_unique_values\": 2,\n        \"samples\": [\n          true,\n          false\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    }\n  ]\n}"
            }
          },
          "metadata": {},
          "execution_count": 2
        }
      ],
      "source": [
        "titanic = sns.load_dataset('titanic') # la función load_dataset viene en la librería sns\n",
        "titanic.head()"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "pP8Afh6cudF8"
      },
      "source": [
        "### 3 Preprocesamiento de los datos"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "QXeUugKFuNyL",
        "outputId": "1ce139f2-832d-445a-9ff2-ca21db79d143",
        "colab": {
          "base_uri": "https://localhost:8080/"
        }
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "<ipython-input-3-e31c8abbb483>:2: FutureWarning: A value is trying to be set on a copy of a DataFrame or Series through chained assignment using an inplace method.\n",
            "The behavior will change in pandas 3.0. This inplace method will never work because the intermediate object on which we are setting values always behaves as a copy.\n",
            "\n",
            "For example, when doing 'df[col].method(value, inplace=True)', try using 'df.method({col: value}, inplace=True)' or df[col] = df[col].method(value) instead, to perform the operation inplace on the original object.\n",
            "\n",
            "\n",
            "  titanic['age'].fillna(titanic['age'].median(), inplace=True) # .fillna es una función de pandas\n",
            "<ipython-input-3-e31c8abbb483>:3: FutureWarning: A value is trying to be set on a copy of a DataFrame or Series through chained assignment using an inplace method.\n",
            "The behavior will change in pandas 3.0. This inplace method will never work because the intermediate object on which we are setting values always behaves as a copy.\n",
            "\n",
            "For example, when doing 'df[col].method(value, inplace=True)', try using 'df.method({col: value}, inplace=True)' or df[col] = df[col].method(value) instead, to perform the operation inplace on the original object.\n",
            "\n",
            "\n",
            "  titanic['embarked'].fillna(titanic['embarked'].mode()[0], inplace=True)\n"
          ]
        }
      ],
      "source": [
        "# Imputar valores faltantes\n",
        "titanic['age'].fillna(titanic['age'].median(), inplace=True) # .fillna es una función de pandas\n",
        "titanic['embarked'].fillna(titanic['embarked'].mode()[0], inplace=True)\n",
        "\n",
        "# Codificar variables categóricas\n",
        "titanic['sex'] = titanic['sex'].map({'male': 0, 'female': 1}) # re escribimos la columna sex\n",
        "titanic['embarked'] = titanic['embarked'].map({'C': 0, 'Q': 1, 'S': 2}) # las letras son la inicial de la ciudad de embarque\n",
        "\n",
        "# Seleccionar características y la variable objetivo\n",
        "features = ['pclass', 'sex', 'age', 'sibsp', 'parch', 'fare', 'embarked']\n",
        "target = 'survived' # queremos predecir si sobrevivirán\n",
        "\n",
        "X = titanic[features]\n",
        "y = titanic[target]\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "1YMU6lXaxr62"
      },
      "source": [
        "Por último, dividimos los datos en los sets de Train y Tets. En este ejemplo no usaremos el set de validación."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "b7aeiWfJxrXM"
      },
      "outputs": [],
      "source": [
        "# Dividir el conjunto de datos en entrenamiento y prueba\n",
        "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # train_test_split es una función de sklearn para dividir el set de datos en el conjunto de entranamiento y el conjunto de prueba"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "0SXTV42jvQCK"
      },
      "source": [
        "### 4 Clasificación con KNN"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 638
        },
        "id": "ONJAYtQJvUK5",
        "outputId": "5c6e8e6f-a955-4486-b543-8dc382f1ecdf"
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Accuracy: 0.6983240223463687\n",
            "Classification Report:\n",
            "               precision    recall  f1-score   support\n",
            "\n",
            "           0       0.73      0.78      0.75       105\n",
            "           1       0.65      0.58      0.61        74\n",
            "\n",
            "    accuracy                           0.70       179\n",
            "   macro avg       0.69      0.68      0.68       179\n",
            "weighted avg       0.70      0.70      0.70       179\n",
            "\n"
          ]
        },
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "<Axes: >"
            ]
          },
          "metadata": {},
          "execution_count": 5
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 640x480 with 2 Axes>"
            ],
            "image/png": "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\n"
          },
          "metadata": {}
        }
      ],
      "source": [
        "# Primero instanciamos al clasificador\n",
        "model = KNeighborsClassifier(n_neighbors=1)\n",
        "\n",
        "# \"Entrenamos\" al clasificador\n",
        "model.fit(X_train, y_train)\n",
        "\n",
        "# Obtenemos las predicciones\n",
        "y_pred = model.predict(X_test)\n",
        "\n",
        "\n",
        "# Evaluación, las funciones accuracy_score y classification_report son parte de sklearn\n",
        "print(\"Accuracy:\", accuracy_score(y_test, y_pred))\n",
        "print(\"Classification Report:\\n\", classification_report(y_test, y_pred))\n",
        "\n",
        "# Mostramos la matriz de confusión\n",
        "cf_matrix = confusion_matrix(y_test, y_pred)\n",
        "sns.heatmap(cf_matrix, annot=True)\n",
        "# recordando que la variable a predecir es sobrevive o no y toma los valores 1 ó 0 respectivamente."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "uQ0kWsHnCQKu"
      },
      "source": [
        "Las filas corresponden a las clases reales, y las columnas corresponden a las clases predichas. ¿Qué representaría el cuadrante (0,1)? ¿Y el (0,0)?"
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "|                        | **Predicción: No Sobrevive (0)** | **Predicción: Sobrevive (1)** |\n",
        "|------------------------|----------------------------------|-------------------------------|\n",
        "| **Real: No Sobrevive (0)** | TN (True Negative)            | FP (False Positive)           |\n",
        "| **Real: Sobrevive (1)**    | FN (False Negative)           | TP (True Positive)            |"
      ],
      "metadata": {
        "id": "3if9Js9HxBaz"
      }
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "JoNdzbohyV6Z"
      },
      "source": [
        "Probemos con otros número de vecinos"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "uLiUsQhFyYjI",
        "outputId": "7ebdab6a-99f7-4dfe-9063-26d3fbd887ea"
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Accuracy usando 1 vecinos: 0.6983240223463687\n",
            "Accuracy usando 3 vecinos: 0.7150837988826816\n",
            "Accuracy usando 4 vecinos: 0.7262569832402235\n",
            "Accuracy usando 5 vecinos: 0.7039106145251397\n",
            "Accuracy usando 7 vecinos: 0.7262569832402235\n",
            "Accuracy usando 9 vecinos: 0.7206703910614525\n",
            "Accuracy usando 11 vecinos: 0.7374301675977654\n",
            "Accuracy usando 15 vecinos: 0.7262569832402235\n"
          ]
        }
      ],
      "source": [
        "number_of_n_neighbors = [1, 3, 4, 5, 7, 9, 11, 15]\n",
        "\n",
        "for n_neighbors in number_of_n_neighbors:\n",
        "  # Primero instanciamos al clasificador\n",
        "  neigh = KNeighborsClassifier(n_neighbors=n_neighbors)\n",
        "\n",
        "  # \"Entrenamos\" al clasificador\n",
        "  neigh.fit(X_train, y_train)\n",
        "\n",
        "  # Obtenemos las predicciones\n",
        "  y_pred = neigh.predict(X_test)\n",
        "\n",
        "  # Evaluación, las funciones accuracy_score y classification_report son parte de sklearn\n",
        "  print(f\"Accuracy usando {n_neighbors} vecinos:\", accuracy_score(y_test, y_pred))\n",
        "  # recordando que la variable a predecir es sobrevive o no y toma los valores 1 ó 0 respectivamente."
      ]
    },
    {
      "cell_type": "code",
      "source": [],
      "metadata": {
        "id": "-SEO-pNHxdbK"
      },
      "execution_count": null,
      "outputs": []
    }
  ],
  "metadata": {
    "colab": {
      "provenance": []
    },
    "kernelspec": {
      "display_name": "Python 3",
      "name": "python3"
    },
    "language_info": {
      "name": "python"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 0
}