{
  "nbformat": 4,
  "nbformat_minor": 0,
  "metadata": {
    "colab": {
      "provenance": []
    },
    "kernelspec": {
      "name": "python3",
      "display_name": "Python 3"
    },
    "language_info": {
      "name": "python"
    }
  },
  "cells": [
    {
      "cell_type": "markdown",
      "source": [
        "## 1. Carga del dataset\n",
        "\n",
        "En esta práctica se trabajará con el dataset **Titanic**, orientado a un problema de **clasificación binaria**.\n",
        "\n",
        "La variable objetivo será `Survived`, que indica si el pasajero sobrevivió (`1`) o no (`0`).\n",
        "\n",
        "En este primer apartado se cargará el dataset y se mostrará una primera vista general de su contenido."
      ],
      "metadata": {
        "id": "TJU3YXbJhITf"
      }
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 205
        },
        "id": "FVn0TArdf7TZ",
        "outputId": "5257722b-c6d6-41d9-f2bc-c70aa590807c"
      },
      "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-eaa3ab62-797e-419e-b9d2-249aa1cd1028\" 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-eaa3ab62-797e-419e-b9d2-249aa1cd1028')\"\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-eaa3ab62-797e-419e-b9d2-249aa1cd1028 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-eaa3ab62-797e-419e-b9d2-249aa1cd1028');\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>\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": 15
        }
      ],
      "source": [
        "import pandas as pd\n",
        "import numpy as np\n",
        "import seaborn as sns\n",
        "import matplotlib.pyplot as plt\n",
        "\n",
        "titanic = sns.load_dataset('titanic')\n",
        "titanic.head()"
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "print(\"Dimensiones del dataset:\", titanic.shape)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "RsVtUUGghHX0",
        "outputId": "cafb57f7-8c49-4414-dcab-8272b4587e9b"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Dimensiones del dataset: (891, 15)\n"
          ]
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "### Variables del dataset Titanic\n",
        "\n",
        "El dataset **Titanic** contiene información sobre pasajeros del famoso transatlántico Titanic.  \n",
        "Cada fila representa a un pasajero y cada columna describe alguna característica personal, social o del viaje.\n",
        "\n",
        "- **survived**  \n",
        "  Indica si el pasajero sobrevivió o no al naufragio.\n",
        "\n",
        "  - `0` → no sobrevivió  \n",
        "  - `1` → sobrevivió\n",
        "\n",
        "  Esta será la **variable objetivo** en el problema de **clasificación binaria**.\n",
        "\n",
        "- **pclass**  \n",
        "  Clase del billete del pasajero.\n",
        "\n",
        "  - `1` → primera clase  \n",
        "  - `2` → segunda clase  \n",
        "  - `3` → tercera clase\n",
        "\n",
        "  Puede interpretarse como un indicador aproximado del nivel socioeconómico del pasajero.\n",
        "\n",
        "- **sex**  \n",
        "  Sexo del pasajero (`male` o `female`).\n",
        "\n",
        "- **age**  \n",
        "  Edad del pasajero en años.  \n",
        "  Puede contener valores faltantes.\n",
        "\n",
        "- **sibsp**  \n",
        "  Número de hermanos/as o cónyuges del pasajero que también viajaban a bordo del Titanic.\n",
        "\n",
        "- **parch**  \n",
        "  Número de padres, madres o hijos del pasajero que también viajaban a bordo.\n",
        "\n",
        "- **fare**  \n",
        "  Precio pagado por el billete.\n",
        "\n",
        "- **embarked**  \n",
        "  Puerto en el que embarcó el pasajero.\n",
        "\n",
        "  - `C` → Cherbourg  \n",
        "  - `Q` → Queenstown  \n",
        "  - `S` → Southampton\n",
        "\n",
        "- **class**  \n",
        "  Representación textual de la clase del pasajero (`First`, `Second`, `Third`).  \n",
        "  Contiene una información muy similar a la de `pclass`.\n",
        "\n",
        "- **who**  \n",
        "  Clasificación general del pasajero en categorías como `man`, `woman` o `child`.\n",
        "\n",
        "- **adult_male**  \n",
        "  Indica si el pasajero es un hombre adulto (`True` o `False`).\n",
        "\n",
        "- **deck**  \n",
        "  Cubierta del barco en la que se encontraba la cabina del pasajero.  \n",
        "  Suele contener bastantes valores faltantes.\n",
        "\n",
        "- **embark_town**  \n",
        "  Nombre completo de la ciudad o puerto de embarque.  \n",
        "  Contiene una información muy similar a la de `embarked`.\n",
        "\n",
        "- **alive**  \n",
        "  Representación textual de la supervivencia (`yes` o `no`).  \n",
        "  Contiene la misma información que `survived`, por lo que no debe utilizarse como variable predictora.\n",
        "\n",
        "- **alone**  \n",
        "  Indica si el pasajero viajaba solo (`True`) o acompañado (`False`)."
      ],
      "metadata": {
        "id": "GukqQbp0h6Z9"
      }
    },
    {
      "cell_type": "markdown",
      "source": [
        "## 2. Análisis exploratorio del dataset\n",
        "\n",
        "Antes de entrenar los modelos de clasificación, conviene realizar una inspección mínima del dataset para identificar qué aspectos deben tratarse en el preprocesado.\n",
        "\n",
        "En particular, interesa revisar:\n",
        "\n",
        "- tipos de variables\n",
        "- valores faltantes\n",
        "- variables categóricas\n",
        "- distribución de la variable objetivo\n",
        "\n",
        "Además, esta inspección también ayudará a decidir si algunas columnas deben eliminarse antes del entrenamiento."
      ],
      "metadata": {
        "id": "zemVfYuYjrrU"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "titanic.info()"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "FKRbaAwKhHZ-",
        "outputId": "265dd6d5-5354-41ac-f72a-db40b5c8e87f"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "<class 'pandas.core.frame.DataFrame'>\n",
            "RangeIndex: 891 entries, 0 to 890\n",
            "Data columns (total 15 columns):\n",
            " #   Column       Non-Null Count  Dtype   \n",
            "---  ------       --------------  -----   \n",
            " 0   survived     891 non-null    int64   \n",
            " 1   pclass       891 non-null    int64   \n",
            " 2   sex          891 non-null    object  \n",
            " 3   age          714 non-null    float64 \n",
            " 4   sibsp        891 non-null    int64   \n",
            " 5   parch        891 non-null    int64   \n",
            " 6   fare         891 non-null    float64 \n",
            " 7   embarked     889 non-null    object  \n",
            " 8   class        891 non-null    category\n",
            " 9   who          891 non-null    object  \n",
            " 10  adult_male   891 non-null    bool    \n",
            " 11  deck         203 non-null    category\n",
            " 12  embark_town  889 non-null    object  \n",
            " 13  alive        891 non-null    object  \n",
            " 14  alone        891 non-null    bool    \n",
            "dtypes: bool(2), category(2), float64(2), int64(4), object(5)\n",
            "memory usage: 80.7+ KB\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "titanic.isnull().sum()"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 550
        },
        "id": "H-bpG_57hHcE",
        "outputId": "c6d1f26b-0936-48f0-c62c-016d2b7156bc"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "survived         0\n",
              "pclass           0\n",
              "sex              0\n",
              "age            177\n",
              "sibsp            0\n",
              "parch            0\n",
              "fare             0\n",
              "embarked         2\n",
              "class            0\n",
              "who              0\n",
              "adult_male       0\n",
              "deck           688\n",
              "embark_town      2\n",
              "alive            0\n",
              "alone            0\n",
              "dtype: int64"
            ],
            "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>0</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>survived</th>\n",
              "      <td>0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>pclass</th>\n",
              "      <td>0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>sex</th>\n",
              "      <td>0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>age</th>\n",
              "      <td>177</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>sibsp</th>\n",
              "      <td>0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>parch</th>\n",
              "      <td>0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>fare</th>\n",
              "      <td>0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>embarked</th>\n",
              "      <td>2</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>class</th>\n",
              "      <td>0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>who</th>\n",
              "      <td>0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>adult_male</th>\n",
              "      <td>0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>deck</th>\n",
              "      <td>688</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>embark_town</th>\n",
              "      <td>2</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>alive</th>\n",
              "      <td>0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>alone</th>\n",
              "      <td>0</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "</div><br><label><b>dtype:</b> int64</label>"
            ]
          },
          "metadata": {},
          "execution_count": 5
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "titanic.select_dtypes(include=[\"object\"]).columns.tolist()"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "4jcmTBuihHeb",
        "outputId": "23f44072-a808-4da2-9d29-3bd7e899eb3d"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "['sex', 'embarked', 'who', 'embark_town', 'alive']"
            ]
          },
          "metadata": {},
          "execution_count": 6
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "titanic.describe()"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 298
        },
        "id": "b_aIeQpUhHgh",
        "outputId": "df1c2730-6eec-4809-89fe-e6cdfee8b256"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "         survived      pclass         age       sibsp       parch        fare\n",
              "count  891.000000  891.000000  714.000000  891.000000  891.000000  891.000000\n",
              "mean     0.383838    2.308642   29.699118    0.523008    0.381594   32.204208\n",
              "std      0.486592    0.836071   14.526497    1.102743    0.806057   49.693429\n",
              "min      0.000000    1.000000    0.420000    0.000000    0.000000    0.000000\n",
              "25%      0.000000    2.000000   20.125000    0.000000    0.000000    7.910400\n",
              "50%      0.000000    3.000000   28.000000    0.000000    0.000000   14.454200\n",
              "75%      1.000000    3.000000   38.000000    1.000000    0.000000   31.000000\n",
              "max      1.000000    3.000000   80.000000    8.000000    6.000000  512.329200"
            ],
            "text/html": [
              "\n",
              "  <div id=\"df-5cf4f75f-7860-4ed7-b919-a9e214ceea74\" 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>age</th>\n",
              "      <th>sibsp</th>\n",
              "      <th>parch</th>\n",
              "      <th>fare</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>count</th>\n",
              "      <td>891.000000</td>\n",
              "      <td>891.000000</td>\n",
              "      <td>714.000000</td>\n",
              "      <td>891.000000</td>\n",
              "      <td>891.000000</td>\n",
              "      <td>891.000000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>mean</th>\n",
              "      <td>0.383838</td>\n",
              "      <td>2.308642</td>\n",
              "      <td>29.699118</td>\n",
              "      <td>0.523008</td>\n",
              "      <td>0.381594</td>\n",
              "      <td>32.204208</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>std</th>\n",
              "      <td>0.486592</td>\n",
              "      <td>0.836071</td>\n",
              "      <td>14.526497</td>\n",
              "      <td>1.102743</td>\n",
              "      <td>0.806057</td>\n",
              "      <td>49.693429</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>min</th>\n",
              "      <td>0.000000</td>\n",
              "      <td>1.000000</td>\n",
              "      <td>0.420000</td>\n",
              "      <td>0.000000</td>\n",
              "      <td>0.000000</td>\n",
              "      <td>0.000000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>25%</th>\n",
              "      <td>0.000000</td>\n",
              "      <td>2.000000</td>\n",
              "      <td>20.125000</td>\n",
              "      <td>0.000000</td>\n",
              "      <td>0.000000</td>\n",
              "      <td>7.910400</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>50%</th>\n",
              "      <td>0.000000</td>\n",
              "      <td>3.000000</td>\n",
              "      <td>28.000000</td>\n",
              "      <td>0.000000</td>\n",
              "      <td>0.000000</td>\n",
              "      <td>14.454200</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>75%</th>\n",
              "      <td>1.000000</td>\n",
              "      <td>3.000000</td>\n",
              "      <td>38.000000</td>\n",
              "      <td>1.000000</td>\n",
              "      <td>0.000000</td>\n",
              "      <td>31.000000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>max</th>\n",
              "      <td>1.000000</td>\n",
              "      <td>3.000000</td>\n",
              "      <td>80.000000</td>\n",
              "      <td>8.000000</td>\n",
              "      <td>6.000000</td>\n",
              "      <td>512.329200</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-5cf4f75f-7860-4ed7-b919-a9e214ceea74')\"\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-5cf4f75f-7860-4ed7-b919-a9e214ceea74 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-5cf4f75f-7860-4ed7-b919-a9e214ceea74');\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>\n",
              "  </div>\n"
            ],
            "application/vnd.google.colaboratory.intrinsic+json": {
              "type": "dataframe",
              "summary": "{\n  \"name\": \"titanic\",\n  \"rows\": 8,\n  \"fields\": [\n    {\n      \"column\": \"survived\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 314.8713661874558,\n        \"min\": 0.0,\n        \"max\": 891.0,\n        \"num_unique_values\": 5,\n        \"samples\": [\n          0.3838383838383838,\n          1.0,\n          0.4865924542648585\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"pclass\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 314.2523437079693,\n        \"min\": 0.8360712409770513,\n        \"max\": 891.0,\n        \"num_unique_values\": 6,\n        \"samples\": [\n          891.0,\n          2.308641975308642,\n          3.0\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"age\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 242.9056731818781,\n        \"min\": 0.42,\n        \"max\": 714.0,\n        \"num_unique_values\": 8,\n        \"samples\": [\n          29.69911764705882,\n          28.0,\n          714.0\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"sibsp\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 314.4908277465442,\n        \"min\": 0.0,\n        \"max\": 891.0,\n        \"num_unique_values\": 6,\n        \"samples\": [\n          891.0,\n          0.5230078563411896,\n          8.0\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"parch\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 314.65971717879,\n        \"min\": 0.0,\n        \"max\": 891.0,\n        \"num_unique_values\": 5,\n        \"samples\": [\n          0.38159371492704824,\n          6.0,\n          0.8060572211299559\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"fare\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 330.6256632228577,\n        \"min\": 0.0,\n        \"max\": 891.0,\n        \"num_unique_values\": 8,\n        \"samples\": [\n          32.204207968574636,\n          14.4542,\n          891.0\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    }\n  ]\n}"
            }
          },
          "metadata": {},
          "execution_count": 7
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "### Distribución de la variable objetivo\n",
        "\n",
        "La variable `survived` indica si el pasajero sobrevivió (`1`) o no (`0`).\n",
        "\n",
        "Antes de entrenar los modelos, conviene comprobar cómo se distribuyen ambas clases para detectar si existe o no desbalanceo entre clases\n",
        "."
      ],
      "metadata": {
        "id": "nZ4CB4Onl6Ok"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "titanic[\"survived\"].value_counts()"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 177
        },
        "id": "1APC0gtDhHiZ",
        "outputId": "c5c6ef21-b582-4008-eb0e-877f389d919f"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "survived\n",
              "0    549\n",
              "1    342\n",
              "Name: count, dtype: int64"
            ],
            "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>count</th>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>survived</th>\n",
              "      <th></th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>0</th>\n",
              "      <td>549</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1</th>\n",
              "      <td>342</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "</div><br><label><b>dtype:</b> int64</label>"
            ]
          },
          "metadata": {},
          "execution_count": 9
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "sns.countplot(data=titanic, x=\"survived\")\n",
        "plt.title(\"Distribución de la variable objetivo survived\")\n",
        "plt.show()"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 472
        },
        "id": "eSf2a8XYhHkZ",
        "outputId": "c58c2f0c-5d8c-49ee-e296-add7a2b9a5b9"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 640x480 with 1 Axes>"
            ],
            "image/png": "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teHQ21g9e/a0/fuWW25RmzZtFBYWpuXLl8vDw6PK1puUlKTExETb+5ycHAIPAAAm5fDbWH/m5+enG2+8UT/88IOCg4OVl5enrKwsuz4ZGRm2MT7BwcHFns4qel/SOKAiVqtVPj4+di8AAGBO1SrsnDlzRkeOHFHt2rUVEREhV1dXbdmyxTb90KFDOnbsmCIjIyVJkZGR2r9/vzIzM219Nm3aJB8fH4WHh1/z+gEAQPXj0NtYTzzxhO6++26FhYXpxIkTmjBhgpydnTVw4ED5+vrqwQcfVGJiovz9/eXj46PHHntMkZGRatu2rSSpe/fuCg8P1+DBgzV9+nSlp6fr2WefVUJCgqxWqyM3DQAAVBMODTv//e9/NXDgQP36668KCAhQ+/bttWvXLgUEBEiSXn75ZTk5OSk2Nla5ubmKjo7WvHnzbPM7OztrzZo1GjFihCIjI+Xp6an4+HhNnjzZUZsEAACqGYthGIaji3C0nJwc+fr6Kjs7u8rG70SMXVIlywWud2kvDnF0CQCuU2X9/7tajdkBAACobIQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgatUm7PzrX/+SxWLR6NGjbW0XLlxQQkKCatasKS8vL8XGxiojI8NuvmPHjikmJkY1atRQYGCgxo4dq4sXL17j6gEAQHVVLcLO3r179dprr+mWW26xax8zZoxWr16tFStWaPv27Tpx4oT69Oljm15QUKCYmBjl5eXp888/1+LFi7Vo0SI999xz13oTAABANeXwsHPmzBkNGjRIb7zxhm644QZbe3Z2tt58803NnDlTXbt2VUREhBYuXKjPP/9cu3btkiRt3LhR3377rd555x21atVKPXv21JQpUzR37lzl5eU5apMAAEA14vCwk5CQoJiYGEVFRdm1p6WlKT8/3669adOmqlevnlJTUyVJqampatGihYKCgmx9oqOjlZOTowMHDpS6ztzcXOXk5Ni9AACAObk4cuXvvvuuvvzyS+3du7fYtPT0dLm5ucnPz8+uPSgoSOnp6bY+fw46RdOLppUmOTlZkyZNusrqAQDA9cBhV3aOHz+uf/zjH1q6dKnc3d2v6bqTkpKUnZ1tex0/fvyarh8AAFw7Dgs7aWlpyszM1K233ioXFxe5uLho+/bteuWVV+Ti4qKgoCDl5eUpKyvLbr6MjAwFBwdLkoKDg4s9nVX0vqhPSaxWq3x8fOxeAADAnBwWdrp166b9+/dr3759tlfr1q01aNAg279dXV21ZcsW2zyHDh3SsWPHFBkZKUmKjIzU/v37lZmZaeuzadMm+fj4KDw8/JpvEwAAqH4cNmbH29tbN998s12bp6enatasaWt/8MEHlZiYKH9/f/n4+Oixxx5TZGSk2rZtK0nq3r27wsPDNXjwYE2fPl3p6el69tlnlZCQIKvVes23CQAAVD8OHaB8JS+//LKcnJwUGxur3NxcRUdHa968ebbpzs7OWrNmjUaMGKHIyEh5enoqPj5ekydPdmDVAACgOrEYhmE4ughHy8nJka+vr7Kzs6ts/E7E2CVVslzgepf24hBHlwDgOlXW/78d/j07AAAAVYmwAwAATI2wAwAATI2wAwAATI2wAwAATI2wAwAATI2wAwAATI2wAwAATI2wAwAATI2wAwAATI2wAwAATI2wAwAATI2wAwAATI2wAwAATI2wAwAATI2wAwAATI2wAwAATI2wAwAATI2wAwAATI2wAwAATI2wAwAATI2wAwAATI2wAwAATI2wAwAATI2wAwAATI2wAwAATI2wAwAATI2wAwAATI2wAwAATI2wAwAATM3F0QUAwPUuYuwSR5cAVEtpLw5xdAmSuLIDAABMjrADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMrUJhp2vXrsrKyirWnpOTo65du15tTQAAAJWmQmFn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rg8AAOCqVCjsFPHy8tJtt91WWbUAAABUugoNUAYAALheEHYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpOTTsJCcn67bbbpO3t7cCAwPVu3dvHTp0yK7PhQsXlJCQoJo1a8rLy0uxsbHKyMiw63Ps2DHFxMSoRo0aCgwM1NixY3Xx4sVruSkAAKCacmjY2b59uxISErRr1y5t2rRJ+fn56t69u86ePWvrM2bMGK1evVorVqzQ9u3bdeLECfXp08c2vaCgQDExMcrLy9Pnn3+uxYsXa9GiRXruueccsUkAAKCacXHkytevX2/3ftGiRQoMDFRaWpo6duyo7Oxsvfnmm1q2bJm6du0qSVq4cKGaNWumXbt2qW3bttq4caO+/fZbbd68WUFBQWrVqpWmTJmicePGaeLEiXJzcyu23tzcXOXm5tre5+TkVO2GAgAAh6lWY3ays7MlSf7+/pKktLQ05efnKyoqytanadOmqlevnlJTUyVJqampatGihYKCgmx9oqOjlZOTowMHDpS4nuTkZPn6+tpeoaGhVbVJAADAwapN2CksLNTo0aPVrl073XzzzZKk9PR0ubm5yc/Pz65vUFCQ0tPTbX3+HHSKphdNK0lSUpKys7Ntr+PHj1fy1gAAgOrCobex/iwhIUHffPONPvvssypfl9VqldVqrfL1AAAAx6sWV3ZGjRqlNWvWaOvWrapbt66tPTg4WHl5ecrKyrLrn5GRoeDgYFufS5/OKnpf1AcAAPx1OTTsGIahUaNGadWqVfrkk0/UoEEDu+kRERFydXXVli1bbG2HDh3SsWPHFBkZKUmKjIzU/v37lZmZaeuzadMm+fj4KDw8/NpsCAAAqLYcehsrISFBy5Yt04cffihvb2/bGBtfX195eHjI19dXDz74oBITE+Xv7y8fHx899thjioyMVNu2bSVJ3bt3V3h4uAYPHqzp06crPT1dzz77rBISErhVBQAAHBt25s+fL0nq3LmzXfvC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vVpnzpyxtW3YsEHnzp3TfffdJ0lKTk7WkiVLtGDBAh04cEBjxozR3//+d23fvl2SdPz4cfXp00d333239u3bp4ceekhPPfVURXcLgCrEbSwA19TJkyd18eJF9enTR2FhYZKkFi1alGsZXbt21T//+U/b+/79+2v06NH67LPPbOFm2bJlGjhwoCwWS7H5o6Oj5enpqVWrVmnw4MG2/vfcc4+8vb2Vm5uradOmafPmzYqMjJQkNWzYUJ999plee+01derUSfPnz1ejRo00Y8YMSdJNN92k/fv364UXXij/TgFQpbiyA+Caatmypbp166YWLVqoX79+euONN/T777+XaxmtW7e2ex8QEKDu3btr6dKlkqSjR48qNTVVgwYNKnF+FxcX9e/f39b/7Nmz+vDDD239f/jhB507d0533nmnvLy8bK8lS5boyJEjkqSDBw+qTZs2dsstCkYAqheu7AC4ppydnbVp0yZ9/vnn2rhxo+bMmaNnnnlGu3fvlpOTU7HbWfn5+cWWUdJTVYMGDdLjjz+uOXPmaNmyZWrRosVlrxgNGjRInTp1UmZmpjZt2iQPDw/16NFDkmy3t9auXas6derYzWe1Wsu9zQAciys7AK45i8Widu3aadKkSfrqq6/k5uamVatWKSAgQCdPnrT1Kygo0DfffFOmZd577726cOGC1q9fr2XLlpV6VafIHXfcodDQUKWkpGjp0qXq16+fXF1dJUnh4eGyWq06duyYGjdubPcKDQ2VJDVr1kx79uyxW+auXbvKsxsAXCNc2QFwTe3evVtbtmxR9+7dFRgYqN27d+vUqVNq1qyZPD09lZiYqLVr16pRo0aaOXNmmb+gz9PTU71799b48eN18OBBDRw48Irz3H///VqwYIG+//57bd261dbu7e2tJ554QmPGjFFhYaHat2+v7Oxs7dy5Uz4+PoqPj9ejjz6qGTNmaOzYsXrooYeUlpamRYsWVXCvAKhKhB0A15SPj4927NihWbNmKScnR2FhYZoxY4Z69uyp/Px8ff311xoyZIhcXFw0ZswYdenSpczLHjRokO666y517NhR9erVK1P/qVOnKiwsTO3atbObNmXKFAUEBCg5OVk//vij/Pz8dOutt+rpp5+WJNWrV08rV67UmDFjNGfOHN1+++2aNm2aHnjggfLtEABVzmKU53lPAACA6wxjdgAAgKkRdgAAgKkRdgAAgKkRdgAAgKkRdgAAgKkRdgAAgKkRdgAAgKkRdgAAgKkRdgAAgKkRdgAAgKkRdgAAgKn9P1nYV/ldx98yAAAAAElFTkSuQmCC\n"
          },
          "metadata": {}
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "sns.countplot(data=titanic, x=\"sex\", hue=\"survived\")\n",
        "plt.title(\"Supervivencia según sexo\")\n",
        "plt.show()"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 472
        },
        "id": "qhLOE0QAm-Hw",
        "outputId": "2a6d6db8-a1cf-4357-a8ec-c33b753ea8db"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 640x480 with 1 Axes>"
            ],
            "image/png": "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jRunZs2aad++fZo8ebJCQ0Nt+4quwb333luslpCQENt+oKxVcXQBwJ3O1dVVDzzwgB544AHdc889Gjp0qNasWaPJkydfd8bhZhaOFvntOQoLC2WxWLRhwwY5OzsX63/trIGk634JXY8ePVS1alWtXr1aDz74oFavXi0nJyf169fvd2saMGCApk2bpgsXLsjb21uff/65Bg4caPsXfGFhoSTp6aefVnR0dInnaNq0qd12SWORZDfzVBqnT59W586dFRISojlz5qhu3bpydXXVl19+qbfeestW6/WMGTNGPXr00D/+8Q9t2rRJkyZNUnx8vP71r3+pRYsWtuP//ve/KzAwsNjxRdfkVtzqz831rt3NvM8nn3yiPXv26IsvvtCmTZs0bNgwzZ49W3v27JGXl5cKCwvl7++v5cuXl3iO34as77//3hYAk5KSSlUXUNYIO0AZKnqK6fz585L+b3bitwsvb/Qv2JMnTyo4ONi2ferUKRUWFtqe1mnYsKEMw1BwcLDuueeeUtfq6empxx57TGvWrNGcOXO0atUqPfTQQ6pdu/bvHjtgwABNmTJFn376qQICApSVlWW3qNnPz0/e3t4qKChQREREqWu8VsOGDSVJ33777S2d84svvlBOTo4+//xzu9mj397u+733fumll/TSSy/p5MmTat68uWbPnq2PP/7YVpe/v/8N6woKCpKkEp8w+21baX5ubkebNm3Upk0bTZs2TStWrFBUVJRWrlypZ555Rg0bNtRXX32ltm3b/u63NxcWFmrIkCGyWq0aM2aMpk+frr59+6p3796S/u8anDhxwjYLWOTEiRO2/UBZ4zYWUArbtm0rccahaF1N0TS91WpVzZo1tXPnTrt+77777nXP/dsnhIq+kblbt26SpN69e8vZ2VlTpkwpVoNhGPrpp59uehwDBgzQuXPn9MEHH+jw4cO/ewurSOPGjRUWFqZVq1Zp1apVqlWrltq3b2/b7+zsrD59+ujTTz8t8Ym19PT0m66xyP3336/g4GDNnTu3WAi40exP0azHtX0yMzO1dOnS333P7OzsYo/9N2zYUN7e3rZbPZGRkbJarZo+fXqJ616Kxlq7dm01adJEy5Yt0+XLl237d+zYUWwGJCgoSM7Ozrf0c1MaFy9eLHbtmjdvLkm28fXv318FBQV64403ih2fn59v92cxZ84c7d69W++//77eeOMNPfjggxo5cqQuXLgg6dd/DPj7+2vRokV2t8o2bNigY8eOqXv37mU6PqAIMztAKYwePVrZ2dl64oknFBISotzcXO3evVurVq1S/fr17RYEP/PMM3rzzTf1zDPPqFWrVtq5c6e+++676577zJkzevzxx/XII48oISFBH3/8sZ566inbo7sNGzbUX//6V02YMEE//PCDevXqJW9vb505c0Zr167Vs88+q5dffvmmxvHoo4/K29tbL7/8si2g3KwBAwYoLi5O7u7uGj58uJyc7P/t9Oabb2rbtm1q3bq1RowYodDQUP388886ePCgvvrqK/388883/V6S5OTkpIULF6pHjx5q3ry5hg4dqlq1aun48eM6cuSINm3aVOJxXbt2laurq3r06KHnnntOly9f1uLFi+Xv72+bgbue7777Tp07d1b//v0VGhqqKlWqaO3atUpNTbXNZFmtVi1cuFCDBg3S/fffryeffFJ+fn5KTk7W+vXr1bZtW73zzjuSpOnTp6tnz55q27athg4dqosXL+qdd95RkyZN7AKQj4+P+vXrp/nz58tisahhw4Zat25dsfUxt+ujjz7Su+++qyeeeEINGzbUpUuXtHjxYlmtVj366KOSfl3X89xzzyk+Pl7ffPONunbtKhcXF508eVJr1qzRvHnz1LdvXx07dkyTJk3SkCFD1KNHD0m/PmbevHlzPf/881q9erVcXFw0Y8YMDR06VB06dNDAgQOVmpqqefPmqX79+ho7dmyZjg+wccxDYMCdbcOGDcawYcOMkJAQw8vLy3B1dTUaNWpkjB492khNTbXrm52dbQwfPtzw8fExvL29jf79+xtpaWnXffT86NGjRt++fQ1vb2+jWrVqxqhRo+we0y3y6aefGu3atTM8PT0NT09PIyQkxIiJiTFOnDhh69OhQwfjvvvuu+FYoqKiDElGREREift/++h5kZMnTxqSDEnG119/XeKxqampRkxMjFG3bl3DxcXFCAwMNDp37my8//77tj5Fj1mvWbPG7tjrPbb/9ddfG126dDG8vb0NT09Po2nTpsb8+fNt+0t69Pzzzz83mjZtari7uxv169c3ZsyYYSxZssSQZJw5c+a61+bChQtGTEyMERISYnh6eho+Pj5G69atjdWrVxfru23bNiMyMtLw8fEx3N3djYYNGxpDhgwxDhw4YNdv5cqVRkhIiOHm5mY0adLE+Pzzz40+ffoYISEhdv3S09ONPn36GFWrVjWqVatmPPfcc8a3335b4qPnnp6exeop6Tr81sGDB42BAwca9erVM9zc3Ax/f3/jscceK1azYRjG+++/b7Rs2dLw8PAwvL29jbCwMOOVV14xzp07Z+Tn5xsPPPCAUadOHSMjI8PuuKKvEFi1apWtbdWqVUaLFi0MNzc3o3r16kZUVJTx//7f/7thrcDt4NdFAJXE66+/rilTpig9PV01a9Z0dDmoQM2bN5efn5+2bNni6FIAU2LNDgBUkLy8POXn59u1bd++XYcPH1bHjh0dUxTwB8CaHQCoID/++KMiIiL09NNPq3bt2jp+/LgWLVqkwMBAfqs5UI4IOwBQQapVq6aWLVvqgw8+UHp6ujw9PdW9e3e9+eabqlGjhqPLA0yLNTsAAMDUWLMDAABMjbADAABMjTU7+vUrzs+dOydvb+/f/e3JAACgcjAMQ5cuXVLt2rWLfbHptQg7ks6dO6e6des6ugwAAFAKZ8+eVZ06da67n7AjydvbW9KvF8tqtTq4GgAAcDOysrJUt25d29/j10PYkWy3rqxWK2EHAIA7zO8tQWGBMgAAMDXCDgAAMDXCDgAAMDXW7AAAUIkUFBQoLy/P0WVUCi4uLnJ2dr7t8xB2AACoBAzDUEpKijIyMhxdSqXi6+urwMDA2/oePMIOAACVQFHQ8ff3V9WqVf/wX3JrGIays7OVlpYmSapVq1apz0XYAQDAwQoKCmxBp0aNGo4up9Lw8PCQJKWlpcnf37/Ut7RYoAwAgIMVrdGpWrWqgyupfIquye2sYyLsAABQSfzRb12VpCyuCWEHAACYGmEHAAAUU79+fc2dO7dc32P79u2yWCzl/gQaC5QBAEAx+/fvl6enp6PLKBOEHQAA/kByc3Pl6ur6u/38/PwqoJqKwW0sAAAquU8++URhYWHy8PBQjRo1FBERoStXrqhjx44aM2aMXd9evXppyJAhtu369evrjTfe0ODBg2W1WvXss8/qwQcf1Pjx4+2OS09Pl4uLi3bu3Gk7rug21lNPPaUBAwbY9c/Ly1PNmjW1bNkySVJhYaHi4+MVHBwsDw8PNWvWTJ988ondMV9++aXuueceeXh46OGHH9YPP/xw+xfnJhB2AACoxM6fP6+BAwdq2LBhOnbsmLZv367evXvLMIybPsff/vY3NWvWTIcOHdKkSZMUFRWllStX2p1j1apVql27th566KFix0dFRemLL77Q5cuXbW2bNm1Sdna2nnjiCUlSfHy8li1bpkWLFunIkSMaO3asnn76ae3YsUOSdPbsWfXu3Vs9evTQN998o2eeeUavvvpqaS/LLeE2VgVpOW6Zo0vANRJnDXZ0CQBwU86fP6/8/Hz17t1bQUFBkqSwsLBbOkenTp300ksv2bb79++vMWPG6Ouvv7aFmxUrVmjgwIElPuodGRkpT09PrV27VoMGDbL1f/zxx+Xt7a2cnBxNnz5dX331lcLDwyVJDRo00Ndff6333ntPHTp00MKFC9WwYUPNnj1bknTvvfcqKSlJM2bMuPWLcouY2QEAoBJr1qyZOnfurLCwMPXr10+LFy/WxYsXb+kcrVq1stv28/NT165dtXz5cknSmTNnlJCQoKioqBKPr1Klivr372/rf+XKFf3zn/+09T916pSys7PVpUsXeXl52V7Lli3T6dOnJUnHjh1T69at7c5bFIzKGzM7AABUYs7OztqyZYt2796tzZs3a/78+frLX/6ivXv3ysnJqdjtrJK+abikp6qioqL0wgsvaP78+VqxYoXCwsJuOGMUFRWlDh06KC0tTVu2bJGHh4ceeeQRSbLd3lq/fr3uuusuu+Pc3NxuecxljZkdAAAqOYvForZt22rKlCk6dOiQXF1dtXbtWvn5+en8+fO2fgUFBfr2229v6pw9e/bU1atXtXHjRq1YseK6szpFHnzwQdWtW1erVq3S8uXL1a9fP7m4uEiSQkND5ebmpuTkZDVq1MjuVbduXUlS48aNtW/fPrtz7tmz51YuQ6kxswMAQCW2d+9ebd26VV27dpW/v7/27t2r9PR0NW7cWJ6enoqNjdX69evVsGFDzZkz56a/oM/T01O9evXSpEmTdOzYMQ0cOPB3j3nqqae0aNEifffdd9q2bZut3dvbWy+//LLGjh2rwsJCtWvXTpmZmdq1a5esVquio6P15z//WbNnz9a4ceP0zDPPKDExUR9++GEpr8qtIewAAFCJWa1W7dy5U3PnzlVWVpaCgoI0e/ZsdevWTXl5eTp8+LAGDx6sKlWqaOzYsXr44Ydv+txRUVF69NFH1b59e9WrV++m+k+bNk1BQUFq27at3b433nhDfn5+io+P1/fffy9fX1/df//9mjhx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ub8PAABwvEoxszNq1CitW7dO27ZtU506dWztgYGBys3NVUZGhl3/1NRUBQYG2vr89umsou2iPgAA4I/LoWHHMAyNGjVKa9eu1b/+9S8FBwfb7W/ZsqVcXFy0detWW9uJEyeUnJys8PBwSVJ4eLiSkpKUlpZm67NlyxZZrVaFhoZWzEAAAECl5dDbWDExMVqxYoX++c9/ytvb27bGxsfHRx4eHvLx8dHw4cMVGxur6tWry2q1avTo0QoPD1ebNm0kSV27dlVoaKgGDRqkmTNnKiUlRa+99ppiYmK4VQUAABwbdhYuXChJ6tixo1370qVLNWTIEEnSW2+9JScnJ/Xp00c5OTmKjIzUu+++a+vr7OysdevWaeTIkQoPD5enp6eio6M1derUihoGAACoxBwadm7mK37c3d21YMECLViw4Lp9goKC9OWXX5ZlaQAAwCQqxQJlAACA8kLYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAAplbF0QUAjpA8NczRJeB/1YtLcnQJAEyOmR0AAGBqhB0AAGBqDg07O3fuVI8ePVS7dm1ZLBb94x//sNtvGIbi4uJUq1YteXh4KCIiQidPnrTr8/PPPysqKkpWq1W+vr4aPny4Ll++XIGjAAAAlZlDw86VK1fUrFkzLViwoMT9M2fO1Ntvv61FixZp79698vT0VGRkpK5evWrrExUVpSNHjmjLli1at26ddu7cqWeffbaihgAAACo5hy5Q7tatm7p161biPsMw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4w35+fkpPj5e33//vXx9fXX//fdr4sSJFVg58MdQHp83JycnrVy5Ui+88IKaNGmie++9V2+//bY6dux43WNq166tXbt2afz48eratatycnIUFBSkRx55RE5OPMB8p7IYhmE4uggAAIDyQkwFAACmRtgBAACmRtgBAACmRtgBAACmRtgBAACmRtgBAACmRtgBAACmRtgBAACmRtgBAACmRtgBAACmRtgBAACmRtgBcMf65JNPFBYWJg8PD9WoUUMRERG6cuWKJOmDDz5Q48aN5e7urpCQEL377ru244YNG6amTZsqJydHkpSbm6sWLVpo8ODBDhkHgPJF2AFwRzp//rwGDhyoYcOG6dixY9q+fbt69+4twzC0fPlyxcXFadq0aTp27JimT5+uSZMm6aOPPpIkvf3227py5YpeffVVSdJf/vIXZWRk6J133nHkkACUkyqOLgAASuP8+fPKz89X7969FRQUJEkKCwuTJE2ePFmzZ89W7969JUnBwcE6evSo3nvvPUVHR8vLy0sff/yxOnToIG9vb82dO1fbtm2T1Wp12HgAlB+LYRiGo4sAgFtVUFCgyMhI7du3T5GRkeratav69u0rV1dXeXl5ycPDQ05O/zd5nZ+fLx8fH6WmptraJk6cqPj4eI0fP15vvvmmI4YBoAIwswPgjuTs7KwtW7Zo9+7d2rx5s+bPn6+//OUv+uKLLyRJixcvVuvWrYsdU6SwsFC7du2Ss7OzTp06VaG1A6hYrNkBcMeyWCxq27atpkyZokOHDsnV1VW7du1S7dq19f3336tRo0Z2r+DgYNuxs2bN0vHjx7Vjxw5t3LhRS5cudeBIAJQnZnYA3JH27t2rrVu3qmvXrvL399fevXuVnp6uxo0ba8qUKXrhhRfk4+OjRx55RDk5OTpw4IAuXryo2NhYHTp0SHFxcfrkk0/Utm1bzZkzRy+++KI6dOigBg0aOHpoAMoYa3YA3JGOHTumsWPH6uDBg8rKylJQUJBGjx6tUaNGSZJWrFihWbNm6ejRo/L09FRYWJjGjBmjbt26qWXLlmrXrp3ee+892/l69uypCxcuaOfOnXa3uwDc+Qg7AADA1FizAwAATI2wAwAATI2wAwAATI2wAwAATI2wAwAATI2wAwAATI2wAwAATI2wAwAATI2wAwAATI2wAwAATI2wAwAATO3/A0cb0hR4SKKOAAAAAElFTkSuQmCC\n"
          },
          "metadata": {}
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "sns.countplot(data=titanic, x=\"pclass\", hue=\"survived\")\n",
        "plt.title(\"Supervivencia según clase del billete\")\n",
        "plt.show()"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 472
        },
        "id": "jt8quvYvm-J0",
        "outputId": "bcf88dac-d6a6-4afb-8872-62008ce85948"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 640x480 with 1 Axes>"
            ],
            "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjsAAAHHCAYAAABZbpmkAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAARLBJREFUeJzt3X1YFXX+//HXAeEIyAFRbhXR0EQUtcU71NTURDRvVvO+xJu0XGxTunFpS9NKSsubdU23dtPczVIrLS1vyAQz0dJVM1NTo2xTxLwBxQSF+f3Rl/PzBJoieo7T83Fd57qYmc/MvGcYznkx85k5FsMwDAEAAJiUm7MLAAAAuJEIOwAAwNQIOwAAwNQIOwAAwNQIOwAAwNQIOwAAwNQIOwAAwNQIOwAAwNQIOwB+V9asWaOpU6fq559/dnYpAG4Swg5wk9SuXVvDhg1zdhlX7ZlnnpHFYnF2GRVqz549uvfee1WzZk15eXnd9PUPGzZMtWvXvunrvR4dOnRQhw4dyjXv1Rzz3333nSwWi1566aXfXF5Zx+Sv15Geni6LxaL09PRyVAyzIuzA6Xbv3q17771XERERqly5smrUqKG7775bc+bMcXZpMJH8/Hz169dPTz75pIYOHerscuCCNm/erGeeeUanT592dimoYIQdONXmzZvVrFkz7dq1S6NGjdLf//53PfDAA3Jzc9Ps2bOdXV6F2r9/v1577TVnl3HVnnrqKVNd6tm1a5f+/Oc/68knn3R2KSinG31Mbt68WZMnTybsmFAlZxeA37fnn39efn5++uKLL+Tv7+8wLScnxzlFXaVz587J29v7qttbrdYbWE3Fq1SpkipVMs9bROvWrdW6dWtnl4HrYLZjEjcPZ3bgVIcOHVLDhg1LBR1JCgoKsv9ccl1/4cKFpdpZLBY988wz9uGS6/r79u1T//79ZbPZVK1aNT3yyCM6f/58qfn/85//KDY2Vl5eXgoICNDAgQP1ww8/OLTp0KGDGjVqpO3bt6tdu3by9vbWk08+qXvuuUe33XZbmdsWFxenZs2a2Ycv7Vuwbds2WSwWvfHGG6XmW7t2rSwWi1atWmUf9+OPP2rEiBEKDg6W1WpVw4YN9frrrzvMV9JXYenSpXr++edVs2ZNVa5cWZ06ddLBgwdLrWfr1q3q1q2bqlatKh8fHzVu3NjhbFpZ/SMWLFigjh07KigoSFarVdHR0Zo3b16Z2/9r2dnZGj58uGrWrCmr1arQ0FD16tVL3333nUO71atX684775SPj498fX3VvXt37dmzp9Tyli1bpujoaFWuXFmNGjXS8uXLS/WJuVz/jbKOp2HDhqlKlSr68ccf1bt3b1WpUkWBgYF67LHHVFRUdFXbuHr1arVv316+vr6y2Wxq3ry5Fi9efMV5XnrpJbVu3VrVqlWTl5eXYmNj9c4775Rql5aWprZt28rf319VqlRR/fr1S52lKigo0KRJk1S3bl1ZrVaFh4friSeeUEFBwVXV/+qrryoyMlJeXl5q0aKFPv300zLbXe96LmfmzJmKiIiQl5eX2rdvr6+++sph+vX0I9u6dau6du0qPz8/eXt7q3379vrss88clv34449LkurUqSOLxSKLxeJwfF7NewVcExEZThUREaHMzEx99dVXatSoUYUuu3///qpdu7ZSU1O1ZcsW/e1vf9OpU6e0aNEie5vnn39eTz/9tPr3768HHnhAx48f15w5c9SuXTvt2LHDIYSdOHFCCQkJGjhwoO677z4FBwcrNjZWQ4cO1RdffKHmzZvb237//ffasmWLpk+fXmZtzZo102233aalS5cqMTHRYdqSJUtUtWpVxcfHS5KOHTumVq1ayWKxaOzYsQoMDNTq1as1cuRI5eXlady4cQ7zv/DCC3Jzc9Njjz2m3NxcTZs2TUOGDNHWrVvtbdLS0nTPPfcoNDRUjzzyiEJCQrR3716tWrVKjzzyyGX36bx589SwYUP17NlTlSpV0sqVK/WnP/1JxcXFSkpKuuLvo2/fvtqzZ48efvhh1a5dWzk5OUpLS9Phw4ftAeXf//63EhMTFR8frxdffFHnzp3TvHnz1LZtW+3YscPe7sMPP9SAAQMUExOj1NRUnTp1SiNHjlSNGjWuWMNvKSoqUnx8vFq2bKmXXnpJH3/8sV5++WVFRkZqzJgxV5x34cKFGjFihBo2bKiUlBT5+/trx44dWrNmjQYPHnzZ+WbPnq2ePXtqyJAhKiws1Ntvv61+/fpp1apV6t69u6RfOlbfc889aty4saZMmSKr1aqDBw86fFgXFxerZ8+e2rRpk0aPHq0GDRpo9+7dmjlzpr755hutWLHiivX/61//0oMPPqjWrVtr3Lhx+vbbb9WzZ08FBAQoPDy8wtZzOYsWLdKZM2eUlJSk8+fPa/bs2erYsaN2796t4ODgci2zxCeffKKEhATFxsZq0qRJcnNzswf3Tz/9VC1atFCfPn30zTff6K233tLMmTNVvXp1SVJgYKCka3uvgAsyACdat26d4e7ubri7uxtxcXHGE088Yaxdu9YoLCx0aJeVlWVIMhYsWFBqGZKMSZMm2YcnTZpkSDJ69uzp0O5Pf/qTIcnYtWuXYRiG8d133xnu7u7G888/79Bu9+7dRqVKlRzGt2/f3pBkzJ8/36Ftbm6uYbVajUcffdRh/LRp0wyLxWJ8//339nERERFGYmKifTglJcXw8PAwTp48aR9XUFBg+Pv7GyNGjLCPGzlypBEaGmr89NNPDusYOHCg4efnZ5w7d84wDMPYsGGDIclo0KCBUVBQYG83e/ZsQ5Kxe/duwzAM4+LFi0adOnWMiIgI49SpUw7LLC4uLrUfL1WyrkvFx8cbt912W6nxlzp16pQhyZg+ffpl25w5c8bw9/c3Ro0a5TA+Ozvb8PPzcxgfExNj1KxZ0zhz5ox9XHp6uiHJiIiIsI8r2ScbNmxwWGZZx1NiYqIhyZgyZYpD2zvuuMOIjY294vadPn3a8PX1NVq2bGn8/PPPDtMu3aeJiYkO9RlG6X1aWFhoNGrUyOjYsaN93MyZMw1JxvHjxy9bw7///W/Dzc3N+PTTTx3Gz58/35BkfPbZZ5edt7Cw0AgKCjKaNm3qcOy8+uqrhiSjffv25VrPr4/5spT8Lry8vIz//e9/9vFbt241JBnjx4+3jyvrmPz1On79Oy8uLjbq1atnxMfHO/wuzp07Z9SpU8e4++677eOmT59uSDKysrIc1nEt7xVwTVzGglPdfffdyszMVM+ePbVr1y5NmzZN8fHxqlGjhj744IPrWvavzzQ8/PDDkqSPPvpIkvTee++puLhY/fv3108//WR/hYSEqF69etqwYYPD/FarVcOHD3cYZ7PZlJCQoKVLl8owDPv4JUuWqFWrVqpVq9Zl6xswYIAuXLig9957zz5u3bp1On36tAYMGCBJMgxD7777rnr06CHDMBzqjI+PV25urv773/86LHf48OHy9PS0D995552SpG+//VaStGPHDmVlZWncuHGl/hv9rUsEl96unZubq59++knt27fXt99+q9zc3CvO5+npqfT0dJ06darMNmlpaTp9+rQGDRrksJ3u7u5q2bKl/fdx5MgR7d69W0OHDlWVKlXs87dv314xMTFXrP9qPPTQQw7Dd955p33fXU5aWprOnDmjv/zlL6pcubLDtGvZp6dOnVJubq7uvPNOh99rye/p/fffV3FxcZnLWbZsmRo0aKCoqCiH/dexY0dJKnU8X2rbtm3KycnRQw895HDsDBs2TH5+fhW2nivp3bu3w5m5Fi1aqGXLlva/1/LauXOnDhw4oMGDB+vEiRP2evPz89WpUydt3Ljxsvu0xLW+V8D1cBkLTte8eXO99957Kiws1K5du7R8+XLNnDlT9957r3bu3Kno6OhyLbdevXoOw5GRkXJzc7Nfgz9w4IAMwyjVroSHh4fDcI0aNRw+CEoMGDBAK1asUGZmplq3bq1Dhw5p+/btmjVr1hXra9KkiaKiorRkyRKNHDlS0i8hqXr16vYPjuPHj+v06dN69dVX9eqrr5a5nF935P51wKpataok2UPGoUOHJKlclw0/++wzTZo0SZmZmTp37pzDtNzc3FIfjCWsVqtefPFFPfroowoODlarVq10zz33aOjQoQoJCZH0y+9Dkn3bf81ms0n65RKhJNWtW7dUm7p165YKf9eicuXK9ssWJapWrXrZgFbievbpqlWr9Nxzz2nnzp0OfV4uDUkDBgzQP//5Tz3wwAP6y1/+ok6dOqlPnz6699575eb2y/+sBw4c0N69e0vVX+JKHf5L9umv/xY8PDxK9Um7nvVcSVl/h7fffruWLl1aruWVKDmufn25+FK5ubn2v5PLLeNa3ivgegg7cBmenp5q3ry5mjdvrttvv13Dhw/XsmXLNGnSpMv+d3y1HUel0v9hFxcXy2KxaPXq1XJ3dy/V/tKzBpIu+xC6Hj16yNvbW0uXLlXr1q21dOlSubm5qV+/fr9Z04ABA/T888/rp59+kq+vrz744AMNGjTIfsdJyX+c991332XfrBs3buwwXNa2SHI481Qehw4dUqdOnRQVFaUZM2YoPDxcnp6e+uijjzRz5szf/O943Lhx6tGjh1asWKG1a9fq6aefVmpqqj755BPdcccd9vn//e9/2wPQpcpzF861HjeX23c3yqeffqqePXuqXbt2euWVVxQaGioPDw8tWLDAoWOzl5eXNm7cqA0bNujDDz/UmjVrtGTJEnXs2FHr1q2Tu7u7iouLFRMToxkzZpS5rkv73VyPm7WeilJyXE2fPl1NmzYts82v/9bLWsa1vFfA9RB24JJK7mI6evSopP9/duLXz78o+Y+0LAcOHFCdOnXswwcPHlRxcbG9k2tkZKQMw1CdOnV0++23l7tWHx8f3XPPPVq2bJlmzJihJUuW6M4771RYWNhvzjtgwABNnjxZ7777roKDg5WXl6eBAwfapwcGBsrX11dFRUXq3LlzuWu8VGRkpCTpq6++uqZlrly5UgUFBfrggw8czh5dyyn8yMhIPfroo3r00Ud14MABNW3aVC+//LL+85//2OsKCgq6Yl0RERGSVOYdZr8eV57jpjwu3adlnXG6nHfffVeVK1fW2rVrHR5NsGDBglJt3dzc1KlTJ3Xq1EkzZszQ1KlT9de//lUbNmxQ586dFRkZqV27dqlTp07XfMdSyT49cOCAw5m1CxcuKCsrS02aNHHY1vKu50pKzsBc6ptvvrnuJ06X/G5sNttvHu+X256Keq+A89BnB061YcOGMs84lFynr1+/vqRf3qiqV6+ujRs3OrR75ZVXLrvsuXPnOgyXPJE5ISFBktSnTx+5u7tr8uTJpWowDEMnTpy46u0YMGCAjhw5on/+85/atWuXvc/Nb2nQoIFiYmK0ZMkSLVmyRKGhoWrXrp19uru7u/r27at333231G240i+Xua7VH/7wB9WpU0ezZs0qFQKudPan5D/aS9vk5uaW+cH8a+fOnSt1239kZKR8fX3tl27i4+Nls9k0depUXbhwodQySrY1LCxMjRo10qJFi3T27Fn79IyMDO3evdthnoiICLm7u1/TcVMeXbp0ka+vr1JTU0tt52/tU4vF4nCm6bvvvit1R9PJkydLzVtylqJk//Xv318//vhjmQ+u/Pnnn5Wfn3/ZOpo1a6bAwEDNnz9fhYWF9vELFy4sdYxcz3quZMWKFfrxxx/tw59//rm2bt1q/3str9jYWEVGRuqll15yOF5KXPo35OPjI6l0OK7I9wo4B2d24FQPP/ywzp07pz/+8Y+KiopSYWGhNm/erCVLlqh27doOHYIfeOABvfDCC3rggQfUrFkzbdy4Ud98881ll52VlaWePXuqa9euyszM1H/+8x8NHjzY/l9qZGSknnvuOaWkpOi7775T79695evrq6ysLC1fvlyjR4/WY489dlXb0a1bN/n6+uqxxx6zB5SrNWDAAE2cOFGVK1fWyJEj7X0wSrzwwgvasGGDWrZsqVGjRik6OlonT57Uf//7X3388cdlfhBeiZubm+bNm6cePXqoadOmGj58uEJDQ7Vv3z7t2bNHa9euLXO+Ll26yNPTUz169NCDDz6os2fP6rXXXlNQUJD9DNzlfPPNN+rUqZP69++v6OhoVapUScuXL9exY8fsZ7JsNpvmzZun+++/X3/4wx80cOBABQYG6vDhw/rwww/Vpk0b/f3vf5ckTZ06Vb169VKbNm00fPhwnTp1Sn//+9/VqFEjhw80Pz8/9evXT3PmzJHFYlFkZKRWrVpV4Q+stNlsmjlzph544AE1b95cgwcPVtWqVbVr1y6dO3euzOcpSVL37t01Y8YMde3aVYMHD1ZOTo7mzp2runXr6ssvv7S3mzJlijZu3Kju3bsrIiJCOTk5euWVV1SzZk21bdtWknT//fdr6dKleuihh7Rhwwa1adNGRUVF2rdvn5YuXaq1a9c6PPfpUh4eHnruuef04IMPqmPHjhowYICysrK0YMGCUn12rmc9V1K3bl21bdtWY8aMUUFBgWbNmqVq1arpiSeeuOZlXcrNzU3//Oc/lZCQoIYNG2r48OGqUaOGfvzxR23YsEE2m00rV66U9EswkqS//vWvGjhwoDw8PNSjR48Kfa+Ak9z8G8CA/2/16tXGiBEjjKioKKNKlSqGp6enUbduXePhhx82jh075tD23LlzxsiRIw0/Pz/D19fX6N+/v5GTk3PZW8+//vpr49577zV8fX2NqlWrGmPHji11W7BhGMa7775rtG3b1vDx8TF8fHyMqKgoIykpydi/f7+9Tfv27Y2GDRtecVuGDBliSDI6d+5c5vTL3YZ74MABQ5Ihydi0aVOZ8x47dsxISkoywsPDDQ8PDyMkJMTo1KmT8eqrr9rblNxyu2zZMod5L3fb/qZNm4y7777b8PX1NXx8fIzGjRsbc+bMsU8v6zbfDz74wGjcuLFRuXJlo3bt2saLL75ovP7662Xernupn376yUhKSjKioqIMHx8fw8/Pz2jZsqWxdOnSUm03bNhgxMfHG35+fkblypWNyMhIY9iwYca2bdsc2r399ttGVFSUYbVajUaNGhkffPCB0bdvXyMqKsqh3fHjx42+ffsa3t7eRtWqVY0HH3zQ+Oqrr8q89dzHx6dUPWXth8v54IMPjNatWxteXl6GzWYzWrRoYbz11lsO6/j1ref/+te/jHr16hlWq9WIiooyFixYUGqd69evN3r16mWEhYUZnp6eRlhYmDFo0CDjm2++cVhWYWGh8eKLLxoNGzY0rFarUbVqVSM2NtaYPHmykZub+5v1v/LKK0adOnUMq9VqNGvWzNi4caPRvn17h1vPr2U913Lr+fTp042XX37ZCA8PN6xWq3HnnXfaHxNRojy3npfYsWOH0adPH6NatWqG1Wo1IiIijP79+xvr1693aPfss88aNWrUMNzc3Eod11fzXgHXZDGM6+y1CLiYZ555RpMnT9bx48ftDwbD70PTpk0VGBiotLQ0Z5cCwIXQZwfALefChQu6ePGiw7j09HTt2rVLHTp0cE5RAFwWfXYA3HJ+/PFHde7cWffdd5/CwsK0b98+zZ8/XyEhIaUeCggAhB0At5yqVasqNjZW//znP3X8+HH5+Pioe/fueuGFF1StWjVnlwfAxdBnBwAAmBp9dgAAgKkRdgAAgKnRZ0e/fO/JkSNH5OvrW6GPPwcAADeOYRg6c+aMwsLCSj2Q9VKEHUlHjhxxuS+vAwAAV+eHH35QzZo1LzudsCPJ19dX0i87y2azObkaAABwNfLy8hQeHm7/HL8cwo7+/zfd2mw2wg4AALeY3+qCQgdlAABgaoQdAABgaoQdAABgavTZAQDAhRQVFenChQvOLsMleHh4yN3d/bqXQ9gBAMAFGIah7OxsnT592tmluBR/f3+FhIRc13PwCDsAALiAkqATFBQkb2/v3/1Dbg3D0Llz55STkyNJCg0NLfeyCDsAADhZUVGRPehUq1bN2eW4DC8vL0lSTk6OgoKCyn1Jiw7KAAA4WUkfHW9vbydX4npK9sn19GMi7AAA4CJ+75euylIR+4SwAwAATI2wAwAASqldu7ZmzZp1Q9eRnp4ui8Vyw+9Ao4MyAAAo5YsvvpCPj4+zy6gQhB0AAH5HCgsL5enp+ZvtAgMDb0I1NweXsQAAcHHvvPOOYmJi5OXlpWrVqqlz587Kz89Xhw4dNG7cOIe2vXv31rBhw+zDtWvX1rPPPquhQ4fKZrNp9OjRat26tSZMmOAw3/Hjx+Xh4aGNGzfa5yu5jDV48GANGDDAof2FCxdUvXp1LVq0SJJUXFys1NRU1alTR15eXmrSpIneeecdh3k++ugj3X777fLy8tJdd92l77777vp3zlUg7AAA4MKOHj2qQYMGacSIEdq7d6/S09PVp08fGYZx1ct46aWX1KRJE+3YsUNPP/20hgwZorffftthGUuWLFFYWJjuvPPOUvMPGTJEK1eu1NmzZ+3j1q5dq3PnzumPf/yjJCk1NVWLFi3S/PnztWfPHo0fP1733XefMjIyJEk//PCD+vTpox49emjnzp164IEH9Je//KW8u+WacBkLAHDTxD6+yNkluITt04deddujR4/q4sWL6tOnjyIiIiRJMTEx17S+jh076tFHH7UP9+/fX+PGjdOmTZvs4Wbx4sUaNGhQmbd6x8fHy8fHR8uXL9f9999vb9+zZ0/5+vqqoKBAU6dO1ccff6y4uDhJ0m233aZNmzbpH//4h9q3b6958+YpMjJSL7/8siSpfv362r17t1588cVr2pby4MwOAAAurEmTJurUqZNiYmLUr18/vfbaazp16tQ1LaNZs2YOw4GBgerSpYvefPNNSVJWVpYyMzM1ZMiQMuevVKmS+vfvb2+fn5+v999/397+4MGDOnfunO6++25VqVLF/lq0aJEOHTokSdq7d69atmzpsNySYHSjcWYHAAAX5u7urrS0NG3evFnr1q3TnDlz9Ne//lVbt26Vm5tbqctZZT1puKy7qoYMGaI///nPmjNnjhYvXqyYmJgrnjEaMmSI2rdvr5ycHKWlpcnLy0tdu3aVJPvlrQ8//FA1atRwmM9qtV7zNlc0zuwAAODiLBaL2rRpo8mTJ2vHjh3y9PTU8uXLFRgYqKNHj9rbFRUV6auvvrqqZfbq1Uvnz5/XmjVrtHjx4sue1SnRunVrhYeHa8mSJXrzzTfVr18/eXh4SJKio6NltVp1+PBh1a1b1+EVHh4uSWrQoIE+//xzh2Vu2bLlWnZDuXFmBwAAF7Z161atX79eXbp0UVBQkLZu3arjx4+rQYMG8vHxUXJysj788ENFRkZqxowZV/2APh8fH/Xu3VtPP/209u7dq0GDBv3mPIMHD9b8+fP1zTffaMOGDfbxvr6+euyxxzR+/HgVFxerbdu2ys3N1WeffSabzabExEQ99NBDevnll/X444/rgQce0Pbt27Vw4cJy7pVrQ9gBAMCF2Ww2bdy4UbNmzVJeXp4iIiL08ssvKyEhQRcuXNCuXbs0dOhQVapUSePHj9ddd9111cseMmSIunXrpnbt2qlWrVpX1f75559XRESE2rRp4zDt2WefVWBgoFJTU/Xtt9/K399ff/jDH/Tkk09KkmrVqqV3331X48eP15w5c9SiRQtNnTpVI0aMuLYdUg4W41ruXTOpvLw8+fn5KTc3VzabzdnlAIBpcTfWL359N9b58+eVlZWlOnXqqHLlyk6qyjVdad9c7ec3fXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpOfW7sebNm6d58+bpu+++kyQ1bNhQEydOVEJCgiSpQ4cOysjIcJjnwQcf1Pz58+3Dhw8f1pgxY7RhwwZVqVJFiYmJSk1NVaVKfO0XAMC8buZXb/z66y2u1ty5czV9+nRlZ2erSZMm9u/Eutmcmghq1qypF154QfXq1ZNhGHrjjTfUq1cv7dixQw0bNpQkjRo1SlOmTLHP4+3tbf+5qKhI3bt3V0hIiDZv3qyjR49q6NCh8vDw0NSpU2/69gAAgF8sWbJEycnJmj9/vlq2bKlZs2YpPj5e+/fvV1BQ0E2txamXsXr06KFu3bqpXr16uv322/X888+rSpUq2rJli72Nt7e3QkJC7K9Lv+hr3bp1+vrrr/Wf//xHTZs2VUJCgp599lnNnTtXhYWFztgkAAAgacaMGRo1apSGDx+u6OhozZ8/X97e3nr99ddvei0u02enqKhIb7/9tvLz8xUXF2cf/+abb6p69epq1KiRUlJSdO7cOfu0zMxMxcTEKDg42D4uPj5eeXl52rNnz2XXVVBQoLy8PIcXAACoGIWFhdq+fbs6d+5sH+fm5qbOnTsrMzPzptfj9I4tu3fvVlxcnM6fP68qVapo+fLlio6OliQNHjxYERERCgsL05dffqkJEyZo//79eu+99yRJ2dnZDkFHkn04Ozv7sutMTU3V5MmTb9AWAQDw+/bTTz+pqKiozM/offv23fR6nB526tevr507dyo3N1fvvPOOEhMTlZGRoejoaI0ePdreLiYmRqGhoerUqZMOHTqkyMjIcq8zJSVFycnJ9uG8vDyFh4df13YAAADX5PTLWJ6enqpbt65iY2OVmpqqJk2aaPbs2WW2bdmypSTp4MGDkqSQkBAdO3bMoU3JcEhIyGXXabVaZbPZHF4AAKBiVK9eXe7u7mV+Rl/p8/lGcXrY+bXi4mIVFBSUOW3nzp2SpNDQUElSXFycdu/erZycHHubtLQ02Ww2+6UwAABwc3l6eio2Nlbr16+3jysuLtb69esd+uXeLE69jJWSkqKEhATVqlVLZ86c0eLFi5Wenq61a9fq0KFDWrx4sbp166Zq1arpyy+/1Pjx49WuXTs1btxYktSlSxdFR0fr/vvv17Rp05Sdna2nnnpKSUlJslqtztw0AAB+15KTk5WYmKhmzZqpRYsWmjVrlvLz8zV8+PCbXotTw05OTo6GDh2qo0ePys/PT40bN9batWt1991364cfftDHH39s3znh4eHq27evnnrqKfv87u7uWrVqlcaMGaO4uDj5+PgoMTHR4bk8AADg5hswYICOHz+uiRMnKjs7W02bNtWaNWtKdVq+GSyGYRg3fa0uJi8vT35+fsrNzaX/DgDcQDfzqb+u7NdPJD5//ryysrJUp04dVa5c2UlVuaYr7Zur/fx2uT47AAAAFYmwAwAATI2wAwAATI2wAwAATI2wAwAATI2wAwAATI2wAwAATI2wAwAATI2wAwAATI2wAwAATM2p340FAADK5/CUmJu2rloTd1/zPBs3btT06dO1fft2HT16VMuXL1fv3r0rvrirwJkdAABQ4fLz89WkSRPNnTvX2aVwZgcAAFS8hIQEJSQkOLsMSZzZAQAAJkfYAQAApkbYAQAApkbYAQAApkbYAQAApsbdWAAAoMKdPXtWBw8etA9nZWVp586dCggIUK1atW5qLYQdAABQ4bZt26a77rrLPpycnCxJSkxM1MKFC29qLYQdAABuQeV5qvHN1KFDBxmG4ewyJNFnBwAAmBxhBwAAmBphBwAAmBphBwAAmBphBwAAF+EqHXpdSUXsE8IOAABO5uHhIUk6d+6ckytxPSX7pGQflQe3ngMA4GTu7u7y9/dXTk6OJMnb21sWi8XJVTmXYRg6d+6ccnJy5O/vL3d393Ivi7ADAIALCAkJkSR74MEv/P397fumvAg7AAC4AIvFotDQUAUFBenChQvOLscleHh4XNcZnRKEHQAAXIi7u3uFfMDj/6ODMgAAMDXCDgAAMDXCDgAAMDXCDgAAMDXCDgAAMDWnhp158+apcePGstlsstlsiouL0+rVq+3Tz58/r6SkJFWrVk1VqlRR3759dezYMYdlHD58WN27d5e3t7eCgoL0+OOP6+LFizd7UwAAgItyatipWbOmXnjhBW3fvl3btm1Tx44d1atXL+3Zs0eSNH78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JurUqZNiYmLUr18/vfbaazp16pQkKSAgQMOGDVN8fLx69Oih2bNn6+jRoxW/sQBuOMIOgFtG5cqVr6n99OnTNXv2bE2YMEEbNmzQzp07FR8fr8LCQkmSu7u70tLStHr1akVHR2vOnDmqX7++srKyJEkLFixQZmamWrdurSVLluj222/Xli1bKny7ANxYhB0ALmfr1q0Ow1u2bFG9evXUpEkTFRcXKyMj46qW89lnn6lXr16677771KRJE91222365ptvHNpYLBa1adNGkydP1o4dO+Tp6anly5fbp99xxx1KSUnR5s2b1ahRIy1evPj6NxDATUXYAeByDh8+rOTkZO3fv19vvfWW5syZo0ceeUS1a9dWYmKiRowYoRUrVigrK0vp6elaunRpmcupV6+e0tLStHnzZu3du1cPPvigjh07Zp++detWTZ06Vdu2bdPhw4f13nvv6fjx42rQoIGysrKUkpKizMxMff/991q3bp0OHDigBg0a3KzdAKCCcDcWAJczdOhQ/fzzz2rRooXc3d31yCOPaPTo0ZKkefPm6cknn9Sf/vQnnThxQrVq1dKTTz5Z5nKeeuopffvtt4qPj5e3t7dGjx6t3r17Kzc3V5Jks9m0ceNGzZo1S3l5eYqIiNDLL7+shIQEHTt2TPv27dMbb7yhEydOKDQ0VElJSXrwwQdv2n4AUDG4GwuAS+nQoYOaNm2qWbNmObsUACbBZSwAAGBqhB0AAGBqXMYCAACmxpkdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgav8PPacxXGnbzhsAAAAASUVORK5CYII=\n"
          },
          "metadata": {}
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "sns.histplot(data=titanic, x=\"age\", hue=\"survived\", kde=True, bins=30)\n",
        "plt.title(\"Distribución de edad según supervivencia\")\n",
        "plt.show()"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 472
        },
        "id": "qhg00XiTm-Lw",
        "outputId": "90f79e2b-be00-4956-840d-b8c8019b0daa"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 640x480 with 1 Axes>"
            ],
            "image/png": "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Pj9Xe/1BeYI3btw4tm3bxgMPPEBkZCSHDx/mgw8+4MSJE/z0008V+951110sXryYO+64gz59+rB582bGjh17xRiqY9u2bSxfvpyHHnoIFxcXPvroIyZOnEhCQgJeXl6XbffFF1/w6KOPcsstt/DYY49RXFzMoUOH2LVrF7fffnuNYtm8eTOLFi3i0UcfRa/X88knn3Ddddexe/duOnbsCEBqaip9+vSpSHx8fHxYtWoV9957L3l5eTz++OOVjvnaa6/h4ODAk08+idlspn379rRs2ZLFixczffr0SvsuWrQIDw8PRo8efcn4Jk+ezJ133smePXsqvgRBebKwc+fOSq+dN954gxdeeIFJkyZx3333kZ6ezscff8ygQYPYv39/pZq17OxsrrvuOiZMmMCkSZNYunQpzzzzDJ06dWLMmDFAzT8P9uzZwx9//MGUKVMIDg7mzJkzfPrppwwZMoRjx45hNBqr/fsR1aAI8ad58+YpgLJnz57L7uPm5qZ069at4vZLL72kXPwy+uCDDxRASU9Pv+wx9uzZowDKvHnzqtw3ePBgBVDmzp17yfsGDx5ccXvjxo0KoAQFBSl5eXkV2xcvXqwAyocfflixLSwsTJk+ffpVj/nVV18pgPL+++9X2ddqtVb8H1Beeumlitvjx49XHBwclFOnTlVsS0pKUlxcXJRBgwZVbLvwHI8YMaLS8Z544glFo9EoOTk5Vc57sa5duyoBAQGV9vv9998VQAkLC6vYtnXrVgVQvvvuu0rtV69efcntfzd8+HClU6dOSnFxcaXH369fP6V169YV2x5//HEFUHbt2lWxLS0tTXFzc1MAJT4+vmK7yWSqcp4ZM2YoRqOx4jwlJSWKr6+v0rVrV8VsNlfs9/nnnytApd/VpVTn9fftt98qarVa2bp1a6Xtc+fOVQBl+/btiqIoSnR0tAIojz/+eKX97rrrriq//+nTp1d6/i/4+/tDUcpfOw4ODsrJkycrth08eFABlI8//viKj++mm25SOnTocMV9bI0FUPbu3Vux7ezZs4qjo6Ny8803V2y79957lYCAACUjI6NS+ylTpihubm4Vv9sL78mWLVtW+X0/++yzik6nU7Kysiq2mc1mxd3dXbnnnnsqtl14j1x47eTm5ip6vV755z//Wel477zzjqJSqZSzZ88qiqIoZ86cUTQajfLGG29U2u/w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nJxc5f6Lh4lff/317Ny5k927d1e6/+89QRe+/V78HJaUlPDJJ59U2q9Hjx74+Pgwd+7cSr+r+fPnV+v1Up3X36RJkzh//jxffPFFlX2LioooLCwE/krY/x7jxx9/XKVdREQEubm5HDp0qGJbcnLyZYfG11RmZmal2w4ODrRv3x5FUSgtLa1RLDt27KhUt5GYmMjPP//MqFGjKuZ0mThxIsuWLePIkSNV2ld32gAo71Hq1KkTixYtYtGiRQQEBFRKbK9k8uTJJCUl8b///Y+DBw9WqauZMGECGo2GV155pcp7VVGUKs9dddTk8wDKX+9/v//jjz+uca+YuDLpkRFVrFq1itjYWMrKykhNTWXDhg2sXbuWsLAwfvnllytO/vTqq6+yZcsWxo4dS1hYGGlpaXzyyScEBwczYMAAoPyD1t3dnblz5+Li4oKTkxO9e/e+5HX16vD09GTAgAHcfffdpKamMnv2bFq1alVpiPh9993H0qVLue6665g0aRKnTp1iwYIFVYZP3nnnnXzzzTfMmjWL3bt3M3DgQAoLC1m3bh0PPfQQN9100yVjeP311yvmL3nooYfQarV89tlnmM3mS85NUVNvvfUWY8eOZcCAAdxzzz1kZWVVzCtSUFBQsd/gwYOZMWMGb731FgcOHGDUqFHodDri4uJYsmQJH374IbfccstlzzNnzhwGDBhAp06duP/++2nZsiWpqans2LGDc+fOcfDgQQCefvppvv32W6677joee+yxiuHXYWFhlf6Q9uvXDw8PD6ZPn86jjz6KSqXi22+/rfJhr9PpeP3115kxYwbDhg1j8uTJxMfHM2/evGrVyFTn9XfHHXewePFiHnzwQTZu3Ej//v2xWCzExsayePFi1qxZQ48ePYiKimLixInMnj2bzMzMiuHXJ06cACpfwpkyZQrPPPMMN998M48++igmk4lPP/2UNm3a1Glx56hRo/D396d///74+fkRExPDf//7X8aOHVtRu2ZrLB07dmT06NGVhl8DFZeqAP7zn/+wceNGevfuzf3330/79u3Jyspi3759rFu37pIJ5OVMnjyZF198EUdHR+69995qT5R3/fXX4+LiwpNPPlmRXF0sIiKC119/nWeffZYzZ84wfvx4XFxciI+P58cff+SBBx7gySefrHacUPPPgxtuuIFvv/0WNzc32rdvz44dO1i3bt0Vh9aLWmjoYVKi8bow7PHCj4ODg+Lv76+MHDlS+fDDDysNcb7g70M6169fr9x0001KYGCg4uDgoAQGBiq33XabcuLEiUrtfv75Z6V9+/aKVqutNBR78ODBlx1eernh199//73y7LPPKr6+vorBYFDGjh1bMSTzYu+9954SFBSk6PV6pX///srevXurHFNRyodOPv/880p4eLii0+kUf39/5ZZbbqk0tJq/DbdUFEXZt2+fMnr0aMXZ2VkxGo3K0KFDlT/++OOSz/Hfh7hfeCwbN2685GO/2LJly5TIyEhFr9cr7du3V5YvX37ZIbeff/65EhUVpRgMBsXFxUXp1KmT8vTTTytJSUlXPc+pU6eUO++8U/H391d0Op0SFBSk3HDDDcrSpUsr7Xfo0CFl8ODBiqOjoxIUFKS89tprypdfflll+PX27duVPn36KAaDQQkMDFSefvppZc2aNZd83J988okSHh6u6PV6pUePHsqWLVsu+bv6u+q+/kpKSpS3335b6dChg6LX6xUPDw8lKipKeeWVV5Tc3NyK/QoLC5WZM2cqnp6eirOzszJ+/Hjl+PHjCqD85z//qXTM33//XenYsaPi4OCgtG3bVlmwYMFlhzzPnDmzSuyXmyLgYp999pkyaNAgxcvLS9Hr9UpERITy1FNPVYq5JrEsWLBAad26taLX65Vu3bpd8nWYmpqqzJw5UwkJCal4XwwfPlz5/PPPK/a58DpesmTJZR9DXFxcxWfMtm3bqtz/9+HXF5s6dWrF9AWXs2zZMmXAgAGKk5OT4uTkpLRr106ZOXOmcvz48Yp9Lvc5c6n3UU0+D7Kzs5W7775b8fb2VpydnZXRo0crsbGx1fodC9upFKWOqguFEOIacODAAbp168aCBQuueJm1KVCpVMycOfOSl06EaCqkRkYIIS6jqKioyrbZs2ejVqurXdshhKhfUiMjhBCX8c477xAdHc3QoUPRarWsWrWKVatW8cADD9TJSDQhRO1JIiOEEJfRr18/1q5dy2uvvUZBQQGhoaG8/PLLPP/88/YOTQjxJ6mREUIIIUSTJTUyQgghhGiyJJERQgghRJNl1xqZl19+udKkS1C+2NyFlXCLi4v55z//yQ8//IDZbGb06NF88skn+Pn5VfscVquVpKQkXFxc6nxqfCGEEELUD0VRyM/PJzAw8IoTJ9q92LdDhw6sW7eu4vbFi4c98cQTrFixgiVLluDm5sbDDz/MhAkTbFrtNSkpSUYXCCGEEE1UYmIiwcHBl73f7omMVqvF39+/yvbc3Fy+/PJLFi5cWLF43Lx584iMjGTnzp306dOnWse/MG13YmJinax3I4QQQoj6l5eXR0hISMXf8cuxeyITFxdHYGAgjo6O9O3bl7feeovQ0FCio6MpLS2ttNpqu3btCA0NZceOHZdNZMxmc8XicEDFYoKurq6SyAghhBBNzNXKQuxa7Nu7d2/mz5/P6tWr+fTTT4mPj2fgwIHk5+eTkpKCg4MD7u7uldr4+fmRkpJy2WO+9dZbuLm5VfzIZSUhhBCi+bJrj8yYMWMq/t+5c2d69+5NWFgYixcvxmAw1OiYzz77LLNmzaq4faFrSgghhBDNT6Mafu3u7k6bNm04efIk/v7+lJSUkJOTU2mf1NTUS9bUXKDX6ysuI8nlJCGEEKJ5s3uNzMUKCgo4deoUd9xxB1FRUeh0OtavX8/EiRMBOH78OAkJCfTt29fOkQohhBC2s1gslJaW2juMRkGn06HRaGp9HLsmMk8++SQ33ngjYWFhJCUl8dJLL6HRaLjttttwc3Pj3nvvZdasWXh6euLq6sojjzxC3759qz1iSQghhGgMFEUhJSWlylWGa527uzv+/v61mufNronMuXPnuO2228jMzMTHx4cBAwawc+dOfHx8APjggw9Qq9VMnDix0oR4QgghRFNyIYnx9fXFaDRe8xO0KoqCyWQiLS0NgICAgBofq9kvGpmXl4ebmxu5ublSLyOEEKLBWSwWTpw4ga+vL15eXvYOp1HJzMwkLS2NNm3aVLnMVN2/342q2FcIIYRobi7UxBiNRjtH0vhceE5qUzckiYwQQgjRAK71y0mXUhfPiSQyQgghhGiyJJERQgghrkEtWrRg9uzZ9XqOTZs2oVKp6nW0VqOaR0YIIYQQDWPPnj04OTnZO4xak0RGCCGEaEZKSkpwcHC46n4Xpjpp6uTSkhBCCGFnS5cupVOnThgMBry8vBgxYgSFhYUMGTKExx9/vNK+48eP56677qq43aJFC1577TXuvPNOXF1deeCBB+jXrx/PPPNMpXbp6enodDq2bNlS0e7CpaXbb7+dyZMnV9q/tLQUb29vvvnmGwCsVitvvfUW4eHhGAwGunTpwtKlSyu1WblyJW3atMFgMDB06FDOnDlT+yfnKqRHRjR7CQkJZGRk1Kitt7c3oaGhdRyREEL8JTk5mdtuu4133nmHm2++mfz8fLZu3Yot07z93//9Hy+++CIvvfQSAKtXr+add97hP//5T8XIoEWLFhEYGMjAgQOrtJ86dSq33norBQUFODs7A7BmzRpMJhM333wzAG+99RYLFixg7ty5tG7dmi1btjBt2jR8fHwYPHgwiYmJTJgwgZkzZ/LAAw+wd+9e/vnPf9b26bkqSWREs5aQkEC7yEiKTKYatTcYjcTGxEgyI4SoN8nJyZSVlTFhwgTCwsIA6NSpk03HGDZsWKWkYdKkSTz++ONs27atInFZuHAht9122yWHPI8ePRonJyd+/PFH7rjjjor9x40bh4uLC2azmTfffJN169ZVrHfYsmVLtm3bxmeffcbgwYP59NNPiYiI4L333gOgbdu2HD58mLffftv2J8UGksiIZi0jI4Mik4mpz7yLX2iETW1TE07x3dtPkZGRIYmMEKLedOnSheHDh9OpUydGjx7NqFGjuOWWW/Dw8Kj2MXr06FHpto+PD6NGjeK7775j4MCBxMfHs2PHDj777LNLttdqtUyaNInvvvuOO+64g8LCQn7++Wd++OEHAE6ePInJZGLkyJGV2pWUlNCtWzcAYmJi6N27d6X7G2KRZ0lkxDXBLzSC4NYd7B2GEEJUodFoWLt2LX/88Qe///47H3/8Mc8//zy7du1CrVZXucR0qVlwLzX6aOrUqTz66KN8/PHHLFy4kE6dOl2xp2fq1KkMHjyYtLQ01q5di8Fg4LrrrgOgoKAAgBUrVhAUFFSpnV6vt/kx1yUp9hVCCCHsTKVS0b9/f1555RX279+Pg4MDP/74Iz4+PiQnJ1fsZ7FYOHLkSLWOedNNN1FcXMzq1atZuHAhU6dOveL+/fr1IyQkhEWLFvHdd99x6623otPpAGjfvj16vZ6EhARatWpV6SckJASAyMhIdu/eXemYO3futOVpqBHpkRFCCCHsaNeuXaxfv55Ro0bh6+vLrl27SE9PJzIyEicnJ2bNmsWKFSuIiIjg/fffr/bkck5OTowfP54XXniBmJgYbrvttqu2uf3225k7dy4nTpxg48aNFdtdXFx48skneeKJJ7BarQwYMIDc3Fy2b9+Oq6sr06dP58EHH+S9997jqaee4r777iM6Opr58+fX8FmpPklkhBBCCDtydXVly5YtzJ49m7y8PMLCwnjvvfcYM2YMpaWlHDx4kDvvvBOtVssTTzzB0KFDq33sqVOncv311zNo0KBq1fpNnTqVN954g7CwMPr371/pvtdeew0fHx/eeustTp8+jbu7O927d+e5554DIDQ0lGXLlvHEE0/w8ccf06tXL958803uuece254QG6kUW8Z3NUHVXQZcNE/79u0jKiqKWXOW21wjcy7uKO/PnEB0dDTdu3evpwiFEM1dcXEx8fHxhIeH4+joaO9wGpUrPTfV/fstNTJCCCGEaLIkkRFCCCFEkyWJjBBCCCGaLElkhBBCCNFkSSIjhBBCiCZLEhkhhBBCNFmSyAghhBCiyZJERgghhBBNliQyQgghhGiyZIkCIYQQopFJSEggIyOjwc7n7e1drSUMGiNJZIQQQohGJCEhgXaRkRSZTA12ToPRSGxMjM3JzJw5c3j33XdJSUmhS5cuFWssNSRJZIQQQohGJCMjgyKTianPvItfaES9ny814RTfvf0UGRkZNiUyixYtYtasWcydO5fevXsze/ZsRo8ezfHjx/H19a3HiCuTREYIIYRohPxCI2xe7LYhvf/++9x///3cfffdAMydO5cVK1bw1Vdf8a9//avB4pBiXyGEEELYpKSkhOjoaEaMGFGxTa1WM2LECHbs2NGgsUgiI4QQQgibZGRkYLFY8PPzq7Tdz8+PlJSUBo1FEhkhhBBCNFmSyAghhBDCJt7e3mg0GlJTUyttT01Nxd/fv0FjkURGCCGEEDZxcHAgKiqK9evXV2yzWq2sX7+evn37NmgsMmpJCCGEEDabNWsW06dPp0ePHvTq1YvZs2dTWFhYMYqpoUgiI4QQQjRCqQmnGvV5Jk+eTHp6Oi+++CIpKSl07dqV1atXVykArm+SyAghhBCNiLe3Nwajke/efqrBzmkwGvH29ra53cMPP8zDDz9cDxFVnyQyQgghRCMSGhpKbEyMrLVUTZLICCGEEI1MaGhok00sGpqMWhJCCCFEkyWJjBBCCCGaLElkhBBCCNFkSSIjhBBCiCZLEhkhhBBCNFmSyAghhBCiyZJERgghhBBNlswjI4QQQjQyCQkJMiFeNUkiI4QQQjQiCQkJREa2w2QqarBzGo0GYmJiq53MbNmyhXfffZfo6GiSk5P58ccfGT9+fP0GeRmSyAghhBCNSEZGBiZTEQuem0RkqE+9ny8mIZ1pby4mIyOj2olMYWEhXbp04Z577mHChAn1HOGVSSIjhBBCNEKRoT50bxNk7zAuacyYMYwZM8beYQBS7CuEEEKIJkwSGSGEEEI0WXJpSYiriImJqVG7pjwKQAghmgpJZIS4jLysdACmTZtWo/YGo5HYmBhJZoQQoh5JIiPEZRQV5AEwdsbztO0cZVPb1IRTfPf2UzaNAhBCCGE7SWSEuAqvwDCCW3ewdxhCCNFoFBQUcPLkyYrb8fHxHDhwAE9Pzwb/8iaJjBBCCNEIxSSkN9rz7N27l6FDh1bcnjVrFgDTp09n/vz5dRVatUgiI4QQQjQi3t7eGI0Gpr25uMHOaTQa8Pb2rvb+Q4YMQVGUeoyo+iSREUIIIRqR0NBQYmJiZa2lapJERgghhGhkQkNDm2xi0dBkQjwhhBBCNFmSyAghhBCiyZJERgghhGgAjaU4tjGpi+dEEhkhhBCiHul0OgBMJpOdI2l8LjwnF56jmmg0xb7/+c9/ePbZZ3nssceYPXs2AMXFxfzzn//khx9+wGw2M3r0aD755BP8/PzsG6wQQghRTRqNBnd3d9LS0gAwGo2oVCo7R2VfiqJgMplIS0vD3d0djUZT42M1ikRmz549fPbZZ3Tu3LnS9ieeeIIVK1awZMkS3NzcePjhh5kwYQLbt2+3U6RCCCGE7fz9/QEqkhlRzt3dveK5qSm7JzIFBQVMnTqVL774gtdff71ie25uLl9++SULFy5k2LBhAMybN4/IyEh27txJnz59Lnk8s9mM2WyuuJ2Xl1e/D0AIIYS4CpVKRUBAAL6+vpSWlto7nEZBp9PVqifmArsnMjNnzmTs2LGMGDGiUiITHR1NaWkpI0aMqNjWrl07QkND2bFjx2UTmbfeeotXXnml3uMWQgghbKXRaOrkj7f4i12LfX/44Qf27dvHW2+9VeW+lJQUHBwccHd3r7Tdz8+PlJSUyx7z2WefJTc3t+InMTGxrsMWQgghRCNhtx6ZxMREHnvsMdauXYujo2OdHVev16PX6+vseEIIIYRovOzWIxMdHU1aWhrdu3dHq9Wi1WrZvHkzH330EVqtFj8/P0pKSsjJyanULjU1tdaFQUIIIYRoHuzWIzN8+HAOHz5cadvdd99Nu3bteOaZZwgJCUGn07F+/XomTpwIwPHjx0lISKBv3772CFkIIYQQjYzdEhkXFxc6duxYaZuTkxNeXl4V2++9915mzZqFp6cnrq6uPPLII/Tt2/eyhb5CCCGEuLbYfdTSlXzwwQeo1WomTpxYaUI8IYQQQghoZInMpk2bKt12dHRkzpw5zJkzxz4BCWEnCQkJZGRk1Kitt7c3oaGhdRyREEI0To0qkRFClCcx7SIjKarhuiwGo5HYmBhJZoQQ1wRJZIRoZDIyMigymZj6zLv4hUbY1DY14RTfvf0UGRkZksgIIa4JksgI0Uj5hUYQ3LqDvcMQQohGza4z+wohhBBC1IYkMkIIIYRosiSREUIIIUSTJYmMEEIIIZosSWSEEEII0WRJIiOEEEKIJksSGSGEEEI0WZLICCGEEKLJkkRGCCGEEE2WJDJCCCGEaLIkkRFCCCFEkyWJjBBCCCGaLElkhBBCCNFkSSIjhBBCiCZLa+8AhGjKckwlnM0ycS67iILiMkosVlQq0Fu0uA+eztE0M12sChq1yt6hCiFEsySJjBA1kJJbzM74TM5mmi6zhxq3PrfywqYsZu9Zx609QrhvYDjezvoGjVMIIZo7SWSEsEFJmZWNx9OITckHQAUEuhsI9TTi5eyAg0aNRVE4ezaBbVs24R81kszCEuZuPsX8P+KZ3q8Fjw1vjdFB3npCCFEX5NNUiGpKyy9m5eEUcotKUamgnb8LvVp44m50qLKvNsvKzytns/KVaeQYgpiz8SQHz+Xy2ebTrDiUzJs3d2JQGx87PAohhGheJJERohrOZxfx04HzlFkVnPVaxnT0J9DdcNV2WrWKUR38Gdnejw2xabz481HOZRdx51e7mTG4JU+NaotWIzX3QghRU/IJKsRV5FgcKpKYEA8DU3uHViuJuZhKpWJ4pB+/PzGI6X3DAPhs82mmfbmLzAJzfYQthBDXBElkhLgCnW84h82elFkVQj2NjOsSiKNOU+PjOem1vHJTR+bc3h0nBw07T2dxy9wdJGZdrmhYCCHElUgiI8RllKLG9+bnsaImxMPAjZ0D6uwy0NjOAfz8cH+C3A3EZxQy4dM/OJaUVyfHFkKIa4kkMkJcglVROE4QWnd/HFVlXN+p7pKYC1r5urD8oX6083chPd/M7f/bSUyyJDNCCGELSWSEuITos9nk4Iy1tJgO+qxaXU66Ej9XRxbN6EuXEHdyTKVM+98uEnNL6+VcQgjRHEkiI8TfZBWWsOt0Vvn/f/8EZ3VZvZ7PzaDjm7t70THIlczCEl7anIXG1bdezymEEM2FDL8W4iKKorA+JhWLouBBAWePbIBbp9T7ed2MOr69pzdTPt/J8dR8fG99mRJrzY8XExNTo3be3t6EhobW/MRCCNHAJJER4iKHz+eSlFuMTqMiwpLMgQY8t4eTA/Pv6cnY2ZvI8g5lR7qV0NZWtOrqd5zmZaUDMG3atBrFYDAaiY2JkWRGCNFkSCIjxJ+KSy38cSoTgH4R3lhOHGvwGALcDLww0JPHfj1LBk5sjE1nRKQvKlX1Fp0sKigvFh4743nado6y6dypCaf47u2nyMjIkERGCNFkSCIjxJ/2ns3GXGbFy8mBzsFu7D9hnzjC3HWk//Qf/Ca/yrHkPHxd9HQJcbfpGF6BYQS37lA/AQohRCMixb5CAHnFpRxIzAGgfytv1NXsAakvxWf208ndAsDmuHTOZcuEeUIIcSmSyAgB7DydicWqEOxuoIWX0d7hANDaxUpbPxcUBVYfScFUUr+jp4QQoimSREZc87JNJcQk5wPQv7V3tetR6ptKBcMjffF0cqCwxMKao6koimLvsIQQolGRREZc86LPZgMQ7u2Ev6ujnaOpTKdRc31Hf7RqFQlZJvacybZ3SEII0ahIIiOuaQXFZRXLAvQI87BzNJfm5axnaNvyCfJ2xWeSmlds54iEEKLxkERGXNP2JWZjVSDI3UCgu8He4VxWZIALrXydsSqw9lgqZZZazJYnhBDNiCQy4ppVXGrhyPlcoPH2xlygUqkY1tYXg05DZmEJO/9cQkEIIa51ksiIa9bRpDxKLQrezg6ENZKRSldicNAwIrL8ElN0QjZJOUV2jkgIIexPEhlxTVIUhUPncgDoGuLeaEYqXU1LH2ciA1wA+P1YKiVlcolJCHFtk0RGXJPOZprIKy5Dr1XTxs/F3uHYZHAbH5z1WnKLStl+MsPe4QghhF1JIiOuSYf+rI1pH+CKTtO03gZ6rYaR7f2A8seRmCWz/gohrl1N6xNciDqQV1RKfEYhAJ2C3ewcTc2EehrpFFQe+4bYNBnFJIS4ZkkiI645h//sjQn1NOJhdLBzNDXXv5UXRgcNOUWlFZP6CSHEtUYSGXFNsSoKsSnlyxF0DHS1czS1o9dqGNTaB4A9Z7PJMZXYOSIhhGh4ksiIa0pilokCc3mRb7iPk73DqbU2fs6EehqxWBU2Hk9HVmISQlxrJJER15SYP3tj2vq5oFU3/Ze/SqViSFsfNH+uxZRB0xqBJYQQtdX0P8mFqCZzmYVTaQUARAY07ctKF/MwOtDzz5mJT+OPyqHxT+4nhBB1RRIZcc2ISyugzKrgYdTh56q3dzh1KqqFB+5GHaVocR90h73DEUKIBiOJjLhmxCaXX1aKDHBtMjP5VpdWra5YIdul2/UUWrV2jkgIIRqGJDLimlBUBuf/XJuonX/zrCMJ9TTiRR4qtYaTJW4oipT+CiGaP0lkxDXhnKn8pR7g5oiLo87O0dSfcNJQykrJseqJzyy0dzhCCFHvJJER14QLiUxTW1fJVo6Ukrf3JwC2xmVgsUqvjBCieZNERjR7GhcfskrKX+qtfJ3tHE39y92xGB0WckylFSt8CyFEcyWJjGj2jO0GABDkbsBZ3/yLYJWSIsIdygubd8VnUVRisXNEQghRfySREc2e05+JTGu/5t8bc4G/xoS3swPmMis7T2faOxwhhKg3zf/rqbimpRWWoQ9sCyi08qlZIpOdk0NycrJNbTIyMmp0rrqiUsGg1j4s33+ew+dz6Rzshpdz85o7RwghQBIZ0cztOW8GwFuv4GTjZaWiovLh2hs3bGDL7gM2tbUUZAHYnADVpRBPIxE+TpxKL2T7qUzGdQm0WyxCCFFfJJERzdqupGIAAg1Wm9uazeVJUI+2QfTs1tGmtrHH4/j1IOTk5Nh83rrUP8Kb0xmFxGcUcj67iCAPg13jEUKIuiaJjGi2ckwlHEsvASDAaHsic4GLUU+Al21rM6U6O9b4fHXJw8mBjoFuHD6fy7aTGUzqEdzsZjUWQlzbpNhXNFsbYtOwKlCSFo/zNZyy9w73RKtWkZJXzMn0AnuHI4QQdcquicynn35K586dcXV1xdXVlb59+7Jq1aqK+4uLi5k5cyZeXl44OzszceJEUlNT7RixaEp+P1r+WjHF7bRzJPblpNfSPbR8dew/TmXKJHlCiGbFrolMcHAw//nPf4iOjmbv3r0MGzaMm266iaNHjwLwxBNP8Ouvv7JkyRI2b95MUlISEyZMsGfIookoLrWw+UQ6AEXXeCID0D3MHYNOQ46plKNJufYORwgh6oxdO9xvvPHGSrffeOMNPv30U3bu3ElwcDBffvklCxcuZNiwYQDMmzePyMhIdu7cSZ8+fewRsmgitp/MoKjUgrdRzdnUU/YOx+70Wg29wj3ZfCKdXfFZtPN3xUErV5aFEE1fo6kcsFgsLFmyhMLCQvr27Ut0dDSlpaWMGDGiYp927doRGhrKjh07LpvImM3mitEmAHl5efUeu2h8NsSmAdAjwJFoO8YRHx/Pvn37bGoTExNTL7F0CnLjQGIOuUWlHEjMoVe4Z72cRwghGpLdE5nDhw/Tt29fiouLcXZ25scff6R9+/YcOHAABwcH3N3dK+3v5+dHSkrKZY/31ltv8corr9Rz1KIxUxSFjX8mMlGB9pkEriC/PIF+4YUXeOGFF2p2jIK6LczVqFX0benF6qMpRJ/NplOQGwYHTZ2eQwghGprdE5m2bdty4MABcnNzWbp0KdOnT2fz5s01Pt6zzz7LrFmzKm7n5eUREhJSF6GKJuJEagFJucXotWo6+tgnkTH/OZneoNsfpUf/ITa1jdm9mVVff0hxcXGdx9XGz5noBD3p+Waiz2YzoLV3nZ9DCCEakt0TGQcHB1q1agVAVFQUe/bs4cMPP2Ty5MmUlJSQk5NTqVcmNTUVf3//yx5Pr9ej18tU7NeyjcfLe2P6RXih19p3zhQ3v2CCW3ewqU1qQv3V9KhU5b0yvxxM4sC5HLqGul8TC2kKIZqvRlftZ7VaMZvNREVFodPpWL9+fcV9x48fJyEhgb59+9oxQtHYXaiPGdrO186RNE4tvIwEuDlisSrsic+ydzhCCFErdv0q9uyzzzJmzBhCQ0PJz89n4cKFbNq0iTVr1uDm5sa9997LrFmz8PT0xNXVlUceeYS+ffvKiCVxWblFpUSfzQZgaFtf0s/IH+q/U6lU9IvwYtm+8xxJyiUqzANXg87eYQkhRI3YNZFJS0vjzjvvJDk5GTc3Nzp37syaNWsYOXIkAB988AFqtZqJEydiNpsZPXo0n3zyiT1DFo3ctrgMLFaFVr7OhHgaST9j74gap2APIyGeBhKzitgZn8mo9pe/XCuEEI2ZXROZL7/88or3Ozo6MmfOHObMmdNAEYmm7kJ9zNC2PnaOpPHr19KbRVmJxCbn0yNMhmILIZqmRlcjI0RNKYrCtrgMAAa3kfqYq/F3c6SltxMKsPN0pr3DEUKIGpFERjQbp9ILSMkrH3bdo4WHvcNpEvpGeAEQl1ZATomsii2EaHokkRHNxtY/e2N6tvDEUScTvVWHt7OeNn7OABzNkedMCNH0SCIjmo3tJ8sTGZnkzTZ9WnqhUkFKsRqHwHb2DkcIIWwiiYxoFkotVnaeLh9qPaCVJDK28DA60D7Atfz/g+6wczRCCGEbSWREs3AgMYcCcxmeTn/9URbV1yvcEzUKjmFdOJRqvnoDIYRoJCSREc3ChfqYfhFeqNVStGorV0cd4c5WAL47nI+iKHaOSAghqkcSGdEsbItLB2Cg1MfUWDs3C9aSYuKySlkXk2bvcIQQolokkRFNXl5xKQfP5QLQX+pjasxRA/nRvwLw3u/HsVqlV0YI0fhJIiOavJ2nMrFYFcK9nQj2MNo7nCYtb/cyjDoVsSn5/HY42d7hCCHEVdUokWnZsiWZmVVnAs3JyaFly5a1DkoIW2y7MOxaemNqzVpcwE1tnQD4YO0JyixWO0ckhBBXVqNE5syZM1gslirbzWYz58+fr3VQQtjiwrIEMn9M3bihtROeTg7EZxSybN85e4cjhBBXZNOikb/88kvF/9esWYObm1vFbYvFwvr162nRokWdBSfE1ZzPKeJ0RiFqVfnEbqL2DDo1Dw2J4PUVMXy4Lo6bugbJTMlCiEbLpkRm/PjxAKhUKqZPn17pPp1OR4sWLXjvvffqLDghrmb7n70xXULccTPo7BxN8zGtTxhfbosnKbeYhbsSuGdAuL1DEkKIS7IpkbFay6+Xh4eHs2fPHry9pStf2NfWP+tjBkp9TCXZOTkkJ9tWrJuRkVHxf0edhkeHt+bZ5YeZs/Ekk3uG4KS36eNCCCEaRI0+meLj4+s6DiFsZrUqFesrybDrckVFRQBs3LCBLbsP2NTWUlC+xMOFBOiWqGA+23yKM5km5m2P5+Fhres0ViGEqAs1/oq1fv161q9fT1paWkVPzQVfffVVrQMT4mpiU/LJKizB6KChW6iHvcNpFMzm8uUFerQNome3jja1jT0ex68Hy0cfAug0ap4Y2YbHfjjAZ1tOM61PGO5Gh7oOWQghaqVGicwrr7zCq6++So8ePQgICEClkinhRcPbFV8+BUCPFp44aGVKpIu5GPUEeNm25lSqs2OVbTd2DuTTTaeITcnnsy2neeY6WR1bCNG41CiRmTt3LvPnz+eOO2SlXGE/u/5c7bp3uKedI2m+1GoVT41uy71f72Xe9nju7t8CX5eqCY8QQthLjb7GlpSU0K9fv7qORYhqs1qVih6ZPi0lkalPw9r50j3UneJSK3M2nLR3OEIIUUmNEpn77ruPhQsX1nUsQlRbXFoB2aZSHHVqOgW52zucZk2lUvHU6PJLSgt3J5CYZbJzREII8ZcaXVoqLi7m888/Z926dXTu3BmdrvL8He+//36dBCfE5VzojYkK82i29TE1GUKdl59fL7H0jfBiYGtvtsZl8OH6OP7v1i71ch4hhLBVjRKZQ4cO0bVrVwCOHDlS6T4p/BUN4a/6mOY3m29thlCXpJVPjVBWVlbXYfHkqLZsjctg+b5zPDi4Ja18Xer8HEIIYasaJTIbN26s6ziEqDZF+as+pjkW+tZmCPWGDYVEx4HFWnUttNrqEuLO6A5+rDmayv+tOcHcO6Lq/BxCCGErmapTNDmn0gvJKCjBQaumS4i7vcOpNzUZQm10rN95Xv45qi1rj6Wy+mgK+xKy6S7z9wgh7KxGiczQoUOveAlpw4YNNQ5IiKu50BvTLcRdFjNsYG38XJjYPZgl0ef4z8pYFs3oI5eThRB2VaNE5kJ9zAWlpaUcOHCAI0eOVFlMUoi6VlEfI6td28WsUW345WASu89ksT4mjRHt/ewdkhDiGlajROaDDz645PaXX36ZgoKCWgUkxJVcXB/TpxnWxzQFAW4G7hkQzqebTvH26liGtPVBq2meI8eEEI1fnX76TJs2TdZZEvXqbKaJ1DwzDhq1rK9kRw8OjsDdqCMurYCl0efsHY4Q4hpWp4nMjh07cHSU6ctF/bnQG9MlxA2Dg9TH2IubQcfDQ1sB8MG6ExSV1P0oKSGEqI4aXVqaMGFCpduKopCcnMzevXt54YUX6iQwIS6lOc8f09Tc0TeM+X+c4Vx2EV9tj2fmn4mNEEI0pBr1yLi5uVX68fT0ZMiQIaxcuZKXXnqprmMUArhQH3Oh0FfqY+xNr9Xw1Oi2AHy66RSZBWY7RySEuBbVqEdm3rx5dR2HEFd1LruI8zlFaNUqosKkPqYxuLFzIF9sPc2R83nMXhfHa+Ntm8BPCCFqq1Y1MtHR0SxYsIAFCxawf//+uopJiEvaebq8PqZTsBtGB5nLsTFQq1U8f317AL7bdZbjKfWz1pMQQlxOjRKZtLQ0hg0bRs+ePXn00Ud59NFHiYqKYvjw4aSnp9d1jEIA/HVZSepjGpW+EV5c18EfqwKvrziGoij2DkkIcQ2pUSLzyCOPkJ+fz9GjR8nKyiIrK4sjR46Ql5fHo48+WtcxCgH8NWJJ6mMan2evb4eDRs3WuAw2Hk+zdzhCiGtIjfrnV69ezbp164iMjKzY1r59e+bMmcOoUaPqLDghLthz9CSJWUWoVaDLSWDfvurNXRITE1PPkQmAMC8nJnb25Pv9Gfx72X5mj/ZBq67+0gXe3t6EhobWY4RCiOaqRomM1WpFp9NV2a7T6bBarbUOSoiLJSQkMOqOh3Eb9QhFSScY2OcGm48hM07Xr4SEBD6aMRbPO2aThAcjHnyV/Ohfqt3eYDQSGxMjyYwQwmY1SmSGDRvGY489xvfff09gYCAA58+f54knnmD48OF1GqAQGRkZqP3aANCxTQS3z1le7bYxuzez6usPKS4urq/wBOW/I1NuJn2dijkJ+I28nzun34W+GnMWpiac4ru3nyIjI0MSGSGEzWqUyPz3v/9l3LhxtGjRgpCQEAASExPp2LEjCxYsqNMAhQBwDCkf1tsuPJhgH+dqt0tNOFVfIYlL6BziRU62AxkFJSSofBja2tfeIQkhmrkaJTIhISHs27ePdevWERsbC0BkZCQjRoyo0+CEAMgqsqDzDAIUgtwN9g5HXIFKBYNa+7B8/3kOn8ulY6AbPi56e4clhGjGbBq1tGHDBtq3b09eXh4qlYqRI0fyyCOP8Mgjj9CzZ086dOjA1q1b6ytWcY06ll4CgLtOQa+T9ZUauxBPI619nVGAjcfTZDi2EKJe2ZTIzJ49m/vvvx9XV9cq97m5uTFjxgzef//9OgtOCICjfyYy3o7yB7GpGNjaG51GRXJuMceS8+wdjhCiGbPp0tLBgwd5++23L3v/qFGj+L//+79aByXExSoSGb2MiGvsMjIy0DgnAxDppeNQWglbT6ThZC1Er7n0cOyMjIyGDFEI0czYlMikpqZecth1xcG0WpnZV9Sp9Hwz5/LKAPDWS49MY5WcXJ68LF++HI3znxMWqlS4dB2D2cmdxZsOUHRqzyXbWgqyKh1DCCFsYVMiExQUxJEjR2jVqtUl7z906BABAQF1EpgQALv/XJagJC0efWiQnaMRl5OTkwPA0G4tade2dcX2tLICNhW4ow9oxdjWejy1VVfIjj0ex68H/zqGEELYwqYameuvv54XXnjhknNyFBUV8dJLL3HDDbZPVibE5VxYlqA48YidIxHV4eHsSICXa8VPFz8d7ZyLABWHSgPw83StdH+Alysezo72DlsI0YTZ1CPz73//m+XLl9OmTRsefvhh2rZtC0BsbCxz5szBYrHw/PPP10ug4tq063R5j4w58Qgw2r7BiBoZ4FXAaZOeNLOOw3kGurgV2TskIUQzYlMi4+fnxx9//ME//vEPnn322YphlSqVitGjRzNnzhz8/PzqJVBx7ckqLOF4aj4gPTJNmZPWSj/PAjZluLI905lwoxlXnRRuCyHqhs0T4oWFhbFy5Uqys7M5efIkiqLQunVrPDw86iM+cQ27UB8T7KrlrCnXztGI2ujsWsTxAkeSix3YkO7KTQE5qKq/pqQQQlxWjWb2BfDw8KBnz551GYsQlVyoj+ng48B2O8ciakelghE+eSxM9OJskZ7jBY60c6lcaxcfH8++fftsPrasnC3Eta3GiYwQ9e1CfUwHHwc7RyLqgqeDhV6eBezIcmFzhguhBjNGrUJBfvmEeS+88AIvvPCCzceVlbOFuLZJIiMapVxTKTEp5X/g2ksi02xEuZuIK3Ako0TH5kxXxvjlYi4qL/4ddPuj9Og/xKbjycrZQghJZESjtOdMFooCLb2d8DTI+krNhUYFI3zzWHTOkxMFjrR1/msEk5tfMMGtO9gxOiFEUySJjGiULtTH9G7pCZTZN5gGYCzJwK8gBt/C43R128Rz9xhpFfAjbklL0St/1ZKYVXrMaiOFahdytd7kaL1J1YWQ6hBCocbNjo+g+vz0ZXR3NxGd48SGdFdC1NLjJoSoOUlkRKO0688RS73DvUBJtXM0dU9tLSM4L5qIzM2E5O7Bq+jMX3cagBAtUAh/W5VBr5jRW8y4WrIJKE2odF+W1peQYEf0LTWoadzDm/t4FHCqUE9OqZYkrx7APHuHJIRooiSREY1OXnEpR86XD7fu3dKT5FPNJ5HxLYilY+pPtMlYh6HsryHlCiqyDC1IdY5k1+kcVq5eR4sBN9O+S3dK1I4oqFChoFPMGKwmnC25uJVl4FWWil9JAl5lqXiWpXGLL9xyhxPZZb9xJieNQ079yNL52/ERX5pWDaN9c1l83pM85zCMkYPtHZIQoomSREY0OtFnsrEqEOppJMDNQFNfSlCllNE6YwNRSQvwL4ip2G7SeXDScwhnPPpyzrU7Zl35paH1h79hxbHV3NjLh0Cdb5XjXWpGHb21iBBzHJz4nb7GRLyNZjwKt9KtcCsJDq3Y6zKMs/p2NKbJW/wdy+jtUcjObGe8Rv2DEpLsHZIQogmSREY0Ojsv1MeEe9o5ktpRq2CY7iB3R3+Fm7n8j3SZSsdJr2Ec8RvHObcoFFXdFDKb1QZOGjrzY0ISO1bE8PQ913NXRC4RxUcILTlJaOZJUnSh/OE6hrOO7erknHWhp0chB5OLKXL05pw1CEVRUDWiZEsI0fhJIiManQvzx/Ru6WXnSGquh1Mqbz/oRAfDr2AGk9adAwGTOBhwK8U693o9d5kV9poC8PaaiHNZNt0Lt9C58A/8SxOYkPkZZ/Tt2OI2jkyd/VeqV6sgOH0Hx/1GUuDgxIHEHLqFyizhQojqk0RGNCqF5jIOX6iPaYI9Mq5lmQzJ/ZGI0KOAhnzFkf0tHuBgwK2UaRp+lecCrQdb3G5ij/Nweuavo2vhNlqYYwlJO0G08zB2uo7EorLvqCF9WQHZG/6H13UPs/1UJiGeRryd9XaNSQjRdKjtHYAQF4s+m43FqhDkbiDE02jvcKpPsdKtYDN3pr1DRPFRyhQV7/5h5v78h4kOvsMuSczFijTObHEfz9d+z3DSsSMarPQqWMedqe8SYI63a2wABQdX42LNx2JVWHUkhVJL4x51JYRoPOyayLz11lv07NkTFxcXfH19GT9+PMePH6+0T3FxMTNnzsTLywtnZ2cmTpxIamrzGcUiKtvVBOtjXMuymJTxX4bk/oROKSHRoRUPnx7M02vNmLBvAvN3uVoffvW6l1887yFf7Ya7JYNJGR/TN28VGjsP2Q4pS8LJQUNWYQkbj6fZNRYhRNNh10Rm8+bNzJw5k507d7J27VpKS0sZNWoUhYWFFfs88cQT/PrrryxZsoTNmzeTlJTEhAkT7Bi1qE87/6yP6RPRNOpjWhcdYGrauwSVxFOi0rPe/RaWev+DcyUu9g7tik4ZOvGN3zMcM/RAjUKf/N95xnUl/s72K7TVYuG6jv6ogJjkfI4l59ktFiFE02HXGpnVq1dXuj1//nx8fX2Jjo5m0KBB5Obm8uWXX7Jw4UKGDRsGwLx584iMjGTnzp306dPHHmGLelJoLuNgYg4AfRt5oa9asTAw9xe6F24BIFkXxkrPO8jTNu64L1aiNrDGcyrxpvaMyFlEW10K+2c4cbgozm4xBXsY6dPSix2nM9kYm4afix4vqZcRQlxBoyr2zc0tL/L09Cy/rBAdHU1paSkjRoyo2Kddu3aEhoayY8eOSyYyZrMZs9lccTsvr/6+1SUkJJCRkVGjtt7e3rLI3d9En82m7M/6mGAPg73DuSyDpYCxWV8TUnISgD3Ow/jD9XqsdTSUuqGdMHYjTRfEiKS5hDhn43PuQ878pCMrdEy1jxEfX3d1Nj1aeHAux0RiVhErj6QwpWcIOo2U8wkhLq3RJDJWq5XHH3+c/v3707FjRwBSUlJwcHDA3d290r5+fn6kpKRc8jhvvfUWr7zySn2HS0JCApGR7TCZiq6+8yUYjQZiYmIlmbnIztPl9TF9Wno12rlEPEpTuTnzc9wsWZSo9Kz2uJ1Ths72DqvWcnS+PHN+KOMLFjGpg44WB97h+/++xnPrzVdvfBGTufbrYqlVKka392fh7oSKepmRkX6N9jUhhLCvRpPIzJw5kyNHjrBt27ZaHefZZ59l1qxZFbfz8vIICQmpbXhVZGRkYDIVseC5SUSG+tjUNiYhnWlvLiYjI0MSmYv8lcg0zkLfIPMpxmV+haNiIkfjxc9e9zXK6f9rKs9UypSlRRT5RzHd6xDPDtAzZMQolrlMR1FduUdk9/rf2Lb8K8yldbPAp5Ney3Ud/Plx/3likvPxd3Wkc7B7nRxbCNG8NIpE5uGHH+a3335jy5YtBAcHV2z39/enpKSEnJycSr0yqamp+Ptf+g+IXq9Hr2+4a+qRoT50bxPUYOdrrgrNZRw6V35psU8jrI9pUXyMGzPnoaWMJF0Yv3jdR5HG2d5h1TkFWKYbR0Crmxhx8g36Fm/Gw1nPmlavYFVf/uPi+KHoOo8lxNNIvwgvtp/KZPOJdLyc9AQ14kuOQgj7sOuFZ0VRePjhh/nxxx/ZsGED4eHhle6PiopCp9Oxfv36im3Hjx8nISGBvn37NnS4oh7t/bM+Jtij8c0f09uQyLjMr9BSxinHjiz1eahZJjEXO+o3jlVtX8ei0tAu43duiH0ajdW2y0x1ISrMg9a+zlgVWHE4mfzi0gaPQQjRuNk1kZk5cyYLFixg4cKFuLi4kJKSQkpKCkVF5XUnbm5u3HvvvcyaNYuNGzcSHR3N3XffTd++fWXEUjNzcX1MY3Jrey3P+GxBg4UThi785nmX3WfCbSgnvEfyS7v3KFPricjeyvhjj6OzmBo0BpVKxcj2fng7O1BUamHF4WTKZLI8IcRF7JrIfPrpp+Tm5jJkyBACAgIqfhYtWlSxzwcffMANN9zAxIkTGTRoEP7+/ixfvtyOUYv6sONU40tkhjjG8v1EA1qVQowhipUedzTZkUk1dcazP8vbf0iJ2kho7l7GxfyzwXtmdBo1N3QOxFGrJjXPzIbjaSiK0qAxCCEaL7vWyFTnw8jR0ZE5c+YwZ86cBohI2EPBResrNZZC33ZpKxnttha1SsXaggiOBt5+1YLX5uq8WxRLO37CxKMzCc3dy9jjz/Fb27evWDNT19wMOsZ0CuCnP4t/vZ31dK+DxSVlCgUhmr5GUewrrm17z2RhsSqEeBoI9rB/fUxY9h+MOvkqahV8ureE1T59GHKNJjEXpLp04OfI95hw9FEisrYw6uSrrG79MjTg8xLqaWRAa2+2xmWwNS4DN4OO2pT1JyQk0C4ykiJTzS6XGYxGYmNiJJkRws4kkRF2t+NCfUy4/S8r+ecf4cbYZ9AoFjYVtWHmir3ccJfMXwLlPTMr2r3FjTFPE5m+imKtC5vCn4QGnN+lW4g72aYSjpzPY/WRFAb51vzcGRkZFJlMTH3mXfxCI2xqm5pwiu/efkqmUBCiEZBERtjdhfWV+tp5fSUP05nyglZrMWfc+zA7pTsKe+0aU2Nz2nMQa1q/xHVxL9EteTFmjQs7wh5ssPOrVCqGtPElr6iMhCwTf6Rr0bh41+qYfqERBLfuUEcRCiEa2rXdXy7sLr+4lCN/1sf0tmOhr5M5nZuPPYqhLJcU5/b81u5tyri2CnurK9Z3DBtaPgVAn3Nf0iH15wY9v0at4vpO/ng5OVBsUeF7y0uYSmUkkxDXKklkhF3tPZONxaoQ6mkkyN0+k53pLCZuPvYYbuZksh1D+an9bEo19q/VacwOBdzKzpD7ABh+6i06OZxr0PPrtRrGdQ3EUa3g4BvOeztyKJVh2UJckySREXZ1Yf4Yu612rVgZHfcyPqY4CnWeLO/wEUW62o+GuRbsCHmAWO9RaBQLz7mvpLVnw36cuDrq6OdThrW0mP0pZp5ZdgirVYZlC3GtkURG2FXFRHgR9hl23fvcV7TO3EiZSsev7d4lz1GWm6g2lYrfW79IkksnXNRmfrvdgLO6YeeY8dArZPz0H9QqWL7vPG+vjm3Q8wsh7E8SGWE3uUWlFfPH9LbDiKWWmZvpl/AZABsi/kWya9NfxbqhWdR6fm33LqkWF9p4aXjWZzNqpW4WjqyuotN7mdnTDYDPtpzmiy2nG/T8Qgj7kkRG2M2OU5lYFWjp7URgA9fHeJpOM+bEiwDsD5jEUb9xDXr+5sTk4MWr2TeSZ1bo5JjG0JyGn3l7aAsj/xrTDoA3VsawLLpha3aEEPYjiYywm+0ny2dUHdC6dsNnbaUvy2NczJM4WE0kukaxpcUTDXr+5uhsmReTlxZhVaCzaQcdCnc2eAwzBrXkvgHlC88+vewQG2JTGzwGIUTDk0RG2M22C4lMqwZMZBSF0XGv4FGcSK4+gBXt3mrQqfabs9Uny/gupwsAw3KW4VeS0KDnV6lUPHd9JDd3C8JiVXhwwT7+OFmz5QeEEE2HJDLCLs5lm4jPKESjVtGnASfC65q8iIisLZSpdPzW7h0ZoVTHluZ15JRjR7SUcUPWfBwtBQ16frVaxTu3dGZkez9Kyqzc981e9p7JatAYhBANSxIZYRfb4sq/KXcNccfVUdcg5/QtiGXgmY8A2BL+OGnO7RrkvNcSBRWrPW4nW+ODqyWb67O/RaU07PwuOo2a/97ejYGtvTGVWLh73h4Onctp0BiEEA1HEhlhF1sb+LKSo1LM9cefQ6uUEuc5hIP+tzbIea9FJWoDv3rdTYnKgTDzCfrlrWzwGPRaDZ/f0YNe4Z7km8u486vdxKbkNXgcQoj6J4mMaHBWq1JRuzCwgQp9byv5Ho/iRLK1PixweYDklBSSk5Ov+JOXn98gsTVHmboA1rpPAaBXwXpaFh1p8BgMDhq+uqsnXUPcyTGVMu1/uziV3rCXuoQQ9U+qHEWDO5qUR7apFGe9li4h7vV6rqKiIu7qqmOI7ihlVhWTd7Rmd+7CarUtSYsHoKysYedFaS5OGLsRUHKG7oVbGJX9PQt0T1KgbdiaJGe9lq/v7sVtX+zkWHIeU7/YxZIH+xLiKUtQCNFcSCIjGtzWk+kA9GnpiU5Tv52CXmWpfDDGEYC1DsPoOnAQXavZdsOGQqLjwGK11Ft8zd1WtxsJLInHvzSR67O/ZYn3TBRVwy7G6WbU8e29vZj8+U5OphVw+/92snhG3waNQQhRf+TSkmhwFwp967s+RqVYeMJtLU4OKg4W+RPrez0BXq7V/jE6OtRrfNcCq0rLSs87MascCSqJp1/earvE4eWs57v7ehPmZSQxq4jbPt9JVpEkqEI0B5LIiAZVVGJh75lsAAa09qnXc/U4/y2RDinkFit8mNkXVPJyt4dcrTdrPSYD0KtgHWHF9lkPyc/VkYX39yHI3cCZTBMvbcpE7eRul1iEEHVHPtlFg9p9JosSi5UAN0cifJzq7TzehXH0/XMdpcdWF5Nhqb9ziauLM3TloFN/AK7L/g4nS65d4ghyN/DDA30IdHPkfL4FvylvUCwdM0I0aZLIiAa1/aJh1yqVql7OobaWMjruJTRKGTuLw/n6YGm9nEfYZrPbTaRrAzFaC7gua0GDzy9zQYinkYX398HToMbBO4ytaVqKSiSbEaKpkmJf0WASEhL4/VD5tPXBugL27dtXrXYxMTE2nadP4hf4FsZh0rrz37xhwEFbQxX1wKLSscJzOrenv0doyUl65a9ll+voivvz8/JITk626ZgZGTVbgqCFtxOvDvHiwSXHyXP25Mf955nQPQhHXcMWIgshak8SGdEgEhISiOzeB5/7vgBg1tSxWE22XV4oKLj6HCD++Ufoee5rADZE/Iucc+dtD1bUm2ydL+vdb2VM9nf0yV/DeX0ExaXlvSF79+5lf+xpm45nKShffsDWBAgg0EVL6g/P0fKBT0kvMJcnM92C0EsyI0STIomMaBAZGRng2wYAN52Vie/Oq3bbmN2bWfX1hxQXF19xP421hFFxr6LGSoz3aOK8hwPf1CZsUQ9ijT0IMcfR0bSbMVnf8g1RAHSJ8KVfz262Het4HL8ehJycnBrFUpZ5joG+ZWzPdCQt38xPB5IY3y0QvVaSGSGaCklkRIMxhHcHICLAk2AbRiylJpyq1n69Er/CqyieQp0nG1s+VaMYRcPY6DaBgJKzeJWl8mzYEX4DnBx1BHi52nScVGfHWsfi5qBwc7cglu87R0peMT8fSGJ81yActFJCKERTIO9U0SCsioKhZfk37xZedT+CyKvwJD3PzwdgY8unMOvc6vwcou6UqfWs8LyTMrT0c0vnsd72nbPHx0XPzd2C0GvVJOcW8/PB85Ra7FOMLISwjSQyokGcyi5F4+SOVqUQ6G6o02OrFAsjT76ORrFw0nMwcV7D6/T4on5k6gLZ7HYTAO+M1NNKn23XeHxdHRnfLQgHjZqknGJ+OZgkyYwQTYAkMqJBRCeZAfBzVNCo63bYddekRQQUHMWscWJDy6ehnoZ1i7p3yKk/W3J8cdCoeM5/Jzrrleug6pu/qyPjuwXioFFzLruI3w4lUybJjBCNmiQyokHsSylPZPwNdftHwbX4PP0TPgVga4tHKdT71unxRT1TqXj7bAcScq0EORQwLGeZvSMiwM3ATV0D0WlUJGSZ+O1wMmVWSWaEaKwkkRH1Lj3fzMms8knp/GqRyGTn5JCcnPzXT1ISA4+9jM5azCnHjqy19q58f3Iyefn5dfUwRD3Jtzhw+7IiLAq0L9pLpGmPvUMi0N3AuC6BaNUqzmaaWHk4BYtVsXdYQohLkFFLot5tPlG+2rU55SSG0FCb2xcVFQGwccMGtuw+ULH9Vv9ztOl4gCKLmlvXe3O66H9V2pakxQNQVlZWg8hFQ9meaGFBVgemex1lWM5SknVh5Ojs27sW7GFkXJdAfj6YRHxGIauOJDOmY0CdXxoVQtSOJDKi3m08ngZA0em90Mv2RMZsLr8s1aNtED27dQTAoBTxpHkjAJv1QxgxfPAl227YUEh0HFisMgV9Y/dDViTDAsyElJzk+uxvWOTzOBaVfT+iQjyN3Ng5gF8PJXMqvZA1R1O4roO/XWMSQlQml5ZEvSops7LleHmPTNGpvbU6lotRT4CXKwFerkzQbsGFQjK1fhz3HVOx/e8/Rkf7DusV1WdFxSrPqRSpnfArPc+A3F/tHRIAYV5OjO0UgEalIi6tgDXHUpCrTEI0HpLIiHq1Kz6TfHMZ7o5qSpKO18kx/UvO0LlwBwDr3W/Baudv7aLuFGrcWeN+GwDdC7cQXnzUzhGVC/d24vpO/qhVcCK1gOhMDajk41OIxkDeiaJerT2WCkCPAD1Q+6+xKsXC8JwlqFA4auzJeX2rWh9TNC7xhg7scxoEwKjs73Gy2LYmV31p6ePMmI4BqFSQYNLgNeYRrIp0zQhhb5LIiHqjKArr/kxkegXVfip5gK6FW/EtTaJYZWSr67g6OaZofLa53UiqLgijtZDrshagUhrH8OdWvs6M6eCPCgXnTiP5LDoXq1xnEsKupE9e1JujSXkk5RZj0Gno5Kuv9fG8NYX0y1sFwFa3GynSONf6mKJxsqi0rPS4k6np7xFacpKeBevZ7TLS3mEB0NrPhYzkc+xKV7H2dBH/+HITD3R3RWXDRIze3t6E1mAEnxCiKklkRL35/c/emEFtvNFraz9k9T6PvTgoJSQ5tOCIsVetjycatxydLxvcb+G67IX0zVvNOYcIkvQt7R0WAG7mVDJX/oDX2CdYc8rEkh8Wkr2h6vD/yzEYjcTGxEgyI0QdkERG1JsL9TEj2/sDabU61tjWWvo5JWJFzTr3W6XQ8hoRY+xJWPFxIouiGZO9gAW+/8SsrvtFR21VVJBH4dGNdBl2E+eNrXDtOZ4+I24g0u3ql8BSE07x3dtPkZGRIYmMEHVAEhlRLxKzTMQk56FWwbB2vpw5XvNERk8p711fXmOzz3kwmbrAugpTNAHr3W/Bv+QsHpYMrstayM9e9zaaRLaVt5FWwT5sPpHOsVwtPn4+dA1xt3dYQlxTGsengWh2Vh5OBqBPSy88nWo3l8sU5z20cFeTVubEDpfRdRGeaEJK1Y6s8LyLMnS0NB+jZ8F6e4dUSdcQd/qEewLls1jHJufZOSIhri2SyIh6cSGRub5TQK2O42U6xc1O+wH4PKsHZeraFw2LpifdIYgN7hMB6Je3ipDiE3aOqLJe4Z4VPTG/x6RyOr3AvgEJcQ2RREbUucQsEwfP5aJWwejaTOeuKAw79TZalZWfYkvZXRRSd0GKJueoU2+OGHujRuH67G9xsuTYO6QKKpWKQa29iQxwQVFg5ZEUzmWb7B2WENcEqZERdW7VkfLemF7hnvi4VO5BycjIQOOcXK3jROWvJzhvP0VWLY+uyqfrhDoPVVxCfl4eycnV+x1d0FCrjG9wn4BvaSK+pUmMzfqGnQwFID4+nn379tl0rJiYmDqNTaVSMaKdH+ZSK6czCvn1YDITugfh51o3cygJIS5NEhlR51YcTgFg7EWXlS78YVy+fDkaZ8+rHsNDV8IzfTeCA7x20IvEvCw6ygrW9aq4tHxhzb1797I/9rRNbRtqlXGLyoHfPO9iatr7BJXEc7NWyzzghRde4IUXXqjRMQsK6u4ykFqtYkxHf34+mMS57CJ+OnCeW6NCal0nJoS4PElkRJ06l23iYGIOKhWM7vjXZaWcnBwAhnZrSbu2ra96nFtLf8LLUkqyypf1xe2AOFnBup6VlJU/v10ifOnXs5tNbRtylfFcrQ9rPG5nXNZX3OgWx51ddJzp8A969B9i03Fidm9m1dcfUlxcXKfxaTVqbuwcyPL950jNM/Pj/vPcGhWMq0FXp+cRQpSTREbUqRWH/rys1MITX5eqXeoezo4EeLle8RjB5pP0zCgv8N3sdRt6fWzdByouy8lRd9Xf0d819Crjpwyd2Okyij75v/P5DY782wyBrTvYdIzUhFP1FB04aNXc1DWIpdHnyCos4cf957klKhgnvXzkClHXpNhX1Kkf958HYHy3oBq11yhlDM9ZDMBBp34k61vUVWiimdnhMpod+f7otSqeNSzFyVy7SRfrmkGn4eauQbg4askpKuXnA0mYy6RXUYi6JomMqDMxyXnEpuTjoFFzfceaDbvumb8Oz7J0CtUubHe9oY4jFM2KSs37Sd04nGrBU13AuNin0Fjq9jJRbTk7apnQLQijg4b0AjO/HkzG0jjWvxSi2ZBERtSZnw6U98YMa+eLm9H2egCP0jR65q8DYJPbzZjVhjqNTzQ/RVYtN/1gIs9qwL/gGCNPvQFK41qN2t3owPiuQTho1ZzPKWJXprbRzEwsRHMg7yZRJ6xWhZ/3JwE1vKykKAzPWYIWC/H6SE4YutZtgKLZis9ReKdoAlY0RKavpndi9RdvbCg+LnrGdQ5Eo1aRXKTGa8yjWBtZwiVEUyWVZ6JO7IzPJCWvGFdHLUPb+djcvr1pDyElJylV6cpncFXVfrXsxqAxz8nSnByyhLOx5VMMP/0f+iV+ToHej6N+4+wdViVBHgau7+jPb4eScO40gq8P5hPVXUHVTF7rQtiLJDKiTizfV35ZaWznQPRajU1tHS0FDMr7BYCdLqPJ03rVeXwNrSnMydLcHAqYiEtJCr3OzWfEyTcpdPDijEd/e4dVSUsfZ6I8LezN0vLriULabTrFzKGt7B2WEE2aJDKi1vKKSyuGXd8SZftlpUF5v2CwFpKuDWCf85A6js4+msqcLM3N9tCHcDan0z59BTfE/oslHT8j1aW9vcOqJMzZyu9LPsdz+AO8u+Y4HkYHbu8dau+whGiyJJERtfbLgSSKSi209nWme6iHTW2DzXF0MO1BQcV690lYVbb15jR2TWFOlmZFpWJtq+dxKs0gLGcXN8U8waJOX5JrCLZ3ZJXk7/2FBx6exdKYAp7/6TDuRl2tF1gV4lolxb6i1hbtSQRgcs8Qm673a5QShucsAeCQzBkj6ohVrePXtm+T6tQWp9IsJhx7GGdzqr3DquK2js7c3jsURYHHftjP1rh0e4ckRJMkiYyolSPnczl8PhcHjZoJ3W371tsvbzWeZekUqF3Z5jq2niIU16JSrRM/tZ9NjmMQ7sXnueXIP3AyN65EQaVS8dpNHRnbKYBSi8KMb6M5kJhj77CEaHIkkRG1cqE3ZlQHP5sWxgswnyGqYBMA69wnUSJzxog6ZnLwZmnHueTqA/EoTuSWIw/iVJJh77Aq0ahVvD+5CwNbe2MqsXDXvN2cTJNRa0LYQmpk7CgmJqbGbb29vQkNrVmBYEJCAhkZNftAv/i8BeayiiUJpvSsfiwapYRROQtRoXDM0IN4g21r5AhRXfl6f5Z2/JRbj8zAsziBiUf+wdKOczE5NJ6RcXqthrnTorj9f7s4mJjDHV/uZuk/+hHkLsm9ENUhiYwdJGflowKmTZtW42MYjQZiYmJtTmYSEhJoFxlJkclUo/MajEZiY2IIDQ1l6d5ECsxltPRxol9E9f8w9Mtb9eclJTc2ud9coziEqK48x8DyZObwDLyKznDLkX+wtOMn9g6rEie9lnl39WTSZzs4mVbAHV/uYsmMvng56+0dmhCNniQydpBTUIwC/PehUfTt3Nrm9jEJ6Ux7czEZGRk2JzIZGRkUmUxMfeZd/EIjbGqbmnCK795+ioyMDIKDQ/h6x1kA7u7XArW6ekW+rbSpRBVsBmCdx62Y1UabYhCiJnIdg1nScS6TjszAqyieyYfv44RqvL3DqsTTyYFv7+3FLZ/u4HR6IXfN28P3D/TBWVbMFuKK5B1iR60CPejepmarRNeWX2gEwa1rfkln84l04jMKcXHUVrvI11EL9zlvQYXCUWNP4h3lkpJoOLmGEBZ3/IwJxx7Bvfg8LzrMY3NA4yoTDHAz8M29vbh17g4On8/l/q/3Mu/unjjqmte0BELUpcb1LhZNxlfby2efndwjBKdqfmN8e4SeAE0uBWo3NrvJJSXR8HINISzq9D9SndripjKx6S4nOirH7R1WJRE+znx9dy+cHDTsOJ3JzO/2UVImS2YLcTl2TWS2bNnCjTfeSGBgICqVip9++qnS/Yqi8OKLLxIQEIDBYGDEiBHExcXZJ1hR4WxuKVvjMlCrYHq/FtVqE1RwiEd7l1/v/91jsqxsLezG5ODNko6fcdgSjrODiieUL4lMW2nvsCrpFOzG/6b3RK9Vsz42jUe+30epRZIZIS7FrolMYWEhXbp0Yc6cOZe8/5133uGjjz5i7ty57Nq1CycnJ0aPHk1xcXEDRyoutjymAIDrOvoT4lmNGpfcc/RN/RaAVUWdOOsYWZ/hCXFVpVon/q/0NhYeLkWLleviXmLw6fdRWxvP+lZ9I7z44s4eOGjUrDmayuOLDlAmyYwQVdi1RmbMmDGMGTPmkvcpisLs2bP597//zU033QTAN998g5+fHz/99BNTpky5ZDuz2YzZbK64nZeXV/eBXyQmwfZJtuJTsushkoahdQ9ge2J5IvnQkGosdmcpg2X3obcWsvu8hSWOPehUzzEKUR0WNExbXoRzp+sYx3q6J3+Pb2EsK9q+icnB297hATCojQ9z7+jOjG+jWXEoGZ1axXuTuqKpZnG9ENeCRlvsGx8fT0pKCiNGjKjY5ubmRu/evdmxY8dlE5m33nqLV155pd7jS04uXyRx2puLa3yMtJzCugqnwbj2uQWrAkPb+tAxyO3qDTa/DQk7KFE7MmVpOgOnSdGiaDwUYJl6DLS5jtFxLxOct5+pB+/kt7Zvkezaxd7hATCsnR9zbu/OQ9/t46cDSWg1at6Z2LnaIwWFaO4abSKTkpICgJ+fX6Xtfn5+FfddyrPPPsusWbMqbufl5RESElLn8eXk5AAwdtI02rZuaVPbvYdi2PLrEnJN5qvv3IiYysC54zAAHh5Wjd6Y+C2w5V0AdvveTnzObAbWZ4BC1NApryF8b5jPjbFP41UUz61HHuSP0AeJDpqG0ggWMh3VwZ+PbuvGI9/vZ2n0OXQaFW+M7yTJjBA04kSmpvR6PXp9w00i5eXrS3BYmE1t4s43rmnSqys2T4NKo6GjjwNRYZ5X3jk/BZbdDyjQ/U7O5vdokBiFqKlsYwu+7zKfUXGv0SZzHQPP/peIrM2saf0yOYaazaJdl67vFECpxcoTiw7w/e5EdBo1r4zrYNNCrUI0R412+LW/vz8AqamVV61NTU2tuE80nOzCEs4UlL9cbuvocuWdy8ywaBoUpIBPJFz3dgNEKETtlWqMrGj7JmtavYBZ40Rg/mGmHbidLsmLQbF/oe1NXYN455YuqFTwzY6zPP/TEaxWxd5hCWFXjTaRCQ8Px9/fn/Xr11dsy8vLY9euXfTt29eOkV2b/jiViYIKU9xOIn2usDikosBvs+DcHnB0gynfgYPM3iuaEJWKY37j+LbbDyS49UBnNTPs9LvccuQhvEyn7B0dt0QF8/bEzqhUsHBXAk8uOSijmcQ1za6JTEFBAQcOHODAgQNAeYHvgQMHSEhIQKVS8fjjj/P666/zyy+/cPjwYe68804CAwMZP368PcO+5qTkFnMyvQBQyNnyzZV3/uMjOLAAVGq4ZR542bYMghCNRb7en2Ud5rCh5VOUqh0JyYtm2v6pDD79PgbsOwXEpB4hzJ5cPnpp+f7zPPrDfpk0T1yz7Fojs3fvXoYOHVpx+0KR7vTp05k/fz5PP/00hYWFPPDAA+Tk5DBgwABWr16No6OjvUK+5iiKwpa48iHmYU5WzmYkXH7nw0th7Yvl/x/1BrQa3gARClGPVGoOBkwi3mMAg+I/oHXWJronf8//6Z0o66pDsePlppu6BuGo0/DIwv2sPJxCcWk0n0ztLssZiGuOXROZIUOGoCiXv76rUql49dVXefXVVxswKnGxY8l5JOcWo9OoaO9mYcvldjy9GX58sPz/fR6Cvg81VIhC1Ep2Tk7FdAqXk4yK4+6zaO0wlHGZX+BXeo55NxlIUD5gf6aa056DwMai25iYmBrF6+3tXbFY7OgO/nwxvQcPfLOXDbFpTP9qN5/f2QM3g+6SbRMSEsjIqNlgg4vPK0Rj0uxGLYm6U1xqYfvJTAD6hHthLEm69I5n/4Dvp4C1FNqPL++NEaKRKyoqAmDjhg1s2X2g2u2eU3XmPo9SnmmfQqhjMqGxT5Ls3JHtYf8g0b3XVdsXFJTPjD1t2rQaxW00GoiJia1IKga38eHre3px7/w97IrPYtLcHcy/pycBbpWXAUlISKBdZCRFJlONzmswGomNiZFkRjQ6ksiIy9p+KoOiUgteTg50CXEn+dQlEpnEPfDdrVBqgohhcPNnoG60NeRCVLgwA3iPtkH07NbRprbb/7DQ8sMlfP74ddxk2EdAwRFuOTqTRNfu7Amezln3vpftobmwxMpr94zk+l5tbDpvTEI6095cTEZGRqWEok9LLxbN6Mvd8/dwPDWfCZ/8wdf39KKN318jDDMyMigymZj6zLv4hdpWu5aacIrv3n6qynmFaAwkkRGXlJBl4sj58uUdhrb1vfSU6Kc2lg+zLimA8EEwZSHopH5JNC0uRj0BXq42tXE1OJBdDN+Yh5E54AV6nZtPp5TlhOTtI+TYPtKcWrM36E5OeI9AUV36Yzbc34PubYLq4iEA0DHIjeX/6Mdd83ZzKr2QWz79gy/u7EHvll6V9vMLjSC4dYc6O68Q9iZfnUUV5lILa4+Vz9/TKciNII9LrFR9ZHl5T8yFJOa2H0AnK1qLa4/JwZtNLZ9kXtRy9gXcRonagG9hHNefeIG7oyfSJXkxWkvDjHIK8TSy7B/96BHmQV5xGXd8uZtl0eca5NxC2IskMqKKzSfSKTCX4WbQMbB15cXzVEBA7HxYevdfNTFTl4KDkz1CFaLRKND7s7nlLP7X41f+CJ2BSeuOmzmJYaff5d69N9I74QsMpfW/YKy70YEF9/Xmug7+lFis/HPJQV7/7RgWmThPNFNyaUlUEpucR0xKPipgVHs/dJq/cl2DtYCfphgIOPF1+YbeD8LoN0Etwz2FuMCsc2NXyH1EB06jQ9ovRJ3/DjdzEv0SP6fX+a9pY+3GTq/6/Q7pqNPwydTuzF53go82nOR/2+LZ6+eAWi9fOETzI4mMqJCeb2Z9bBoAPcM9CXT/61JRy6wt3Jv1Kq5tdVjVOtTjPoKut9srVCEqyc/Lu+oQ6r/Ly8+vp2jKlWkcORgwiUP+E2idsYGopAX4F8QwjJ0cf9iZc9ZoyPEEt5B6G7o9xBsc+rrz8e5cDqSW4H/nB+SV1uTRCNF4SSJjFwodfdV0dEyFE2vAlAElheUjfy5MsKVSl9ec6Ixg8ACj118/9TAJV3GphRWHkymzKoR5GekdXr4opFvROQacnUObzHUAxKRbYOJcIrveVucxCGGr4lILUD655v7Y0za1LUmLB6CsrKzO47qYotJywmcUJ7xHEpS3n1ZHPqKrcoRgdTocXAjO/hDSC7zbXrV3MzmrPPmydei2zjcc3wn/RucZyIZkBTzyaB9gW4GzEI2VJDINRVEILImnvWkP04MO4PkPZ+AMJJ+5fJuyYijKhrzzlTZ3RcPWu40EHZkDujEQ1B08wm3+VldxGouV3w4lk1tUiqujlus6+ONZnEC3pB/olPoTGqUMBRWbjKO5/vPFbL+3bY3OI0RdKykrT2S6RPjSr2c3m9pu2FBIdBxYrJb6CK0qlYrzbt1Zob6bHR8+yG8PRdJGl1y+uGrML6B3haAoCOgC2kuP/sspKC8aHjvjedp2jrLp9If3/MHB7GQMLbqy9lgqiVkmhrb1xUErpZKiaZNEpp5plDIiTXuIKtiIZ1n5VP9oobBEIRN3QiMiwckbHFzKF1dU/zkjp7UMyorKe2pMmWDK+vPfTNTWUgaEauH00vIfKO+1CYoq/wnsXp7cOPteNT6rorDmWCrnc4pw0Kh4LOg4w0+8T4ucnRX7nHHvw9YWj3IgqYTissV1/RQJUWtOjjqbh1AbHa+w+Gk9i8uyssfagTZ9boak/XA+Gsx5cHojnN1enswE9wa98yXbewWG2TyEOjXhFGnvPMPg5xdwttSV2JR8UvKKub5jAD4u+rp4WELYhSQy9USlWGlv2k3fvNW4WHMBKFE5cMLQlUXxLrzzxY+8N6MPD7ccYtuBFYWjMTH85/NFvDfrdnxLEiHlUHnPzcl15T8XuIVCQGfwaAHuoWDwwDUlnTGttHQw7yMgNZ4lia6czA1ARxnz1W/T7/zR8tOg4rTHAPYF3s459x5/HvBorZ8XIcRFdEYI6w8hvSH1aPmq8aaM8n/P7ytPaEL7lPfW1AXFSpiugB6d27P6SAo5plIW7UmkT4Qn3UM8UF9qvighGjlJZOqBf8kZhuUsw6+0fP6GfLUb0S5DOWLsQ6laz8GYaEpq2putUmHWurHgUClPdHoU3+7doawEUo+Uf6s7v6/834wTkJtQ/nORVsDKqUYsOR/zXMZ9bLC0RYWV93Wf0E9zlFSndpz0GsJx71HkGkJq90QIIapHrS1PWvw7Q9ZpSPij/JJy0j5IPli+PbRPnZ0uyN3A7b1DWXsslfiMQrafzORkWgEjI/3wcpbeGdG0SCJThzRKKX3zVhNVsBE1CmaVIztdRnPQeQCWy8zuWSe0DuWXkoK6/7WtOA+SD0DqMchJgNxEKM6lMDuFg0dP8JXf06yzdEGNlQf9jmMJnMxc51cocvCsvziFEFemUoFXBHi2hJyz5ZeZchMheT+kHKS3JpBw97rpNTHoNNzYOYCY5Hw2x6WTmmfm+92J9G7pSVSo9M6IpkMSmTriUZrGDVnz8S4rHwJ6zNCDLW7jKNK4XKVlPXF0LZ9xN3xQpc17duxlyp71OJZ1RK2C6zoEovNrS7x9ohSiSavJsO/snBwA4lOy2Xfi/BX21IFxCM6aVPwLDuFakkIr9TmOP+zMJuuPnCrpVOsvHiqVivaBroR6Glkfm8qZTBN/nMokLrWAIW19Kk3BUBuy6raoT5LI1IE2pv2MzFmEg2KmUO3MOvdJnDZ0sndYVRxLyuNf6zNwDOmIVqVwQ5cgwrxkgiwhbFWbYd+lWeXJywtfreWFr9ZWu12fYA0vD9YzupWWkWxncPTNRAdNIzrwdkq1tXsfOztqGdclkNiUfDafSCe9wMyS6HO083dhQCvvqx/gCmTVbVHfJJGpBRUw0bCHsdkHAUh0aMVKzzswaRrX/AyKorBg51leWxFDSZmVspwURrbzkiRGiBqq9bDvGOhz3U30i+piU9vXd+/h7e2/89m0VrQmmb6Jn9M5ZSk7Q+7jiN/NWNU1/0hXqVREBrgS5mXkj1OZHE3KIzYln9PphbR1UYOmZseWVbdFfZNEpoY01hJ+uMXAOGN5ErPHeRjbXa9HUTWu6frP5xTx/I+H2XS8fOh3jwA9P340C9f/m2/fwIRoBmoz7NvV05vgsDCb2h6PO8WKMxb+WXgPD/R0pv/ZT/AoTmT46XfonvQ928NmEuc1rMZzSgEYHbSMiPSjY5Abm46nkZpn5nCOlqD75rL5rIkuXRU0NaifkVW3RX2RRKYmFIXBSXMJ6KCjTFGz3mMyx5x62TuqSsosVhbsPMu7a45TWGLBQaPm6eva0s2YzbKiPHuHJ4SoFRVx3iM45TmEjqk/0SfxCzyKE7nh+L9IdI1iU8tZZDi1qdUZ/F0dmdwjhGPJeWw7nkqxuz8f7splzdmtPDW6LcPa+aKqRcIkRF2RKR1rQqUi1mMoaYVW3skb06iSGEVR2HwinTEfbuXlX49RWGIhKsyDlY8N5L6BLeWDR4hmxKrWcijgFuZF/cjOkPsoU+sJyYtm6oE7GHbqPziW5tTq+CqVig6BbowOLCV703yMOhWxKfnc+/VeJnz6BxtiU1EUWVVb2JckMjWU5NSJlh8WcLwswN6hVNhzJovJn+9k+le7iUsrwMOo4/XxHVkyoy+tfC89Q6gQoukr1RjZETqD+d2Xctx7JGqsdElZxt3RE+iW9D1qa+3Wk9KqIW/XUj693pcHB0eg16rZn5DDPfP3cv1H2/jtUBIWqyQ0wj7k0lItFDaCVWTLLFZWH03hq23x7EvIAcBBo+aOvmE8Oqw1bkadfQMUQjSYfL0/K9u+yUH/WxkS/3/4Fp5gSPz7dEpZTpG6f62P76JX868x7bhnQAu+3BrPgp1niUnO4+GF+2npfYJ7B4YzoVswBofGVSsomjdJZJootaMzP8YW8PCajSTlli8k56BRMzEqiEeGta6z+R+EEI3P1eavScafaN+36Zm/juuyvsWr6Az/cjhDm0kGVuaeITnZtvqZv88B4+viyLPXR/KPIRHM236G+X+c4XRGIc//eIR31xzntl6h3Nk3jAA3+RwS9U8SmSbmZIGezzLaE/SP+Xx7KB8ALycHpvUJY2qfUHxdLr1qrhCi6bN1/prPADdtX/7V8gT3B8czIVLHGMsnzF77Ox+ejaDYWr2eE0tBFkCV5Mnd6MATI9tw/6CWLNqTyNd/nCEhy8Snm07x+ZbTjOnoT3/vEtsepBA2kkSmCVAU2JLpzFdnvdmcUT7UU+0ALdy1zBzRnhu7BOKok65cIZq7ms5fE08/pu78jRluOxgWruXZiBPMaJXGr9rrOKpud9Xh2rHH4/j1IOT8OSvx3znrtdw7IJy7+rVgfUwqX22PZ+fpLH47lMxvgP8d73OmQI2fxYpOI6WZom5JItOIFVlU/JjkwVdnvTlZWN7TokKhpzGNX/43m2U/ziMqShZ2FOJaU5P5a3ZaPRn+jYnXHxjFo8GxeFpymF76A2f07djkejPZOt/Ltk11rl5Pr0atYlQHf0Z18OdYUh7ztsfz0/5zENiG6Cw4vC2eSH8XOgW5yeKUos5IItMIpRRr+SbBm4XnPMkpLf8VOWss3BqUxV1hmWSei2dJ4mEZSi2EsNmWghBcfcfTK38dUQUbaWGO5Y60d9jnPJhdLiMpVdfN5en2ga68e2sXxgSVcPOsdwgaPh1TmZWD53I5eC6XQHdHOgW50crHGa300ohakESmEYkr0PNZvA8/J7tTqpS/sUMMZu4KzWRScBYuWisAmfYMUgjR5JWp9fzhNpajTr0YkvMTLc3H6FmwgUjTXra4jeO4oXutZge+mLujhrxdS7n3jtuxerXg8PlcTmcUkpRTTFJOMZt16bQPcKVjkBseRoc6Oae4tkgi0wjszTYyN96Xdel/dRX38ijg3rAMRvjmoZGOFyFEPcjV+vCz9/2EFx1lSO5PuFsyuD57AZ0L/2Cj+wQydEF1di6VCsK8nAjzcqKguIyjybkcOZ9HgbmMfQk57EvIIdjDQKcgNyJ8nGu0DIK4NkkiY0fJaj+m7Q1nW6YLUF7/Mto3jxnhaXRzL7pq+5UrVxITE2PTOePj42sUqxCi+Yo3dCDBsQ1RBZvolb+W4JLTTE17j0NO/fnDdUydn8/ZUUvvcC96tvDkTGYhh8/lcibTxLnsIs5lF2HQaegQ6Ip37ebxs5uEhIQqQ9ary9vbWxbItJEkMnZQpHXB5+bn+c6pL2SCTmVlYmA294dnEOFkvmr7g6fLh0C+8MILNY4hNS1VFnATQlSwqHTsdhlJjKEHg/J+pk3RQboWbqNN0X4c9d1YUA8dJGqVipbezrT0diavqJSjSXkcTcqlsMTC3rPZgA6fW15ib1JxjRerbGgJCQm0i4ykyGSqUXuD0UhsTIwkMzaQRKYBFZSp2Z7pTJznAIxeKlSKlVuCc3g0IpUQQ/WnCT6fUT5/TN/rxtO6VUubYjh88BD7t64jLy/fpnZCiGtDvtaDFZ53ccgcx9CcZXiVpXKP8zY63etEZnH99ei6GnT0jfCiV7gn8RmFHD6fS0KWCWNET97cls3XRzZye+9QJvUIwcel8Y54ysjIoMhkYuoz7+IXGmFT29SEU3z39lNkZGRIImMDSWQaQJkC+3OM7Ml2Ki/iVUFh7FYeDonnpY5da3zckOBAuna2rVclMy2V/TU+oxDiWpGob80C36foUriNXtkr6BkEJL4LyxNh+AvgFlwv59WoVbTydaaVrzMxx46y5OffCBowkfM5Rby75jiz153guo4BTOsdSq9wz0Y7etMvNEJ6vRuIjHmrZ/GFDnyX6MUfWS6UKmr89SW0ytxOxs9v42XNtnd4QghxWVaVhv3Og3km51bm7f9zht5DP8DHUbDuZSjOrdfzu+ggZ+NXfHGDH+/d2oWuIe6UWhR+PZjE5M93Mnr2Fr7ZcYb84kaw8J2wG0lk6klhmZqVKW78kuJBTqkWo8bCKN9cJgVlYyyr3ze/EELUpTzFyD2/FLMq5GkIGwBlxbDtA/ioG+z6DMrqdxkCvVbFxKhgfprZn98eGcBtvUIw6DScSC3gxZ+P0vvN9Ty7/DBHk+Sz9VokiUwdUxSIzXdkQaIXcYWOqFDo7lbInaGZRLoU19XUDEII0eCyHFvAXb/BlO/Buw2YMmHV0/BJbzj2c/kHYD3rGOTGWxM6s+v54bwyrgOtfJ0xlVj4fncCYz/axoRPtrN837mKdalE8yc1MnWooEzNhnRX4k3lhWjeDqWM9M3DV99ExxAKIcRF4uPj2bd/P+APfT7BO2EFAbHz0WWdhsV3UujejqR295LvE1UxoZ6tU0RcyuWmmtACd/nCGScNu7L0HM3VVcxJ8+9l++ntqzCxqz+BLrb/qZNh0E2HJDJ1JK5Az/p0V8xWNWoUensWEuVeKJPZCSGavIL8PKB8yoe/T/vg7ABP99czq48DTjmxtN75FJvPlPH8BjPbE//qFSkoKLD5vCmJZyrOWx1qJ3ecO4/Cpct1mNx82ZgMG5PTKTpzgIIDqzDF7QJr9b5YyjDopkMSmVoqQ8Pvaa7E5BsA8NWXMso3Fy8H6dYUQjQP5qLyCToH3f4oPfoPqXJ/DvCONZfhhb/Rr2gjg1vAtnu0xDh0Yu6ZFnz0xXcUFxfbfN7c7PIFWaJG3kSHttUfyqxwhH0x+aTpAjBG9MTQoiuGFl3RqxVaOFsJd7bgdIW/fjIMummRRKYWHALaEG3oSXG+AVDo6V5Ib0/phRFCNE9ufsFXHFIcTT+Om1PonfgVHdJ+IbLkMB8GHmbwJAP7lfM1Pm9gUJDNU01kpW3g6OJXGf3EB7i26V0x0d7xPA3H8zSEeRrpFOxGuJcT6iYw0Z64PElkakBRFDal6fGf9i7Fag0uWgujfXMJsmFSOyGEaI4K9P6sb/Uce4PupE/iF7RLW8mESB0TlA84fWwPu0LuJcWlY4PF40DpJSfaO/vnj9FBQzt/F9oHuOLl3Hgn2hOXJ4lMDahUKgrK1KjUGnzKUpnYQoVeU//V+kII0VTkGoJZ0+YV5p8Lpcvxj7mtswMts7fRMnsbZ916sSvkXs67dW+weC6eaC/HVMKRpDyOJeVhKrFUFAj7ueppH+CKs7XBwhJ1QIZf19Bo/yLSf3yTSPNRSWKEEOIykhQfpv1YxL9UT3PEdxwWlYaw3N1MOjKDWw8/QGj2zgYZtn0xd6MDA1p5c++AcG7oHEBLbydUKkjNM7PxeDorzunwvvEp9iYVU2qRrKaxkx6ZGtKpwXTiD1Sj+tg7FCGEaPRSVT6sbX0LO0Puo+f5r+mQ+gvBefsJPvYIKc7t2RV8D6c9B4Kq4b5fa9QqInycifBxptBcxvHUfI4l5ZFZWIJT+8G8uS2bT/atY0zHAG7sEkDvcK8msXDltUYSGTtKTM9j3wnbC+CSMvJqfe78vDySk5NtanNhWfqazAsRH19/i80JIRpGTT43cnJyKh/DMYANEf9iV/C9RCUtoHPKMvwLjnFT7JNkGsLZGzSN4z7XYVE71GHkV+ek19I91INuIe4cORbDT7+tInTAeHJMpXy/O4Hvdyfg66Lnhs6B3NglgK4h7o12nadrjSQydmAqKF95+p0lu3hnya4aH6eoxPaJ9i7Mdrl37172x562qa2lIAuAadOm2XzeC0pLZXJAIZqa2nxulKSVf4kxmUyVthfqfdgS/gR7gqbTPWkhXVKW4lUUz+iTr9E/YS77A6awQ2WumwdgA5VKhYeDQvb6z1nznwcocQ/jlwNJrDqSTFq+ma+2x/PV9nhCPY3c2CWAsZ0CiQxwkaTGjiSRsYMSc/l8Cn2uu4l+UV1sbr9xyx/s37oOc5ntc9WU/NmmS4Qv/Xp2s6ntnv1H2HQQnrm1D5OGR9nU9n8r9/LpL7uwWCSREaKpqc3nxs4/StkaB+aSS6/HVOTgyfYWD7Mn+C46pf5I96TvcS5JZ+DZj4ny0dFzpJ5jmsJaP4aa0KhV9G/lTf9W3rw6vgNbTmTw68Ek1h5LJSHLxJyNp5iz8RQtvIyM6RTA9R0DUBq43kdIImNXrp7eBIeF2dzO2b32U347OeoI8HK1qY2LsXxoYrCPC93bBNnUNnD3CZv2F0I0PjX53HA1VO8SUYnWmeigO9gfMIV26auJSlqAt+k0T/XTU6r8zInsc0Q7DyVTF1CT0GtNr9Uwsr0fI9v7YSopY11MGr8eTGLziXTOZJr4dNMpPt10Cl8nDe5D7yHTrCJIUaSnpgFIIiOEEKLRsKp1HPO7kWO+Y8ld8RpDcn9iSAstHUx76GDawxl9W/Y7D+KMvl2DFgZfzOigZVyXQMZ1CaTAXMbG2DRWHUlmQ2waaYUW3HpNYFMq7M05UzHkO9DNUZKaeiKJjBBCiMZHpWavOZxXvjYx64FJzAhPplXxIVqYj9PCfJwsrQ8HnAZxzNiTUrX9JrJz1mu5sUsgN3YJxFRSxrzVu3j5fz/j1mEQBeYyDiTmcCAxBycHDRG+zrT2dSbQ3YBakpo6I4mMEEKIRi2uxJsVXqNxLcuka+E2OhbuxLMsnWG5y+iXt4IjTn046DSQPK2nXeM0OmjpG2wg49d3mTq6LxaPMOLSCjidXkhhiYVD53I5dC4Xg05DhI8TrXydCfYwypDuWpJERgghRL2rydDtvPz8yre1Xmxxu4kdLqNpb9pDt4KteFjS6VGwie4Fmznl2In9zoM479CyLkOvEY0KwnycaenjTJnVSmJWESfTCjiVXkBRqYUjSXkcScrDUaumpU95T41a6oRrRBIZIYQQ9aYuhm6XlVUe7ViqduSg80AOOvUn3BxDt4IthJlP0Lr4EK2LD5GuDUDv4c2Whp2K5rK0ajXh3k6EezsxzOrLuWzTn0lNIUWlFo4l53EsOQ+dSofX2FnsPl9M+04WHHUae4feJEgiI4QQot7UZuj2hg2FRMeBxXqZqSZUauIdOxDv2AGv0mS6FmwlsmgvPmXJPOSfzJ3/dGE7K8goaEuac7vaPpQ6oVGrCPNyIszLiaFtFc7nlPfUnEwvwFRiwbnjMP6zPZuP96xleKQf13fyZ3AbXwwOktRcjiQyQggh6l1Nhm4bHavfpZKpC2C9xyS2ud1ApGkvEWlrCdUXMJr9cPAOUpzbc8h/Iie8hlOqdbI1/HqhVqsI8TQS4mlkcFsfDh2J4deVK2kx8Gayiiz8cjCJXw4mYdBpGNbOl+s6+jOsnS9OevnTfTF5NoQQQjQbZrWRA86DeG9nKXk7F/HatF4McDiOf8Ex/E8eY+jpd4nzGsYx37EkuvWw2xDuv1OrVHg7KmSv/4Lf356B2qclqw4ns/JwCudzilhxOJkVh5PRa9UMbuPD9Z0CGBbpi6ujzt6h250kMkIIIZohFVsTLLxXdDMx/QbSIe1XOqT+gmdxAu3TV9I+fSV5Dn7E+I7lmO/15Bhsn5y0vqhVKrqHetA91IPnro/k8PlcVh1J4f/bu/eoqOu8gePvGWAGCAFl5C4gpqIi3ghCc3tKyjXXNtsn3VZb0pOtu3hWY09puWmd1qzjPj1dtpMnW+3so+XappZZootm3hJRIDHkogSoXAQSRITRmc/zBzUraRcMG2b8vM75Hobf9/sdPh+/nB8f53f78HAV5fUtbP28hq2f12DyMDK2v4Wfx4dyx+AQAn27yUlBPzEtZJRSSrm186Ze5ESmkRPxW8LOHmZw7WYG1G3F31pD8omVJJ9YSZVfPMWWVEos45wdbgcGg4GEyEASIgN5bPxACqvO8lFBFR8eruLY6XNkHa0l62gtnkYDo2+0cFd8KHcOCaXXDddPUaOFjFJKqeuDwUCVfwJV/gl8HJtBv4ZPGFS7mZgv9xHWXEBYcwG3fvEi5Z6xkGLC3HwSGPmTh1lY+N2PobnNArfd5k9low/7TrSy70Qr5Y0X+aT4NJ8Un2bhxgJuju3FhPgwxg8JpXeP779hYEVFBXV1dVcVr8ViISoq6qrmdgUtZJRSSl13bEYzxZY7KLbcga+1jv712+lfl0VkUy7RF4/zP3d6w/bpkN8fBoxvb1Ep4HHtzklpajgNwPTp0zs917NXBAHx/8WISTMoqWtlT2k9e0rrefK9Am6K6cVd8aGMGxRCn16+l82tqKhg0KA4WlrOX1Xcvr4+FBYedVoxo4WMUkqp61qLyUJ+2BTyw6bga63DUvgWgZ+t4vZ+Zgz1JbCvBPb9DUx+ED0aYsZC359B6FAwdt1l0eebmwCY+LuFDEwY1am5NRXHWPP8ozz/vxkERQ/ko4JqPiqoJr/yDNllDWSXNfDUps/p08uHW260MLqfhdH9ggjyM1NXV0dLy3lWPzGFQVG9O/VzCytOM/3ZddTV1Wkho5RSSjlbi8nCXt9xvPB/r5L76UcM96uH4q1Qkgkt9VCytb0BeAdAZBJEJkJEIkR0zWGooPBoIvsPuer50UE3MPvWfsy+tR8nvmxhS0E1mUeqya04Q2XDed7OruTt7EoABoX5c2MPGz79UwgJj2TkAEuX5PBT0kJGKaWUugK7lx8M+RkMmQx2G9QUQNkuKPsEyvdCayOUbmtvXxnsG876KT74Nb+Lte4Udb79aPSOxGZ0zsm3kT19eWhsLA+NjaW57SIHyhrYXVrHntI6jlafpbCqicIqCL53IQ9VQsRpK8MDWxjm38KgHq0M6nEei/lbbkjYTbhEIfPqq6+ybNkyqqurGTZsGK+88gpJSUnODksppdT1wugBYcPa2+g5YLsI1flwIqe9ncyBhuN4t5xi8iAvaNkERZsAEAycNQXT6B1Jo3cETd5hNJt6c87LwjmThXOmIFo9A695Cn5mT26LC+a2uGAA6prb2Husnk37i9j86RG8g2M42WriZLWJzdX/icdiusCgHq30u6GNGN/21vcGKxHe1mse8w/R7QuZf/7zn2RkZLB8+XKSk5N58cUXGT9+PEVFRQQHBzs7PKWUUtcjD0+IGNXekn/Xvq2lgZJd7/K3xXO4/547ifL6Esu5Y5jsLfhba/C31tCn6eC3vmWb2ZNlGX6I/XkM+auwevrR5uGHzeiFzeCF3eCJ3eCJzfj1aw8MCIjQ3Hya0DvMRBx5DWp7AwJib2/2i1+1S19fxGK/yN1i59aL9fy3dQ8JPfpR5hlDrjWKIxfCKbwYxhd2C3VWL3bVe7GrvkfHfwJshBjCuXf+Mo7k7WXkyJ/+Ci9wgULmhRdeYNasWcyYMQOA5cuXs3nzZlauXMmCBQucHJ1SSin1Fd9enO09ipf3W/H87cz281xE8LnwJYGtJwhoPUlA20n8W6u44UIdN1jbm++FLzEgmA0XCethBE5D8+lO//jbR5vh2Do41rl5AcD4Gz3hQjlhF8oZDWAETNAiZoolkiJ7H45LKF9IKGUSxhcSghUTp8TCKSzccaGs0/F2lW5dyFitVg4ePMjjjz/u2GY0GklNTWXfvn1XnNPW1kZbW5vj+8bGRgCampq6NLaWlhYASkuPY7W2fc/ojmpOnQLgVGUl2TmHOv2zf8z8HzO3svwLAPZ+fhLz5gOdmptz9AQAZV+UYzQaOjXXWfnqXJ2rc113bmXlyfavRYfJ9v7++6hcqqG6/UTY9evXc/Dgt3+CciXl5eUAFOTs5dSJym/0GoDIr9p/GMWGD1bqi7Mp3bWBMT+/h5iIELxpw5fzGLHjiQ0PbI6vHtgwYgfaD12dP9dMWUEOyckp+AcGAAYEA2DAbjAieGDHgBiM2PFADEYEI2IwUlf/Jevf38TdYwYT5O/XPu6r9vVrM00M5CwDKEXEgE0MNHEDRY0evHOomuCnF3b539mv309EvnugdGMnT54UQPbu3dth+6OPPipJSUlXnLN48WIBtGnTpk2bNm1u0CorK7+zVujWn8hcjccff5yMjAzH93a7nYaGBoKCgjAYOvdJwJU0NTXRp08fKisr8ffv3JNcXYW75+ju+YHm6A7cPT/QHN3BtcxPRDh79izh4eHfOa5bFzIWiwUPDw9qamo6bK+pqSE0NPSKc8xmM2Zzx48RAwMDuzw2f39/t/ylvJS75+ju+YHm6A7cPT/QHN3BtcovICDge8d0j+eXfwuTycSoUaPIyspybLPb7WRlZZGSkuLEyJRSSinVHXTrT2QAMjIySEtLIzExkaSkJF588UXOnTvnuIpJKaWUUtevbl/ITJ06ldOnT7No0SKqq6sZPnw4W7ZsISQkxCnxmM1mFi9efNnhK3fi7jm6e36gOboDd88PNEd30B3yM4h833VNSimllFLdU7c+R0YppZRS6rtoIaOUUkopl6WFjFJKKaVclhYySimllHJZWsh00quvvkpMTAze3t4kJyeTnZ3t7JCuyieffMKkSZMIDw/HYDCwcePGDv0iwqJFiwgLC8PHx4fU1FRKSkqcE+xVWrp0KTfddBM9evQgODiYe+65h6Kiog5jWltbSU9PJygoCD8/P371q19ddgPG7uq1114jISHBcSOqlJQUPvroI0e/K+f2bZ577jkMBgPz5s1zbHP1PJ966ikMBkOHFhcX5+h39fwATp48yfTp0wkKCsLHx4ehQ4eSk5Pj6Hf1/U1MTMxla2gwGEhPTwfcYw1tNhtPPvkkffv2xcfHh379+vHMM890eA6S09bxxz8R6fqxdu1aMZlMsnLlSjly5IjMmjVLAgMDpaamxtmhddqHH34oCxculPXr1wsgGzZs6ND/3HPPSUBAgGzcuFHy8/Pl7rvvlr59+8r58+edE/BVGD9+vKxatUoKCgokLy9P7rrrLomKipLm5mbHmNmzZ0ufPn0kKytLcnJy5Oabb5bRo0c7Meof7v3335fNmzdLcXGxFBUVyRNPPCFeXl5SUFAgIq6d25VkZ2dLTEyMJCQkyNy5cx3bXT3PxYsXy5AhQ6SqqsrRTp8+7eh39fwaGhokOjpaHnzwQdm/f78cP35cMjMzpbS01DHG1fc3tbW1HdZv27ZtAsiOHTtExPXXUERkyZIlEhQUJB988IGUlZXJO++8I35+fvLSSy85xjhrHbWQ6YSkpCRJT093fG+z2SQ8PFyWLl3qxKh+vG8WMna7XUJDQ2XZsmWObWfOnBGz2Sxvv/22EyLsGrW1tQLIzp07RaQ9Jy8vL3nnnXccYwoLCwWQffv2OSvMH6Vnz57yxhtvuF1uZ8+elf79+8u2bdvk1ltvdRQy7pDn4sWLZdiwYVfsc4f85s+fL7fccsu39rvj/mbu3LnSr18/sdvtbrGGIiITJ06UmTNndth27733yrRp00TEueuoh5Z+IKvVysGDB0lNTXVsMxqNpKamsm/fPidG1vXKysqorq7ukGtAQADJyckunWtjYyMAvXr1AuDgwYNcuHChQ55xcXFERUW5XJ42m421a9dy7tw5UlJS3Co3gPT0dCZOnNghH3CfNSwpKSE8PJzY2FimTZtGRUUF4B75vf/++yQmJnLfffcRHBzMiBEjWLFihaPf3fY3VquV1atXM3PmTAwGg1usIcDo0aPJysqiuLgYgPz8fHbv3s2ECRMA565jt7+zb3dRV1eHzWa77I7CISEhHD161ElRXRvV1dUAV8z16z5XY7fbmTdvHmPGjCE+Ph5oz9NkMl32UFFXyvPw4cOkpKTQ2tqKn58fGzZsYPDgweTl5bl8bl9bu3Ythw4d4sCBA5f1ucMaJicn8+abbzJw4ECqqqp4+umnGTt2LAUFBW6R3/Hjx3nttdfIyMjgiSee4MCBA/zxj3/EZDKRlpbmdvubjRs3cubMGR588EHAPX5HARYsWEBTUxNxcXF4eHhgs9lYsmQJ06ZNA5z7d0MLGXVdSE9Pp6CggN27dzs7lC41cOBA8vLyaGxs5F//+hdpaWns3LnT2WF1mcrKSubOncu2bdvw9vZ2djjXxNf/owVISEggOTmZ6Oho1q1bh4+PjxMj6xp2u53ExESeffZZAEaMGEFBQQHLly8nLS3NydF1vb///e9MmDCB8PBwZ4fSpdatW8eaNWt46623GDJkCHl5ecybN4/w8HCnr6MeWvqBLBYLHh4el51pXlNTQ2hoqJOiuja+zsddcp0zZw4ffPABO3bsIDIy0rE9NDQUq9XKmTNnOox3pTxNJhM33ngjo0aNYunSpQwbNoyXXnrJLXKD9kMrtbW1jBw5Ek9PTzw9Pdm5cycvv/wynp6ehISEuEWelwoMDGTAgAGUlpa6xTqGhYUxePDgDtsGDRrkOHzmTvub8vJy/v3vf/PQQw85trnDGgI8+uijLFiwgF//+tcMHTqUBx54gEceeYSlS5cCzl1HLWR+IJPJxKhRo8jKynJss9vtZGVlkZKS4sTIul7fvn0JDQ3tkGtTUxP79+93qVxFhDlz5rBhwwa2b99O3759O/SPGjUKLy+vDnkWFRVRUVHhUnleym6309bW5ja5jRs3jsOHD5OXl+doiYmJTJs2zfHaHfK8VHNzM8eOHSMsLMwt1nHMmDGX3faguLiY6OhowH32NwCrVq0iODiYiRMnOra5wxoCtLS0YDR2LBk8PDyw2+2Ak9fxmp5K7GbWrl0rZrNZ3nzzTfn888/l4YcflsDAQKmurnZ2aJ129uxZyc3NldzcXAHkhRdekNzcXCkvLxeR9svoAgMD5b333pPPPvtMfvnLX7rU5ZAiIr///e8lICBAPv744w6XRra0tDjGzJ49W6KiomT79u2Sk5MjKSkpkpKS4sSof7gFCxbIzp07paysTD777DNZsGCBGAwG2bp1q4i4dm7f5dKrlkRcP88//elP8vHHH0tZWZns2bNHUlNTxWKxSG1trYi4fn7Z2dni6ekpS5YskZKSElmzZo34+vrK6tWrHWPcYX9js9kkKipK5s+ff1mfq6+hiEhaWppEREQ4Lr9ev369WCwWeeyxxxxjnLWOWsh00iuvvCJRUVFiMpkkKSlJPv30U2eHdFV27NghwGUtLS1NRNovpXvyySclJCREzGazjBs3ToqKipwbdCddKT9AVq1a5Rhz/vx5+cMf/iA9e/YUX19fmTx5slRVVTkv6E6YOXOmREdHi8lkkt69e8u4ceMcRYyIa+f2Xb5ZyLh6nlOnTpWwsDAxmUwSEREhU6dO7XCPFVfPT0Rk06ZNEh8fL2azWeLi4uT111/v0O8O+5vMzEwBrhi3O6xhU1OTzJ07V6KiosTb21tiY2Nl4cKF0tbW5hjjrHU0iFxyWz6llFJKKRei58gopZRSymVpIaOUUkopl6WFjFJKKaVclhYySimllHJZWsgopZRSymVpIaOUUkopl6WFjFJKKaVclhYySimllHJZWsgopZRSymVpIaOUUkopl6WFjFJKKaVclhYySqluZ8uWLdxyyy0EBgYSFBTEL37xC44dO+bo37t3L8OHD8fb25vExEQ2btyIwWAgLy/PMaagoIAJEybg5+dHSEgIDzzwAHV1dU7IRil1LWkho5Tqds6dO0dGRgY5OTlkZWVhNBqZPHkydrudpqYmJk2axNChQzl06BDPPPMM8+fP7zD/zJkz3H777YwYMYKcnBy2bNlCTU0NU6ZMcVJGSqlrRZ9+rZTq9urq6ujduzeHDx9m9+7d/PnPf+bEiRN4e3sD8MYbbzBr1ixyc3MZPnw4f/nLX9i1axeZmZmO9zhx4gR9+vShqKiIAQMGOCsVpVQX009klFLdTklJCffffz+xsbH4+/sTExMDQEVFBUVFRSQkJDiKGICkpKQO8/Pz89mxYwd+fn6OFhcXB9DhEJVSyvV5OjsApZT6pkmTJhEdHc2KFSsIDw/HbrcTHx+P1Wr9QfObm5uZNGkSzz///GV9YWFhXR2uUsqJtJBRSnUr9fX1FBUVsWLFCsaOHQvA7t27Hf0DBw5k9erVtLW1YTabAThw4ECH9xg5ciTvvvsuMTExeHrqbk4pd6aHlpRS3UrPnj0JCgri9ddfp7S0lO3bt5ORkeHo/81vfoPdbufhhx+msLCQzMxM/vrXvwJgMBgASE9Pp6Ghgfvvv58DBw5w7NgxMjMzmTFjBjabzSl5KaWuDS1klFLditFoZO3atRw8eJD4+HgeeeQRli1b5uj39/dn06ZN5OXlMXz4cBYuXMiiRYsAHOfNhIeHs2fPHmw2G3feeSdDhw5l3rx5BAYGYjTqbk8pd6JXLSmlXN6aNWuYMWMGjY2N+Pj4ODscpdRPSA8eK6Vczj/+8Q9iY2OJiIggPz+f+fPnM2XKFC1ilLoOaSGjlHI51dXVLFq0iOrqasLCwrjvvvtYsmSJs8NSSjmBHlpSSimllMvSs96UUkop5bK0kFFKKaWUy9JCRimllFIuSwsZpZRSSrksLWSUUkop5bK0kFFKKaWUy9JCRimllFIuSwsZpZRSSrms/weOngUHZn2AawAAAABJRU5ErkJggg==\n"
          },
          "metadata": {}
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "### Revisión básica de columnas potencialmente problemáticas\n",
        "\n",
        "Además de los valores faltantes y de la variable objetivo, conviene revisar algunas columnas que podrían no resultar adecuadas para el entrenamiento del modelo.\n",
        "\n",
        "En este dataset, interesará prestar especial atención a variables como:\n",
        "\n",
        "- `alive`, porque contiene la misma información que `survived`\n",
        "- `pclass` y `class`, porque representan la misma información con formatos distintos\n",
        "- `embarked` y `embark_town`, porque también contienen una información muy similar\n",
        "- `deck`, porque suele contener una cantidad importante de valores faltantes"
      ],
      "metadata": {
        "id": "SJR_EXv0nvrV"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "titanic[[\"alive\", \"pclass\", \"class\", \"embarked\", \"embark_town\", \"deck\"]].head(10)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 360
        },
        "id": "CFIVDQEHnySU",
        "outputId": "86cf39b4-aacb-4fb2-fb99-9333473cfced"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "  alive  pclass   class embarked  embark_town deck\n",
              "0    no       3   Third        S  Southampton  NaN\n",
              "1   yes       1   First        C    Cherbourg    C\n",
              "2   yes       3   Third        S  Southampton  NaN\n",
              "3   yes       1   First        S  Southampton    C\n",
              "4    no       3   Third        S  Southampton  NaN\n",
              "5    no       3   Third        Q   Queenstown  NaN\n",
              "6    no       1   First        S  Southampton    E\n",
              "7    no       3   Third        S  Southampton  NaN\n",
              "8   yes       3   Third        S  Southampton  NaN\n",
              "9   yes       2  Second        C    Cherbourg  NaN"
            ],
            "text/html": [
              "\n",
              "  <div id=\"df-eecc5145-4484-497e-8f8d-7efacdd1f8c9\" 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>alive</th>\n",
              "      <th>pclass</th>\n",
              "      <th>class</th>\n",
              "      <th>embarked</th>\n",
              "      <th>embark_town</th>\n",
              "      <th>deck</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>0</th>\n",
              "      <td>no</td>\n",
              "      <td>3</td>\n",
              "      <td>Third</td>\n",
              "      <td>S</td>\n",
              "      <td>Southampton</td>\n",
              "      <td>NaN</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1</th>\n",
              "      <td>yes</td>\n",
              "      <td>1</td>\n",
              "      <td>First</td>\n",
              "      <td>C</td>\n",
              "      <td>Cherbourg</td>\n",
              "      <td>C</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2</th>\n",
              "      <td>yes</td>\n",
              "      <td>3</td>\n",
              "      <td>Third</td>\n",
              "      <td>S</td>\n",
              "      <td>Southampton</td>\n",
              "      <td>NaN</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>3</th>\n",
              "      <td>yes</td>\n",
              "      <td>1</td>\n",
              "      <td>First</td>\n",
              "      <td>S</td>\n",
              "      <td>Southampton</td>\n",
              "      <td>C</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>4</th>\n",
              "      <td>no</td>\n",
              "      <td>3</td>\n",
              "      <td>Third</td>\n",
              "      <td>S</td>\n",
              "      <td>Southampton</td>\n",
              "      <td>NaN</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>5</th>\n",
              "      <td>no</td>\n",
              "      <td>3</td>\n",
              "      <td>Third</td>\n",
              "      <td>Q</td>\n",
              "      <td>Queenstown</td>\n",
              "      <td>NaN</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>6</th>\n",
              "      <td>no</td>\n",
              "      <td>1</td>\n",
              "      <td>First</td>\n",
              "      <td>S</td>\n",
              "      <td>Southampton</td>\n",
              "      <td>E</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>7</th>\n",
              "      <td>no</td>\n",
              "      <td>3</td>\n",
              "      <td>Third</td>\n",
              "      <td>S</td>\n",
              "      <td>Southampton</td>\n",
              "      <td>NaN</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>8</th>\n",
              "      <td>yes</td>\n",
              "      <td>3</td>\n",
              "      <td>Third</td>\n",
              "      <td>S</td>\n",
              "      <td>Southampton</td>\n",
              "      <td>NaN</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>9</th>\n",
              "      <td>yes</td>\n",
              "      <td>2</td>\n",
              "      <td>Second</td>\n",
              "      <td>C</td>\n",
              "      <td>Cherbourg</td>\n",
              "      <td>NaN</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-eecc5145-4484-497e-8f8d-7efacdd1f8c9')\"\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-eecc5145-4484-497e-8f8d-7efacdd1f8c9 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-eecc5145-4484-497e-8f8d-7efacdd1f8c9');\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>\n",
              "  </div>\n"
            ],
            "application/vnd.google.colaboratory.intrinsic+json": {
              "type": "dataframe",
              "summary": "{\n  \"name\": \"titanic[[\\\"alive\\\", \\\"pclass\\\", \\\"class\\\", \\\"embarked\\\", \\\"embark_town\\\", \\\"deck\\\"]]\",\n  \"rows\": 10,\n  \"fields\": [\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\": \"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\": \"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\": \"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\": \"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\": \"deck\",\n      \"properties\": {\n        \"dtype\": \"category\",\n        \"num_unique_values\": 2,\n        \"samples\": [\n          \"E\",\n          \"C\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    }\n  ]\n}"
            }
          },
          "metadata": {},
          "execution_count": 26
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "titanic[[\"alive\", \"pclass\", \"class\", \"embarked\", \"embark_town\", \"deck\"]].isnull().sum()"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 270
        },
        "id": "tNAkMw7HnzNx",
        "outputId": "60abe6eb-f615-4ce7-bffd-002f9ad0af6e"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "alive            0\n",
              "pclass           0\n",
              "class            0\n",
              "embarked         2\n",
              "embark_town      2\n",
              "deck           688\n",
              "dtype: int64"
            ],
            "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>0</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>alive</th>\n",
              "      <td>0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>pclass</th>\n",
              "      <td>0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>class</th>\n",
              "      <td>0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>embarked</th>\n",
              "      <td>2</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>embark_town</th>\n",
              "      <td>2</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>deck</th>\n",
              "      <td>688</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "</div><br><label><b>dtype:</b> int64</label>"
            ]
          },
          "metadata": {},
          "execution_count": 27
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "A partir de esta inspección inicial, ya se pueden identificar algunos aspectos importantes para el preprocesado y el entrenamiento de modelos:\n",
        "\n",
        "- existen columnas con valores faltantes, como `age`, `embarked`, `embark_town` o `deck`\n",
        "- hay variables categóricas que deberán transformarse\n",
        "- algunas columnas pueden no resultar adecuadas para el entrenamiento y convendrá eliminarlas\n",
        "- algunas variables pueden contener información redundante o incluso fuga de información\n",
        "\n",
        "En particular:\n",
        "\n",
        "- `alive` no debe utilizarse como predictora, ya que contiene la misma información que la variable objetivo `survived`\n",
        "- `pclass` y `class` son redundantes; en esta práctica se mantendrá `class` y se eliminará `pclass`. Eliminamos `pclass` porque puede confundir a los clasificadores al tener valores numéricos que implícitamente definan un orden.\n",
        "- `embarked` y `embark_town` también son redundantes; en esta práctica se mantendrá `embarked` y se eliminará `embark_town`\n",
        "- `deck` presenta muchos valores faltantes, por lo que también se eliminará para simplificar el preprocesado\n",
        "\n",
        "En la siguiente sección se definirá la variable objetivo y se seleccionarán las variables predictoras que se utilizarán en la práctica."
      ],
      "metadata": {
        "id": "7GQT2riwrxny"
      }
    },
    {
      "cell_type": "markdown",
      "source": [
        "### Eliminación de columnas no utilizadas\n",
        "\n",
        "Una vez revisadas las columnas problemáticas, se eliminarán del dataset aquellas que no se utilizarán en el entrenamiento de los modelos."
      ],
      "metadata": {
        "id": "6vMVqXuys0Rb"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "titanic = titanic.drop(columns=[\"alive\", \"pclass\", \"embark_town\", \"deck\"])"
      ],
      "metadata": {
        "id": "4wCtbumJnzQK"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "titanic.head()"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 205
        },
        "id": "vTiaGK4ZnzSS",
        "outputId": "717902cd-2211-4c69-e200-b41340e360bf"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "   survived     sex   age  sibsp  parch     fare embarked  class    who  \\\n",
              "0         0    male  22.0      1      0   7.2500        S  Third    man   \n",
              "1         1  female  38.0      1      0  71.2833        C  First  woman   \n",
              "2         1  female  26.0      0      0   7.9250        S  Third  woman   \n",
              "3         1  female  35.0      1      0  53.1000        S  First  woman   \n",
              "4         0    male  35.0      0      0   8.0500        S  Third    man   \n",
              "\n",
              "   adult_male  alone  \n",
              "0        True  False  \n",
              "1       False  False  \n",
              "2       False   True  \n",
              "3       False  False  \n",
              "4        True   True  "
            ],
            "text/html": [
              "\n",
              "  <div id=\"df-74d0e857-8343-44a5-b470-8bcf61531a2d\" 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>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>alone</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>0</th>\n",
              "      <td>0</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>False</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1</th>\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>False</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2</th>\n",
              "      <td>1</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>True</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>3</th>\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>False</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>4</th>\n",
              "      <td>0</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>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-74d0e857-8343-44a5-b470-8bcf61531a2d')\"\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-74d0e857-8343-44a5-b470-8bcf61531a2d 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-74d0e857-8343-44a5-b470-8bcf61531a2d');\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>\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\": \"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\": \"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": 30
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "## 3. Separación entre variables predictoras y variable objetivo\n",
        "\n",
        "En esta práctica, la variable objetivo será `survived`, que indica si el pasajero sobrevivió (`1`) o no (`0`).\n",
        "\n",
        "Una vez eliminadas en la sección anterior algunas columnas problemáticas o redundantes, el siguiente paso consiste en separar:\n",
        "\n",
        "- las **variables predictoras** (`X`)\n",
        "- la **variable objetivo** (`y`)"
      ],
      "metadata": {
        "id": "ufezyTmqmXtB"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "X = titanic.drop(columns=[\"survived\"])\n",
        "y = titanic[\"survived\"].copy()"
      ],
      "metadata": {
        "id": "0QJ64tT1nzUa"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "print(\"Dimensiones de X:\", X.shape)\n",
        "print(\"Dimensiones de y:\", y.shape)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "jvi4quLZmSUe",
        "outputId": "110a48af-ce2d-41c1-e798-722cadb2ccfb"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Dimensiones de X: (891, 10)\n",
            "Dimensiones de y: (891,)\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "X"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 421
        },
        "id": "cQJ8MjphmSXC",
        "outputId": "4553c8f4-4244-4fc2-c77a-dc91af97c9c8"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "        sex   age  sibsp  parch     fare embarked   class    who  adult_male  \\\n",
              "0      male  22.0      1      0   7.2500        S   Third    man        True   \n",
              "1    female  38.0      1      0  71.2833        C   First  woman       False   \n",
              "2    female  26.0      0      0   7.9250        S   Third  woman       False   \n",
              "3    female  35.0      1      0  53.1000        S   First  woman       False   \n",
              "4      male  35.0      0      0   8.0500        S   Third    man        True   \n",
              "..      ...   ...    ...    ...      ...      ...     ...    ...         ...   \n",
              "886    male  27.0      0      0  13.0000        S  Second    man        True   \n",
              "887  female  19.0      0      0  30.0000        S   First  woman       False   \n",
              "888  female   NaN      1      2  23.4500        S   Third  woman       False   \n",
              "889    male  26.0      0      0  30.0000        C   First    man        True   \n",
              "890    male  32.0      0      0   7.7500        Q   Third    man        True   \n",
              "\n",
              "     alone  \n",
              "0    False  \n",
              "1    False  \n",
              "2     True  \n",
              "3    False  \n",
              "4     True  \n",
              "..     ...  \n",
              "886   True  \n",
              "887   True  \n",
              "888  False  \n",
              "889   True  \n",
              "890   True  \n",
              "\n",
              "[891 rows x 10 columns]"
            ],
            "text/html": [
              "\n",
              "  <div id=\"df-18784d92-b3e7-499c-8709-c05b220237f8\" 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>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>alone</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>0</th>\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>False</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1</th>\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>False</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2</th>\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>True</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>3</th>\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>False</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>4</th>\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>True</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>...</th>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>886</th>\n",
              "      <td>male</td>\n",
              "      <td>27.0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>13.0000</td>\n",
              "      <td>S</td>\n",
              "      <td>Second</td>\n",
              "      <td>man</td>\n",
              "      <td>True</td>\n",
              "      <td>True</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>887</th>\n",
              "      <td>female</td>\n",
              "      <td>19.0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>30.0000</td>\n",
              "      <td>S</td>\n",
              "      <td>First</td>\n",
              "      <td>woman</td>\n",
              "      <td>False</td>\n",
              "      <td>True</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>888</th>\n",
              "      <td>female</td>\n",
              "      <td>NaN</td>\n",
              "      <td>1</td>\n",
              "      <td>2</td>\n",
              "      <td>23.4500</td>\n",
              "      <td>S</td>\n",
              "      <td>Third</td>\n",
              "      <td>woman</td>\n",
              "      <td>False</td>\n",
              "      <td>False</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>889</th>\n",
              "      <td>male</td>\n",
              "      <td>26.0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>30.0000</td>\n",
              "      <td>C</td>\n",
              "      <td>First</td>\n",
              "      <td>man</td>\n",
              "      <td>True</td>\n",
              "      <td>True</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>890</th>\n",
              "      <td>male</td>\n",
              "      <td>32.0</td>\n",
              "      <td>0</td>\n",
              "      <td>0</td>\n",
              "      <td>7.7500</td>\n",
              "      <td>Q</td>\n",
              "      <td>Third</td>\n",
              "      <td>man</td>\n",
              "      <td>True</td>\n",
              "      <td>True</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "<p>891 rows × 10 columns</p>\n",
              "</div>\n",
              "    <div class=\"colab-df-buttons\">\n",
              "\n",
              "  <div class=\"colab-df-container\">\n",
              "    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-18784d92-b3e7-499c-8709-c05b220237f8')\"\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-18784d92-b3e7-499c-8709-c05b220237f8 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-18784d92-b3e7-499c-8709-c05b220237f8');\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=\"id_a12eef30-a5cc-461d-ba9a-ce9f3b55142e\">\n",
              "    <style>\n",
              "      .colab-df-generate {\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-generate: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",
              "      [theme=dark] .colab-df-generate {\n",
              "        background-color: #3B4455;\n",
              "        fill: #D2E3FC;\n",
              "      }\n",
              "\n",
              "      [theme=dark] .colab-df-generate: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",
              "    <button class=\"colab-df-generate\" onclick=\"generateWithVariable('X')\"\n",
              "            title=\"Generate code using this dataframe.\"\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",
              "    <path d=\"M7,19H8.4L18.45,9,17,7.55,7,17.6ZM5,21V16.75L18.45,3.32a2,2,0,0,1,2.83,0l1.4,1.43a1.91,1.91,0,0,1,.58,1.4,1.91,1.91,0,0,1-.58,1.4L9.25,21ZM18.45,9,17,7.55Zm-12,3A5.31,5.31,0,0,0,4.9,8.1,5.31,5.31,0,0,0,1,6.5,5.31,5.31,0,0,0,4.9,4.9,5.31,5.31,0,0,0,6.5,1,5.31,5.31,0,0,0,8.1,4.9,5.31,5.31,0,0,0,12,6.5,5.46,5.46,0,0,0,6.5,12Z\"/>\n",
              "  </svg>\n",
              "    </button>\n",
              "    <script>\n",
              "      (() => {\n",
              "      const buttonEl =\n",
              "        document.querySelector('#id_a12eef30-a5cc-461d-ba9a-ce9f3b55142e button.colab-df-generate');\n",
              "      buttonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "\n",
              "      buttonEl.onclick = () => {\n",
              "        google.colab.notebook.generateWithVariable('X');\n",
              "      }\n",
              "      })();\n",
              "    </script>\n",
              "  </div>\n",
              "\n",
              "    </div>\n",
              "  </div>\n"
            ],
            "application/vnd.google.colaboratory.intrinsic+json": {
              "type": "dataframe",
              "variable_name": "X",
              "summary": "{\n  \"name\": \"X\",\n  \"rows\": 891,\n  \"fields\": [\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\": \"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": 33
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "y"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 455
        },
        "id": "FLjA49_emSYe",
        "outputId": "46e16cf7-2d5e-4234-d9d5-128db14f6a4a"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "0      0\n",
              "1      1\n",
              "2      1\n",
              "3      1\n",
              "4      0\n",
              "      ..\n",
              "886    0\n",
              "887    1\n",
              "888    0\n",
              "889    1\n",
              "890    0\n",
              "Name: survived, Length: 891, dtype: int64"
            ],
            "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>survived</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>0</th>\n",
              "      <td>0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1</th>\n",
              "      <td>1</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2</th>\n",
              "      <td>1</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>3</th>\n",
              "      <td>1</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>4</th>\n",
              "      <td>0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>...</th>\n",
              "      <td>...</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>886</th>\n",
              "      <td>0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>887</th>\n",
              "      <td>1</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>888</th>\n",
              "      <td>0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>889</th>\n",
              "      <td>1</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>890</th>\n",
              "      <td>0</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "<p>891 rows × 1 columns</p>\n",
              "</div><br><label><b>dtype:</b> int64</label>"
            ]
          },
          "metadata": {},
          "execution_count": 34
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "## 4. División del dataset en entrenamiento y prueba\n",
        "\n",
        "Una vez definidas las variables predictoras y la variable objetivo, el siguiente paso consiste en dividir el dataset en dos partes:\n",
        "\n",
        "- **train**: se utilizará para entrenar los modelos\n",
        "- **test**: se reservará para evaluar el rendimiento final sobre datos no vistos\n",
        "\n",
        "En problemas de clasificación, además, conviene que esta partición mantenga aproximadamente la misma proporción de clases en ambos subconjuntos. Para ello se utilizará el parámetro `stratify=y`."
      ],
      "metadata": {
        "id": "sLzo667dtshb"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "from sklearn.model_selection import train_test_split\n",
        "\n",
        "X_train, X_test, y_train, y_test = train_test_split(\n",
        "    X,\n",
        "    y,\n",
        "    test_size=0.2,\n",
        "    random_state=42,\n",
        "    stratify=y\n",
        ")"
      ],
      "metadata": {
        "id": "kpuyDA53mSau"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "print(\"Dimensiones de X_train:\", X_train.shape)\n",
        "print(\"Dimensiones de X_test:\", X_test.shape)\n",
        "print(\"Dimensiones de y_train:\", y_train.shape)\n",
        "print(\"Dimensiones de y_test:\", y_test.shape)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "7ykZheOAmSc5",
        "outputId": "ea0c3533-ec6f-4e53-f708-bd2499151afe"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Dimensiones de X_train: (712, 10)\n",
            "Dimensiones de X_test: (179, 10)\n",
            "Dimensiones de y_train: (712,)\n",
            "Dimensiones de y_test: (179,)\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "print(\"Distribución de survived en y_train:\")\n",
        "print(y_train.value_counts(normalize=True))\n",
        "\n",
        "print()\n",
        "\n",
        "print(\"Distribución de survived en y_test:\")\n",
        "print(y_test.value_counts(normalize=True))"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "Gb2CJ03LmSfD",
        "outputId": "8b141339-cfd0-4579-c105-812440d134ee"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Distribución de survived en y_train:\n",
            "survived\n",
            "0    0.616573\n",
            "1    0.383427\n",
            "Name: proportion, dtype: float64\n",
            "\n",
            "Distribución de survived en y_test:\n",
            "survived\n",
            "0    0.614525\n",
            "1    0.385475\n",
            "Name: proportion, dtype: float64\n"
          ]
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "## 5. Preprocesado específico para modelado ajustado solo con train\n",
        "\n",
        "Una vez realizada la partición entre entrenamiento y prueba, el siguiente paso consiste en definir el preprocesado que se aplicará a los datos antes de entrenar los modelos de clasificación.\n",
        "\n",
        "Este preprocesado debe ajustarse únicamente con `X_train`. Después, ese mismo procesamiento se aplicará a `X_test`.\n",
        "\n",
        "En esta práctica se considerarán dos tipos de variables:\n",
        "\n",
        "- **variables numéricas**, sobre las que se aplicará imputación y escalado\n",
        "- **variables categóricas**, sobre las que se aplicará imputación y codificación\n",
        "\n",
        "De este modo, el dataset quedará preparado para entrenar distintos modelos de clasificación dentro de un flujo común basado en pipelines."
      ],
      "metadata": {
        "id": "zFYmBoZBuDxP"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "num_attribs = X_train.select_dtypes(include=[np.number]).columns.tolist()\n",
        "cat_attribs = X_train.select_dtypes(exclude=[np.number]).columns.tolist()\n",
        "\n",
        "print(\"Columnas numéricas:\", num_attribs)\n",
        "print(\"Columnas categóricas:\", cat_attribs)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "VzIQt3r5mShP",
        "outputId": "d9dec171-a6e0-4200-e181-01d1e5390934"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Columnas numéricas: ['age', 'sibsp', 'parch', 'fare']\n",
            "Columnas categóricas: ['sex', 'embarked', 'class', 'who', 'adult_male', 'alone']\n"
          ]
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "### Definición del pipeline numérico\n",
        "\n",
        "En las variables numéricas se aplicarán dos transformaciones:\n",
        "\n",
        "- **imputación por la mediana**, para tratar posibles valores faltantes\n",
        "- **escalado con `StandardScaler`**, para dejar las variables numéricas en una escala más homogénea"
      ],
      "metadata": {
        "id": "DsJWSTtMuTA2"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "from sklearn.pipeline import Pipeline\n",
        "from sklearn.compose import ColumnTransformer\n",
        "from sklearn.impute import SimpleImputer\n",
        "from sklearn.preprocessing import StandardScaler, OneHotEncoder"
      ],
      "metadata": {
        "id": "N5uY_QO2uftT"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "num_pipeline = Pipeline([\n",
        "    (\"imputer\", SimpleImputer(strategy=\"median\")),\n",
        "    (\"scaler\", StandardScaler())\n",
        "])"
      ],
      "metadata": {
        "id": "0RND32IkmSji"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "source": [
        "### Definición del pipeline categórico\n",
        "\n",
        "En las variables categóricas se aplicarán también dos transformaciones:\n",
        "\n",
        "- **imputación por el valor más frecuente**, para tratar posibles valores faltantes\n",
        "- **One Hot Encoding**, para convertir las categorías a una representación numérica adecuada para los modelos"
      ],
      "metadata": {
        "id": "8ZkP17EluVBN"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "cat_pipeline = Pipeline([\n",
        "    (\"imputer\", SimpleImputer(strategy=\"most_frequent\")),\n",
        "    (\"onehot\", OneHotEncoder(handle_unknown=\"ignore\"))\n",
        "])"
      ],
      "metadata": {
        "id": "HkI33DjomSld"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "source": [
        "### Combinación del preprocesado numérico y categórico\n",
        "\n",
        "Una vez definidos ambos pipelines, se combinan en una única estructura de preprocesado mediante `ColumnTransformer`.\n",
        "\n",
        "De este modo:\n",
        "\n",
        "- el pipeline numérico se aplicará solo a las columnas numéricas\n",
        "- el pipeline categórico se aplicará solo a las columnas categóricas"
      ],
      "metadata": {
        "id": "PpCxV1umulV1"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "preprocessor = ColumnTransformer([\n",
        "    (\"num\", num_pipeline, num_attribs),\n",
        "    (\"cat\", cat_pipeline, cat_attribs)\n",
        "])"
      ],
      "metadata": {
        "id": "xgdKELPzmSnz"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "source": [
        "### Ajuste del preprocesado con `X_train`\n",
        "\n",
        "A continuación, el preprocesado se ajustará utilizando únicamente `X_train`.\n",
        "\n",
        "Después, ese mismo preprocesado ya ajustado se aplicará a `X_test`."
      ],
      "metadata": {
        "id": "EohZBFBtuoOM"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "X_train_prepared = preprocessor.fit_transform(X_train)\n",
        "X_test_prepared = preprocessor.transform(X_test)"
      ],
      "metadata": {
        "id": "wuQYiTM7mSsL"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "print(\"Dimensiones originales de X_train:\", X_train.shape)\n",
        "print(\"Dimensiones transformadas de X_train:\", X_train_prepared.shape)\n",
        "print(\"Dimensiones originales de X_test:\", X_test.shape)\n",
        "print(\"Dimensiones transformadas de X_test:\", X_test_prepared.shape)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "jD0uvJzumSuX",
        "outputId": "53f1d20f-03b8-4906-92c9-5459bf8ce62f"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Dimensiones originales de X_train: (712, 10)\n",
            "Dimensiones transformadas de X_train: (712, 19)\n",
            "Dimensiones originales de X_test: (179, 10)\n",
            "Dimensiones transformadas de X_test: (179, 19)\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "# Este código nos vuelca a un df el resultado de la transformación\n",
        "# X_train_prepared es una matriz de valores en la que es difícil ver que el resultado es el esperado\n",
        "\n",
        "feature_names = preprocessor.get_feature_names_out()\n",
        "\n",
        "X_train_prepared_df = pd.DataFrame(\n",
        "    X_train_prepared,\n",
        "    columns=feature_names,\n",
        "    index=X_train.index\n",
        ")\n",
        "\n",
        "X_train_prepared_df"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 441
        },
        "id": "_aiO2qyNuzV4",
        "outputId": "1a325da7-ca87-4dc7-fbb6-ad41b78beae0"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "     num__age  num__sibsp  num__parch  num__fare  cat__sex_female  \\\n",
              "692 -0.081135   -0.465084   -0.466183   0.513812              0.0   \n",
              "481 -0.081135   -0.465084   -0.466183  -0.662563              0.0   \n",
              "527 -0.081135   -0.465084   -0.466183   3.955399              0.0   \n",
              "855 -0.887827   -0.465084    0.727782  -0.467874              1.0   \n",
              "801  0.110934    0.478335    0.727782  -0.115977              1.0   \n",
              "..        ...         ...         ...        ...              ...   \n",
              "359 -0.081135   -0.465084   -0.466183  -0.498500              1.0   \n",
              "258  0.418245   -0.465084   -0.466183  10.005329              1.0   \n",
              "736  1.417007    0.478335    3.115713   0.053205              1.0   \n",
              "462  1.340179   -0.465084   -0.466183   0.139097              0.0   \n",
              "507 -0.081135   -0.465084   -0.466183  -0.109730              0.0   \n",
              "\n",
              "     cat__sex_male  cat__embarked_C  cat__embarked_Q  cat__embarked_S  \\\n",
              "692            1.0              0.0              0.0              1.0   \n",
              "481            1.0              0.0              0.0              1.0   \n",
              "527            1.0              0.0              0.0              1.0   \n",
              "855            0.0              0.0              0.0              1.0   \n",
              "801            0.0              0.0              0.0              1.0   \n",
              "..             ...              ...              ...              ...   \n",
              "359            0.0              0.0              1.0              0.0   \n",
              "258            0.0              1.0              0.0              0.0   \n",
              "736            0.0              0.0              0.0              1.0   \n",
              "462            1.0              0.0              0.0              1.0   \n",
              "507            1.0              0.0              0.0              1.0   \n",
              "\n",
              "     cat__class_First  cat__class_Second  cat__class_Third  cat__who_child  \\\n",
              "692               0.0                0.0               1.0             0.0   \n",
              "481               0.0                1.0               0.0             0.0   \n",
              "527               1.0                0.0               0.0             0.0   \n",
              "855               0.0                0.0               1.0             0.0   \n",
              "801               0.0                1.0               0.0             0.0   \n",
              "..                ...                ...               ...             ...   \n",
              "359               0.0                0.0               1.0             0.0   \n",
              "258               1.0                0.0               0.0             0.0   \n",
              "736               0.0                0.0               1.0             0.0   \n",
              "462               1.0                0.0               0.0             0.0   \n",
              "507               1.0                0.0               0.0             0.0   \n",
              "\n",
              "     cat__who_man  cat__who_woman  cat__adult_male_False  \\\n",
              "692           1.0             0.0                    0.0   \n",
              "481           1.0             0.0                    0.0   \n",
              "527           1.0             0.0                    0.0   \n",
              "855           0.0             1.0                    1.0   \n",
              "801           0.0             1.0                    1.0   \n",
              "..            ...             ...                    ...   \n",
              "359           0.0             1.0                    1.0   \n",
              "258           0.0             1.0                    1.0   \n",
              "736           0.0             1.0                    1.0   \n",
              "462           1.0             0.0                    0.0   \n",
              "507           1.0             0.0                    0.0   \n",
              "\n",
              "     cat__adult_male_True  cat__alone_False  cat__alone_True  \n",
              "692                   1.0               0.0              1.0  \n",
              "481                   1.0               0.0              1.0  \n",
              "527                   1.0               0.0              1.0  \n",
              "855                   0.0               1.0              0.0  \n",
              "801                   0.0               1.0              0.0  \n",
              "..                    ...               ...              ...  \n",
              "359                   0.0               0.0              1.0  \n",
              "258                   0.0               0.0              1.0  \n",
              "736                   0.0               1.0              0.0  \n",
              "462                   1.0               0.0              1.0  \n",
              "507                   1.0               0.0              1.0  \n",
              "\n",
              "[712 rows x 19 columns]"
            ],
            "text/html": [
              "\n",
              "  <div id=\"df-4bf16d9d-71a8-480c-a269-142def4c82d1\" 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>num__age</th>\n",
              "      <th>num__sibsp</th>\n",
              "      <th>num__parch</th>\n",
              "      <th>num__fare</th>\n",
              "      <th>cat__sex_female</th>\n",
              "      <th>cat__sex_male</th>\n",
              "      <th>cat__embarked_C</th>\n",
              "      <th>cat__embarked_Q</th>\n",
              "      <th>cat__embarked_S</th>\n",
              "      <th>cat__class_First</th>\n",
              "      <th>cat__class_Second</th>\n",
              "      <th>cat__class_Third</th>\n",
              "      <th>cat__who_child</th>\n",
              "      <th>cat__who_man</th>\n",
              "      <th>cat__who_woman</th>\n",
              "      <th>cat__adult_male_False</th>\n",
              "      <th>cat__adult_male_True</th>\n",
              "      <th>cat__alone_False</th>\n",
              "      <th>cat__alone_True</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>692</th>\n",
              "      <td>-0.081135</td>\n",
              "      <td>-0.465084</td>\n",
              "      <td>-0.466183</td>\n",
              "      <td>0.513812</td>\n",
              "      <td>0.0</td>\n",
              "      <td>1.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>1.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</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>1.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>1.0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>481</th>\n",
              "      <td>-0.081135</td>\n",
              "      <td>-0.465084</td>\n",
              "      <td>-0.466183</td>\n",
              "      <td>-0.662563</td>\n",
              "      <td>0.0</td>\n",
              "      <td>1.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</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>1.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>1.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>1.0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>527</th>\n",
              "      <td>-0.081135</td>\n",
              "      <td>-0.465084</td>\n",
              "      <td>-0.466183</td>\n",
              "      <td>3.955399</td>\n",
              "      <td>0.0</td>\n",
              "      <td>1.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>1.0</td>\n",
              "      <td>1.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>1.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>1.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>1.0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>855</th>\n",
              "      <td>-0.887827</td>\n",
              "      <td>-0.465084</td>\n",
              "      <td>0.727782</td>\n",
              "      <td>-0.467874</td>\n",
              "      <td>1.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>1.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>1.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>1.0</td>\n",
              "      <td>1.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>1.0</td>\n",
              "      <td>0.0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>801</th>\n",
              "      <td>0.110934</td>\n",
              "      <td>0.478335</td>\n",
              "      <td>0.727782</td>\n",
              "      <td>-0.115977</td>\n",
              "      <td>1.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</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>0.0</td>\n",
              "      <td>1.0</td>\n",
              "      <td>1.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>1.0</td>\n",
              "      <td>0.0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>...</th>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>359</th>\n",
              "      <td>-0.081135</td>\n",
              "      <td>-0.465084</td>\n",
              "      <td>-0.466183</td>\n",
              "      <td>-0.498500</td>\n",
              "      <td>1.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>1.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>1.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>1.0</td>\n",
              "      <td>1.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>1.0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>258</th>\n",
              "      <td>0.418245</td>\n",
              "      <td>-0.465084</td>\n",
              "      <td>-0.466183</td>\n",
              "      <td>10.005329</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>1.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>1.0</td>\n",
              "      <td>1.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>1.0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>736</th>\n",
              "      <td>1.417007</td>\n",
              "      <td>0.478335</td>\n",
              "      <td>3.115713</td>\n",
              "      <td>0.053205</td>\n",
              "      <td>1.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>1.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>1.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>1.0</td>\n",
              "      <td>1.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>1.0</td>\n",
              "      <td>0.0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>462</th>\n",
              "      <td>1.340179</td>\n",
              "      <td>-0.465084</td>\n",
              "      <td>-0.466183</td>\n",
              "      <td>0.139097</td>\n",
              "      <td>0.0</td>\n",
              "      <td>1.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>1.0</td>\n",
              "      <td>1.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>1.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>1.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>1.0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>507</th>\n",
              "      <td>-0.081135</td>\n",
              "      <td>-0.465084</td>\n",
              "      <td>-0.466183</td>\n",
              "      <td>-0.109730</td>\n",
              "      <td>0.0</td>\n",
              "      <td>1.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>1.0</td>\n",
              "      <td>1.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>1.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>1.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>1.0</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "<p>712 rows × 19 columns</p>\n",
              "</div>\n",
              "    <div class=\"colab-df-buttons\">\n",
              "\n",
              "  <div class=\"colab-df-container\">\n",
              "    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-4bf16d9d-71a8-480c-a269-142def4c82d1')\"\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-4bf16d9d-71a8-480c-a269-142def4c82d1 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-4bf16d9d-71a8-480c-a269-142def4c82d1');\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=\"id_a2ee306d-ae56-4d46-830f-b3f79a68add2\">\n",
              "    <style>\n",
              "      .colab-df-generate {\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-generate: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",
              "      [theme=dark] .colab-df-generate {\n",
              "        background-color: #3B4455;\n",
              "        fill: #D2E3FC;\n",
              "      }\n",
              "\n",
              "      [theme=dark] .colab-df-generate: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",
              "    <button class=\"colab-df-generate\" onclick=\"generateWithVariable('X_train_prepared_df')\"\n",
              "            title=\"Generate code using this dataframe.\"\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",
              "    <path d=\"M7,19H8.4L18.45,9,17,7.55,7,17.6ZM5,21V16.75L18.45,3.32a2,2,0,0,1,2.83,0l1.4,1.43a1.91,1.91,0,0,1,.58,1.4,1.91,1.91,0,0,1-.58,1.4L9.25,21ZM18.45,9,17,7.55Zm-12,3A5.31,5.31,0,0,0,4.9,8.1,5.31,5.31,0,0,0,1,6.5,5.31,5.31,0,0,0,4.9,4.9,5.31,5.31,0,0,0,6.5,1,5.31,5.31,0,0,0,8.1,4.9,5.31,5.31,0,0,0,12,6.5,5.46,5.46,0,0,0,6.5,12Z\"/>\n",
              "  </svg>\n",
              "    </button>\n",
              "    <script>\n",
              "      (() => {\n",
              "      const buttonEl =\n",
              "        document.querySelector('#id_a2ee306d-ae56-4d46-830f-b3f79a68add2 button.colab-df-generate');\n",
              "      buttonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "\n",
              "      buttonEl.onclick = () => {\n",
              "        google.colab.notebook.generateWithVariable('X_train_prepared_df');\n",
              "      }\n",
              "      })();\n",
              "    </script>\n",
              "  </div>\n",
              "\n",
              "    </div>\n",
              "  </div>\n"
            ],
            "application/vnd.google.colaboratory.intrinsic+json": {
              "type": "dataframe",
              "variable_name": "X_train_prepared_df",
              "summary": "{\n  \"name\": \"X_train_prepared_df\",\n  \"rows\": 712,\n  \"fields\": [\n    {\n      \"column\": \"num__age\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 1.0007029877845401,\n        \"min\": -2.238459843712981,\n        \"max\": 3.8754961621172517,\n        \"num_unique_values\": 85,\n        \"samples\": [\n          3.107218202098373,\n          -0.08113533197997112,\n          0.5334870360351315\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"num__sibsp\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 1.0007029877845341,\n        \"min\": -0.46508427634374117,\n        \"max\": 7.082266259422497,\n        \"num_unique_values\": 7,\n        \"samples\": [\n          -0.46508427634374117,\n          0.4783345406270387,\n          1.4217533575978185\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"num__parch\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 1.0007029877845415,\n        \"min\": -0.46618317148792077,\n        \"max\": 6.697610024901998,\n        \"num_unique_values\": 7,\n        \"samples\": [\n          -0.46618317148792077,\n          0.7277823612437324,\n          4.309678959438692\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"num__fare\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 1.0007029877845375,\n        \"min\": -0.6625632269369692,\n        \"max\": 10.005329337567716,\n        \"num_unique_values\": 226,\n        \"samples\": [\n          0.07662982713825477,\n          -0.1151959759791537,\n          2.7703471811842633\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"cat__sex_female\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0.4789517960369678,\n        \"min\": 0.0,\n        \"max\": 1.0,\n        \"num_unique_values\": 2,\n        \"samples\": [\n          1.0,\n          0.0\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"cat__sex_male\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0.4789517960369678,\n        \"min\": 0.0,\n        \"max\": 1.0,\n        \"num_unique_values\": 2,\n        \"samples\": [\n          0.0,\n          1.0\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"cat__embarked_C\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0.3966522424866413,\n        \"min\": 0.0,\n        \"max\": 1.0,\n        \"num_unique_values\": 2,\n        \"samples\": [\n          1.0,\n          0.0\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"cat__embarked_Q\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0.2671709485414896,\n        \"min\": 0.0,\n        \"max\": 1.0,\n        \"num_unique_values\": 2,\n        \"samples\": [\n          1.0,\n          0.0\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"cat__embarked_S\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0.4455443571348282,\n        \"min\": 0.0,\n        \"max\": 1.0,\n        \"num_unique_values\": 2,\n        \"samples\": [\n          0.0,\n          1.0\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"cat__class_First\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0.4274859943343307,\n        \"min\": 0.0,\n        \"max\": 1.0,\n        \"num_unique_values\": 2,\n        \"samples\": [\n          1.0,\n          0.0\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"cat__class_Second\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0.4080740611549291,\n        \"min\": 0.0,\n        \"max\": 1.0,\n        \"num_unique_values\": 2,\n        \"samples\": [\n          1.0,\n          0.0\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"cat__class_Third\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0.49792748298831835,\n        \"min\": 0.0,\n        \"max\": 1.0,\n        \"num_unique_values\": 2,\n        \"samples\": [\n          0.0,\n          1.0\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"cat__who_child\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0.2902107059160348,\n        \"min\": 0.0,\n        \"max\": 1.0,\n        \"num_unique_values\": 2,\n        \"samples\": [\n          1.0,\n          0.0\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"cat__who_man\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0.4900114828638108,\n        \"min\": 0.0,\n        \"max\": 1.0,\n        \"num_unique_values\": 2,\n        \"samples\": [\n          0.0,\n          1.0\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"cat__who_woman\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0.46122933785038084,\n        \"min\": 0.0,\n        \"max\": 1.0,\n        \"num_unique_values\": 2,\n        \"samples\": [\n          1.0,\n          0.0\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"cat__adult_male_False\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0.4900114828638108,\n        \"min\": 0.0,\n        \"max\": 1.0,\n        \"num_unique_values\": 2,\n        \"samples\": [\n          1.0,\n          0.0\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"cat__adult_male_True\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0.4900114828638108,\n        \"min\": 0.0,\n        \"max\": 1.0,\n        \"num_unique_values\": 2,\n        \"samples\": [\n          0.0,\n          1.0\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"cat__alone_False\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0.4881940314552062,\n        \"min\": 0.0,\n        \"max\": 1.0,\n        \"num_unique_values\": 2,\n        \"samples\": [\n          1.0,\n          0.0\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"cat__alone_True\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0.4881940314552062,\n        \"min\": 0.0,\n        \"max\": 1.0,\n        \"num_unique_values\": 2,\n        \"samples\": [\n          0.0,\n          1.0\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    }\n  ]\n}"
            }
          },
          "metadata": {},
          "execution_count": 54
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "## 6. Logistic Regression + GridSearchCV\n",
        "\n",
        "El primer modelo que se entrenará será una **regresión logística**.\n",
        "\n",
        "En este caso, el preprocesado y el modelo se integrarán en un único pipeline completo. Después, se utilizará `GridSearchCV` para probar distintas configuraciones del modelo y seleccionar automáticamente la mejor mediante validación cruzada.\n",
        "\n",
        "La métrica principal que se utilizará en esta práctica será **F1-score**, ya que combina *precision* y *recall* y resulta especialmente útil en problemas de clasificación binaria."
      ],
      "metadata": {
        "id": "cM5Bmfu7wRsr"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "from sklearn.pipeline import Pipeline\n",
        "from sklearn.linear_model import LogisticRegression\n",
        "from sklearn.model_selection import GridSearchCV"
      ],
      "metadata": {
        "id": "xFBnrSngvhbs"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "source": [
        "### Definición del pipeline completo\n",
        "\n",
        "A continuación, se construirá un pipeline que agrupe:\n",
        "\n",
        "- el preprocesado definido en la sección anterior\n",
        "- el modelo de regresión logística"
      ],
      "metadata": {
        "id": "zNAB6P0jwoYc"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "full_pipeline_logreg = Pipeline([\n",
        "    (\"preprocessor\", preprocessor),\n",
        "    (\"model\", LogisticRegression())\n",
        "])"
      ],
      "metadata": {
        "id": "9uagUEUIvhfE"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "source": [
        "### Definición de la búsqueda de hiperparámetros\n",
        "\n",
        "Se probarán distintas configuraciones del modelo modificando algunos hiperparámetros habituales de la regresión logística:\n",
        "\n",
        "- `C`, que controla el nivel de regularización\n",
        "- `solver`, que indica el método de optimización utilizado\n",
        "- `max_iter`, para asegurar convergencia del entrenamiento"
      ],
      "metadata": {
        "id": "FzrMzuruwsXE"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "param_grid_logreg = {\n",
        "    \"model__C\": [0.01, 0.1, 1, 10],\n",
        "    \"model__solver\": [\"liblinear\", \"lbfgs\"],\n",
        "    \"model__max_iter\": [500, 1000]\n",
        "}"
      ],
      "metadata": {
        "id": "FEWWQIPdvhiH"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "source": [
        "### Entrenamiento con GridSearchCV\n",
        "\n",
        "A continuación, se aplicará `GridSearchCV` sobre el conjunto `train` para seleccionar automáticamente la mejor configuración del modelo mediante validación cruzada."
      ],
      "metadata": {
        "id": "5VCVZOvGwyHl"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "grid_search_logreg = GridSearchCV(\n",
        "    estimator=full_pipeline_logreg,\n",
        "    param_grid=param_grid_logreg,\n",
        "    scoring=\"f1\",\n",
        "    cv=5\n",
        ")"
      ],
      "metadata": {
        "id": "0jRumcj9vhlM"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "grid_search_logreg.fit(X_train, y_train)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 316
        },
        "id": "k4_C-MAivhoV",
        "outputId": "a3808e43-e122-492f-ed69-b721ef73bede"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "GridSearchCV(cv=5,\n",
              "             estimator=Pipeline(steps=[('preprocessor',\n",
              "                                        ColumnTransformer(transformers=[('num',\n",
              "                                                                         Pipeline(steps=[('imputer',\n",
              "                                                                                          SimpleImputer(strategy='median')),\n",
              "                                                                                         ('scaler',\n",
              "                                                                                          StandardScaler())]),\n",
              "                                                                         ['age',\n",
              "                                                                          'sibsp',\n",
              "                                                                          'parch',\n",
              "                                                                          'fare']),\n",
              "                                                                        ('cat',\n",
              "                                                                         Pipeline(steps=[('imputer',\n",
              "                                                                                          SimpleImputer(strategy='most_frequent')),\n",
              "                                                                                         ('onehot',\n",
              "                                                                                          OneHotEncoder(handle_unknown='ignore'))]),\n",
              "                                                                         ['sex',\n",
              "                                                                          'embarked',\n",
              "                                                                          'class',\n",
              "                                                                          'who',\n",
              "                                                                          'adult_male',\n",
              "                                                                          'alone'])])),\n",
              "                                       ('model', LogisticRegression())]),\n",
              "             param_grid={'model__C': [0.01, 0.1, 1, 10],\n",
              "                         'model__max_iter': [500, 1000],\n",
              "                         'model__solver': ['liblinear', 'lbfgs']},\n",
              "             scoring='f1')"
            ],
            "text/html": [
              "<style>#sk-container-id-1 {\n",
              "  /* Definition of color scheme common for light and dark mode */\n",
              "  --sklearn-color-text: #000;\n",
              "  --sklearn-color-text-muted: #666;\n",
              "  --sklearn-color-line: gray;\n",
              "  /* Definition of color scheme for unfitted estimators */\n",
              "  --sklearn-color-unfitted-level-0: #fff5e6;\n",
              "  --sklearn-color-unfitted-level-1: #f6e4d2;\n",
              "  --sklearn-color-unfitted-level-2: #ffe0b3;\n",
              "  --sklearn-color-unfitted-level-3: chocolate;\n",
              "  /* Definition of color scheme for fitted estimators */\n",
              "  --sklearn-color-fitted-level-0: #f0f8ff;\n",
              "  --sklearn-color-fitted-level-1: #d4ebff;\n",
              "  --sklearn-color-fitted-level-2: #b3dbfd;\n",
              "  --sklearn-color-fitted-level-3: cornflowerblue;\n",
              "\n",
              "  /* Specific color for light theme */\n",
              "  --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
              "  --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
              "  --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
              "  --sklearn-color-icon: #696969;\n",
              "\n",
              "  @media (prefers-color-scheme: dark) {\n",
              "    /* Redefinition of color scheme for dark theme */\n",
              "    --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
              "    --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
              "    --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
              "    --sklearn-color-icon: #878787;\n",
              "  }\n",
              "}\n",
              "\n",
              "#sk-container-id-1 {\n",
              "  color: var(--sklearn-color-text);\n",
              "}\n",
              "\n",
              "#sk-container-id-1 pre {\n",
              "  padding: 0;\n",
              "}\n",
              "\n",
              "#sk-container-id-1 input.sk-hidden--visually {\n",
              "  border: 0;\n",
              "  clip: rect(1px 1px 1px 1px);\n",
              "  clip: rect(1px, 1px, 1px, 1px);\n",
              "  height: 1px;\n",
              "  margin: -1px;\n",
              "  overflow: hidden;\n",
              "  padding: 0;\n",
              "  position: absolute;\n",
              "  width: 1px;\n",
              "}\n",
              "\n",
              "#sk-container-id-1 div.sk-dashed-wrapped {\n",
              "  border: 1px dashed var(--sklearn-color-line);\n",
              "  margin: 0 0.4em 0.5em 0.4em;\n",
              "  box-sizing: border-box;\n",
              "  padding-bottom: 0.4em;\n",
              "  background-color: var(--sklearn-color-background);\n",
              "}\n",
              "\n",
              "#sk-container-id-1 div.sk-container {\n",
              "  /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
              "     but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
              "     so we also need the `!important` here to be able to override the\n",
              "     default hidden behavior on the sphinx rendered scikit-learn.org.\n",
              "     See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
              "  display: inline-block !important;\n",
              "  position: relative;\n",
              "}\n",
              "\n",
              "#sk-container-id-1 div.sk-text-repr-fallback {\n",
              "  display: none;\n",
              "}\n",
              "\n",
              "div.sk-parallel-item,\n",
              "div.sk-serial,\n",
              "div.sk-item {\n",
              "  /* draw centered vertical line to link estimators */\n",
              "  background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
              "  background-size: 2px 100%;\n",
              "  background-repeat: no-repeat;\n",
              "  background-position: center center;\n",
              "}\n",
              "\n",
              "/* Parallel-specific style estimator block */\n",
              "\n",
              "#sk-container-id-1 div.sk-parallel-item::after {\n",
              "  content: \"\";\n",
              "  width: 100%;\n",
              "  border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
              "  flex-grow: 1;\n",
              "}\n",
              "\n",
              "#sk-container-id-1 div.sk-parallel {\n",
              "  display: flex;\n",
              "  align-items: stretch;\n",
              "  justify-content: center;\n",
              "  background-color: var(--sklearn-color-background);\n",
              "  position: relative;\n",
              "}\n",
              "\n",
              "#sk-container-id-1 div.sk-parallel-item {\n",
              "  display: flex;\n",
              "  flex-direction: column;\n",
              "}\n",
              "\n",
              "#sk-container-id-1 div.sk-parallel-item:first-child::after {\n",
              "  align-self: flex-end;\n",
              "  width: 50%;\n",
              "}\n",
              "\n",
              "#sk-container-id-1 div.sk-parallel-item:last-child::after {\n",
              "  align-self: flex-start;\n",
              "  width: 50%;\n",
              "}\n",
              "\n",
              "#sk-container-id-1 div.sk-parallel-item:only-child::after {\n",
              "  width: 0;\n",
              "}\n",
              "\n",
              "/* Serial-specific style estimator block */\n",
              "\n",
              "#sk-container-id-1 div.sk-serial {\n",
              "  display: flex;\n",
              "  flex-direction: column;\n",
              "  align-items: center;\n",
              "  background-color: var(--sklearn-color-background);\n",
              "  padding-right: 1em;\n",
              "  padding-left: 1em;\n",
              "}\n",
              "\n",
              "\n",
              "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
              "clickable and can be expanded/collapsed.\n",
              "- Pipeline and ColumnTransformer use this feature and define the default style\n",
              "- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
              "*/\n",
              "\n",
              "/* Pipeline and ColumnTransformer style (default) */\n",
              "\n",
              "#sk-container-id-1 div.sk-toggleable {\n",
              "  /* Default theme specific background. It is overwritten whether we have a\n",
              "  specific estimator or a Pipeline/ColumnTransformer */\n",
              "  background-color: var(--sklearn-color-background);\n",
              "}\n",
              "\n",
              "/* Toggleable label */\n",
              "#sk-container-id-1 label.sk-toggleable__label {\n",
              "  cursor: pointer;\n",
              "  display: flex;\n",
              "  width: 100%;\n",
              "  margin-bottom: 0;\n",
              "  padding: 0.5em;\n",
              "  box-sizing: border-box;\n",
              "  text-align: center;\n",
              "  align-items: start;\n",
              "  justify-content: space-between;\n",
              "  gap: 0.5em;\n",
              "}\n",
              "\n",
              "#sk-container-id-1 label.sk-toggleable__label .caption {\n",
              "  font-size: 0.6rem;\n",
              "  font-weight: lighter;\n",
              "  color: var(--sklearn-color-text-muted);\n",
              "}\n",
              "\n",
              "#sk-container-id-1 label.sk-toggleable__label-arrow:before {\n",
              "  /* Arrow on the left of the label */\n",
              "  content: \"▸\";\n",
              "  float: left;\n",
              "  margin-right: 0.25em;\n",
              "  color: var(--sklearn-color-icon);\n",
              "}\n",
              "\n",
              "#sk-container-id-1 label.sk-toggleable__label-arrow:hover:before {\n",
              "  color: var(--sklearn-color-text);\n",
              "}\n",
              "\n",
              "/* Toggleable content - dropdown */\n",
              "\n",
              "#sk-container-id-1 div.sk-toggleable__content {\n",
              "  max-height: 0;\n",
              "  max-width: 0;\n",
              "  overflow: hidden;\n",
              "  text-align: left;\n",
              "  /* unfitted */\n",
              "  background-color: var(--sklearn-color-unfitted-level-0);\n",
              "}\n",
              "\n",
              "#sk-container-id-1 div.sk-toggleable__content.fitted {\n",
              "  /* fitted */\n",
              "  background-color: var(--sklearn-color-fitted-level-0);\n",
              "}\n",
              "\n",
              "#sk-container-id-1 div.sk-toggleable__content pre {\n",
              "  margin: 0.2em;\n",
              "  border-radius: 0.25em;\n",
              "  color: var(--sklearn-color-text);\n",
              "  /* unfitted */\n",
              "  background-color: var(--sklearn-color-unfitted-level-0);\n",
              "}\n",
              "\n",
              "#sk-container-id-1 div.sk-toggleable__content.fitted pre {\n",
              "  /* unfitted */\n",
              "  background-color: var(--sklearn-color-fitted-level-0);\n",
              "}\n",
              "\n",
              "#sk-container-id-1 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
              "  /* Expand drop-down */\n",
              "  max-height: 200px;\n",
              "  max-width: 100%;\n",
              "  overflow: auto;\n",
              "}\n",
              "\n",
              "#sk-container-id-1 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
              "  content: \"▾\";\n",
              "}\n",
              "\n",
              "/* Pipeline/ColumnTransformer-specific style */\n",
              "\n",
              "#sk-container-id-1 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
              "  color: var(--sklearn-color-text);\n",
              "  background-color: var(--sklearn-color-unfitted-level-2);\n",
              "}\n",
              "\n",
              "#sk-container-id-1 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
              "  background-color: var(--sklearn-color-fitted-level-2);\n",
              "}\n",
              "\n",
              "/* Estimator-specific style */\n",
              "\n",
              "/* Colorize estimator box */\n",
              "#sk-container-id-1 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
              "  /* unfitted */\n",
              "  background-color: var(--sklearn-color-unfitted-level-2);\n",
              "}\n",
              "\n",
              "#sk-container-id-1 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
              "  /* fitted */\n",
              "  background-color: var(--sklearn-color-fitted-level-2);\n",
              "}\n",
              "\n",
              "#sk-container-id-1 div.sk-label label.sk-toggleable__label,\n",
              "#sk-container-id-1 div.sk-label label {\n",
              "  /* The background is the default theme color */\n",
              "  color: var(--sklearn-color-text-on-default-background);\n",
              "}\n",
              "\n",
              "/* On hover, darken the color of the background */\n",
              "#sk-container-id-1 div.sk-label:hover label.sk-toggleable__label {\n",
              "  color: var(--sklearn-color-text);\n",
              "  background-color: var(--sklearn-color-unfitted-level-2);\n",
              "}\n",
              "\n",
              "/* Label box, darken color on hover, fitted */\n",
              "#sk-container-id-1 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
              "  color: var(--sklearn-color-text);\n",
              "  background-color: var(--sklearn-color-fitted-level-2);\n",
              "}\n",
              "\n",
              "/* Estimator label */\n",
              "\n",
              "#sk-container-id-1 div.sk-label label {\n",
              "  font-family: monospace;\n",
              "  font-weight: bold;\n",
              "  display: inline-block;\n",
              "  line-height: 1.2em;\n",
              "}\n",
              "\n",
              "#sk-container-id-1 div.sk-label-container {\n",
              "  text-align: center;\n",
              "}\n",
              "\n",
              "/* Estimator-specific */\n",
              "#sk-container-id-1 div.sk-estimator {\n",
              "  font-family: monospace;\n",
              "  border: 1px dotted var(--sklearn-color-border-box);\n",
              "  border-radius: 0.25em;\n",
              "  box-sizing: border-box;\n",
              "  margin-bottom: 0.5em;\n",
              "  /* unfitted */\n",
              "  background-color: var(--sklearn-color-unfitted-level-0);\n",
              "}\n",
              "\n",
              "#sk-container-id-1 div.sk-estimator.fitted {\n",
              "  /* fitted */\n",
              "  background-color: var(--sklearn-color-fitted-level-0);\n",
              "}\n",
              "\n",
              "/* on hover */\n",
              "#sk-container-id-1 div.sk-estimator:hover {\n",
              "  /* unfitted */\n",
              "  background-color: var(--sklearn-color-unfitted-level-2);\n",
              "}\n",
              "\n",
              "#sk-container-id-1 div.sk-estimator.fitted:hover {\n",
              "  /* fitted */\n",
              "  background-color: var(--sklearn-color-fitted-level-2);\n",
              "}\n",
              "\n",
              "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
              "\n",
              "/* Common style for \"i\" and \"?\" */\n",
              "\n",
              ".sk-estimator-doc-link,\n",
              "a:link.sk-estimator-doc-link,\n",
              "a:visited.sk-estimator-doc-link {\n",
              "  float: right;\n",
              "  font-size: smaller;\n",
              "  line-height: 1em;\n",
              "  font-family: monospace;\n",
              "  background-color: var(--sklearn-color-background);\n",
              "  border-radius: 1em;\n",
              "  height: 1em;\n",
              "  width: 1em;\n",
              "  text-decoration: none !important;\n",
              "  margin-left: 0.5em;\n",
              "  text-align: center;\n",
              "  /* unfitted */\n",
              "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
              "  color: var(--sklearn-color-unfitted-level-1);\n",
              "}\n",
              "\n",
              ".sk-estimator-doc-link.fitted,\n",
              "a:link.sk-estimator-doc-link.fitted,\n",
              "a:visited.sk-estimator-doc-link.fitted {\n",
              "  /* fitted */\n",
              "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
              "  color: var(--sklearn-color-fitted-level-1);\n",
              "}\n",
              "\n",
              "/* On hover */\n",
              "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
              ".sk-estimator-doc-link:hover,\n",
              "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
              ".sk-estimator-doc-link:hover {\n",
              "  /* unfitted */\n",
              "  background-color: var(--sklearn-color-unfitted-level-3);\n",
              "  color: var(--sklearn-color-background);\n",
              "  text-decoration: none;\n",
              "}\n",
              "\n",
              "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
              ".sk-estimator-doc-link.fitted:hover,\n",
              "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
              ".sk-estimator-doc-link.fitted:hover {\n",
              "  /* fitted */\n",
              "  background-color: var(--sklearn-color-fitted-level-3);\n",
              "  color: var(--sklearn-color-background);\n",
              "  text-decoration: none;\n",
              "}\n",
              "\n",
              "/* Span, style for the box shown on hovering the info icon */\n",
              ".sk-estimator-doc-link span {\n",
              "  display: none;\n",
              "  z-index: 9999;\n",
              "  position: relative;\n",
              "  font-weight: normal;\n",
              "  right: .2ex;\n",
              "  padding: .5ex;\n",
              "  margin: .5ex;\n",
              "  width: min-content;\n",
              "  min-width: 20ex;\n",
              "  max-width: 50ex;\n",
              "  color: var(--sklearn-color-text);\n",
              "  box-shadow: 2pt 2pt 4pt #999;\n",
              "  /* unfitted */\n",
              "  background: var(--sklearn-color-unfitted-level-0);\n",
              "  border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
              "}\n",
              "\n",
              ".sk-estimator-doc-link.fitted span {\n",
              "  /* fitted */\n",
              "  background: var(--sklearn-color-fitted-level-0);\n",
              "  border: var(--sklearn-color-fitted-level-3);\n",
              "}\n",
              "\n",
              ".sk-estimator-doc-link:hover span {\n",
              "  display: block;\n",
              "}\n",
              "\n",
              "/* \"?\"-specific style due to the `<a>` HTML tag */\n",
              "\n",
              "#sk-container-id-1 a.estimator_doc_link {\n",
              "  float: right;\n",
              "  font-size: 1rem;\n",
              "  line-height: 1em;\n",
              "  font-family: monospace;\n",
              "  background-color: var(--sklearn-color-background);\n",
              "  border-radius: 1rem;\n",
              "  height: 1rem;\n",
              "  width: 1rem;\n",
              "  text-decoration: none;\n",
              "  /* unfitted */\n",
              "  color: var(--sklearn-color-unfitted-level-1);\n",
              "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
              "}\n",
              "\n",
              "#sk-container-id-1 a.estimator_doc_link.fitted {\n",
              "  /* fitted */\n",
              "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
              "  color: var(--sklearn-color-fitted-level-1);\n",
              "}\n",
              "\n",
              "/* On hover */\n",
              "#sk-container-id-1 a.estimator_doc_link:hover {\n",
              "  /* unfitted */\n",
              "  background-color: var(--sklearn-color-unfitted-level-3);\n",
              "  color: var(--sklearn-color-background);\n",
              "  text-decoration: none;\n",
              "}\n",
              "\n",
              "#sk-container-id-1 a.estimator_doc_link.fitted:hover {\n",
              "  /* fitted */\n",
              "  background-color: var(--sklearn-color-fitted-level-3);\n",
              "}\n",
              "</style><div id=\"sk-container-id-1\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>GridSearchCV(cv=5,\n",
              "             estimator=Pipeline(steps=[(&#x27;preprocessor&#x27;,\n",
              "                                        ColumnTransformer(transformers=[(&#x27;num&#x27;,\n",
              "                                                                         Pipeline(steps=[(&#x27;imputer&#x27;,\n",
              "                                                                                          SimpleImputer(strategy=&#x27;median&#x27;)),\n",
              "                                                                                         (&#x27;scaler&#x27;,\n",
              "                                                                                          StandardScaler())]),\n",
              "                                                                         [&#x27;age&#x27;,\n",
              "                                                                          &#x27;sibsp&#x27;,\n",
              "                                                                          &#x27;parch&#x27;,\n",
              "                                                                          &#x27;fare&#x27;]),\n",
              "                                                                        (&#x27;cat&#x27;,\n",
              "                                                                         Pipeline(steps=[(&#x27;imputer&#x27;,\n",
              "                                                                                          SimpleImputer(strategy=&#x27;most_frequent&#x27;)),\n",
              "                                                                                         (&#x27;onehot&#x27;,\n",
              "                                                                                          OneHotEncoder(handle_unknown=&#x27;ignore&#x27;))]),\n",
              "                                                                         [&#x27;sex&#x27;,\n",
              "                                                                          &#x27;embarked&#x27;,\n",
              "                                                                          &#x27;class&#x27;,\n",
              "                                                                          &#x27;who&#x27;,\n",
              "                                                                          &#x27;adult_male&#x27;,\n",
              "                                                                          &#x27;alone&#x27;])])),\n",
              "                                       (&#x27;model&#x27;, LogisticRegression())]),\n",
              "             param_grid={&#x27;model__C&#x27;: [0.01, 0.1, 1, 10],\n",
              "                         &#x27;model__max_iter&#x27;: [500, 1000],\n",
              "                         &#x27;model__solver&#x27;: [&#x27;liblinear&#x27;, &#x27;lbfgs&#x27;]},\n",
              "             scoring=&#x27;f1&#x27;)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item sk-dashed-wrapped\"><div class=\"sk-label-container\"><div class=\"sk-label fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-1\" type=\"checkbox\" ><label for=\"sk-estimator-id-1\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>GridSearchCV</div></div><div><a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.6/modules/generated/sklearn.model_selection.GridSearchCV.html\">?<span>Documentation for GridSearchCV</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></div></label><div class=\"sk-toggleable__content fitted\"><pre>GridSearchCV(cv=5,\n",
              "             estimator=Pipeline(steps=[(&#x27;preprocessor&#x27;,\n",
              "                                        ColumnTransformer(transformers=[(&#x27;num&#x27;,\n",
              "                                                                         Pipeline(steps=[(&#x27;imputer&#x27;,\n",
              "                                                                                          SimpleImputer(strategy=&#x27;median&#x27;)),\n",
              "                                                                                         (&#x27;scaler&#x27;,\n",
              "                                                                                          StandardScaler())]),\n",
              "                                                                         [&#x27;age&#x27;,\n",
              "                                                                          &#x27;sibsp&#x27;,\n",
              "                                                                          &#x27;parch&#x27;,\n",
              "                                                                          &#x27;fare&#x27;]),\n",
              "                                                                        (&#x27;cat&#x27;,\n",
              "                                                                         Pipeline(steps=[(&#x27;imputer&#x27;,\n",
              "                                                                                          SimpleImputer(strategy=&#x27;most_frequent&#x27;)),\n",
              "                                                                                         (&#x27;onehot&#x27;,\n",
              "                                                                                          OneHotEncoder(handle_unknown=&#x27;ignore&#x27;))]),\n",
              "                                                                         [&#x27;sex&#x27;,\n",
              "                                                                          &#x27;embarked&#x27;,\n",
              "                                                                          &#x27;class&#x27;,\n",
              "                                                                          &#x27;who&#x27;,\n",
              "                                                                          &#x27;adult_male&#x27;,\n",
              "                                                                          &#x27;alone&#x27;])])),\n",
              "                                       (&#x27;model&#x27;, LogisticRegression())]),\n",
              "             param_grid={&#x27;model__C&#x27;: [0.01, 0.1, 1, 10],\n",
              "                         &#x27;model__max_iter&#x27;: [500, 1000],\n",
              "                         &#x27;model__solver&#x27;: [&#x27;liblinear&#x27;, &#x27;lbfgs&#x27;]},\n",
              "             scoring=&#x27;f1&#x27;)</pre></div> </div></div><div class=\"sk-parallel\"><div class=\"sk-parallel-item\"><div class=\"sk-item\"><div class=\"sk-label-container\"><div class=\"sk-label fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-2\" type=\"checkbox\" ><label for=\"sk-estimator-id-2\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>best_estimator_: Pipeline</div></div></label><div class=\"sk-toggleable__content fitted\"><pre>Pipeline(steps=[(&#x27;preprocessor&#x27;,\n",
              "                 ColumnTransformer(transformers=[(&#x27;num&#x27;,\n",
              "                                                  Pipeline(steps=[(&#x27;imputer&#x27;,\n",
              "                                                                   SimpleImputer(strategy=&#x27;median&#x27;)),\n",
              "                                                                  (&#x27;scaler&#x27;,\n",
              "                                                                   StandardScaler())]),\n",
              "                                                  [&#x27;age&#x27;, &#x27;sibsp&#x27;, &#x27;parch&#x27;,\n",
              "                                                   &#x27;fare&#x27;]),\n",
              "                                                 (&#x27;cat&#x27;,\n",
              "                                                  Pipeline(steps=[(&#x27;imputer&#x27;,\n",
              "                                                                   SimpleImputer(strategy=&#x27;most_frequent&#x27;)),\n",
              "                                                                  (&#x27;onehot&#x27;,\n",
              "                                                                   OneHotEncoder(handle_unknown=&#x27;ignore&#x27;))]),\n",
              "                                                  [&#x27;sex&#x27;, &#x27;embarked&#x27;, &#x27;class&#x27;,\n",
              "                                                   &#x27;who&#x27;, &#x27;adult_male&#x27;,\n",
              "                                                   &#x27;alone&#x27;])])),\n",
              "                (&#x27;model&#x27;,\n",
              "                 LogisticRegression(C=10, max_iter=500, solver=&#x27;liblinear&#x27;))])</pre></div> </div></div><div class=\"sk-serial\"><div class=\"sk-item\"><div class=\"sk-serial\"><div class=\"sk-item sk-dashed-wrapped\"><div class=\"sk-label-container\"><div class=\"sk-label fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-3\" type=\"checkbox\" ><label for=\"sk-estimator-id-3\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>preprocessor: ColumnTransformer</div></div><div><a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.6/modules/generated/sklearn.compose.ColumnTransformer.html\">?<span>Documentation for preprocessor: ColumnTransformer</span></a></div></label><div class=\"sk-toggleable__content fitted\"><pre>ColumnTransformer(transformers=[(&#x27;num&#x27;,\n",
              "                                 Pipeline(steps=[(&#x27;imputer&#x27;,\n",
              "                                                  SimpleImputer(strategy=&#x27;median&#x27;)),\n",
              "                                                 (&#x27;scaler&#x27;, StandardScaler())]),\n",
              "                                 [&#x27;age&#x27;, &#x27;sibsp&#x27;, &#x27;parch&#x27;, &#x27;fare&#x27;]),\n",
              "                                (&#x27;cat&#x27;,\n",
              "                                 Pipeline(steps=[(&#x27;imputer&#x27;,\n",
              "                                                  SimpleImputer(strategy=&#x27;most_frequent&#x27;)),\n",
              "                                                 (&#x27;onehot&#x27;,\n",
              "                                                  OneHotEncoder(handle_unknown=&#x27;ignore&#x27;))]),\n",
              "                                 [&#x27;sex&#x27;, &#x27;embarked&#x27;, &#x27;class&#x27;, &#x27;who&#x27;,\n",
              "                                  &#x27;adult_male&#x27;, &#x27;alone&#x27;])])</pre></div> </div></div><div class=\"sk-parallel\"><div class=\"sk-parallel-item\"><div class=\"sk-item\"><div class=\"sk-label-container\"><div class=\"sk-label fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-4\" type=\"checkbox\" ><label for=\"sk-estimator-id-4\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>num</div></div></label><div class=\"sk-toggleable__content fitted\"><pre>[&#x27;age&#x27;, &#x27;sibsp&#x27;, &#x27;parch&#x27;, &#x27;fare&#x27;]</pre></div> </div></div><div class=\"sk-serial\"><div class=\"sk-item\"><div class=\"sk-serial\"><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-5\" type=\"checkbox\" ><label for=\"sk-estimator-id-5\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>SimpleImputer</div></div><div><a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.6/modules/generated/sklearn.impute.SimpleImputer.html\">?<span>Documentation for SimpleImputer</span></a></div></label><div class=\"sk-toggleable__content fitted\"><pre>SimpleImputer(strategy=&#x27;median&#x27;)</pre></div> </div></div><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-6\" type=\"checkbox\" ><label for=\"sk-estimator-id-6\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>StandardScaler</div></div><div><a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.6/modules/generated/sklearn.preprocessing.StandardScaler.html\">?<span>Documentation for StandardScaler</span></a></div></label><div class=\"sk-toggleable__content fitted\"><pre>StandardScaler()</pre></div> </div></div></div></div></div></div></div><div class=\"sk-parallel-item\"><div class=\"sk-item\"><div class=\"sk-label-container\"><div class=\"sk-label fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-7\" type=\"checkbox\" ><label for=\"sk-estimator-id-7\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>cat</div></div></label><div class=\"sk-toggleable__content fitted\"><pre>[&#x27;sex&#x27;, &#x27;embarked&#x27;, &#x27;class&#x27;, &#x27;who&#x27;, &#x27;adult_male&#x27;, &#x27;alone&#x27;]</pre></div> </div></div><div class=\"sk-serial\"><div class=\"sk-item\"><div class=\"sk-serial\"><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-8\" type=\"checkbox\" ><label for=\"sk-estimator-id-8\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>SimpleImputer</div></div><div><a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.6/modules/generated/sklearn.impute.SimpleImputer.html\">?<span>Documentation for SimpleImputer</span></a></div></label><div class=\"sk-toggleable__content fitted\"><pre>SimpleImputer(strategy=&#x27;most_frequent&#x27;)</pre></div> </div></div><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-9\" type=\"checkbox\" ><label for=\"sk-estimator-id-9\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>OneHotEncoder</div></div><div><a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.6/modules/generated/sklearn.preprocessing.OneHotEncoder.html\">?<span>Documentation for OneHotEncoder</span></a></div></label><div class=\"sk-toggleable__content fitted\"><pre>OneHotEncoder(handle_unknown=&#x27;ignore&#x27;)</pre></div> </div></div></div></div></div></div></div></div></div><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-10\" type=\"checkbox\" ><label for=\"sk-estimator-id-10\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>LogisticRegression</div></div><div><a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.6/modules/generated/sklearn.linear_model.LogisticRegression.html\">?<span>Documentation for LogisticRegression</span></a></div></label><div class=\"sk-toggleable__content fitted\"><pre>LogisticRegression(C=10, max_iter=500, solver=&#x27;liblinear&#x27;)</pre></div> </div></div></div></div></div></div></div></div></div></div></div>"
            ]
          },
          "metadata": {},
          "execution_count": 60
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "### Resultados de la búsqueda\n",
        "\n",
        "Una vez finalizado el proceso, se pueden consultar:\n",
        "\n",
        "- los mejores hiperparámetros encontrados\n",
        "- el mejor valor medio de F1-score obtenido en validación cruzada"
      ],
      "metadata": {
        "id": "nAskbTc5xGgB"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "print(\"Mejores parámetros:\", grid_search_logreg.best_params_)\n",
        "print(\"Mejor F1-score en validación cruzada:\", round(grid_search_logreg.best_score_, 4))"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "syQBPRHyvhrj",
        "outputId": "0049103a-7b6c-403a-ad89-b4a24b8d0452"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Mejores parámetros: {'model__C': 10, 'model__max_iter': 500, 'model__solver': 'liblinear'}\n",
            "Mejor F1-score en validación cruzada: 0.7541\n"
          ]
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "### Evaluación final sobre test\n",
        "\n",
        "Después de seleccionar la mejor configuración, se utilizará el mejor modelo encontrado para generar predicciones sobre el conjunto `test`.\n",
        "\n",
        "A continuación, se calcularán varias métricas de clasificación para evaluar su rendimiento."
      ],
      "metadata": {
        "id": "KqaG5MxIxSZq"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "best_model_logreg = grid_search_logreg.best_estimator_\n",
        "y_test_predicted_logreg = best_model_logreg.predict(X_test)"
      ],
      "metadata": {
        "id": "RvaKRrAJvhum"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, confusion_matrix\n",
        "\n",
        "accuracy_logreg = accuracy_score(y_test, y_test_predicted_logreg)\n",
        "precision_logreg = precision_score(y_test, y_test_predicted_logreg)\n",
        "recall_logreg = recall_score(y_test, y_test_predicted_logreg)\n",
        "f1_logreg = f1_score(y_test, y_test_predicted_logreg)\n",
        "cm_logreg = confusion_matrix(y_test, y_test_predicted_logreg)"
      ],
      "metadata": {
        "id": "FEi_oMUYvhyG"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "print(\"Accuracy:\", round(accuracy_logreg, 4))\n",
        "print(\"Precision:\", round(precision_logreg, 4))\n",
        "print(\"Recall:\", round(recall_logreg, 4))\n",
        "print(\"F1-score:\", round(f1_logreg, 4))"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "OkqMc26gvh1V",
        "outputId": "9abf6651-f8fc-4015-8480-3fafec3627c3"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Accuracy: 0.8324\n",
            "Precision: 0.8095\n",
            "Recall: 0.7391\n",
            "F1-score: 0.7727\n"
          ]
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "### Classification report\n",
        "\n",
        "Además de las métricas anteriores, también puede mostrarse un resumen completo del rendimiento del modelo mediante `classification_report`.\n",
        "\n",
        "Este informe recoge, para cada clase, los valores de **precision**, **recall**, **f1-score** y **support**."
      ],
      "metadata": {
        "id": "HSB6QjPCxu52"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "from sklearn.metrics import classification_report\n",
        "\n",
        "print(classification_report(y_test, y_test_predicted_logreg))"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "IlHVcjhMvh72",
        "outputId": "46f249ca-85aa-4bf8-e487-4c8d866e65d7"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "              precision    recall  f1-score   support\n",
            "\n",
            "           0       0.84      0.89      0.87       110\n",
            "           1       0.81      0.74      0.77        69\n",
            "\n",
            "    accuracy                           0.83       179\n",
            "   macro avg       0.83      0.82      0.82       179\n",
            "weighted avg       0.83      0.83      0.83       179\n",
            "\n"
          ]
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "### Interpretación de los resultados del classification report\n",
        "\n",
        "A partir del `classification_report`, puede observarse que el modelo ofrece un rendimiento general bastante razonable, con una **accuracy de 0.83**, lo que significa que clasifica correctamente aproximadamente el **83%** de los pasajeros del conjunto de prueba.\n",
        "\n",
        "Analizando cada clase por separado:\n",
        "\n",
        "- Para la clase **0** (pasajeros que **no sobrevivieron**), el modelo obtiene:\n",
        "  - **precision = 0.84** → cuando el modelo predice que un pasajero no sobrevivió, acierta en un 84% de los casos\n",
        "  - **recall = 0.89** → detecta correctamente el 89% de los pasajeros que realmente no sobrevivieron\n",
        "  - **f1-score = 0.87** → combina precision y recall en una única medida, mostrando un comportamiento bastante sólido para esta clase\n",
        "\n",
        "- Para la clase **1** (pasajeros que **sí sobrevivieron**), el modelo obtiene:\n",
        "  - **precision = 0.81** → cuando el modelo predice que un pasajero sobrevivió, acierta en un 81% de los casos\n",
        "  - **recall = 0.74** → detecta correctamente el 74% de los pasajeros que realmente sobrevivieron\n",
        "  - **f1-score = 0.77** → el rendimiento sigue siendo razonable, aunque algo inferior al de la clase 0\n",
        "\n",
        "Esto indica que el modelo clasifica mejor la clase **0** que la clase **1**. En particular, el valor de **recall** para la clase 1 es más bajo, lo que sugiere que el modelo está dejando sin identificar correctamente a una parte de los pasajeros que sí sobrevivieron.\n",
        "\n",
        "Además:\n",
        "\n",
        "- **macro avg** calcula la media simple entre ambas clases, dando el mismo peso a cada una\n",
        "- **weighted avg** calcula una media ponderada según el número de ejemplos de cada clase\n",
        "\n",
        "Como ambas medias son parecidas y cercanas a **0.83**, puede decirse que el modelo presenta un comportamiento general bastante equilibrado, aunque con algo más de dificultad para detectar correctamente la clase de los supervivientes.\n",
        "\n",
        "En conjunto, estos resultados pueden considerarse **buenos como primera aproximación**, aunque todavía existe margen de mejora, especialmente en la capacidad del modelo para identificar correctamente a los pasajeros que sí sobrevivieron."
      ],
      "metadata": {
        "id": "qNTOIUTdyENg"
      }
    },
    {
      "cell_type": "markdown",
      "source": [
        "### Matriz de confusión\n",
        "\n",
        "La matriz de confusión permite observar cuántos ejemplos de cada clase se han clasificado correctamente y cuántos se han clasificado de forma incorrecta."
      ],
      "metadata": {
        "id": "lWniM05xxdvi"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "print(\"Matriz de confusión:\")\n",
        "print(cm_logreg)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "j_It7GaWvh4l",
        "outputId": "7a14d38b-5e17-4217-e9e9-8c373dc1e9c5"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Matriz de confusión:\n",
            "[[98 12]\n",
            " [18 51]]\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "plt.figure(figsize=(6, 4))\n",
        "sns.heatmap(\n",
        "    cm_logreg,\n",
        "    annot=True,\n",
        "    fmt=\"d\",\n",
        "    cmap=\"Blues\",\n",
        "    xticklabels=[\"0\", \"1\"],\n",
        "    yticklabels=[\"0\", \"1\"]\n",
        ")\n",
        "plt.title(\"Matriz de confusión - Logistic Regression\")\n",
        "plt.xlabel(\"Clase predicha\")\n",
        "plt.ylabel(\"Clase real\")\n",
        "plt.show()"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 411
        },
        "id": "ldkxnx7Wz2Zv",
        "outputId": "5690640c-f6f6-4ecf-91f1-ec2d3ad7294e"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 600x400 with 2 Axes>"
            ],
            "image/png": "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\n"
          },
          "metadata": {}
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "### Interpretación básica del modelo\n",
        "\n",
        "En el caso de la regresión logística, una forma sencilla de interpretar el modelo consiste en observar los **coeficientes** asociados a cada variable transformada.\n",
        "\n",
        "En términos generales:\n",
        "\n",
        "- coeficientes **positivos** favorecen la predicción de la clase `1`\n",
        "- coeficientes **negativos** favorecen la predicción de la clase `0`\n",
        "- cuanto mayor sea el valor absoluto del coeficiente, mayor será la influencia de esa variable en la decisión del modelo"
      ],
      "metadata": {
        "id": "4IA-vLp457fF"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "feature_names_logreg = best_model_logreg.named_steps[\"preprocessor\"].get_feature_names_out()\n",
        "coefficients_logreg = best_model_logreg.named_steps[\"model\"].coef_[0]\n",
        "\n",
        "coef_df_logreg = pd.DataFrame({\n",
        "    \"feature\": feature_names_logreg,\n",
        "    \"coefficient\": coefficients_logreg\n",
        "})\n",
        "\n",
        "coef_df_logreg[\"abs_coefficient\"] = coef_df_logreg[\"coefficient\"].abs()\n",
        "coef_df_logreg = coef_df_logreg.sort_values(by=\"abs_coefficient\", ascending=False)\n",
        "\n",
        "coef_df_logreg"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 641
        },
        "id": "lnw-Uthp6Ahv",
        "outputId": "9f48cd92-9675-4844-d1c5-52ea19cc0080"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "                  feature  coefficient  abs_coefficient\n",
              "9        cat__class_First     1.073183         1.073183\n",
              "11       cat__class_Third    -1.000457         1.000457\n",
              "15  cat__adult_male_False     0.873135         0.873135\n",
              "16   cat__adult_male_True    -0.760178         0.760178\n",
              "13           cat__who_man    -0.760178         0.760178\n",
              "1              num__sibsp    -0.601040         0.601040\n",
              "12         cat__who_child     0.442484         0.442484\n",
              "14         cat__who_woman     0.430651         0.430651\n",
              "17       cat__alone_False     0.323565         0.323565\n",
              "7         cat__embarked_Q     0.317304         0.317304\n",
              "2              num__parch    -0.277040         0.277040\n",
              "0                num__age    -0.272703         0.272703\n",
              "8         cat__embarked_S    -0.263130         0.263130\n",
              "18        cat__alone_True    -0.210608         0.210608\n",
              "4         cat__sex_female     0.148831         0.148831\n",
              "3               num__fare     0.117945         0.117945\n",
              "6         cat__embarked_C     0.058783         0.058783\n",
              "10      cat__class_Second     0.040231         0.040231\n",
              "5           cat__sex_male    -0.035874         0.035874"
            ],
            "text/html": [
              "\n",
              "  <div id=\"df-f6cc04ab-68e6-44ab-bdb8-e09678ed4452\" 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>feature</th>\n",
              "      <th>coefficient</th>\n",
              "      <th>abs_coefficient</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>9</th>\n",
              "      <td>cat__class_First</td>\n",
              "      <td>1.073183</td>\n",
              "      <td>1.073183</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>11</th>\n",
              "      <td>cat__class_Third</td>\n",
              "      <td>-1.000457</td>\n",
              "      <td>1.000457</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>15</th>\n",
              "      <td>cat__adult_male_False</td>\n",
              "      <td>0.873135</td>\n",
              "      <td>0.873135</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>16</th>\n",
              "      <td>cat__adult_male_True</td>\n",
              "      <td>-0.760178</td>\n",
              "      <td>0.760178</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>13</th>\n",
              "      <td>cat__who_man</td>\n",
              "      <td>-0.760178</td>\n",
              "      <td>0.760178</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1</th>\n",
              "      <td>num__sibsp</td>\n",
              "      <td>-0.601040</td>\n",
              "      <td>0.601040</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>12</th>\n",
              "      <td>cat__who_child</td>\n",
              "      <td>0.442484</td>\n",
              "      <td>0.442484</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>14</th>\n",
              "      <td>cat__who_woman</td>\n",
              "      <td>0.430651</td>\n",
              "      <td>0.430651</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>17</th>\n",
              "      <td>cat__alone_False</td>\n",
              "      <td>0.323565</td>\n",
              "      <td>0.323565</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>7</th>\n",
              "      <td>cat__embarked_Q</td>\n",
              "      <td>0.317304</td>\n",
              "      <td>0.317304</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2</th>\n",
              "      <td>num__parch</td>\n",
              "      <td>-0.277040</td>\n",
              "      <td>0.277040</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>0</th>\n",
              "      <td>num__age</td>\n",
              "      <td>-0.272703</td>\n",
              "      <td>0.272703</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>8</th>\n",
              "      <td>cat__embarked_S</td>\n",
              "      <td>-0.263130</td>\n",
              "      <td>0.263130</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>18</th>\n",
              "      <td>cat__alone_True</td>\n",
              "      <td>-0.210608</td>\n",
              "      <td>0.210608</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>4</th>\n",
              "      <td>cat__sex_female</td>\n",
              "      <td>0.148831</td>\n",
              "      <td>0.148831</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>3</th>\n",
              "      <td>num__fare</td>\n",
              "      <td>0.117945</td>\n",
              "      <td>0.117945</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>6</th>\n",
              "      <td>cat__embarked_C</td>\n",
              "      <td>0.058783</td>\n",
              "      <td>0.058783</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>10</th>\n",
              "      <td>cat__class_Second</td>\n",
              "      <td>0.040231</td>\n",
              "      <td>0.040231</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>5</th>\n",
              "      <td>cat__sex_male</td>\n",
              "      <td>-0.035874</td>\n",
              "      <td>0.035874</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-f6cc04ab-68e6-44ab-bdb8-e09678ed4452')\"\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-f6cc04ab-68e6-44ab-bdb8-e09678ed4452 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-f6cc04ab-68e6-44ab-bdb8-e09678ed4452');\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=\"id_ebec8421-2201-4faa-8b2a-65ebef05f063\">\n",
              "    <style>\n",
              "      .colab-df-generate {\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-generate: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",
              "      [theme=dark] .colab-df-generate {\n",
              "        background-color: #3B4455;\n",
              "        fill: #D2E3FC;\n",
              "      }\n",
              "\n",
              "      [theme=dark] .colab-df-generate: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",
              "    <button class=\"colab-df-generate\" onclick=\"generateWithVariable('coef_df_logreg')\"\n",
              "            title=\"Generate code using this dataframe.\"\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",
              "    <path d=\"M7,19H8.4L18.45,9,17,7.55,7,17.6ZM5,21V16.75L18.45,3.32a2,2,0,0,1,2.83,0l1.4,1.43a1.91,1.91,0,0,1,.58,1.4,1.91,1.91,0,0,1-.58,1.4L9.25,21ZM18.45,9,17,7.55Zm-12,3A5.31,5.31,0,0,0,4.9,8.1,5.31,5.31,0,0,0,1,6.5,5.31,5.31,0,0,0,4.9,4.9,5.31,5.31,0,0,0,6.5,1,5.31,5.31,0,0,0,8.1,4.9,5.31,5.31,0,0,0,12,6.5,5.46,5.46,0,0,0,6.5,12Z\"/>\n",
              "  </svg>\n",
              "    </button>\n",
              "    <script>\n",
              "      (() => {\n",
              "      const buttonEl =\n",
              "        document.querySelector('#id_ebec8421-2201-4faa-8b2a-65ebef05f063 button.colab-df-generate');\n",
              "      buttonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "\n",
              "      buttonEl.onclick = () => {\n",
              "        google.colab.notebook.generateWithVariable('coef_df_logreg');\n",
              "      }\n",
              "      })();\n",
              "    </script>\n",
              "  </div>\n",
              "\n",
              "    </div>\n",
              "  </div>\n"
            ],
            "application/vnd.google.colaboratory.intrinsic+json": {
              "type": "dataframe",
              "variable_name": "coef_df_logreg",
              "summary": "{\n  \"name\": \"coef_df_logreg\",\n  \"rows\": 19,\n  \"fields\": [\n    {\n      \"column\": \"feature\",\n      \"properties\": {\n        \"dtype\": \"string\",\n        \"num_unique_values\": 19,\n        \"samples\": [\n          \"cat__class_First\",\n          \"num__sibsp\",\n          \"num__age\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"coefficient\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0.5436049885451628,\n        \"min\": -1.0004567462883542,\n        \"max\": 1.0731825294773196,\n        \"num_unique_values\": 19,\n        \"samples\": [\n          1.0731825294773196,\n          -0.6010401655038455,\n          -0.27270279340588505\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"abs_coefficient\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0.3292385362548621,\n        \"min\": 0.03587396195327491,\n        \"max\": 1.0731825294773196,\n        \"num_unique_values\": 19,\n        \"samples\": [\n          1.0731825294773196,\n          0.6010401655038455,\n          0.27270279340588505\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    }\n  ]\n}"
            }
          },
          "metadata": {},
          "execution_count": 96
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "A partir de los resultados obtenidos, pueden destacarse algunas ideas:\n",
        "\n",
        "- `cat__class_First` presenta un coeficiente claramente positivo, lo que sugiere que pertenecer a **primera clase** aumenta la probabilidad de supervivencia.\n",
        "- `cat__class_Third` presenta un coeficiente claramente negativo, lo que indica que pertenecer a **tercera clase** reduce la probabilidad de supervivencia.\n",
        "- `cat__adult_male_False` tiene un coeficiente positivo, mientras que `cat__adult_male_True` presenta un coeficiente negativo. Esto sugiere que **no ser un varón adulto** favorece la supervivencia, mientras que **ser un varón adulto** la reduce.\n",
        "- La variable `cat__who_man` también aparece con coeficiente negativo, mientras que `cat__who_child` y `cat__who_woman` presentan coeficientes positivos. Esto refuerza la idea de que el modelo asocia una mayor probabilidad de supervivencia a **mujeres y niños**, y una menor probabilidad a los **hombres adultos**.\n",
        "- `num__sibsp` tiene un coeficiente negativo relativamente alto, lo que sugiere que viajar con más hermanos/as o cónyuges se asocia con una menor probabilidad de supervivencia en este modelo.\n",
        "- `num__age` también presenta un coeficiente negativo, por lo que una mayor edad parece asociarse con una menor probabilidad de supervivencia.\n",
        "- `num__fare` tiene un coeficiente positivo, aunque menor que otras variables, lo que sugiere que pagar una tarifa más alta se relaciona con una mayor probabilidad de supervivencia.\n",
        "- En las variables de embarque, `cat__embarked_Q` aparece con coeficiente positivo y `cat__embarked_S` con coeficiente negativo, lo que indica que el puerto de embarque también influye en la decisión del modelo.\n",
        "\n",
        "En conjunto, los coeficientes reflejan patrones bastante coherentes con el contexto histórico del Titanic: la clase del pasajero, el sexo, la edad y algunas características familiares parecen influir de forma importante en la probabilidad de supervivencia.\n",
        "\n",
        "Aun así, conviene recordar que estos coeficientes se interpretan dentro del modelo y después del preprocesado aplicado. Por tanto, ofrecen una guía útil sobre las variables más influyentes, pero no deben entenderse como una relación causal directa."
      ],
      "metadata": {
        "id": "d_DRUYwM6gK9"
      }
    },
    {
      "cell_type": "markdown",
      "source": [
        "## 7. Decision Tree + GridSearchCV\n",
        "\n",
        "El segundo modelo que se entrenará será un **árbol de decisión**.\n",
        "\n",
        "Al igual que en la sección anterior, el preprocesado y el modelo se integrarán en un único pipeline completo. Después, se utilizará `GridSearchCV` para probar distintas configuraciones del árbol y seleccionar automáticamente la mejor mediante validación cruzada.\n",
        "\n",
        "De nuevo, la métrica principal que se utilizará será **F1-score**."
      ],
      "metadata": {
        "id": "8cDvXXBhyiIK"
      }
    },
    {
      "cell_type": "markdown",
      "source": [
        "### Definición del pipeline completo\n",
        "\n",
        "A continuación, se construirá un pipeline que agrupe:\n",
        "\n",
        "- el preprocesado definido en la sección 5\n",
        "- el modelo de árbol de decisión"
      ],
      "metadata": {
        "id": "chQPDk96yxXc"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "from sklearn.tree import DecisionTreeClassifier"
      ],
      "metadata": {
        "id": "ddeiWn-DyqPu"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "full_pipeline_tree = Pipeline([\n",
        "    (\"preprocessor\", preprocessor),\n",
        "    (\"model\", DecisionTreeClassifier(random_state=42))\n",
        "])"
      ],
      "metadata": {
        "id": "afBB44Ykvh_I"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "source": [
        "### Definición de la búsqueda de hiperparámetros\n",
        "\n",
        "Se probarán distintas configuraciones del árbol modificando algunos hiperparámetros habituales:\n",
        "\n",
        "- `max_depth`, que controla la profundidad máxima del árbol\n",
        "- `min_samples_split`, que indica el número mínimo de muestras necesarias para dividir un nodo\n",
        "- `min_samples_leaf`, que indica el número mínimo de muestras necesarias en una hoja"
      ],
      "metadata": {
        "id": "revXzABWytOu"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "param_grid_tree = {\n",
        "    \"model__max_depth\": [3, 5, 7, 10, None],\n",
        "    \"model__min_samples_split\": [2, 5, 10],\n",
        "    \"model__min_samples_leaf\": [1, 2, 4]\n",
        "}"
      ],
      "metadata": {
        "id": "DtjFRvniviCo"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "source": [
        "### Entrenamiento con GridSearchCV\n",
        "\n",
        "A continuación, se aplicará `GridSearchCV` sobre el conjunto `train` para seleccionar automáticamente la mejor configuración del árbol mediante validación cruzada."
      ],
      "metadata": {
        "id": "FIln980ky0fY"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "grid_search_tree = GridSearchCV(\n",
        "    estimator=full_pipeline_tree,\n",
        "    param_grid=param_grid_tree,\n",
        "    scoring=\"f1\",\n",
        "    cv=5\n",
        ")"
      ],
      "metadata": {
        "id": "7omiN4ahuzYj"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "grid_search_tree.fit(X_train, y_train)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 316
        },
        "id": "bwsVH9Pkuzct",
        "outputId": "552bd1b2-e468-4dad-adfe-1110b7f8bb08"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "GridSearchCV(cv=5,\n",
              "             estimator=Pipeline(steps=[('preprocessor',\n",
              "                                        ColumnTransformer(transformers=[('num',\n",
              "                                                                         Pipeline(steps=[('imputer',\n",
              "                                                                                          SimpleImputer(strategy='median')),\n",
              "                                                                                         ('scaler',\n",
              "                                                                                          StandardScaler())]),\n",
              "                                                                         ['age',\n",
              "                                                                          'sibsp',\n",
              "                                                                          'parch',\n",
              "                                                                          'fare']),\n",
              "                                                                        ('cat',\n",
              "                                                                         Pipeline(steps=[('imputer',\n",
              "                                                                                          SimpleImputer(strategy='most_frequent')),\n",
              "                                                                                         ('onehot',\n",
              "                                                                                          OneHotEncoder(handle_unknown='ignore'))]),\n",
              "                                                                         ['sex',\n",
              "                                                                          'embarked',\n",
              "                                                                          'class',\n",
              "                                                                          'who',\n",
              "                                                                          'adult_male',\n",
              "                                                                          'alone'])])),\n",
              "                                       ('model',\n",
              "                                        DecisionTreeClassifier(random_state=42))]),\n",
              "             param_grid={'model__max_depth': [3, 5, 7, 10, None],\n",
              "                         'model__min_samples_leaf': [1, 2, 4],\n",
              "                         'model__min_samples_split': [2, 5, 10]},\n",
              "             scoring='f1')"
            ],
            "text/html": [
              "<style>#sk-container-id-2 {\n",
              "  /* Definition of color scheme common for light and dark mode */\n",
              "  --sklearn-color-text: #000;\n",
              "  --sklearn-color-text-muted: #666;\n",
              "  --sklearn-color-line: gray;\n",
              "  /* Definition of color scheme for unfitted estimators */\n",
              "  --sklearn-color-unfitted-level-0: #fff5e6;\n",
              "  --sklearn-color-unfitted-level-1: #f6e4d2;\n",
              "  --sklearn-color-unfitted-level-2: #ffe0b3;\n",
              "  --sklearn-color-unfitted-level-3: chocolate;\n",
              "  /* Definition of color scheme for fitted estimators */\n",
              "  --sklearn-color-fitted-level-0: #f0f8ff;\n",
              "  --sklearn-color-fitted-level-1: #d4ebff;\n",
              "  --sklearn-color-fitted-level-2: #b3dbfd;\n",
              "  --sklearn-color-fitted-level-3: cornflowerblue;\n",
              "\n",
              "  /* Specific color for light theme */\n",
              "  --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
              "  --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
              "  --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
              "  --sklearn-color-icon: #696969;\n",
              "\n",
              "  @media (prefers-color-scheme: dark) {\n",
              "    /* Redefinition of color scheme for dark theme */\n",
              "    --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
              "    --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
              "    --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
              "    --sklearn-color-icon: #878787;\n",
              "  }\n",
              "}\n",
              "\n",
              "#sk-container-id-2 {\n",
              "  color: var(--sklearn-color-text);\n",
              "}\n",
              "\n",
              "#sk-container-id-2 pre {\n",
              "  padding: 0;\n",
              "}\n",
              "\n",
              "#sk-container-id-2 input.sk-hidden--visually {\n",
              "  border: 0;\n",
              "  clip: rect(1px 1px 1px 1px);\n",
              "  clip: rect(1px, 1px, 1px, 1px);\n",
              "  height: 1px;\n",
              "  margin: -1px;\n",
              "  overflow: hidden;\n",
              "  padding: 0;\n",
              "  position: absolute;\n",
              "  width: 1px;\n",
              "}\n",
              "\n",
              "#sk-container-id-2 div.sk-dashed-wrapped {\n",
              "  border: 1px dashed var(--sklearn-color-line);\n",
              "  margin: 0 0.4em 0.5em 0.4em;\n",
              "  box-sizing: border-box;\n",
              "  padding-bottom: 0.4em;\n",
              "  background-color: var(--sklearn-color-background);\n",
              "}\n",
              "\n",
              "#sk-container-id-2 div.sk-container {\n",
              "  /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
              "     but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
              "     so we also need the `!important` here to be able to override the\n",
              "     default hidden behavior on the sphinx rendered scikit-learn.org.\n",
              "     See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
              "  display: inline-block !important;\n",
              "  position: relative;\n",
              "}\n",
              "\n",
              "#sk-container-id-2 div.sk-text-repr-fallback {\n",
              "  display: none;\n",
              "}\n",
              "\n",
              "div.sk-parallel-item,\n",
              "div.sk-serial,\n",
              "div.sk-item {\n",
              "  /* draw centered vertical line to link estimators */\n",
              "  background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
              "  background-size: 2px 100%;\n",
              "  background-repeat: no-repeat;\n",
              "  background-position: center center;\n",
              "}\n",
              "\n",
              "/* Parallel-specific style estimator block */\n",
              "\n",
              "#sk-container-id-2 div.sk-parallel-item::after {\n",
              "  content: \"\";\n",
              "  width: 100%;\n",
              "  border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
              "  flex-grow: 1;\n",
              "}\n",
              "\n",
              "#sk-container-id-2 div.sk-parallel {\n",
              "  display: flex;\n",
              "  align-items: stretch;\n",
              "  justify-content: center;\n",
              "  background-color: var(--sklearn-color-background);\n",
              "  position: relative;\n",
              "}\n",
              "\n",
              "#sk-container-id-2 div.sk-parallel-item {\n",
              "  display: flex;\n",
              "  flex-direction: column;\n",
              "}\n",
              "\n",
              "#sk-container-id-2 div.sk-parallel-item:first-child::after {\n",
              "  align-self: flex-end;\n",
              "  width: 50%;\n",
              "}\n",
              "\n",
              "#sk-container-id-2 div.sk-parallel-item:last-child::after {\n",
              "  align-self: flex-start;\n",
              "  width: 50%;\n",
              "}\n",
              "\n",
              "#sk-container-id-2 div.sk-parallel-item:only-child::after {\n",
              "  width: 0;\n",
              "}\n",
              "\n",
              "/* Serial-specific style estimator block */\n",
              "\n",
              "#sk-container-id-2 div.sk-serial {\n",
              "  display: flex;\n",
              "  flex-direction: column;\n",
              "  align-items: center;\n",
              "  background-color: var(--sklearn-color-background);\n",
              "  padding-right: 1em;\n",
              "  padding-left: 1em;\n",
              "}\n",
              "\n",
              "\n",
              "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
              "clickable and can be expanded/collapsed.\n",
              "- Pipeline and ColumnTransformer use this feature and define the default style\n",
              "- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
              "*/\n",
              "\n",
              "/* Pipeline and ColumnTransformer style (default) */\n",
              "\n",
              "#sk-container-id-2 div.sk-toggleable {\n",
              "  /* Default theme specific background. It is overwritten whether we have a\n",
              "  specific estimator or a Pipeline/ColumnTransformer */\n",
              "  background-color: var(--sklearn-color-background);\n",
              "}\n",
              "\n",
              "/* Toggleable label */\n",
              "#sk-container-id-2 label.sk-toggleable__label {\n",
              "  cursor: pointer;\n",
              "  display: flex;\n",
              "  width: 100%;\n",
              "  margin-bottom: 0;\n",
              "  padding: 0.5em;\n",
              "  box-sizing: border-box;\n",
              "  text-align: center;\n",
              "  align-items: start;\n",
              "  justify-content: space-between;\n",
              "  gap: 0.5em;\n",
              "}\n",
              "\n",
              "#sk-container-id-2 label.sk-toggleable__label .caption {\n",
              "  font-size: 0.6rem;\n",
              "  font-weight: lighter;\n",
              "  color: var(--sklearn-color-text-muted);\n",
              "}\n",
              "\n",
              "#sk-container-id-2 label.sk-toggleable__label-arrow:before {\n",
              "  /* Arrow on the left of the label */\n",
              "  content: \"▸\";\n",
              "  float: left;\n",
              "  margin-right: 0.25em;\n",
              "  color: var(--sklearn-color-icon);\n",
              "}\n",
              "\n",
              "#sk-container-id-2 label.sk-toggleable__label-arrow:hover:before {\n",
              "  color: var(--sklearn-color-text);\n",
              "}\n",
              "\n",
              "/* Toggleable content - dropdown */\n",
              "\n",
              "#sk-container-id-2 div.sk-toggleable__content {\n",
              "  max-height: 0;\n",
              "  max-width: 0;\n",
              "  overflow: hidden;\n",
              "  text-align: left;\n",
              "  /* unfitted */\n",
              "  background-color: var(--sklearn-color-unfitted-level-0);\n",
              "}\n",
              "\n",
              "#sk-container-id-2 div.sk-toggleable__content.fitted {\n",
              "  /* fitted */\n",
              "  background-color: var(--sklearn-color-fitted-level-0);\n",
              "}\n",
              "\n",
              "#sk-container-id-2 div.sk-toggleable__content pre {\n",
              "  margin: 0.2em;\n",
              "  border-radius: 0.25em;\n",
              "  color: var(--sklearn-color-text);\n",
              "  /* unfitted */\n",
              "  background-color: var(--sklearn-color-unfitted-level-0);\n",
              "}\n",
              "\n",
              "#sk-container-id-2 div.sk-toggleable__content.fitted pre {\n",
              "  /* unfitted */\n",
              "  background-color: var(--sklearn-color-fitted-level-0);\n",
              "}\n",
              "\n",
              "#sk-container-id-2 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
              "  /* Expand drop-down */\n",
              "  max-height: 200px;\n",
              "  max-width: 100%;\n",
              "  overflow: auto;\n",
              "}\n",
              "\n",
              "#sk-container-id-2 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
              "  content: \"▾\";\n",
              "}\n",
              "\n",
              "/* Pipeline/ColumnTransformer-specific style */\n",
              "\n",
              "#sk-container-id-2 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
              "  color: var(--sklearn-color-text);\n",
              "  background-color: var(--sklearn-color-unfitted-level-2);\n",
              "}\n",
              "\n",
              "#sk-container-id-2 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
              "  background-color: var(--sklearn-color-fitted-level-2);\n",
              "}\n",
              "\n",
              "/* Estimator-specific style */\n",
              "\n",
              "/* Colorize estimator box */\n",
              "#sk-container-id-2 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
              "  /* unfitted */\n",
              "  background-color: var(--sklearn-color-unfitted-level-2);\n",
              "}\n",
              "\n",
              "#sk-container-id-2 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
              "  /* fitted */\n",
              "  background-color: var(--sklearn-color-fitted-level-2);\n",
              "}\n",
              "\n",
              "#sk-container-id-2 div.sk-label label.sk-toggleable__label,\n",
              "#sk-container-id-2 div.sk-label label {\n",
              "  /* The background is the default theme color */\n",
              "  color: var(--sklearn-color-text-on-default-background);\n",
              "}\n",
              "\n",
              "/* On hover, darken the color of the background */\n",
              "#sk-container-id-2 div.sk-label:hover label.sk-toggleable__label {\n",
              "  color: var(--sklearn-color-text);\n",
              "  background-color: var(--sklearn-color-unfitted-level-2);\n",
              "}\n",
              "\n",
              "/* Label box, darken color on hover, fitted */\n",
              "#sk-container-id-2 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
              "  color: var(--sklearn-color-text);\n",
              "  background-color: var(--sklearn-color-fitted-level-2);\n",
              "}\n",
              "\n",
              "/* Estimator label */\n",
              "\n",
              "#sk-container-id-2 div.sk-label label {\n",
              "  font-family: monospace;\n",
              "  font-weight: bold;\n",
              "  display: inline-block;\n",
              "  line-height: 1.2em;\n",
              "}\n",
              "\n",
              "#sk-container-id-2 div.sk-label-container {\n",
              "  text-align: center;\n",
              "}\n",
              "\n",
              "/* Estimator-specific */\n",
              "#sk-container-id-2 div.sk-estimator {\n",
              "  font-family: monospace;\n",
              "  border: 1px dotted var(--sklearn-color-border-box);\n",
              "  border-radius: 0.25em;\n",
              "  box-sizing: border-box;\n",
              "  margin-bottom: 0.5em;\n",
              "  /* unfitted */\n",
              "  background-color: var(--sklearn-color-unfitted-level-0);\n",
              "}\n",
              "\n",
              "#sk-container-id-2 div.sk-estimator.fitted {\n",
              "  /* fitted */\n",
              "  background-color: var(--sklearn-color-fitted-level-0);\n",
              "}\n",
              "\n",
              "/* on hover */\n",
              "#sk-container-id-2 div.sk-estimator:hover {\n",
              "  /* unfitted */\n",
              "  background-color: var(--sklearn-color-unfitted-level-2);\n",
              "}\n",
              "\n",
              "#sk-container-id-2 div.sk-estimator.fitted:hover {\n",
              "  /* fitted */\n",
              "  background-color: var(--sklearn-color-fitted-level-2);\n",
              "}\n",
              "\n",
              "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
              "\n",
              "/* Common style for \"i\" and \"?\" */\n",
              "\n",
              ".sk-estimator-doc-link,\n",
              "a:link.sk-estimator-doc-link,\n",
              "a:visited.sk-estimator-doc-link {\n",
              "  float: right;\n",
              "  font-size: smaller;\n",
              "  line-height: 1em;\n",
              "  font-family: monospace;\n",
              "  background-color: var(--sklearn-color-background);\n",
              "  border-radius: 1em;\n",
              "  height: 1em;\n",
              "  width: 1em;\n",
              "  text-decoration: none !important;\n",
              "  margin-left: 0.5em;\n",
              "  text-align: center;\n",
              "  /* unfitted */\n",
              "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
              "  color: var(--sklearn-color-unfitted-level-1);\n",
              "}\n",
              "\n",
              ".sk-estimator-doc-link.fitted,\n",
              "a:link.sk-estimator-doc-link.fitted,\n",
              "a:visited.sk-estimator-doc-link.fitted {\n",
              "  /* fitted */\n",
              "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
              "  color: var(--sklearn-color-fitted-level-1);\n",
              "}\n",
              "\n",
              "/* On hover */\n",
              "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
              ".sk-estimator-doc-link:hover,\n",
              "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
              ".sk-estimator-doc-link:hover {\n",
              "  /* unfitted */\n",
              "  background-color: var(--sklearn-color-unfitted-level-3);\n",
              "  color: var(--sklearn-color-background);\n",
              "  text-decoration: none;\n",
              "}\n",
              "\n",
              "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
              ".sk-estimator-doc-link.fitted:hover,\n",
              "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
              ".sk-estimator-doc-link.fitted:hover {\n",
              "  /* fitted */\n",
              "  background-color: var(--sklearn-color-fitted-level-3);\n",
              "  color: var(--sklearn-color-background);\n",
              "  text-decoration: none;\n",
              "}\n",
              "\n",
              "/* Span, style for the box shown on hovering the info icon */\n",
              ".sk-estimator-doc-link span {\n",
              "  display: none;\n",
              "  z-index: 9999;\n",
              "  position: relative;\n",
              "  font-weight: normal;\n",
              "  right: .2ex;\n",
              "  padding: .5ex;\n",
              "  margin: .5ex;\n",
              "  width: min-content;\n",
              "  min-width: 20ex;\n",
              "  max-width: 50ex;\n",
              "  color: var(--sklearn-color-text);\n",
              "  box-shadow: 2pt 2pt 4pt #999;\n",
              "  /* unfitted */\n",
              "  background: var(--sklearn-color-unfitted-level-0);\n",
              "  border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
              "}\n",
              "\n",
              ".sk-estimator-doc-link.fitted span {\n",
              "  /* fitted */\n",
              "  background: var(--sklearn-color-fitted-level-0);\n",
              "  border: var(--sklearn-color-fitted-level-3);\n",
              "}\n",
              "\n",
              ".sk-estimator-doc-link:hover span {\n",
              "  display: block;\n",
              "}\n",
              "\n",
              "/* \"?\"-specific style due to the `<a>` HTML tag */\n",
              "\n",
              "#sk-container-id-2 a.estimator_doc_link {\n",
              "  float: right;\n",
              "  font-size: 1rem;\n",
              "  line-height: 1em;\n",
              "  font-family: monospace;\n",
              "  background-color: var(--sklearn-color-background);\n",
              "  border-radius: 1rem;\n",
              "  height: 1rem;\n",
              "  width: 1rem;\n",
              "  text-decoration: none;\n",
              "  /* unfitted */\n",
              "  color: var(--sklearn-color-unfitted-level-1);\n",
              "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
              "}\n",
              "\n",
              "#sk-container-id-2 a.estimator_doc_link.fitted {\n",
              "  /* fitted */\n",
              "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
              "  color: var(--sklearn-color-fitted-level-1);\n",
              "}\n",
              "\n",
              "/* On hover */\n",
              "#sk-container-id-2 a.estimator_doc_link:hover {\n",
              "  /* unfitted */\n",
              "  background-color: var(--sklearn-color-unfitted-level-3);\n",
              "  color: var(--sklearn-color-background);\n",
              "  text-decoration: none;\n",
              "}\n",
              "\n",
              "#sk-container-id-2 a.estimator_doc_link.fitted:hover {\n",
              "  /* fitted */\n",
              "  background-color: var(--sklearn-color-fitted-level-3);\n",
              "}\n",
              "</style><div id=\"sk-container-id-2\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>GridSearchCV(cv=5,\n",
              "             estimator=Pipeline(steps=[(&#x27;preprocessor&#x27;,\n",
              "                                        ColumnTransformer(transformers=[(&#x27;num&#x27;,\n",
              "                                                                         Pipeline(steps=[(&#x27;imputer&#x27;,\n",
              "                                                                                          SimpleImputer(strategy=&#x27;median&#x27;)),\n",
              "                                                                                         (&#x27;scaler&#x27;,\n",
              "                                                                                          StandardScaler())]),\n",
              "                                                                         [&#x27;age&#x27;,\n",
              "                                                                          &#x27;sibsp&#x27;,\n",
              "                                                                          &#x27;parch&#x27;,\n",
              "                                                                          &#x27;fare&#x27;]),\n",
              "                                                                        (&#x27;cat&#x27;,\n",
              "                                                                         Pipeline(steps=[(&#x27;imputer&#x27;,\n",
              "                                                                                          SimpleImputer(strategy=&#x27;most_frequent&#x27;)),\n",
              "                                                                                         (&#x27;onehot&#x27;,\n",
              "                                                                                          OneHotEncoder(handle_unknown=&#x27;ignore&#x27;))]),\n",
              "                                                                         [&#x27;sex&#x27;,\n",
              "                                                                          &#x27;embarked&#x27;,\n",
              "                                                                          &#x27;class&#x27;,\n",
              "                                                                          &#x27;who&#x27;,\n",
              "                                                                          &#x27;adult_male&#x27;,\n",
              "                                                                          &#x27;alone&#x27;])])),\n",
              "                                       (&#x27;model&#x27;,\n",
              "                                        DecisionTreeClassifier(random_state=42))]),\n",
              "             param_grid={&#x27;model__max_depth&#x27;: [3, 5, 7, 10, None],\n",
              "                         &#x27;model__min_samples_leaf&#x27;: [1, 2, 4],\n",
              "                         &#x27;model__min_samples_split&#x27;: [2, 5, 10]},\n",
              "             scoring=&#x27;f1&#x27;)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item sk-dashed-wrapped\"><div class=\"sk-label-container\"><div class=\"sk-label fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-11\" type=\"checkbox\" ><label for=\"sk-estimator-id-11\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>GridSearchCV</div></div><div><a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.6/modules/generated/sklearn.model_selection.GridSearchCV.html\">?<span>Documentation for GridSearchCV</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></div></label><div class=\"sk-toggleable__content fitted\"><pre>GridSearchCV(cv=5,\n",
              "             estimator=Pipeline(steps=[(&#x27;preprocessor&#x27;,\n",
              "                                        ColumnTransformer(transformers=[(&#x27;num&#x27;,\n",
              "                                                                         Pipeline(steps=[(&#x27;imputer&#x27;,\n",
              "                                                                                          SimpleImputer(strategy=&#x27;median&#x27;)),\n",
              "                                                                                         (&#x27;scaler&#x27;,\n",
              "                                                                                          StandardScaler())]),\n",
              "                                                                         [&#x27;age&#x27;,\n",
              "                                                                          &#x27;sibsp&#x27;,\n",
              "                                                                          &#x27;parch&#x27;,\n",
              "                                                                          &#x27;fare&#x27;]),\n",
              "                                                                        (&#x27;cat&#x27;,\n",
              "                                                                         Pipeline(steps=[(&#x27;imputer&#x27;,\n",
              "                                                                                          SimpleImputer(strategy=&#x27;most_frequent&#x27;)),\n",
              "                                                                                         (&#x27;onehot&#x27;,\n",
              "                                                                                          OneHotEncoder(handle_unknown=&#x27;ignore&#x27;))]),\n",
              "                                                                         [&#x27;sex&#x27;,\n",
              "                                                                          &#x27;embarked&#x27;,\n",
              "                                                                          &#x27;class&#x27;,\n",
              "                                                                          &#x27;who&#x27;,\n",
              "                                                                          &#x27;adult_male&#x27;,\n",
              "                                                                          &#x27;alone&#x27;])])),\n",
              "                                       (&#x27;model&#x27;,\n",
              "                                        DecisionTreeClassifier(random_state=42))]),\n",
              "             param_grid={&#x27;model__max_depth&#x27;: [3, 5, 7, 10, None],\n",
              "                         &#x27;model__min_samples_leaf&#x27;: [1, 2, 4],\n",
              "                         &#x27;model__min_samples_split&#x27;: [2, 5, 10]},\n",
              "             scoring=&#x27;f1&#x27;)</pre></div> </div></div><div class=\"sk-parallel\"><div class=\"sk-parallel-item\"><div class=\"sk-item\"><div class=\"sk-label-container\"><div class=\"sk-label fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-12\" type=\"checkbox\" ><label for=\"sk-estimator-id-12\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>best_estimator_: Pipeline</div></div></label><div class=\"sk-toggleable__content fitted\"><pre>Pipeline(steps=[(&#x27;preprocessor&#x27;,\n",
              "                 ColumnTransformer(transformers=[(&#x27;num&#x27;,\n",
              "                                                  Pipeline(steps=[(&#x27;imputer&#x27;,\n",
              "                                                                   SimpleImputer(strategy=&#x27;median&#x27;)),\n",
              "                                                                  (&#x27;scaler&#x27;,\n",
              "                                                                   StandardScaler())]),\n",
              "                                                  [&#x27;age&#x27;, &#x27;sibsp&#x27;, &#x27;parch&#x27;,\n",
              "                                                   &#x27;fare&#x27;]),\n",
              "                                                 (&#x27;cat&#x27;,\n",
              "                                                  Pipeline(steps=[(&#x27;imputer&#x27;,\n",
              "                                                                   SimpleImputer(strategy=&#x27;most_frequent&#x27;)),\n",
              "                                                                  (&#x27;onehot&#x27;,\n",
              "                                                                   OneHotEncoder(handle_unknown=&#x27;ignore&#x27;))]),\n",
              "                                                  [&#x27;sex&#x27;, &#x27;embarked&#x27;, &#x27;class&#x27;,\n",
              "                                                   &#x27;who&#x27;, &#x27;adult_male&#x27;,\n",
              "                                                   &#x27;alone&#x27;])])),\n",
              "                (&#x27;model&#x27;,\n",
              "                 DecisionTreeClassifier(max_depth=3, min_samples_leaf=4,\n",
              "                                        random_state=42))])</pre></div> </div></div><div class=\"sk-serial\"><div class=\"sk-item\"><div class=\"sk-serial\"><div class=\"sk-item sk-dashed-wrapped\"><div class=\"sk-label-container\"><div class=\"sk-label fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-13\" type=\"checkbox\" ><label for=\"sk-estimator-id-13\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>preprocessor: ColumnTransformer</div></div><div><a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.6/modules/generated/sklearn.compose.ColumnTransformer.html\">?<span>Documentation for preprocessor: ColumnTransformer</span></a></div></label><div class=\"sk-toggleable__content fitted\"><pre>ColumnTransformer(transformers=[(&#x27;num&#x27;,\n",
              "                                 Pipeline(steps=[(&#x27;imputer&#x27;,\n",
              "                                                  SimpleImputer(strategy=&#x27;median&#x27;)),\n",
              "                                                 (&#x27;scaler&#x27;, StandardScaler())]),\n",
              "                                 [&#x27;age&#x27;, &#x27;sibsp&#x27;, &#x27;parch&#x27;, &#x27;fare&#x27;]),\n",
              "                                (&#x27;cat&#x27;,\n",
              "                                 Pipeline(steps=[(&#x27;imputer&#x27;,\n",
              "                                                  SimpleImputer(strategy=&#x27;most_frequent&#x27;)),\n",
              "                                                 (&#x27;onehot&#x27;,\n",
              "                                                  OneHotEncoder(handle_unknown=&#x27;ignore&#x27;))]),\n",
              "                                 [&#x27;sex&#x27;, &#x27;embarked&#x27;, &#x27;class&#x27;, &#x27;who&#x27;,\n",
              "                                  &#x27;adult_male&#x27;, &#x27;alone&#x27;])])</pre></div> </div></div><div class=\"sk-parallel\"><div class=\"sk-parallel-item\"><div class=\"sk-item\"><div class=\"sk-label-container\"><div class=\"sk-label fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-14\" type=\"checkbox\" ><label for=\"sk-estimator-id-14\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>num</div></div></label><div class=\"sk-toggleable__content fitted\"><pre>[&#x27;age&#x27;, &#x27;sibsp&#x27;, &#x27;parch&#x27;, &#x27;fare&#x27;]</pre></div> </div></div><div class=\"sk-serial\"><div class=\"sk-item\"><div class=\"sk-serial\"><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-15\" type=\"checkbox\" ><label for=\"sk-estimator-id-15\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>SimpleImputer</div></div><div><a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.6/modules/generated/sklearn.impute.SimpleImputer.html\">?<span>Documentation for SimpleImputer</span></a></div></label><div class=\"sk-toggleable__content fitted\"><pre>SimpleImputer(strategy=&#x27;median&#x27;)</pre></div> </div></div><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-16\" type=\"checkbox\" ><label for=\"sk-estimator-id-16\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>StandardScaler</div></div><div><a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.6/modules/generated/sklearn.preprocessing.StandardScaler.html\">?<span>Documentation for StandardScaler</span></a></div></label><div class=\"sk-toggleable__content fitted\"><pre>StandardScaler()</pre></div> </div></div></div></div></div></div></div><div class=\"sk-parallel-item\"><div class=\"sk-item\"><div class=\"sk-label-container\"><div class=\"sk-label fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-17\" type=\"checkbox\" ><label for=\"sk-estimator-id-17\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>cat</div></div></label><div class=\"sk-toggleable__content fitted\"><pre>[&#x27;sex&#x27;, &#x27;embarked&#x27;, &#x27;class&#x27;, &#x27;who&#x27;, &#x27;adult_male&#x27;, &#x27;alone&#x27;]</pre></div> </div></div><div class=\"sk-serial\"><div class=\"sk-item\"><div class=\"sk-serial\"><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-18\" type=\"checkbox\" ><label for=\"sk-estimator-id-18\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>SimpleImputer</div></div><div><a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.6/modules/generated/sklearn.impute.SimpleImputer.html\">?<span>Documentation for SimpleImputer</span></a></div></label><div class=\"sk-toggleable__content fitted\"><pre>SimpleImputer(strategy=&#x27;most_frequent&#x27;)</pre></div> </div></div><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-19\" type=\"checkbox\" ><label for=\"sk-estimator-id-19\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>OneHotEncoder</div></div><div><a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.6/modules/generated/sklearn.preprocessing.OneHotEncoder.html\">?<span>Documentation for OneHotEncoder</span></a></div></label><div class=\"sk-toggleable__content fitted\"><pre>OneHotEncoder(handle_unknown=&#x27;ignore&#x27;)</pre></div> </div></div></div></div></div></div></div></div></div><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-20\" type=\"checkbox\" ><label for=\"sk-estimator-id-20\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>DecisionTreeClassifier</div></div><div><a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.6/modules/generated/sklearn.tree.DecisionTreeClassifier.html\">?<span>Documentation for DecisionTreeClassifier</span></a></div></label><div class=\"sk-toggleable__content fitted\"><pre>DecisionTreeClassifier(max_depth=3, min_samples_leaf=4, random_state=42)</pre></div> </div></div></div></div></div></div></div></div></div></div></div>"
            ]
          },
          "metadata": {},
          "execution_count": 73
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "### Resultados de la búsqueda\n",
        "\n",
        "Una vez finalizado el proceso, se pueden consultar:\n",
        "\n",
        "- los mejores hiperparámetros encontrados\n",
        "- el mejor valor medio de F1-score obtenido en validación cruzada"
      ],
      "metadata": {
        "id": "6CWCkBSWy8kJ"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "print(\"Mejores parámetros:\", grid_search_tree.best_params_)\n",
        "print(\"Mejor F1-score en validación cruzada:\", round(grid_search_tree.best_score_, 4))"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "0zFRouZSuzfl",
        "outputId": "78f6a8bc-f65f-46fd-b6b8-afcb0854e376"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Mejores parámetros: {'model__max_depth': 3, 'model__min_samples_leaf': 4, 'model__min_samples_split': 2}\n",
            "Mejor F1-score en validación cruzada: 0.7312\n"
          ]
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "### Evaluación final sobre test\n",
        "\n",
        "Después de seleccionar la mejor configuración, se utilizará el mejor modelo encontrado para generar predicciones sobre el conjunto `test`.\n",
        "\n",
        "A continuación, se calcularán varias métricas de clasificación para evaluar su rendimiento."
      ],
      "metadata": {
        "id": "_ZEI29ijzBGb"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "best_model_tree = grid_search_tree.best_estimator_\n",
        "y_test_predicted_tree = best_model_tree.predict(X_test)"
      ],
      "metadata": {
        "id": "0nx0Y-e_uzi8"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "accuracy_tree = accuracy_score(y_test, y_test_predicted_tree)\n",
        "precision_tree = precision_score(y_test, y_test_predicted_tree)\n",
        "recall_tree = recall_score(y_test, y_test_predicted_tree)\n",
        "f1_tree = f1_score(y_test, y_test_predicted_tree)\n",
        "cm_tree = confusion_matrix(y_test, y_test_predicted_tree)"
      ],
      "metadata": {
        "id": "bI_8SaWQuzl2"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "print(\"Accuracy:\", round(accuracy_tree, 4))\n",
        "print(\"Precision:\", round(precision_tree, 4))\n",
        "print(\"Recall:\", round(recall_tree, 4))\n",
        "print(\"F1-score:\", round(f1_tree, 4))"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "nzmqyE-Auzo4",
        "outputId": "76e24f9e-f394-4ead-aa3e-5e5d9b062222"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Accuracy: 0.8268\n",
            "Precision: 0.7879\n",
            "Recall: 0.7536\n",
            "F1-score: 0.7704\n"
          ]
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "### Classification report\n",
        "\n",
        "Además de las métricas anteriores, también puede mostrarse un resumen completo del rendimiento del modelo mediante `classification_report`.\n",
        "\n",
        "Este informe recoge, para cada clase, los valores de **precision**, **recall**, **f1-score** y **support**."
      ],
      "metadata": {
        "id": "-JFPDDhgzJdh"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "print(classification_report(y_test, y_test_predicted_tree))"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "Z9QHstjOuzr2",
        "outputId": "b925961b-3751-4638-d0a2-1454b20dafab"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "              precision    recall  f1-score   support\n",
            "\n",
            "           0       0.85      0.87      0.86       110\n",
            "           1       0.79      0.75      0.77        69\n",
            "\n",
            "    accuracy                           0.83       179\n",
            "   macro avg       0.82      0.81      0.82       179\n",
            "weighted avg       0.83      0.83      0.83       179\n",
            "\n"
          ]
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "### Matriz de confusión\n",
        "\n",
        "La matriz de confusión permite observar cuántos ejemplos de cada clase se han clasificado correctamente y cuántos se han clasificado de forma incorrecta."
      ],
      "metadata": {
        "id": "ySfUhSA5zP_R"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "plt.figure(figsize=(6, 4))\n",
        "sns.heatmap(\n",
        "    cm_tree,\n",
        "    annot=True,\n",
        "    fmt=\"d\",\n",
        "    cmap=\"Blues\",\n",
        "    xticklabels=[\"0\", \"1\"],\n",
        "    yticklabels=[\"0\", \"1\"]\n",
        ")\n",
        "plt.title(\"Matriz de confusión - Decision Tree\")\n",
        "plt.xlabel(\"Clase predicha\")\n",
        "plt.ylabel(\"Clase real\")\n",
        "plt.show()"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 410
        },
        "id": "sruI5_3Juzu6",
        "outputId": "a0d7b549-294a-4031-825d-65a31086b394"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 600x400 with 2 Axes>"
            ],
            "image/png": "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\n"
          },
          "metadata": {}
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "### Interpretación básica del modelo\n",
        "\n",
        "En los árboles de decisión, una forma habitual de interpretar el modelo consiste en observar la **importancia de las variables**.\n",
        "\n",
        "Esta medida indica cuánto contribuye cada variable a las divisiones del árbol y, por tanto, a la toma de decisiones del modelo."
      ],
      "metadata": {
        "id": "7XuCa1om63lN"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "feature_names_tree = best_model_tree.named_steps[\"preprocessor\"].get_feature_names_out()\n",
        "importances_tree = best_model_tree.named_steps[\"model\"].feature_importances_\n",
        "\n",
        "importance_df_tree = pd.DataFrame({\n",
        "    \"feature\": feature_names_tree,\n",
        "    \"importance\": importances_tree\n",
        "})\n",
        "\n",
        "importance_df_tree = importance_df_tree.sort_values(by=\"importance\", ascending=False)\n",
        "\n",
        "importance_df_tree"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 641
        },
        "id": "NHFQh9WM68Gq",
        "outputId": "f1a029e2-9fc5-4e11-ead7-6fda6caa07ce"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "                  feature  importance\n",
              "16   cat__adult_male_True    0.638219\n",
              "11       cat__class_Third    0.201113\n",
              "3               num__fare    0.160668\n",
              "2              num__parch    0.000000\n",
              "1              num__sibsp    0.000000\n",
              "0                num__age    0.000000\n",
              "4         cat__sex_female    0.000000\n",
              "7         cat__embarked_Q    0.000000\n",
              "8         cat__embarked_S    0.000000\n",
              "5           cat__sex_male    0.000000\n",
              "6         cat__embarked_C    0.000000\n",
              "10      cat__class_Second    0.000000\n",
              "9        cat__class_First    0.000000\n",
              "13           cat__who_man    0.000000\n",
              "12         cat__who_child    0.000000\n",
              "14         cat__who_woman    0.000000\n",
              "15  cat__adult_male_False    0.000000\n",
              "17       cat__alone_False    0.000000\n",
              "18        cat__alone_True    0.000000"
            ],
            "text/html": [
              "\n",
              "  <div id=\"df-58552318-71ee-4152-8b3b-419120e4fe55\" 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>feature</th>\n",
              "      <th>importance</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>16</th>\n",
              "      <td>cat__adult_male_True</td>\n",
              "      <td>0.638219</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>11</th>\n",
              "      <td>cat__class_Third</td>\n",
              "      <td>0.201113</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>3</th>\n",
              "      <td>num__fare</td>\n",
              "      <td>0.160668</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2</th>\n",
              "      <td>num__parch</td>\n",
              "      <td>0.000000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1</th>\n",
              "      <td>num__sibsp</td>\n",
              "      <td>0.000000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>0</th>\n",
              "      <td>num__age</td>\n",
              "      <td>0.000000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>4</th>\n",
              "      <td>cat__sex_female</td>\n",
              "      <td>0.000000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>7</th>\n",
              "      <td>cat__embarked_Q</td>\n",
              "      <td>0.000000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>8</th>\n",
              "      <td>cat__embarked_S</td>\n",
              "      <td>0.000000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>5</th>\n",
              "      <td>cat__sex_male</td>\n",
              "      <td>0.000000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>6</th>\n",
              "      <td>cat__embarked_C</td>\n",
              "      <td>0.000000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>10</th>\n",
              "      <td>cat__class_Second</td>\n",
              "      <td>0.000000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>9</th>\n",
              "      <td>cat__class_First</td>\n",
              "      <td>0.000000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>13</th>\n",
              "      <td>cat__who_man</td>\n",
              "      <td>0.000000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>12</th>\n",
              "      <td>cat__who_child</td>\n",
              "      <td>0.000000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>14</th>\n",
              "      <td>cat__who_woman</td>\n",
              "      <td>0.000000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>15</th>\n",
              "      <td>cat__adult_male_False</td>\n",
              "      <td>0.000000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>17</th>\n",
              "      <td>cat__alone_False</td>\n",
              "      <td>0.000000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>18</th>\n",
              "      <td>cat__alone_True</td>\n",
              "      <td>0.000000</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-58552318-71ee-4152-8b3b-419120e4fe55')\"\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-58552318-71ee-4152-8b3b-419120e4fe55 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-58552318-71ee-4152-8b3b-419120e4fe55');\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=\"id_5e91410f-31c1-442f-a8cb-daa3cd9d66bf\">\n",
              "    <style>\n",
              "      .colab-df-generate {\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-generate: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",
              "      [theme=dark] .colab-df-generate {\n",
              "        background-color: #3B4455;\n",
              "        fill: #D2E3FC;\n",
              "      }\n",
              "\n",
              "      [theme=dark] .colab-df-generate: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",
              "    <button class=\"colab-df-generate\" onclick=\"generateWithVariable('importance_df_tree')\"\n",
              "            title=\"Generate code using this dataframe.\"\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",
              "    <path d=\"M7,19H8.4L18.45,9,17,7.55,7,17.6ZM5,21V16.75L18.45,3.32a2,2,0,0,1,2.83,0l1.4,1.43a1.91,1.91,0,0,1,.58,1.4,1.91,1.91,0,0,1-.58,1.4L9.25,21ZM18.45,9,17,7.55Zm-12,3A5.31,5.31,0,0,0,4.9,8.1,5.31,5.31,0,0,0,1,6.5,5.31,5.31,0,0,0,4.9,4.9,5.31,5.31,0,0,0,6.5,1,5.31,5.31,0,0,0,8.1,4.9,5.31,5.31,0,0,0,12,6.5,5.46,5.46,0,0,0,6.5,12Z\"/>\n",
              "  </svg>\n",
              "    </button>\n",
              "    <script>\n",
              "      (() => {\n",
              "      const buttonEl =\n",
              "        document.querySelector('#id_5e91410f-31c1-442f-a8cb-daa3cd9d66bf button.colab-df-generate');\n",
              "      buttonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "\n",
              "      buttonEl.onclick = () => {\n",
              "        google.colab.notebook.generateWithVariable('importance_df_tree');\n",
              "      }\n",
              "      })();\n",
              "    </script>\n",
              "  </div>\n",
              "\n",
              "    </div>\n",
              "  </div>\n"
            ],
            "application/vnd.google.colaboratory.intrinsic+json": {
              "type": "dataframe",
              "variable_name": "importance_df_tree",
              "summary": "{\n  \"name\": \"importance_df_tree\",\n  \"rows\": 19,\n  \"fields\": [\n    {\n      \"column\": \"feature\",\n      \"properties\": {\n        \"dtype\": \"string\",\n        \"num_unique_values\": 19,\n        \"samples\": [\n          \"cat__adult_male_True\",\n          \"num__age\",\n          \"cat__class_Second\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"importance\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0.15292568245734844,\n        \"min\": 0.0,\n        \"max\": 0.6382192131575772,\n        \"num_unique_values\": 4,\n        \"samples\": [\n          0.20111296040162188,\n          0.0,\n          0.6382192131575772\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    }\n  ]\n}"
            }
          },
          "metadata": {},
          "execution_count": 97
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "top_importance_tree = importance_df_tree.head(10)\n",
        "\n",
        "plt.figure(figsize=(8, 5))\n",
        "sns.barplot(data=top_importance_tree, x=\"importance\", y=\"feature\")\n",
        "plt.title(\"Variables más influyentes - Decision Tree\")\n",
        "plt.xlabel(\"Importancia\")\n",
        "plt.ylabel(\"Variable\")\n",
        "plt.show()"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 488
        },
        "id": "qbf6fe2B7BAW",
        "outputId": "fae09a2a-b7e5-42e7-df25-21ff8ca2341e"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 800x500 with 1 Axes>"
            ],
            "image/png": "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qBppaWnB3t6+usMgIiIiIiq1Uj9aNmfOHEyfPh33799Xlt2/fx9ffvklAgMDKzQ4IiIiIiKioqh1R8bNzQ0SiUR5nJiYCGtra1hbWwP4d62FVCrFw4cPuU6GiIiIiIgqnVqJzIABAyo5DCIiIiIiIvWV+XtkiMSIi/2JiIiIarZK+x4ZIiIiIiKi6lbqXcvy8/OxcuVK/PTTT0hJSUFOTo5K/ZMnTyosOCIiIiIioqKU+o5MSEgIVqxYgeHDhyMjIwPTp0/HoEGDoKGhgblz51ZCiERERERERKpKnchEREQgLCwM/v7+0NLSwsiRI7Fx40YEBQXh5MmTlREjERERERGRilInMvfv34eLiwsAwMDAABkZGQCAPn36YN++fRUbHRERERERURFKnci89957SE1NBQA0atQIf/75JwDgzJkzkEqlFRsdERERERFREUqdyAwcOBBRUVEAgM8//xyBgYFwcHDA6NGjMW7cuAoPkIiIiIiI6E3l/h6Z2NhYxMbGwsHBAX379q2ouIgqBb9HhoiIiKhmU/fzWqm3X36Tu7s73N3dy9sNERERERGR2tRKZH799Vf06tUL2tra+PXXX0ts269fvwoJjIiIiIiIqDhqPVqmoaGB+/fvo379+tDQKH5ZjUQiQX5+foUGSFSR+GgZERERUc1WoY+WKRSKIn8mIiIiIiKqDqXatSw3Nxfdu3dHYmJiZcVDRERERET0VqVKZLS1tXHp0qXKioWIiIiIiEgtpf4emY8++gg//PBDZcRCRERERESkllJvv5yXl4dNmzbh8OHDaNWqFfT19VXqV6xYUWHBERERERERFaXUicyVK1fQsmVLAMCNGzdU6iQSScVERUREREREVIJSJzJHjx6tjDiIiIiIiIjUVuo1MkRERERERNWt1HdkAODs2bP46aefkJKSgpycHJW63bt3V0hgRERERERExSn1HZnIyEh06NABCQkJ2LNnD3Jzc3H16lUcOXIERkZGlREjERERERGRilInMosWLcLKlSvx22+/QUdHB6tXr8a1a9cwbNgwWFtbV0aM9IYuXbpgypQpmDlzJkxMTGBubo65c+cCAJKTkyGRSBAXF6dsn56eDolEgujoaABAdHQ0JBIJDh48CDc3N8hkMnTr1g1paWnYv38/nJ2dYWhoiA8//BAvXrwod7wHDhxAx44dYWxsjLp166JP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\n"
          },
          "metadata": {}
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "## 8. Random Forest + GridSearchCV\n",
        "\n",
        "El tercer modelo que se entrenará será un **random forest**.\n",
        "\n",
        "Este algoritmo combina múltiples árboles de decisión y suele ofrecer un comportamiento más robusto que un único árbol, ya que reduce en parte el riesgo de sobreajuste y suele generalizar mejor.\n",
        "\n",
        "Al igual que en las secciones anteriores, el preprocesado y el modelo se integrarán en un único pipeline completo. Después, se utilizará `GridSearchCV` para probar distintas configuraciones del modelo y seleccionar automáticamente la mejor mediante validación cruzada.\n",
        "\n",
        "De nuevo, la métrica principal que se utilizará será **F1-score**."
      ],
      "metadata": {
        "id": "cvv4QIeG0Vti"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "from sklearn.ensemble import RandomForestClassifier"
      ],
      "metadata": {
        "id": "RnLvvN-O0aDs"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "source": [
        "### Definición del pipeline completo\n",
        "\n",
        "A continuación, se construirá un pipeline que agrupe:\n",
        "\n",
        "- el preprocesado definido en la sección 5\n",
        "- el modelo de random forest"
      ],
      "metadata": {
        "id": "CtZi96DN0fCc"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "full_pipeline_rf = Pipeline([\n",
        "    (\"preprocessor\", preprocessor),\n",
        "    (\"model\", RandomForestClassifier(random_state=42))\n",
        "])"
      ],
      "metadata": {
        "id": "R99CKcDS0aK8"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "source": [
        "### Definición de la búsqueda de hiperparámetros\n",
        "\n",
        "Se probarán distintas configuraciones del random forest modificando algunos hiperparámetros habituales:\n",
        "\n",
        "- `n_estimators`, que indica el número de árboles del bosque\n",
        "- `max_depth`, que controla la profundidad máxima de cada árbol\n",
        "- `min_samples_split`, que indica el número mínimo de muestras necesarias para dividir un nodo"
      ],
      "metadata": {
        "id": "UUTGpfgP0izO"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "param_grid_rf = {\n",
        "    \"model__n_estimators\": [50, 100, 200],\n",
        "    \"model__max_depth\": [3, 5, 10, None],\n",
        "    \"model__min_samples_split\": [2, 5, 10]\n",
        "}"
      ],
      "metadata": {
        "id": "VY0e4Q_W0aPr"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "source": [
        "### Entrenamiento con GridSearchCV\n",
        "\n",
        "A continuación, se aplicará `GridSearchCV` sobre el conjunto `train` para seleccionar automáticamente la mejor configuración del random forest mediante validación cruzada."
      ],
      "metadata": {
        "id": "_Qr9wZ2Q0sxP"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "grid_search_rf = GridSearchCV(\n",
        "    estimator=full_pipeline_rf,\n",
        "    param_grid=param_grid_rf,\n",
        "    scoring=\"f1\",\n",
        "    cv=5\n",
        ")"
      ],
      "metadata": {
        "id": "7Da6oHAj0aUa"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "grid_search_rf.fit(X_train, y_train)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 316
        },
        "id": "tgen5RoZ0aZO",
        "outputId": "061f4a4b-1953-4b52-cc5c-87b2fdfca3c7"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "GridSearchCV(cv=5,\n",
              "             estimator=Pipeline(steps=[('preprocessor',\n",
              "                                        ColumnTransformer(transformers=[('num',\n",
              "                                                                         Pipeline(steps=[('imputer',\n",
              "                                                                                          SimpleImputer(strategy='median')),\n",
              "                                                                                         ('scaler',\n",
              "                                                                                          StandardScaler())]),\n",
              "                                                                         ['age',\n",
              "                                                                          'sibsp',\n",
              "                                                                          'parch',\n",
              "                                                                          'fare']),\n",
              "                                                                        ('cat',\n",
              "                                                                         Pipeline(steps=[('imputer',\n",
              "                                                                                          SimpleImputer(strategy='most_frequent')),\n",
              "                                                                                         ('onehot',\n",
              "                                                                                          OneHotEncoder(handle_unknown='ignore'))]),\n",
              "                                                                         ['sex',\n",
              "                                                                          'embarked',\n",
              "                                                                          'class',\n",
              "                                                                          'who',\n",
              "                                                                          'adult_male',\n",
              "                                                                          'alone'])])),\n",
              "                                       ('model',\n",
              "                                        RandomForestClassifier(random_state=42))]),\n",
              "             param_grid={'model__max_depth': [3, 5, 10, None],\n",
              "                         'model__min_samples_split': [2, 5, 10],\n",
              "                         'model__n_estimators': [50, 100, 200]},\n",
              "             scoring='f1')"
            ],
            "text/html": [
              "<style>#sk-container-id-3 {\n",
              "  /* Definition of color scheme common for light and dark mode */\n",
              "  --sklearn-color-text: #000;\n",
              "  --sklearn-color-text-muted: #666;\n",
              "  --sklearn-color-line: gray;\n",
              "  /* Definition of color scheme for unfitted estimators */\n",
              "  --sklearn-color-unfitted-level-0: #fff5e6;\n",
              "  --sklearn-color-unfitted-level-1: #f6e4d2;\n",
              "  --sklearn-color-unfitted-level-2: #ffe0b3;\n",
              "  --sklearn-color-unfitted-level-3: chocolate;\n",
              "  /* Definition of color scheme for fitted estimators */\n",
              "  --sklearn-color-fitted-level-0: #f0f8ff;\n",
              "  --sklearn-color-fitted-level-1: #d4ebff;\n",
              "  --sklearn-color-fitted-level-2: #b3dbfd;\n",
              "  --sklearn-color-fitted-level-3: cornflowerblue;\n",
              "\n",
              "  /* Specific color for light theme */\n",
              "  --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
              "  --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
              "  --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
              "  --sklearn-color-icon: #696969;\n",
              "\n",
              "  @media (prefers-color-scheme: dark) {\n",
              "    /* Redefinition of color scheme for dark theme */\n",
              "    --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
              "    --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
              "    --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
              "    --sklearn-color-icon: #878787;\n",
              "  }\n",
              "}\n",
              "\n",
              "#sk-container-id-3 {\n",
              "  color: var(--sklearn-color-text);\n",
              "}\n",
              "\n",
              "#sk-container-id-3 pre {\n",
              "  padding: 0;\n",
              "}\n",
              "\n",
              "#sk-container-id-3 input.sk-hidden--visually {\n",
              "  border: 0;\n",
              "  clip: rect(1px 1px 1px 1px);\n",
              "  clip: rect(1px, 1px, 1px, 1px);\n",
              "  height: 1px;\n",
              "  margin: -1px;\n",
              "  overflow: hidden;\n",
              "  padding: 0;\n",
              "  position: absolute;\n",
              "  width: 1px;\n",
              "}\n",
              "\n",
              "#sk-container-id-3 div.sk-dashed-wrapped {\n",
              "  border: 1px dashed var(--sklearn-color-line);\n",
              "  margin: 0 0.4em 0.5em 0.4em;\n",
              "  box-sizing: border-box;\n",
              "  padding-bottom: 0.4em;\n",
              "  background-color: var(--sklearn-color-background);\n",
              "}\n",
              "\n",
              "#sk-container-id-3 div.sk-container {\n",
              "  /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
              "     but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
              "     so we also need the `!important` here to be able to override the\n",
              "     default hidden behavior on the sphinx rendered scikit-learn.org.\n",
              "     See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
              "  display: inline-block !important;\n",
              "  position: relative;\n",
              "}\n",
              "\n",
              "#sk-container-id-3 div.sk-text-repr-fallback {\n",
              "  display: none;\n",
              "}\n",
              "\n",
              "div.sk-parallel-item,\n",
              "div.sk-serial,\n",
              "div.sk-item {\n",
              "  /* draw centered vertical line to link estimators */\n",
              "  background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
              "  background-size: 2px 100%;\n",
              "  background-repeat: no-repeat;\n",
              "  background-position: center center;\n",
              "}\n",
              "\n",
              "/* Parallel-specific style estimator block */\n",
              "\n",
              "#sk-container-id-3 div.sk-parallel-item::after {\n",
              "  content: \"\";\n",
              "  width: 100%;\n",
              "  border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
              "  flex-grow: 1;\n",
              "}\n",
              "\n",
              "#sk-container-id-3 div.sk-parallel {\n",
              "  display: flex;\n",
              "  align-items: stretch;\n",
              "  justify-content: center;\n",
              "  background-color: var(--sklearn-color-background);\n",
              "  position: relative;\n",
              "}\n",
              "\n",
              "#sk-container-id-3 div.sk-parallel-item {\n",
              "  display: flex;\n",
              "  flex-direction: column;\n",
              "}\n",
              "\n",
              "#sk-container-id-3 div.sk-parallel-item:first-child::after {\n",
              "  align-self: flex-end;\n",
              "  width: 50%;\n",
              "}\n",
              "\n",
              "#sk-container-id-3 div.sk-parallel-item:last-child::after {\n",
              "  align-self: flex-start;\n",
              "  width: 50%;\n",
              "}\n",
              "\n",
              "#sk-container-id-3 div.sk-parallel-item:only-child::after {\n",
              "  width: 0;\n",
              "}\n",
              "\n",
              "/* Serial-specific style estimator block */\n",
              "\n",
              "#sk-container-id-3 div.sk-serial {\n",
              "  display: flex;\n",
              "  flex-direction: column;\n",
              "  align-items: center;\n",
              "  background-color: var(--sklearn-color-background);\n",
              "  padding-right: 1em;\n",
              "  padding-left: 1em;\n",
              "}\n",
              "\n",
              "\n",
              "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
              "clickable and can be expanded/collapsed.\n",
              "- Pipeline and ColumnTransformer use this feature and define the default style\n",
              "- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
              "*/\n",
              "\n",
              "/* Pipeline and ColumnTransformer style (default) */\n",
              "\n",
              "#sk-container-id-3 div.sk-toggleable {\n",
              "  /* Default theme specific background. It is overwritten whether we have a\n",
              "  specific estimator or a Pipeline/ColumnTransformer */\n",
              "  background-color: var(--sklearn-color-background);\n",
              "}\n",
              "\n",
              "/* Toggleable label */\n",
              "#sk-container-id-3 label.sk-toggleable__label {\n",
              "  cursor: pointer;\n",
              "  display: flex;\n",
              "  width: 100%;\n",
              "  margin-bottom: 0;\n",
              "  padding: 0.5em;\n",
              "  box-sizing: border-box;\n",
              "  text-align: center;\n",
              "  align-items: start;\n",
              "  justify-content: space-between;\n",
              "  gap: 0.5em;\n",
              "}\n",
              "\n",
              "#sk-container-id-3 label.sk-toggleable__label .caption {\n",
              "  font-size: 0.6rem;\n",
              "  font-weight: lighter;\n",
              "  color: var(--sklearn-color-text-muted);\n",
              "}\n",
              "\n",
              "#sk-container-id-3 label.sk-toggleable__label-arrow:before {\n",
              "  /* Arrow on the left of the label */\n",
              "  content: \"▸\";\n",
              "  float: left;\n",
              "  margin-right: 0.25em;\n",
              "  color: var(--sklearn-color-icon);\n",
              "}\n",
              "\n",
              "#sk-container-id-3 label.sk-toggleable__label-arrow:hover:before {\n",
              "  color: var(--sklearn-color-text);\n",
              "}\n",
              "\n",
              "/* Toggleable content - dropdown */\n",
              "\n",
              "#sk-container-id-3 div.sk-toggleable__content {\n",
              "  max-height: 0;\n",
              "  max-width: 0;\n",
              "  overflow: hidden;\n",
              "  text-align: left;\n",
              "  /* unfitted */\n",
              "  background-color: var(--sklearn-color-unfitted-level-0);\n",
              "}\n",
              "\n",
              "#sk-container-id-3 div.sk-toggleable__content.fitted {\n",
              "  /* fitted */\n",
              "  background-color: var(--sklearn-color-fitted-level-0);\n",
              "}\n",
              "\n",
              "#sk-container-id-3 div.sk-toggleable__content pre {\n",
              "  margin: 0.2em;\n",
              "  border-radius: 0.25em;\n",
              "  color: var(--sklearn-color-text);\n",
              "  /* unfitted */\n",
              "  background-color: var(--sklearn-color-unfitted-level-0);\n",
              "}\n",
              "\n",
              "#sk-container-id-3 div.sk-toggleable__content.fitted pre {\n",
              "  /* unfitted */\n",
              "  background-color: var(--sklearn-color-fitted-level-0);\n",
              "}\n",
              "\n",
              "#sk-container-id-3 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
              "  /* Expand drop-down */\n",
              "  max-height: 200px;\n",
              "  max-width: 100%;\n",
              "  overflow: auto;\n",
              "}\n",
              "\n",
              "#sk-container-id-3 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
              "  content: \"▾\";\n",
              "}\n",
              "\n",
              "/* Pipeline/ColumnTransformer-specific style */\n",
              "\n",
              "#sk-container-id-3 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
              "  color: var(--sklearn-color-text);\n",
              "  background-color: var(--sklearn-color-unfitted-level-2);\n",
              "}\n",
              "\n",
              "#sk-container-id-3 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
              "  background-color: var(--sklearn-color-fitted-level-2);\n",
              "}\n",
              "\n",
              "/* Estimator-specific style */\n",
              "\n",
              "/* Colorize estimator box */\n",
              "#sk-container-id-3 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
              "  /* unfitted */\n",
              "  background-color: var(--sklearn-color-unfitted-level-2);\n",
              "}\n",
              "\n",
              "#sk-container-id-3 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
              "  /* fitted */\n",
              "  background-color: var(--sklearn-color-fitted-level-2);\n",
              "}\n",
              "\n",
              "#sk-container-id-3 div.sk-label label.sk-toggleable__label,\n",
              "#sk-container-id-3 div.sk-label label {\n",
              "  /* The background is the default theme color */\n",
              "  color: var(--sklearn-color-text-on-default-background);\n",
              "}\n",
              "\n",
              "/* On hover, darken the color of the background */\n",
              "#sk-container-id-3 div.sk-label:hover label.sk-toggleable__label {\n",
              "  color: var(--sklearn-color-text);\n",
              "  background-color: var(--sklearn-color-unfitted-level-2);\n",
              "}\n",
              "\n",
              "/* Label box, darken color on hover, fitted */\n",
              "#sk-container-id-3 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
              "  color: var(--sklearn-color-text);\n",
              "  background-color: var(--sklearn-color-fitted-level-2);\n",
              "}\n",
              "\n",
              "/* Estimator label */\n",
              "\n",
              "#sk-container-id-3 div.sk-label label {\n",
              "  font-family: monospace;\n",
              "  font-weight: bold;\n",
              "  display: inline-block;\n",
              "  line-height: 1.2em;\n",
              "}\n",
              "\n",
              "#sk-container-id-3 div.sk-label-container {\n",
              "  text-align: center;\n",
              "}\n",
              "\n",
              "/* Estimator-specific */\n",
              "#sk-container-id-3 div.sk-estimator {\n",
              "  font-family: monospace;\n",
              "  border: 1px dotted var(--sklearn-color-border-box);\n",
              "  border-radius: 0.25em;\n",
              "  box-sizing: border-box;\n",
              "  margin-bottom: 0.5em;\n",
              "  /* unfitted */\n",
              "  background-color: var(--sklearn-color-unfitted-level-0);\n",
              "}\n",
              "\n",
              "#sk-container-id-3 div.sk-estimator.fitted {\n",
              "  /* fitted */\n",
              "  background-color: var(--sklearn-color-fitted-level-0);\n",
              "}\n",
              "\n",
              "/* on hover */\n",
              "#sk-container-id-3 div.sk-estimator:hover {\n",
              "  /* unfitted */\n",
              "  background-color: var(--sklearn-color-unfitted-level-2);\n",
              "}\n",
              "\n",
              "#sk-container-id-3 div.sk-estimator.fitted:hover {\n",
              "  /* fitted */\n",
              "  background-color: var(--sklearn-color-fitted-level-2);\n",
              "}\n",
              "\n",
              "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
              "\n",
              "/* Common style for \"i\" and \"?\" */\n",
              "\n",
              ".sk-estimator-doc-link,\n",
              "a:link.sk-estimator-doc-link,\n",
              "a:visited.sk-estimator-doc-link {\n",
              "  float: right;\n",
              "  font-size: smaller;\n",
              "  line-height: 1em;\n",
              "  font-family: monospace;\n",
              "  background-color: var(--sklearn-color-background);\n",
              "  border-radius: 1em;\n",
              "  height: 1em;\n",
              "  width: 1em;\n",
              "  text-decoration: none !important;\n",
              "  margin-left: 0.5em;\n",
              "  text-align: center;\n",
              "  /* unfitted */\n",
              "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
              "  color: var(--sklearn-color-unfitted-level-1);\n",
              "}\n",
              "\n",
              ".sk-estimator-doc-link.fitted,\n",
              "a:link.sk-estimator-doc-link.fitted,\n",
              "a:visited.sk-estimator-doc-link.fitted {\n",
              "  /* fitted */\n",
              "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
              "  color: var(--sklearn-color-fitted-level-1);\n",
              "}\n",
              "\n",
              "/* On hover */\n",
              "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
              ".sk-estimator-doc-link:hover,\n",
              "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
              ".sk-estimator-doc-link:hover {\n",
              "  /* unfitted */\n",
              "  background-color: var(--sklearn-color-unfitted-level-3);\n",
              "  color: var(--sklearn-color-background);\n",
              "  text-decoration: none;\n",
              "}\n",
              "\n",
              "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
              ".sk-estimator-doc-link.fitted:hover,\n",
              "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
              ".sk-estimator-doc-link.fitted:hover {\n",
              "  /* fitted */\n",
              "  background-color: var(--sklearn-color-fitted-level-3);\n",
              "  color: var(--sklearn-color-background);\n",
              "  text-decoration: none;\n",
              "}\n",
              "\n",
              "/* Span, style for the box shown on hovering the info icon */\n",
              ".sk-estimator-doc-link span {\n",
              "  display: none;\n",
              "  z-index: 9999;\n",
              "  position: relative;\n",
              "  font-weight: normal;\n",
              "  right: .2ex;\n",
              "  padding: .5ex;\n",
              "  margin: .5ex;\n",
              "  width: min-content;\n",
              "  min-width: 20ex;\n",
              "  max-width: 50ex;\n",
              "  color: var(--sklearn-color-text);\n",
              "  box-shadow: 2pt 2pt 4pt #999;\n",
              "  /* unfitted */\n",
              "  background: var(--sklearn-color-unfitted-level-0);\n",
              "  border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
              "}\n",
              "\n",
              ".sk-estimator-doc-link.fitted span {\n",
              "  /* fitted */\n",
              "  background: var(--sklearn-color-fitted-level-0);\n",
              "  border: var(--sklearn-color-fitted-level-3);\n",
              "}\n",
              "\n",
              ".sk-estimator-doc-link:hover span {\n",
              "  display: block;\n",
              "}\n",
              "\n",
              "/* \"?\"-specific style due to the `<a>` HTML tag */\n",
              "\n",
              "#sk-container-id-3 a.estimator_doc_link {\n",
              "  float: right;\n",
              "  font-size: 1rem;\n",
              "  line-height: 1em;\n",
              "  font-family: monospace;\n",
              "  background-color: var(--sklearn-color-background);\n",
              "  border-radius: 1rem;\n",
              "  height: 1rem;\n",
              "  width: 1rem;\n",
              "  text-decoration: none;\n",
              "  /* unfitted */\n",
              "  color: var(--sklearn-color-unfitted-level-1);\n",
              "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
              "}\n",
              "\n",
              "#sk-container-id-3 a.estimator_doc_link.fitted {\n",
              "  /* fitted */\n",
              "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
              "  color: var(--sklearn-color-fitted-level-1);\n",
              "}\n",
              "\n",
              "/* On hover */\n",
              "#sk-container-id-3 a.estimator_doc_link:hover {\n",
              "  /* unfitted */\n",
              "  background-color: var(--sklearn-color-unfitted-level-3);\n",
              "  color: var(--sklearn-color-background);\n",
              "  text-decoration: none;\n",
              "}\n",
              "\n",
              "#sk-container-id-3 a.estimator_doc_link.fitted:hover {\n",
              "  /* fitted */\n",
              "  background-color: var(--sklearn-color-fitted-level-3);\n",
              "}\n",
              "</style><div id=\"sk-container-id-3\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>GridSearchCV(cv=5,\n",
              "             estimator=Pipeline(steps=[(&#x27;preprocessor&#x27;,\n",
              "                                        ColumnTransformer(transformers=[(&#x27;num&#x27;,\n",
              "                                                                         Pipeline(steps=[(&#x27;imputer&#x27;,\n",
              "                                                                                          SimpleImputer(strategy=&#x27;median&#x27;)),\n",
              "                                                                                         (&#x27;scaler&#x27;,\n",
              "                                                                                          StandardScaler())]),\n",
              "                                                                         [&#x27;age&#x27;,\n",
              "                                                                          &#x27;sibsp&#x27;,\n",
              "                                                                          &#x27;parch&#x27;,\n",
              "                                                                          &#x27;fare&#x27;]),\n",
              "                                                                        (&#x27;cat&#x27;,\n",
              "                                                                         Pipeline(steps=[(&#x27;imputer&#x27;,\n",
              "                                                                                          SimpleImputer(strategy=&#x27;most_frequent&#x27;)),\n",
              "                                                                                         (&#x27;onehot&#x27;,\n",
              "                                                                                          OneHotEncoder(handle_unknown=&#x27;ignore&#x27;))]),\n",
              "                                                                         [&#x27;sex&#x27;,\n",
              "                                                                          &#x27;embarked&#x27;,\n",
              "                                                                          &#x27;class&#x27;,\n",
              "                                                                          &#x27;who&#x27;,\n",
              "                                                                          &#x27;adult_male&#x27;,\n",
              "                                                                          &#x27;alone&#x27;])])),\n",
              "                                       (&#x27;model&#x27;,\n",
              "                                        RandomForestClassifier(random_state=42))]),\n",
              "             param_grid={&#x27;model__max_depth&#x27;: [3, 5, 10, None],\n",
              "                         &#x27;model__min_samples_split&#x27;: [2, 5, 10],\n",
              "                         &#x27;model__n_estimators&#x27;: [50, 100, 200]},\n",
              "             scoring=&#x27;f1&#x27;)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item sk-dashed-wrapped\"><div class=\"sk-label-container\"><div class=\"sk-label fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-21\" type=\"checkbox\" ><label for=\"sk-estimator-id-21\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>GridSearchCV</div></div><div><a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.6/modules/generated/sklearn.model_selection.GridSearchCV.html\">?<span>Documentation for GridSearchCV</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></div></label><div class=\"sk-toggleable__content fitted\"><pre>GridSearchCV(cv=5,\n",
              "             estimator=Pipeline(steps=[(&#x27;preprocessor&#x27;,\n",
              "                                        ColumnTransformer(transformers=[(&#x27;num&#x27;,\n",
              "                                                                         Pipeline(steps=[(&#x27;imputer&#x27;,\n",
              "                                                                                          SimpleImputer(strategy=&#x27;median&#x27;)),\n",
              "                                                                                         (&#x27;scaler&#x27;,\n",
              "                                                                                          StandardScaler())]),\n",
              "                                                                         [&#x27;age&#x27;,\n",
              "                                                                          &#x27;sibsp&#x27;,\n",
              "                                                                          &#x27;parch&#x27;,\n",
              "                                                                          &#x27;fare&#x27;]),\n",
              "                                                                        (&#x27;cat&#x27;,\n",
              "                                                                         Pipeline(steps=[(&#x27;imputer&#x27;,\n",
              "                                                                                          SimpleImputer(strategy=&#x27;most_frequent&#x27;)),\n",
              "                                                                                         (&#x27;onehot&#x27;,\n",
              "                                                                                          OneHotEncoder(handle_unknown=&#x27;ignore&#x27;))]),\n",
              "                                                                         [&#x27;sex&#x27;,\n",
              "                                                                          &#x27;embarked&#x27;,\n",
              "                                                                          &#x27;class&#x27;,\n",
              "                                                                          &#x27;who&#x27;,\n",
              "                                                                          &#x27;adult_male&#x27;,\n",
              "                                                                          &#x27;alone&#x27;])])),\n",
              "                                       (&#x27;model&#x27;,\n",
              "                                        RandomForestClassifier(random_state=42))]),\n",
              "             param_grid={&#x27;model__max_depth&#x27;: [3, 5, 10, None],\n",
              "                         &#x27;model__min_samples_split&#x27;: [2, 5, 10],\n",
              "                         &#x27;model__n_estimators&#x27;: [50, 100, 200]},\n",
              "             scoring=&#x27;f1&#x27;)</pre></div> </div></div><div class=\"sk-parallel\"><div class=\"sk-parallel-item\"><div class=\"sk-item\"><div class=\"sk-label-container\"><div class=\"sk-label fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-22\" type=\"checkbox\" ><label for=\"sk-estimator-id-22\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>best_estimator_: Pipeline</div></div></label><div class=\"sk-toggleable__content fitted\"><pre>Pipeline(steps=[(&#x27;preprocessor&#x27;,\n",
              "                 ColumnTransformer(transformers=[(&#x27;num&#x27;,\n",
              "                                                  Pipeline(steps=[(&#x27;imputer&#x27;,\n",
              "                                                                   SimpleImputer(strategy=&#x27;median&#x27;)),\n",
              "                                                                  (&#x27;scaler&#x27;,\n",
              "                                                                   StandardScaler())]),\n",
              "                                                  [&#x27;age&#x27;, &#x27;sibsp&#x27;, &#x27;parch&#x27;,\n",
              "                                                   &#x27;fare&#x27;]),\n",
              "                                                 (&#x27;cat&#x27;,\n",
              "                                                  Pipeline(steps=[(&#x27;imputer&#x27;,\n",
              "                                                                   SimpleImputer(strategy=&#x27;most_frequent&#x27;)),\n",
              "                                                                  (&#x27;onehot&#x27;,\n",
              "                                                                   OneHotEncoder(handle_unknown=&#x27;ignore&#x27;))]),\n",
              "                                                  [&#x27;sex&#x27;, &#x27;embarked&#x27;, &#x27;class&#x27;,\n",
              "                                                   &#x27;who&#x27;, &#x27;adult_male&#x27;,\n",
              "                                                   &#x27;alone&#x27;])])),\n",
              "                (&#x27;model&#x27;,\n",
              "                 RandomForestClassifier(max_depth=10, min_samples_split=10,\n",
              "                                        random_state=42))])</pre></div> </div></div><div class=\"sk-serial\"><div class=\"sk-item\"><div class=\"sk-serial\"><div class=\"sk-item sk-dashed-wrapped\"><div class=\"sk-label-container\"><div class=\"sk-label fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-23\" type=\"checkbox\" ><label for=\"sk-estimator-id-23\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>preprocessor: ColumnTransformer</div></div><div><a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.6/modules/generated/sklearn.compose.ColumnTransformer.html\">?<span>Documentation for preprocessor: ColumnTransformer</span></a></div></label><div class=\"sk-toggleable__content fitted\"><pre>ColumnTransformer(transformers=[(&#x27;num&#x27;,\n",
              "                                 Pipeline(steps=[(&#x27;imputer&#x27;,\n",
              "                                                  SimpleImputer(strategy=&#x27;median&#x27;)),\n",
              "                                                 (&#x27;scaler&#x27;, StandardScaler())]),\n",
              "                                 [&#x27;age&#x27;, &#x27;sibsp&#x27;, &#x27;parch&#x27;, &#x27;fare&#x27;]),\n",
              "                                (&#x27;cat&#x27;,\n",
              "                                 Pipeline(steps=[(&#x27;imputer&#x27;,\n",
              "                                                  SimpleImputer(strategy=&#x27;most_frequent&#x27;)),\n",
              "                                                 (&#x27;onehot&#x27;,\n",
              "                                                  OneHotEncoder(handle_unknown=&#x27;ignore&#x27;))]),\n",
              "                                 [&#x27;sex&#x27;, &#x27;embarked&#x27;, &#x27;class&#x27;, &#x27;who&#x27;,\n",
              "                                  &#x27;adult_male&#x27;, &#x27;alone&#x27;])])</pre></div> </div></div><div class=\"sk-parallel\"><div class=\"sk-parallel-item\"><div class=\"sk-item\"><div class=\"sk-label-container\"><div class=\"sk-label fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-24\" type=\"checkbox\" ><label for=\"sk-estimator-id-24\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>num</div></div></label><div class=\"sk-toggleable__content fitted\"><pre>[&#x27;age&#x27;, &#x27;sibsp&#x27;, &#x27;parch&#x27;, &#x27;fare&#x27;]</pre></div> </div></div><div class=\"sk-serial\"><div class=\"sk-item\"><div class=\"sk-serial\"><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-25\" type=\"checkbox\" ><label for=\"sk-estimator-id-25\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>SimpleImputer</div></div><div><a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.6/modules/generated/sklearn.impute.SimpleImputer.html\">?<span>Documentation for SimpleImputer</span></a></div></label><div class=\"sk-toggleable__content fitted\"><pre>SimpleImputer(strategy=&#x27;median&#x27;)</pre></div> </div></div><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-26\" type=\"checkbox\" ><label for=\"sk-estimator-id-26\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>StandardScaler</div></div><div><a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.6/modules/generated/sklearn.preprocessing.StandardScaler.html\">?<span>Documentation for StandardScaler</span></a></div></label><div class=\"sk-toggleable__content fitted\"><pre>StandardScaler()</pre></div> </div></div></div></div></div></div></div><div class=\"sk-parallel-item\"><div class=\"sk-item\"><div class=\"sk-label-container\"><div class=\"sk-label fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-27\" type=\"checkbox\" ><label for=\"sk-estimator-id-27\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>cat</div></div></label><div class=\"sk-toggleable__content fitted\"><pre>[&#x27;sex&#x27;, &#x27;embarked&#x27;, &#x27;class&#x27;, &#x27;who&#x27;, &#x27;adult_male&#x27;, &#x27;alone&#x27;]</pre></div> </div></div><div class=\"sk-serial\"><div class=\"sk-item\"><div class=\"sk-serial\"><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-28\" type=\"checkbox\" ><label for=\"sk-estimator-id-28\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>SimpleImputer</div></div><div><a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.6/modules/generated/sklearn.impute.SimpleImputer.html\">?<span>Documentation for SimpleImputer</span></a></div></label><div class=\"sk-toggleable__content fitted\"><pre>SimpleImputer(strategy=&#x27;most_frequent&#x27;)</pre></div> </div></div><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-29\" type=\"checkbox\" ><label for=\"sk-estimator-id-29\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>OneHotEncoder</div></div><div><a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.6/modules/generated/sklearn.preprocessing.OneHotEncoder.html\">?<span>Documentation for OneHotEncoder</span></a></div></label><div class=\"sk-toggleable__content fitted\"><pre>OneHotEncoder(handle_unknown=&#x27;ignore&#x27;)</pre></div> </div></div></div></div></div></div></div></div></div><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-30\" type=\"checkbox\" ><label for=\"sk-estimator-id-30\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>RandomForestClassifier</div></div><div><a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.6/modules/generated/sklearn.ensemble.RandomForestClassifier.html\">?<span>Documentation for RandomForestClassifier</span></a></div></label><div class=\"sk-toggleable__content fitted\"><pre>RandomForestClassifier(max_depth=10, min_samples_split=10, random_state=42)</pre></div> </div></div></div></div></div></div></div></div></div></div></div>"
            ]
          },
          "metadata": {},
          "execution_count": 88
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "### Resultados de la búsqueda\n",
        "\n",
        "Una vez finalizado el proceso, se pueden consultar:\n",
        "\n",
        "- los mejores hiperparámetros encontrados\n",
        "- el mejor valor medio de F1-score obtenido en validación cruzada"
      ],
      "metadata": {
        "id": "A75og5b50xGU"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "print(\"Mejores parámetros:\", grid_search_rf.best_params_)\n",
        "print(\"Mejor F1-score en validación cruzada:\", round(grid_search_rf.best_score_, 4))"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "YD0zz8Jy0aeM",
        "outputId": "b9739039-8b05-4384-876e-591bc01692d3"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Mejores parámetros: {'model__max_depth': 10, 'model__min_samples_split': 10, 'model__n_estimators': 100}\n",
            "Mejor F1-score en validación cruzada: 0.7596\n"
          ]
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "### Evaluación final sobre test\n",
        "\n",
        "Después de seleccionar la mejor configuración, se utilizará el mejor modelo encontrado para generar predicciones sobre el conjunto `test`.\n",
        "\n",
        "A continuación, se calcularán varias métricas de clasificación para evaluar su rendimiento."
      ],
      "metadata": {
        "id": "CIDk27pj01x2"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "best_model_rf = grid_search_rf.best_estimator_\n",
        "y_test_predicted_rf = best_model_rf.predict(X_test)"
      ],
      "metadata": {
        "id": "QvomRe-t0ajR"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "accuracy_rf = accuracy_score(y_test, y_test_predicted_rf)\n",
        "precision_rf = precision_score(y_test, y_test_predicted_rf)\n",
        "recall_rf = recall_score(y_test, y_test_predicted_rf)\n",
        "f1_rf = f1_score(y_test, y_test_predicted_rf)\n",
        "cm_rf = confusion_matrix(y_test, y_test_predicted_rf)"
      ],
      "metadata": {
        "id": "36njSCve0aoK"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "print(\"Accuracy:\", round(accuracy_rf, 4))\n",
        "print(\"Precision:\", round(precision_rf, 4))\n",
        "print(\"Recall:\", round(recall_rf, 4))\n",
        "print(\"F1-score:\", round(f1_rf, 4))"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "Vg6WZ0_kmRtw",
        "outputId": "bc4b2bbf-9ced-4c05-bcec-a9493ab08cf5"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Accuracy: 0.8212\n",
            "Precision: 0.8136\n",
            "Recall: 0.6957\n",
            "F1-score: 0.75\n"
          ]
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "### Classification report\n",
        "\n",
        "Además de las métricas anteriores, también puede mostrarse un resumen completo del rendimiento del modelo mediante `classification_report`.\n",
        "\n",
        "Este informe recoge, para cada clase, los valores de **precision**, **recall**, **f1-score** y **support**."
      ],
      "metadata": {
        "id": "5gmIlVEj07ZZ"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "print(classification_report(y_test, y_test_predicted_rf))"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "1spgJuP_05eN",
        "outputId": "7406ced6-0f81-4dd3-bc6f-bd4e77c123a3"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "              precision    recall  f1-score   support\n",
            "\n",
            "           0       0.82      0.90      0.86       110\n",
            "           1       0.81      0.70      0.75        69\n",
            "\n",
            "    accuracy                           0.82       179\n",
            "   macro avg       0.82      0.80      0.81       179\n",
            "weighted avg       0.82      0.82      0.82       179\n",
            "\n"
          ]
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "### Matriz de confusión\n",
        "\n",
        "La matriz de confusión permite observar cuántos ejemplos de cada clase se han clasificado correctamente y cuántos se han clasificado de forma incorrecta."
      ],
      "metadata": {
        "id": "6VM5ELb90_kR"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "plt.figure(figsize=(6, 4))\n",
        "sns.heatmap(\n",
        "    cm_rf,\n",
        "    annot=True,\n",
        "    fmt=\"d\",\n",
        "    cmap=\"Blues\",\n",
        "    xticklabels=[\"0\", \"1\"],\n",
        "    yticklabels=[\"0\", \"1\"]\n",
        ")\n",
        "plt.title(\"Matriz de confusión - Random Forest\")\n",
        "plt.xlabel(\"Clase predicha\")\n",
        "plt.ylabel(\"Clase real\")\n",
        "plt.show()"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 410
        },
        "id": "wmM0DE391AOi",
        "outputId": "a53c8461-33ad-4b8a-9b2b-d46166b00c44"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 600x400 with 2 Axes>"
            ],
            "image/png": "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\n"
          },
          "metadata": {}
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "### Interpretación básica del modelo\n",
        "\n",
        "En el caso de random forest, también puede analizarse la **importancia de las variables**.\n",
        "\n",
        "Como este modelo combina múltiples árboles de decisión, esta medida suele resultar más estable que en un único árbol y permite identificar qué variables han contribuido más al proceso de clasificación."
      ],
      "metadata": {
        "id": "E_6JXRm67Phw"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "feature_names_rf = best_model_rf.named_steps[\"preprocessor\"].get_feature_names_out()\n",
        "importances_rf = best_model_rf.named_steps[\"model\"].feature_importances_\n",
        "\n",
        "importance_df_rf = pd.DataFrame({\n",
        "    \"feature\": feature_names_rf,\n",
        "    \"importance\": importances_rf\n",
        "})\n",
        "\n",
        "importance_df_rf = importance_df_rf.sort_values(by=\"importance\", ascending=False)\n",
        "\n",
        "importance_df_rf"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 641
        },
        "id": "wBBBnW6h05jL",
        "outputId": "814d75d7-831a-4c90-dc08-7238ccae8c47"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "                  feature  importance\n",
              "3               num__fare    0.160968\n",
              "0                num__age    0.107546\n",
              "16   cat__adult_male_True    0.091346\n",
              "13           cat__who_man    0.091157\n",
              "15  cat__adult_male_False    0.088426\n",
              "4         cat__sex_female    0.083510\n",
              "5           cat__sex_male    0.073890\n",
              "11       cat__class_Third    0.068319\n",
              "1              num__sibsp    0.047062\n",
              "14         cat__who_woman    0.042980\n",
              "9        cat__class_First    0.037935\n",
              "10      cat__class_Second    0.026977\n",
              "2              num__parch    0.020745\n",
              "8         cat__embarked_S    0.015764\n",
              "6         cat__embarked_C    0.011373\n",
              "17       cat__alone_False    0.009708\n",
              "7         cat__embarked_Q    0.009242\n",
              "12         cat__who_child    0.006657\n",
              "18        cat__alone_True    0.006395"
            ],
            "text/html": [
              "\n",
              "  <div id=\"df-1e4c9051-a7fa-46ad-b226-baef756837de\" 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>feature</th>\n",
              "      <th>importance</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>3</th>\n",
              "      <td>num__fare</td>\n",
              "      <td>0.160968</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>0</th>\n",
              "      <td>num__age</td>\n",
              "      <td>0.107546</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>16</th>\n",
              "      <td>cat__adult_male_True</td>\n",
              "      <td>0.091346</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>13</th>\n",
              "      <td>cat__who_man</td>\n",
              "      <td>0.091157</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>15</th>\n",
              "      <td>cat__adult_male_False</td>\n",
              "      <td>0.088426</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>4</th>\n",
              "      <td>cat__sex_female</td>\n",
              "      <td>0.083510</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>5</th>\n",
              "      <td>cat__sex_male</td>\n",
              "      <td>0.073890</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>11</th>\n",
              "      <td>cat__class_Third</td>\n",
              "      <td>0.068319</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1</th>\n",
              "      <td>num__sibsp</td>\n",
              "      <td>0.047062</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>14</th>\n",
              "      <td>cat__who_woman</td>\n",
              "      <td>0.042980</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>9</th>\n",
              "      <td>cat__class_First</td>\n",
              "      <td>0.037935</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>10</th>\n",
              "      <td>cat__class_Second</td>\n",
              "      <td>0.026977</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2</th>\n",
              "      <td>num__parch</td>\n",
              "      <td>0.020745</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>8</th>\n",
              "      <td>cat__embarked_S</td>\n",
              "      <td>0.015764</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>6</th>\n",
              "      <td>cat__embarked_C</td>\n",
              "      <td>0.011373</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>17</th>\n",
              "      <td>cat__alone_False</td>\n",
              "      <td>0.009708</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>7</th>\n",
              "      <td>cat__embarked_Q</td>\n",
              "      <td>0.009242</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>12</th>\n",
              "      <td>cat__who_child</td>\n",
              "      <td>0.006657</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>18</th>\n",
              "      <td>cat__alone_True</td>\n",
              "      <td>0.006395</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-1e4c9051-a7fa-46ad-b226-baef756837de')\"\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-1e4c9051-a7fa-46ad-b226-baef756837de 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-1e4c9051-a7fa-46ad-b226-baef756837de');\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=\"id_24dcab31-7035-4a0a-812e-db19e02a72da\">\n",
              "    <style>\n",
              "      .colab-df-generate {\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-generate: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",
              "      [theme=dark] .colab-df-generate {\n",
              "        background-color: #3B4455;\n",
              "        fill: #D2E3FC;\n",
              "      }\n",
              "\n",
              "      [theme=dark] .colab-df-generate: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",
              "    <button class=\"colab-df-generate\" onclick=\"generateWithVariable('importance_df_rf')\"\n",
              "            title=\"Generate code using this dataframe.\"\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",
              "    <path d=\"M7,19H8.4L18.45,9,17,7.55,7,17.6ZM5,21V16.75L18.45,3.32a2,2,0,0,1,2.83,0l1.4,1.43a1.91,1.91,0,0,1,.58,1.4,1.91,1.91,0,0,1-.58,1.4L9.25,21ZM18.45,9,17,7.55Zm-12,3A5.31,5.31,0,0,0,4.9,8.1,5.31,5.31,0,0,0,1,6.5,5.31,5.31,0,0,0,4.9,4.9,5.31,5.31,0,0,0,6.5,1,5.31,5.31,0,0,0,8.1,4.9,5.31,5.31,0,0,0,12,6.5,5.46,5.46,0,0,0,6.5,12Z\"/>\n",
              "  </svg>\n",
              "    </button>\n",
              "    <script>\n",
              "      (() => {\n",
              "      const buttonEl =\n",
              "        document.querySelector('#id_24dcab31-7035-4a0a-812e-db19e02a72da button.colab-df-generate');\n",
              "      buttonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "\n",
              "      buttonEl.onclick = () => {\n",
              "        google.colab.notebook.generateWithVariable('importance_df_rf');\n",
              "      }\n",
              "      })();\n",
              "    </script>\n",
              "  </div>\n",
              "\n",
              "    </div>\n",
              "  </div>\n"
            ],
            "application/vnd.google.colaboratory.intrinsic+json": {
              "type": "dataframe",
              "variable_name": "importance_df_rf",
              "summary": "{\n  \"name\": \"importance_df_rf\",\n  \"rows\": 19,\n  \"fields\": [\n    {\n      \"column\": \"feature\",\n      \"properties\": {\n        \"dtype\": \"string\",\n        \"num_unique_values\": 19,\n        \"samples\": [\n          \"num__fare\",\n          \"cat__sex_female\",\n          \"cat__class_Second\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"importance\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0.04328289711199068,\n        \"min\": 0.00639478845109585,\n        \"max\": 0.1609676386057431,\n        \"num_unique_values\": 19,\n        \"samples\": [\n          0.1609676386057431,\n          0.08351023912548916,\n          0.026977147137398533\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    }\n  ]\n}"
            }
          },
          "metadata": {},
          "execution_count": 99
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "top_importance_rf = importance_df_rf.head(10)\n",
        "\n",
        "plt.figure(figsize=(8, 5))\n",
        "sns.barplot(data=top_importance_rf, x=\"importance\", y=\"feature\")\n",
        "plt.title(\"Variables más influyentes - Random Forest\")\n",
        "plt.xlabel(\"Importancia\")\n",
        "plt.ylabel(\"Variable\")\n",
        "plt.show()"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 488
        },
        "id": "XxsAHBRx05qQ",
        "outputId": "9807d813-5cd1-4020-d8b0-213ac734580b"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 800x500 with 1 Axes>"
            ],
            "image/png": "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1hZsbGyEH3/8Mc/7RxDebROd3xbX+b2Wly9fFjw9PQVtbW2hevXqwowZM4Rffvkl363Aw8LChNq1awuampqCqamp8M033wgvXrzIc438tmEvKCYARW65XNQ45UpMTBR69OghGBoaCtra2kLjxo2FPXv2KJQp7HeXIAjCxYsXhW7dusl/P1hbWwu9evUSoqOjBUEQhKysLGHixIlC3bp1BalUKujq6gp169YVVqxYodBORkaG0K9fP8HQ0FAAwC2jqUxEgqCEO9WIiIioQJcuXUK9evXw66+/YsCAAcoOh4jok8J7cIiIiCqZ8PBw6OnpoVu3bsoOhYjok8N7cIiIiCqJ3bt3Iz4+HqtXr0ZAQIDCF50SEVHxcIkaERFRJWFjY4PHjx/D29sbGzZsqNBNHIiIVBUTHCIiIiIiUhm8B4eIiIiIiFQGExwiIiIiIlIZTHCIiIiIiEhlcBc1+uzJZDL8888/kEqlEIlEyg6HiIiIiD4gCALS09NhYWEBNbXC52iY4NBn759//oGlpaWywyAiIiKiIjx48AA1atQotAwTHPrs5W7D+uDBA+jr6ys5GiIiIiL6UFpaGiwtLYu1fT4THPrs5S5L09fXZ4JDREREVIkV53YCbjJAREREREQqgzM4RP/TasomqIslyg6DiIiIqNI7P99P2SEUiDM4RERERESkMpjgEBERERGRymCCQ0REREREKoMJDhERERERqQwmOEREREREpDKY4BARERERkcpggkNERERERCqDCQ4REREREakMJjhERERERKQymODQRycIAoYPHw4jIyOIRCLExcUpOyQiIiIiUhEayg6APj/79+9HREQEYmJiYGtri6pVqyo7JCIiIiJSEUxw6KNLTEyEubk5mjdvXqZ2srOzoampWU5REREREZEq4BI1FeDl5YXRo0dj0qRJMDIygpmZGUJCQgAA9+7dy7MM7OXLlxCJRIiJiQEAxMTEQCQS4cCBA3B3d4dEIsEXX3yBlJQU/PHHH3BycoK+vj769euHzMzMMsXq7++P7777DklJSRCJRLCxsQHwblanRYsWMDQ0hLGxMTp27IjExER5vdx+bN68GZ6entDW1kZkZCQAYM2aNXBycoK2tjZq166NFStWlClGIiIiIvp0cQZHRaxfvx7jxo3D6dOnERsbC39/f3h4eMDe3r7YbYSEhCAsLAw6Ojro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\n"
          },
          "metadata": {}
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "## 9. k-NN + GridSearchCV\n",
        "\n",
        "El cuarto modelo que se entrenará será **k-Nearest Neighbors (k-NN)**.\n",
        "\n",
        "Este algoritmo clasifica cada ejemplo en función de los ejemplos más cercanos del conjunto de entrenamiento. Por ello, la escala de las variables resulta especialmente importante, lo que hace que el preprocesado definido anteriormente tenga un papel clave en este modelo.\n",
        "\n",
        "Al igual que en las secciones anteriores, el preprocesado y el modelo se integrarán en un único pipeline completo. Después, se utilizará `GridSearchCV` para probar distintas configuraciones del modelo y seleccionar automáticamente la mejor mediante validación cruzada.\n",
        "\n",
        "De nuevo, la métrica principal que se utilizará será **F1-score**."
      ],
      "metadata": {
        "id": "AyZGjWX07lSa"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "from sklearn.neighbors import KNeighborsClassifier"
      ],
      "metadata": {
        "id": "CosdH7jv05vu"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "source": [
        "### Definición del pipeline completo\n",
        "\n",
        "A continuación, se construirá un pipeline que agrupe:\n",
        "\n",
        "- el preprocesado definido en la sección 5\n",
        "- el modelo k-NN"
      ],
      "metadata": {
        "id": "vZtyVhvK7uJb"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "full_pipeline_knn = Pipeline([\n",
        "    (\"preprocessor\", preprocessor),\n",
        "    (\"model\", KNeighborsClassifier())\n",
        "])"
      ],
      "metadata": {
        "id": "avKx3jB4051A"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "source": [
        "### Definición de la búsqueda de hiperparámetros\n",
        "\n",
        "Se probarán distintas configuraciones del modelo modificando algunos hiperparámetros habituales:\n",
        "\n",
        "- `n_neighbors`, que indica cuántos vecinos se tendrán en cuenta\n",
        "- `weights`, que permite decidir si todos los vecinos pesan igual o si los más cercanos tienen mayor influencia\n",
        "- `p`, que determina el tipo de distancia utilizada"
      ],
      "metadata": {
        "id": "oqapah477yMA"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "param_grid_knn = {\n",
        "    \"model__n_neighbors\": [3, 5, 7, 9, 11],\n",
        "    \"model__weights\": [\"uniform\", \"distance\"],\n",
        "    \"model__p\": [1, 2]\n",
        "}"
      ],
      "metadata": {
        "id": "ATx9elwV7vxh"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "source": [
        "### Entrenamiento con GridSearchCV\n",
        "\n",
        "A continuación, se aplicará `GridSearchCV` sobre el conjunto `train` para seleccionar automáticamente la mejor configuración del modelo k-NN mediante validación cruzada."
      ],
      "metadata": {
        "id": "do4Dmzf979Ta"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "grid_search_knn = GridSearchCV(\n",
        "    estimator=full_pipeline_knn,\n",
        "    param_grid=param_grid_knn,\n",
        "    scoring=\"f1\",\n",
        "    cv=5\n",
        ")"
      ],
      "metadata": {
        "id": "JGUbQt-17v3a"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "grid_search_knn.fit(X_train, y_train)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 316
        },
        "id": "XjWsc-Le7v97",
        "outputId": "43068d8c-12c5-45a2-e775-87d4bc359b6a"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "GridSearchCV(cv=5,\n",
              "             estimator=Pipeline(steps=[('preprocessor',\n",
              "                                        ColumnTransformer(transformers=[('num',\n",
              "                                                                         Pipeline(steps=[('imputer',\n",
              "                                                                                          SimpleImputer(strategy='median')),\n",
              "                                                                                         ('scaler',\n",
              "                                                                                          StandardScaler())]),\n",
              "                                                                         ['age',\n",
              "                                                                          'sibsp',\n",
              "                                                                          'parch',\n",
              "                                                                          'fare']),\n",
              "                                                                        ('cat',\n",
              "                                                                         Pipeline(steps=[('imputer',\n",
              "                                                                                          SimpleImputer(strategy='most_frequent')),\n",
              "                                                                                         ('onehot',\n",
              "                                                                                          OneHotEncoder(handle_unknown='ignore'))]),\n",
              "                                                                         ['sex',\n",
              "                                                                          'embarked',\n",
              "                                                                          'class',\n",
              "                                                                          'who',\n",
              "                                                                          'adult_male',\n",
              "                                                                          'alone'])])),\n",
              "                                       ('model', KNeighborsClassifier())]),\n",
              "             param_grid={'model__n_neighbors': [3, 5, 7, 9, 11],\n",
              "                         'model__p': [1, 2],\n",
              "                         'model__weights': ['uniform', 'distance']},\n",
              "             scoring='f1')"
            ],
            "text/html": [
              "<style>#sk-container-id-4 {\n",
              "  /* Definition of color scheme common for light and dark mode */\n",
              "  --sklearn-color-text: #000;\n",
              "  --sklearn-color-text-muted: #666;\n",
              "  --sklearn-color-line: gray;\n",
              "  /* Definition of color scheme for unfitted estimators */\n",
              "  --sklearn-color-unfitted-level-0: #fff5e6;\n",
              "  --sklearn-color-unfitted-level-1: #f6e4d2;\n",
              "  --sklearn-color-unfitted-level-2: #ffe0b3;\n",
              "  --sklearn-color-unfitted-level-3: chocolate;\n",
              "  /* Definition of color scheme for fitted estimators */\n",
              "  --sklearn-color-fitted-level-0: #f0f8ff;\n",
              "  --sklearn-color-fitted-level-1: #d4ebff;\n",
              "  --sklearn-color-fitted-level-2: #b3dbfd;\n",
              "  --sklearn-color-fitted-level-3: cornflowerblue;\n",
              "\n",
              "  /* Specific color for light theme */\n",
              "  --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
              "  --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
              "  --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
              "  --sklearn-color-icon: #696969;\n",
              "\n",
              "  @media (prefers-color-scheme: dark) {\n",
              "    /* Redefinition of color scheme for dark theme */\n",
              "    --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
              "    --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
              "    --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
              "    --sklearn-color-icon: #878787;\n",
              "  }\n",
              "}\n",
              "\n",
              "#sk-container-id-4 {\n",
              "  color: var(--sklearn-color-text);\n",
              "}\n",
              "\n",
              "#sk-container-id-4 pre {\n",
              "  padding: 0;\n",
              "}\n",
              "\n",
              "#sk-container-id-4 input.sk-hidden--visually {\n",
              "  border: 0;\n",
              "  clip: rect(1px 1px 1px 1px);\n",
              "  clip: rect(1px, 1px, 1px, 1px);\n",
              "  height: 1px;\n",
              "  margin: -1px;\n",
              "  overflow: hidden;\n",
              "  padding: 0;\n",
              "  position: absolute;\n",
              "  width: 1px;\n",
              "}\n",
              "\n",
              "#sk-container-id-4 div.sk-dashed-wrapped {\n",
              "  border: 1px dashed var(--sklearn-color-line);\n",
              "  margin: 0 0.4em 0.5em 0.4em;\n",
              "  box-sizing: border-box;\n",
              "  padding-bottom: 0.4em;\n",
              "  background-color: var(--sklearn-color-background);\n",
              "}\n",
              "\n",
              "#sk-container-id-4 div.sk-container {\n",
              "  /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
              "     but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
              "     so we also need the `!important` here to be able to override the\n",
              "     default hidden behavior on the sphinx rendered scikit-learn.org.\n",
              "     See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
              "  display: inline-block !important;\n",
              "  position: relative;\n",
              "}\n",
              "\n",
              "#sk-container-id-4 div.sk-text-repr-fallback {\n",
              "  display: none;\n",
              "}\n",
              "\n",
              "div.sk-parallel-item,\n",
              "div.sk-serial,\n",
              "div.sk-item {\n",
              "  /* draw centered vertical line to link estimators */\n",
              "  background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
              "  background-size: 2px 100%;\n",
              "  background-repeat: no-repeat;\n",
              "  background-position: center center;\n",
              "}\n",
              "\n",
              "/* Parallel-specific style estimator block */\n",
              "\n",
              "#sk-container-id-4 div.sk-parallel-item::after {\n",
              "  content: \"\";\n",
              "  width: 100%;\n",
              "  border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
              "  flex-grow: 1;\n",
              "}\n",
              "\n",
              "#sk-container-id-4 div.sk-parallel {\n",
              "  display: flex;\n",
              "  align-items: stretch;\n",
              "  justify-content: center;\n",
              "  background-color: var(--sklearn-color-background);\n",
              "  position: relative;\n",
              "}\n",
              "\n",
              "#sk-container-id-4 div.sk-parallel-item {\n",
              "  display: flex;\n",
              "  flex-direction: column;\n",
              "}\n",
              "\n",
              "#sk-container-id-4 div.sk-parallel-item:first-child::after {\n",
              "  align-self: flex-end;\n",
              "  width: 50%;\n",
              "}\n",
              "\n",
              "#sk-container-id-4 div.sk-parallel-item:last-child::after {\n",
              "  align-self: flex-start;\n",
              "  width: 50%;\n",
              "}\n",
              "\n",
              "#sk-container-id-4 div.sk-parallel-item:only-child::after {\n",
              "  width: 0;\n",
              "}\n",
              "\n",
              "/* Serial-specific style estimator block */\n",
              "\n",
              "#sk-container-id-4 div.sk-serial {\n",
              "  display: flex;\n",
              "  flex-direction: column;\n",
              "  align-items: center;\n",
              "  background-color: var(--sklearn-color-background);\n",
              "  padding-right: 1em;\n",
              "  padding-left: 1em;\n",
              "}\n",
              "\n",
              "\n",
              "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
              "clickable and can be expanded/collapsed.\n",
              "- Pipeline and ColumnTransformer use this feature and define the default style\n",
              "- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
              "*/\n",
              "\n",
              "/* Pipeline and ColumnTransformer style (default) */\n",
              "\n",
              "#sk-container-id-4 div.sk-toggleable {\n",
              "  /* Default theme specific background. It is overwritten whether we have a\n",
              "  specific estimator or a Pipeline/ColumnTransformer */\n",
              "  background-color: var(--sklearn-color-background);\n",
              "}\n",
              "\n",
              "/* Toggleable label */\n",
              "#sk-container-id-4 label.sk-toggleable__label {\n",
              "  cursor: pointer;\n",
              "  display: flex;\n",
              "  width: 100%;\n",
              "  margin-bottom: 0;\n",
              "  padding: 0.5em;\n",
              "  box-sizing: border-box;\n",
              "  text-align: center;\n",
              "  align-items: start;\n",
              "  justify-content: space-between;\n",
              "  gap: 0.5em;\n",
              "}\n",
              "\n",
              "#sk-container-id-4 label.sk-toggleable__label .caption {\n",
              "  font-size: 0.6rem;\n",
              "  font-weight: lighter;\n",
              "  color: var(--sklearn-color-text-muted);\n",
              "}\n",
              "\n",
              "#sk-container-id-4 label.sk-toggleable__label-arrow:before {\n",
              "  /* Arrow on the left of the label */\n",
              "  content: \"▸\";\n",
              "  float: left;\n",
              "  margin-right: 0.25em;\n",
              "  color: var(--sklearn-color-icon);\n",
              "}\n",
              "\n",
              "#sk-container-id-4 label.sk-toggleable__label-arrow:hover:before {\n",
              "  color: var(--sklearn-color-text);\n",
              "}\n",
              "\n",
              "/* Toggleable content - dropdown */\n",
              "\n",
              "#sk-container-id-4 div.sk-toggleable__content {\n",
              "  max-height: 0;\n",
              "  max-width: 0;\n",
              "  overflow: hidden;\n",
              "  text-align: left;\n",
              "  /* unfitted */\n",
              "  background-color: var(--sklearn-color-unfitted-level-0);\n",
              "}\n",
              "\n",
              "#sk-container-id-4 div.sk-toggleable__content.fitted {\n",
              "  /* fitted */\n",
              "  background-color: var(--sklearn-color-fitted-level-0);\n",
              "}\n",
              "\n",
              "#sk-container-id-4 div.sk-toggleable__content pre {\n",
              "  margin: 0.2em;\n",
              "  border-radius: 0.25em;\n",
              "  color: var(--sklearn-color-text);\n",
              "  /* unfitted */\n",
              "  background-color: var(--sklearn-color-unfitted-level-0);\n",
              "}\n",
              "\n",
              "#sk-container-id-4 div.sk-toggleable__content.fitted pre {\n",
              "  /* unfitted */\n",
              "  background-color: var(--sklearn-color-fitted-level-0);\n",
              "}\n",
              "\n",
              "#sk-container-id-4 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
              "  /* Expand drop-down */\n",
              "  max-height: 200px;\n",
              "  max-width: 100%;\n",
              "  overflow: auto;\n",
              "}\n",
              "\n",
              "#sk-container-id-4 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
              "  content: \"▾\";\n",
              "}\n",
              "\n",
              "/* Pipeline/ColumnTransformer-specific style */\n",
              "\n",
              "#sk-container-id-4 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
              "  color: var(--sklearn-color-text);\n",
              "  background-color: var(--sklearn-color-unfitted-level-2);\n",
              "}\n",
              "\n",
              "#sk-container-id-4 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
              "  background-color: var(--sklearn-color-fitted-level-2);\n",
              "}\n",
              "\n",
              "/* Estimator-specific style */\n",
              "\n",
              "/* Colorize estimator box */\n",
              "#sk-container-id-4 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
              "  /* unfitted */\n",
              "  background-color: var(--sklearn-color-unfitted-level-2);\n",
              "}\n",
              "\n",
              "#sk-container-id-4 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
              "  /* fitted */\n",
              "  background-color: var(--sklearn-color-fitted-level-2);\n",
              "}\n",
              "\n",
              "#sk-container-id-4 div.sk-label label.sk-toggleable__label,\n",
              "#sk-container-id-4 div.sk-label label {\n",
              "  /* The background is the default theme color */\n",
              "  color: var(--sklearn-color-text-on-default-background);\n",
              "}\n",
              "\n",
              "/* On hover, darken the color of the background */\n",
              "#sk-container-id-4 div.sk-label:hover label.sk-toggleable__label {\n",
              "  color: var(--sklearn-color-text);\n",
              "  background-color: var(--sklearn-color-unfitted-level-2);\n",
              "}\n",
              "\n",
              "/* Label box, darken color on hover, fitted */\n",
              "#sk-container-id-4 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
              "  color: var(--sklearn-color-text);\n",
              "  background-color: var(--sklearn-color-fitted-level-2);\n",
              "}\n",
              "\n",
              "/* Estimator label */\n",
              "\n",
              "#sk-container-id-4 div.sk-label label {\n",
              "  font-family: monospace;\n",
              "  font-weight: bold;\n",
              "  display: inline-block;\n",
              "  line-height: 1.2em;\n",
              "}\n",
              "\n",
              "#sk-container-id-4 div.sk-label-container {\n",
              "  text-align: center;\n",
              "}\n",
              "\n",
              "/* Estimator-specific */\n",
              "#sk-container-id-4 div.sk-estimator {\n",
              "  font-family: monospace;\n",
              "  border: 1px dotted var(--sklearn-color-border-box);\n",
              "  border-radius: 0.25em;\n",
              "  box-sizing: border-box;\n",
              "  margin-bottom: 0.5em;\n",
              "  /* unfitted */\n",
              "  background-color: var(--sklearn-color-unfitted-level-0);\n",
              "}\n",
              "\n",
              "#sk-container-id-4 div.sk-estimator.fitted {\n",
              "  /* fitted */\n",
              "  background-color: var(--sklearn-color-fitted-level-0);\n",
              "}\n",
              "\n",
              "/* on hover */\n",
              "#sk-container-id-4 div.sk-estimator:hover {\n",
              "  /* unfitted */\n",
              "  background-color: var(--sklearn-color-unfitted-level-2);\n",
              "}\n",
              "\n",
              "#sk-container-id-4 div.sk-estimator.fitted:hover {\n",
              "  /* fitted */\n",
              "  background-color: var(--sklearn-color-fitted-level-2);\n",
              "}\n",
              "\n",
              "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
              "\n",
              "/* Common style for \"i\" and \"?\" */\n",
              "\n",
              ".sk-estimator-doc-link,\n",
              "a:link.sk-estimator-doc-link,\n",
              "a:visited.sk-estimator-doc-link {\n",
              "  float: right;\n",
              "  font-size: smaller;\n",
              "  line-height: 1em;\n",
              "  font-family: monospace;\n",
              "  background-color: var(--sklearn-color-background);\n",
              "  border-radius: 1em;\n",
              "  height: 1em;\n",
              "  width: 1em;\n",
              "  text-decoration: none !important;\n",
              "  margin-left: 0.5em;\n",
              "  text-align: center;\n",
              "  /* unfitted */\n",
              "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
              "  color: var(--sklearn-color-unfitted-level-1);\n",
              "}\n",
              "\n",
              ".sk-estimator-doc-link.fitted,\n",
              "a:link.sk-estimator-doc-link.fitted,\n",
              "a:visited.sk-estimator-doc-link.fitted {\n",
              "  /* fitted */\n",
              "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
              "  color: var(--sklearn-color-fitted-level-1);\n",
              "}\n",
              "\n",
              "/* On hover */\n",
              "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
              ".sk-estimator-doc-link:hover,\n",
              "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
              ".sk-estimator-doc-link:hover {\n",
              "  /* unfitted */\n",
              "  background-color: var(--sklearn-color-unfitted-level-3);\n",
              "  color: var(--sklearn-color-background);\n",
              "  text-decoration: none;\n",
              "}\n",
              "\n",
              "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
              ".sk-estimator-doc-link.fitted:hover,\n",
              "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
              ".sk-estimator-doc-link.fitted:hover {\n",
              "  /* fitted */\n",
              "  background-color: var(--sklearn-color-fitted-level-3);\n",
              "  color: var(--sklearn-color-background);\n",
              "  text-decoration: none;\n",
              "}\n",
              "\n",
              "/* Span, style for the box shown on hovering the info icon */\n",
              ".sk-estimator-doc-link span {\n",
              "  display: none;\n",
              "  z-index: 9999;\n",
              "  position: relative;\n",
              "  font-weight: normal;\n",
              "  right: .2ex;\n",
              "  padding: .5ex;\n",
              "  margin: .5ex;\n",
              "  width: min-content;\n",
              "  min-width: 20ex;\n",
              "  max-width: 50ex;\n",
              "  color: var(--sklearn-color-text);\n",
              "  box-shadow: 2pt 2pt 4pt #999;\n",
              "  /* unfitted */\n",
              "  background: var(--sklearn-color-unfitted-level-0);\n",
              "  border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
              "}\n",
              "\n",
              ".sk-estimator-doc-link.fitted span {\n",
              "  /* fitted */\n",
              "  background: var(--sklearn-color-fitted-level-0);\n",
              "  border: var(--sklearn-color-fitted-level-3);\n",
              "}\n",
              "\n",
              ".sk-estimator-doc-link:hover span {\n",
              "  display: block;\n",
              "}\n",
              "\n",
              "/* \"?\"-specific style due to the `<a>` HTML tag */\n",
              "\n",
              "#sk-container-id-4 a.estimator_doc_link {\n",
              "  float: right;\n",
              "  font-size: 1rem;\n",
              "  line-height: 1em;\n",
              "  font-family: monospace;\n",
              "  background-color: var(--sklearn-color-background);\n",
              "  border-radius: 1rem;\n",
              "  height: 1rem;\n",
              "  width: 1rem;\n",
              "  text-decoration: none;\n",
              "  /* unfitted */\n",
              "  color: var(--sklearn-color-unfitted-level-1);\n",
              "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
              "}\n",
              "\n",
              "#sk-container-id-4 a.estimator_doc_link.fitted {\n",
              "  /* fitted */\n",
              "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
              "  color: var(--sklearn-color-fitted-level-1);\n",
              "}\n",
              "\n",
              "/* On hover */\n",
              "#sk-container-id-4 a.estimator_doc_link:hover {\n",
              "  /* unfitted */\n",
              "  background-color: var(--sklearn-color-unfitted-level-3);\n",
              "  color: var(--sklearn-color-background);\n",
              "  text-decoration: none;\n",
              "}\n",
              "\n",
              "#sk-container-id-4 a.estimator_doc_link.fitted:hover {\n",
              "  /* fitted */\n",
              "  background-color: var(--sklearn-color-fitted-level-3);\n",
              "}\n",
              "</style><div id=\"sk-container-id-4\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>GridSearchCV(cv=5,\n",
              "             estimator=Pipeline(steps=[(&#x27;preprocessor&#x27;,\n",
              "                                        ColumnTransformer(transformers=[(&#x27;num&#x27;,\n",
              "                                                                         Pipeline(steps=[(&#x27;imputer&#x27;,\n",
              "                                                                                          SimpleImputer(strategy=&#x27;median&#x27;)),\n",
              "                                                                                         (&#x27;scaler&#x27;,\n",
              "                                                                                          StandardScaler())]),\n",
              "                                                                         [&#x27;age&#x27;,\n",
              "                                                                          &#x27;sibsp&#x27;,\n",
              "                                                                          &#x27;parch&#x27;,\n",
              "                                                                          &#x27;fare&#x27;]),\n",
              "                                                                        (&#x27;cat&#x27;,\n",
              "                                                                         Pipeline(steps=[(&#x27;imputer&#x27;,\n",
              "                                                                                          SimpleImputer(strategy=&#x27;most_frequent&#x27;)),\n",
              "                                                                                         (&#x27;onehot&#x27;,\n",
              "                                                                                          OneHotEncoder(handle_unknown=&#x27;ignore&#x27;))]),\n",
              "                                                                         [&#x27;sex&#x27;,\n",
              "                                                                          &#x27;embarked&#x27;,\n",
              "                                                                          &#x27;class&#x27;,\n",
              "                                                                          &#x27;who&#x27;,\n",
              "                                                                          &#x27;adult_male&#x27;,\n",
              "                                                                          &#x27;alone&#x27;])])),\n",
              "                                       (&#x27;model&#x27;, KNeighborsClassifier())]),\n",
              "             param_grid={&#x27;model__n_neighbors&#x27;: [3, 5, 7, 9, 11],\n",
              "                         &#x27;model__p&#x27;: [1, 2],\n",
              "                         &#x27;model__weights&#x27;: [&#x27;uniform&#x27;, &#x27;distance&#x27;]},\n",
              "             scoring=&#x27;f1&#x27;)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item sk-dashed-wrapped\"><div class=\"sk-label-container\"><div class=\"sk-label fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-31\" type=\"checkbox\" ><label for=\"sk-estimator-id-31\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>GridSearchCV</div></div><div><a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.6/modules/generated/sklearn.model_selection.GridSearchCV.html\">?<span>Documentation for GridSearchCV</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></div></label><div class=\"sk-toggleable__content fitted\"><pre>GridSearchCV(cv=5,\n",
              "             estimator=Pipeline(steps=[(&#x27;preprocessor&#x27;,\n",
              "                                        ColumnTransformer(transformers=[(&#x27;num&#x27;,\n",
              "                                                                         Pipeline(steps=[(&#x27;imputer&#x27;,\n",
              "                                                                                          SimpleImputer(strategy=&#x27;median&#x27;)),\n",
              "                                                                                         (&#x27;scaler&#x27;,\n",
              "                                                                                          StandardScaler())]),\n",
              "                                                                         [&#x27;age&#x27;,\n",
              "                                                                          &#x27;sibsp&#x27;,\n",
              "                                                                          &#x27;parch&#x27;,\n",
              "                                                                          &#x27;fare&#x27;]),\n",
              "                                                                        (&#x27;cat&#x27;,\n",
              "                                                                         Pipeline(steps=[(&#x27;imputer&#x27;,\n",
              "                                                                                          SimpleImputer(strategy=&#x27;most_frequent&#x27;)),\n",
              "                                                                                         (&#x27;onehot&#x27;,\n",
              "                                                                                          OneHotEncoder(handle_unknown=&#x27;ignore&#x27;))]),\n",
              "                                                                         [&#x27;sex&#x27;,\n",
              "                                                                          &#x27;embarked&#x27;,\n",
              "                                                                          &#x27;class&#x27;,\n",
              "                                                                          &#x27;who&#x27;,\n",
              "                                                                          &#x27;adult_male&#x27;,\n",
              "                                                                          &#x27;alone&#x27;])])),\n",
              "                                       (&#x27;model&#x27;, KNeighborsClassifier())]),\n",
              "             param_grid={&#x27;model__n_neighbors&#x27;: [3, 5, 7, 9, 11],\n",
              "                         &#x27;model__p&#x27;: [1, 2],\n",
              "                         &#x27;model__weights&#x27;: [&#x27;uniform&#x27;, &#x27;distance&#x27;]},\n",
              "             scoring=&#x27;f1&#x27;)</pre></div> </div></div><div class=\"sk-parallel\"><div class=\"sk-parallel-item\"><div class=\"sk-item\"><div class=\"sk-label-container\"><div class=\"sk-label fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-32\" type=\"checkbox\" ><label for=\"sk-estimator-id-32\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>best_estimator_: Pipeline</div></div></label><div class=\"sk-toggleable__content fitted\"><pre>Pipeline(steps=[(&#x27;preprocessor&#x27;,\n",
              "                 ColumnTransformer(transformers=[(&#x27;num&#x27;,\n",
              "                                                  Pipeline(steps=[(&#x27;imputer&#x27;,\n",
              "                                                                   SimpleImputer(strategy=&#x27;median&#x27;)),\n",
              "                                                                  (&#x27;scaler&#x27;,\n",
              "                                                                   StandardScaler())]),\n",
              "                                                  [&#x27;age&#x27;, &#x27;sibsp&#x27;, &#x27;parch&#x27;,\n",
              "                                                   &#x27;fare&#x27;]),\n",
              "                                                 (&#x27;cat&#x27;,\n",
              "                                                  Pipeline(steps=[(&#x27;imputer&#x27;,\n",
              "                                                                   SimpleImputer(strategy=&#x27;most_frequent&#x27;)),\n",
              "                                                                  (&#x27;onehot&#x27;,\n",
              "                                                                   OneHotEncoder(handle_unknown=&#x27;ignore&#x27;))]),\n",
              "                                                  [&#x27;sex&#x27;, &#x27;embarked&#x27;, &#x27;class&#x27;,\n",
              "                                                   &#x27;who&#x27;, &#x27;adult_male&#x27;,\n",
              "                                                   &#x27;alone&#x27;])])),\n",
              "                (&#x27;model&#x27;, KNeighborsClassifier(p=1))])</pre></div> </div></div><div class=\"sk-serial\"><div class=\"sk-item\"><div class=\"sk-serial\"><div class=\"sk-item sk-dashed-wrapped\"><div class=\"sk-label-container\"><div class=\"sk-label fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-33\" type=\"checkbox\" ><label for=\"sk-estimator-id-33\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>preprocessor: ColumnTransformer</div></div><div><a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.6/modules/generated/sklearn.compose.ColumnTransformer.html\">?<span>Documentation for preprocessor: ColumnTransformer</span></a></div></label><div class=\"sk-toggleable__content fitted\"><pre>ColumnTransformer(transformers=[(&#x27;num&#x27;,\n",
              "                                 Pipeline(steps=[(&#x27;imputer&#x27;,\n",
              "                                                  SimpleImputer(strategy=&#x27;median&#x27;)),\n",
              "                                                 (&#x27;scaler&#x27;, StandardScaler())]),\n",
              "                                 [&#x27;age&#x27;, &#x27;sibsp&#x27;, &#x27;parch&#x27;, &#x27;fare&#x27;]),\n",
              "                                (&#x27;cat&#x27;,\n",
              "                                 Pipeline(steps=[(&#x27;imputer&#x27;,\n",
              "                                                  SimpleImputer(strategy=&#x27;most_frequent&#x27;)),\n",
              "                                                 (&#x27;onehot&#x27;,\n",
              "                                                  OneHotEncoder(handle_unknown=&#x27;ignore&#x27;))]),\n",
              "                                 [&#x27;sex&#x27;, &#x27;embarked&#x27;, &#x27;class&#x27;, &#x27;who&#x27;,\n",
              "                                  &#x27;adult_male&#x27;, &#x27;alone&#x27;])])</pre></div> </div></div><div class=\"sk-parallel\"><div class=\"sk-parallel-item\"><div class=\"sk-item\"><div class=\"sk-label-container\"><div class=\"sk-label fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-34\" type=\"checkbox\" ><label for=\"sk-estimator-id-34\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>num</div></div></label><div class=\"sk-toggleable__content fitted\"><pre>[&#x27;age&#x27;, &#x27;sibsp&#x27;, &#x27;parch&#x27;, &#x27;fare&#x27;]</pre></div> </div></div><div class=\"sk-serial\"><div class=\"sk-item\"><div class=\"sk-serial\"><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-35\" type=\"checkbox\" ><label for=\"sk-estimator-id-35\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>SimpleImputer</div></div><div><a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.6/modules/generated/sklearn.impute.SimpleImputer.html\">?<span>Documentation for SimpleImputer</span></a></div></label><div class=\"sk-toggleable__content fitted\"><pre>SimpleImputer(strategy=&#x27;median&#x27;)</pre></div> </div></div><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-36\" type=\"checkbox\" ><label for=\"sk-estimator-id-36\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>StandardScaler</div></div><div><a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.6/modules/generated/sklearn.preprocessing.StandardScaler.html\">?<span>Documentation for StandardScaler</span></a></div></label><div class=\"sk-toggleable__content fitted\"><pre>StandardScaler()</pre></div> </div></div></div></div></div></div></div><div class=\"sk-parallel-item\"><div class=\"sk-item\"><div class=\"sk-label-container\"><div class=\"sk-label fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-37\" type=\"checkbox\" ><label for=\"sk-estimator-id-37\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>cat</div></div></label><div class=\"sk-toggleable__content fitted\"><pre>[&#x27;sex&#x27;, &#x27;embarked&#x27;, &#x27;class&#x27;, &#x27;who&#x27;, &#x27;adult_male&#x27;, &#x27;alone&#x27;]</pre></div> </div></div><div class=\"sk-serial\"><div class=\"sk-item\"><div class=\"sk-serial\"><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-38\" type=\"checkbox\" ><label for=\"sk-estimator-id-38\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>SimpleImputer</div></div><div><a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.6/modules/generated/sklearn.impute.SimpleImputer.html\">?<span>Documentation for SimpleImputer</span></a></div></label><div class=\"sk-toggleable__content fitted\"><pre>SimpleImputer(strategy=&#x27;most_frequent&#x27;)</pre></div> </div></div><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-39\" type=\"checkbox\" ><label for=\"sk-estimator-id-39\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>OneHotEncoder</div></div><div><a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.6/modules/generated/sklearn.preprocessing.OneHotEncoder.html\">?<span>Documentation for OneHotEncoder</span></a></div></label><div class=\"sk-toggleable__content fitted\"><pre>OneHotEncoder(handle_unknown=&#x27;ignore&#x27;)</pre></div> </div></div></div></div></div></div></div></div></div><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-40\" type=\"checkbox\" ><label for=\"sk-estimator-id-40\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>KNeighborsClassifier</div></div><div><a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.6/modules/generated/sklearn.neighbors.KNeighborsClassifier.html\">?<span>Documentation for KNeighborsClassifier</span></a></div></label><div class=\"sk-toggleable__content fitted\"><pre>KNeighborsClassifier(p=1)</pre></div> </div></div></div></div></div></div></div></div></div></div></div>"
            ]
          },
          "metadata": {},
          "execution_count": 105
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "### Resultados de la búsqueda\n",
        "\n",
        "Una vez finalizado el proceso, se pueden consultar:\n",
        "\n",
        "- los mejores hiperparámetros encontrados\n",
        "- el mejor valor medio de F1-score obtenido en validación cruzada"
      ],
      "metadata": {
        "id": "Kl9ck5DS8B3d"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "print(\"Mejores parámetros:\", grid_search_knn.best_params_)\n",
        "print(\"Mejor F1-score en validación cruzada:\", round(grid_search_knn.best_score_, 4))"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "HQcraY1u7wEc",
        "outputId": "582a6996-f195-4845-f048-2c527ada0d24"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Mejores parámetros: {'model__n_neighbors': 5, 'model__p': 1, 'model__weights': 'uniform'}\n",
            "Mejor F1-score en validación cruzada: 0.7474\n"
          ]
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "### Evaluación final sobre test\n",
        "\n",
        "Después de seleccionar la mejor configuración, se utilizará el mejor modelo encontrado para generar predicciones sobre el conjunto `test`.\n",
        "\n",
        "A continuación, se calcularán varias métricas de clasificación para evaluar su rendimiento."
      ],
      "metadata": {
        "id": "psKErGh78HN5"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "best_model_knn = grid_search_knn.best_estimator_\n",
        "y_test_predicted_knn = best_model_knn.predict(X_test)"
      ],
      "metadata": {
        "id": "U2QO_Nr2056P"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "accuracy_knn = accuracy_score(y_test, y_test_predicted_knn)\n",
        "precision_knn = precision_score(y_test, y_test_predicted_knn)\n",
        "recall_knn = recall_score(y_test, y_test_predicted_knn)\n",
        "f1_knn = f1_score(y_test, y_test_predicted_knn)\n",
        "cm_knn = confusion_matrix(y_test, y_test_predicted_knn)"
      ],
      "metadata": {
        "id": "dMNt2y0_05_m"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "print(\"Accuracy:\", round(accuracy_knn, 4))\n",
        "print(\"Precision:\", round(precision_knn, 4))\n",
        "print(\"Recall:\", round(recall_knn, 4))\n",
        "print(\"F1-score:\", round(f1_knn, 4))"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "sxett_iF06FM",
        "outputId": "5ba4498a-8410-4c55-e071-86fb9ce62740"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Accuracy: 0.8268\n",
            "Precision: 0.7969\n",
            "Recall: 0.7391\n",
            "F1-score: 0.7669\n"
          ]
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "### Classification report\n",
        "\n",
        "Además de las métricas anteriores, también puede mostrarse un resumen completo del rendimiento del modelo mediante `classification_report`.\n",
        "\n",
        "Este informe recoge, para cada clase, los valores de **precision**, **recall**, **f1-score** y **support**."
      ],
      "metadata": {
        "id": "PkAatv768S06"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "print(classification_report(y_test, y_test_predicted_knn))"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "MTc2GWut8QwY",
        "outputId": "9ec94d85-864f-4b0b-8eaf-05938cfc43f3"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "              precision    recall  f1-score   support\n",
            "\n",
            "           0       0.84      0.88      0.86       110\n",
            "           1       0.80      0.74      0.77        69\n",
            "\n",
            "    accuracy                           0.83       179\n",
            "   macro avg       0.82      0.81      0.81       179\n",
            "weighted avg       0.83      0.83      0.83       179\n",
            "\n"
          ]
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "### Matriz de confusión\n",
        "\n",
        "La matriz de confusión permite observar cuántos ejemplos de cada clase se han clasificado correctamente y cuántos se han clasificado de forma incorrecta."
      ],
      "metadata": {
        "id": "9KwqgGjD8X-l"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "plt.figure(figsize=(6, 4))\n",
        "sns.heatmap(\n",
        "    cm_knn,\n",
        "    annot=True,\n",
        "    fmt=\"d\",\n",
        "    cmap=\"Blues\",\n",
        "    xticklabels=[\"0\", \"1\"],\n",
        "    yticklabels=[\"0\", \"1\"]\n",
        ")\n",
        "plt.title(\"Matriz de confusión - k-NN\")\n",
        "plt.xlabel(\"Clase predicha\")\n",
        "plt.ylabel(\"Clase real\")\n",
        "plt.show()"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 410
        },
        "id": "Ro4qDbgI8PFZ",
        "outputId": "01bcea71-3daf-4c16-e0a3-849b044db037"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 600x400 with 2 Axes>"
            ],
            "image/png": "iVBORw0KGgoAAAANSUhEUgAAAfUAAAGJCAYAAACTqKqrAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAQP1JREFUeJzt3Xl8TGf7P/DPTJZJZJkkRBYkliBqKUKJLaWpWGqNpegjStW3IiSp0jyK0BK1S22tx9J67LVTlLRSSxAhqRZBGkLJoCSRSCbb+f3Rn3k6kjAzyWTinM+7r/N6yX3uc+7rTLVXrvvc54xMEAQBRERE9MqTmzoAIiIiqhhM6kRERCLBpE5ERCQSTOpEREQiwaROREQkEkzqREREIsGkTkREJBJM6kRERCLBpE5EFUatVmPu3Lk4cuSIqUMhkiQmdarSIiMjIZPJjDqGTCZDZGSkUceoDCqVCoMGDUL16tUhk8mwdOnSCh/jZZ9VeHg4Nm3ahHbt2lX42Lp69nfm4cOHJouByFSY1AkAsGHDBshkMshkMpw8ebLEfkEQUKdOHchkMrzzzjsGjTF37lzs2bOnnJFSWcLCwnDkyBFERERg48aN6NGjR6WOv337duzZsweHDh2Cg4NDpY5dkd58803IZDL06dOnxL6bN29CJpNh4cKFmrbjx49r/ttJSEgoccyoUaNga2tr1JiJnmFSJy1WVlbYvHlzifbY2FjcuXMHCoXC4HMbktQ/++wz5ObmGjymlPz000/o168fJk+ejPfeew/e3t4VPkZubi4+++yzEu2CIODOnTs4dOgQPDw8KnxcUzhw4ECpSfpFxDDjQ682JnXS0qtXL+zYsQOFhYVa7Zs3b4aPjw9cXV0rJY6cnBwAgLm5OaysrCplzFfd/fv3jV4hW1lZwdzcvES7TCZDeHg4WrRoYdTxK4uHhwccHR0xa9YsnY9p2bIlDhw4gAsXLhgxMqIXY1InLcOGDcNff/2Fo0ePatry8/Px/fffY/jw4aUes3DhQnTo0AHVq1eHtbU1fHx88P3332v1kclkyMnJwbfffquZqhw1ahSA/90DvXz5MoYPHw5HR0d06tRJa98zo0aN0hz//PayKkmtViMsLAzOzs6ws7ND3759cefOnVL7/vnnnxg9ejRcXFygUCjQtGlTrFu37mUfn8Z///tfvPHGG6hWrRocHR3RpUsX/Pjjj1p9Vq5ciaZNm0KhUMDd3R3BwcHIyMjQ6vPmm2+iWbNmuHz5Mrp27Ypq1aqhVq1amD9/vqbPs1sngiBgxYoVms+jtM/v+WNu3rypaTt//jwCAgJQo0YNWFtbo169ehg9erTWcaV9zhcvXkTPnj1hb28PW1tbvPXWWzhz5kyp4506dQrh4eFwdnaGjY0NBgwYgAcPHuj6sRrs1q1b8PLyQrNmzaBSqV7a387ODmFhYdi/f7/OSTokJASOjo6s1smkmNRJS926deHr64stW7Zo2g4dOoTMzEy8++67pR6zbNkytGrVCrNnz8bcuXNhbm6OwYMH4+DBg5o+GzduhEKhQOfOnbFx40Zs3LgR48aN0zrP4MGD8fTpU8ydOxdjx44tdaxx48Zpjn+2jRgxAgBQs2bNF17bBx98gKVLl6J79+6YN28eLCws0Lt37xL9VCoV2rdvj2PHjmHChAlYtmwZvLy8MGbMGJ0Wn82aNQv/+te/YGFhgdmzZ2PWrFmoU6cOfvrpJ02fyMhIBAcHw93dHYsWLUJgYCC+/vprdO/eHQUFBVrne/z4MXr06IHXX38dixYtgre3N6ZOnYpDhw4BALp06YKNGzcCAN5++23N56KP+/fvo3v37rh58yY+/fRTfPXVVxgxYkSJ5Py833//HZ07d0ZSUhKmTJmC6dOnIzU1FW+++SbOnj1bon9ISAiSkpIwc+ZMfPTRR9i/fz8mTJigV6z6SklJQZcuXWBnZ4fjx4/DxcVFp+MmTZqkV5K2t7fX+xcBogonEAmCsH79egGAEB8fLyxfvlyws7MTnj59KgiCIAwePFjo2rWrIAiC4OnpKfTu3Vvr2Gf9nsnPzxeaNWsmdOvWTavdxsZGCAoKKjH2zJkzBQDCsGHDytxXluvXrwtKpVJ4++23hcLCwjL7JSYmCgCE8ePHa7UPHz5cACDMnDlT0zZmzBjBzc1NePjwoVbfd999V1AqlSWu9/l45HK5MGDAAKGoqEhrX3FxsSAIgnD//n3B0tJS6N69u1af5cuXCwCEdevWadr8/PwEAMJ3332naVOr1YKrq6sQGBiodX4AQnBwsFZbWZ/fs3/fqampgiAIwu7duzX//l/k+c+qf//+gqWlpZCSkqJpu3v3rmBnZyd06dKlxHj+/v6az0EQBCEsLEwwMzMTMjIyXjiuPp5d84MHD4QrV64I7u7uQtu2bYVHjx7pdLyfn5/QtGlTQRAEYdasWQIAISEhQRAEQUhNTRUACAsWLND0//nnnwUAwo4dO4SMjAzB0dFR6Nu3r2Z/UFCQYGNjU2HXR/QirNSphCFDhiA3NxcHDhzAkydPcODAgTKn3gHA2tpa8+fHjx8jMzMTnTt31rta+b//+z+9+ufk5GDAgAFwdHTEli1bYGZmVmbfH374AQAwceJErfbQ0FCtnwVBwM6dO9GnTx8IgoCHDx9qtoCAAGRmZr7wuvbs2YPi4mLMmDEDcrn2f17PpsGPHTuG/Px8hIaGavUZO3Ys7O3ttWY4AMDW1hbvvfee5mdLS0u88cYb+OOPP8qMQ1/P7sUfOHCgxExBWYqKivDjjz+if//+qF+/vqbdzc0Nw4cPx8mTJ5GVlaV1zIcffqh1O6Bz584oKirCrVu3yn8Rz/ntt9/g5+eHunXr4tixY3B0dNT7HM+qdV3vrSuVSoSGhmLfvn24ePGi3uMRlReTOpXg7OwMf39/bN68Gbt27UJRUREGDRpUZv8DBw6gffv2sLKygpOTE5ydnbFq1SpkZmbqNW69evX06j927FikpKRg9+7dqF69+gv73rp1C3K5HA0aNNBqb9y4sdbPDx48QEZGBr755hs4Oztrbe+//z6Av6eqy5KSkgK5XI7XXnvthbGUNralpSXq169fIsHVrl27xH1xR0dHPH78uMwx9OXn54fAwEDMmjULNWrUQL9+/bB+/Xqo1eoyj3nw4AGePn1a4joAoEmTJiguLsbt27e12p9fGf8s0b7oWnJzc5Genq616aJPnz6ws7PDkSNHYG9vr7UvOztb63xl3dc3JElPmjQJDg4OvLdOJsGkTqUaPnw4Dh06hNWrV6Nnz55lrqo+ceIE+vbtCysrK6xcuRI//PADjh49iuHDh0MQBL3G/GfF/zLLli3Dli1bsGbNGrRs2VKvcV6kuLgYAPDee+/h6NGjpW4dO3assPF0UdYMhC6fb1kv7ikqKirR7/vvv0dcXBwmTJigWSjo4+OD7Oxs/YMugyHXsm3bNri5uWltuggMDERKSgo2bdpUYt/ChQu1zte2bdsyz/MsSbNap1dByWdTiAAMGDAA48aNw5kzZ7Bt27Yy++3cuRNWVlY4cuSI1jPs69evL9G3ot4Md+LECUyePBmhoaGaRXIv4+npieLiYqSkpGhVlsnJyVr9nq2MLyoqgr+/v96xNWjQAMXFxbh8+XKZv2x4enpqxv7ntHV+fj5SU1MNGrcszyrhjIwMrV/Myprubt++Pdq3b485c+Zg8+bNGDFiBLZu3YoPPvigRF9nZ2dUq1atxGcIAFevXoVcLkedOnXKfQ0BAQFaT2PoasGCBTA3N8f48eNhZ2endQtp5MiRmicsgBf/QvksSUdGRiIoKEinsUNDQ7F06VLMmjXrlX4RD716WKlTqWxtbbFq1SpERkaW+matZ8zMzCCTybQqv5s3b5b6khkbG5sSj2zp6969exgyZAg6deqEBQsW6Hxcz549AQDR0dFa7c+vZjczM0NgYCB27tyJ3377rcR5Xvb4Vf/+/SGXyzF79mxN1f/Ms2rU398flpaWiI6O1qpQ165di8zMzFJX5Bvq2e2GX375RdP27NHCf3r8+HGJavnZLyVlTcGbmZmhe/fu2Lt3r9ajcSqVCps3b0anTp1KTHsbws3NDf7+/lqbLmQyGb755hsMGjQIQUFB2Ldvn2Zf/fr1tc73stmX0NBQODg4YPbs2TqN/ewXgb179yIxMVGnY4gqAit1KpMuVUnv3r2xePFi9OjRA8OHD8f9+/exYsUKeHl54ddff9Xq6+Pjg2PHjmHx4sVwd3dHvXr19H5H+MSJE/HgwQNMmTIFW7du1drXokWLMl9+0rJlSwwbNgwrV65EZmYmOnTogJiYGNy4caNE33nz5uHnn39Gu3btMHbsWLz22mt49OgRLly4gGPHjuHRo0dlxufl5YVp06bh888/R+fOnTFw4EAoFArEx8fD3d0dUVFRcHZ2RkREBGbNmoUePXqgb9++SE5OxsqVK9G2bVutRXHl1b17d3h4eGDMmDH45JNPYGZmhnXr1sHZ2RlpaWmaft9++y1WrlyJAQMGoEGDBnjy5AnWrFkDe3t79OrVq8zzf/HFFzh69Cg6deqE8ePHw9zcHF9//TXUarXWs/SmIpfL8d///hf9+/fHkCFD8MMPP6Bbt256n0epVGLSpEl6vYxm0qRJWLJkCZKSkmBjY6P3mEQGMd3Ce6pK/vlI24uU9kjb2rVrhYYNGwoKhULw9vYW1q9fX+qjVFevXhW6dOkiWFtbCwA0j7f98xGk5z1/nmePeJW2/fNRq9Lk5uYKEydOFKpXry7Y2NgIffr0EW7fvl3qsSqVSggODhbq1KkjWFhYCK6ursJbb70lfPPNNy8c45l169YJrVq1EhQKheDo6Cj4+fkJR48e1eqzfPlywdvbW7CwsBBcXFyEjz76SHj8+LFWn38+XvVPQUFBgqenp1YbSnmkTRAEISEhQWjXrp1gaWkpeHh4CIsXLy7xSNuFCxeEYcOGCR4eHoJCoRBq1qwpvPPOO8L58+dLjPH8Z3XhwgUhICBAsLW1FapVqyZ07dpVOH36tFafsv5+PXsc7Oeffy4Rt6FK+/v09OlTwc/PT7C1tRXOnDnzwuPL+swfP34sKJXKFz7SVlYsfKSNKotMEPRczURERERVEu+pExERiQSTOhERkUgwqRMREYkEkzoREZFIMKkTERGJBJM6ERGRSDCpExERiYQo3yhn3WqCqUMgMrrH8ctNHQKR0VkZOUuVJ1/kXqx6/w2KMqkTERHpRCauCWsmdSIikq4K+vbIqoJJnYiIpEtklbq4roaIiEjCWKkTEZF0cfqdiIhIJEQ2/c6kTkRE0sVKnYiISCRYqRMREYmEyCp1cf2KQkREJGGs1ImISLo4/U5ERCQSIpt+Z1InIiLpYqVOREQkEqzUiYiIREJklbq4roaIiEjCWKkTEZF0iaxSZ1InIiLpkvOeOhERkTiwUiciIhIJrn4nIiISCZFV6uK6GiIioirqyZMnCA0NhaenJ6ytrdGhQwfEx8dr9guCgBkzZsDNzQ3W1tbw9/fH9evX9RqDSZ2IiKRLJjN809MHH3yAo0ePYuPGjbh06RK6d+8Of39//PnnnwCA+fPnIzo6GqtXr8bZs2dhY2ODgIAA5OXl6X45giAIekdWxVm3mmDqEIiM7nH8clOHQGR0Vka+SWzdfYHBx2bsnwi1Wq3VplAooFAoSvTNzc2FnZ0d9u7di969e2vafXx80LNnT3z++edwd3fHxx9/jMmTJwMAMjMz4eLigg0bNuDdd9/VKSZW6kREJF3lqNSjoqKgVCq1tqioqFKHKSwsRFFREaysrLTara2tcfLkSaSmpiI9PR3+/v6afUqlEu3atUNcXJzOl8OFckREJF3lWCgXERGB8PBwrbbSqnQAsLOzg6+vLz7//HM0adIELi4u2LJlC+Li4uDl5YX09HQAgIuLi9ZxLi4umn26YKVORETSVY5KXaFQwN7eXmsrK6kDwMaNGyEIAmrVqgWFQoHo6GgMGzYMcnnFpWImdSIiokrQoEEDxMbGIjs7G7dv38a5c+dQUFCA+vXrw9XVFQCgUqm0jlGpVJp9umBSJyIi6ZLJDd8MZGNjAzc3Nzx+/BhHjhxBv379UK9ePbi6uiImJkbTLysrC2fPnoWvr6/O5+Y9dSIikq5KfKPckSNHIAgCGjdujBs3buCTTz6Bt7c33n//fchkMoSGhuKLL75Aw4YNUa9ePUyfPh3u7u7o37+/zmMwqRMRkXRV4hvlMjMzERERgTt37sDJyQmBgYGYM2cOLCwsAABTpkxBTk4OPvzwQ2RkZKBTp044fPhwiRXzL8Ln1IleUXxOnaTA6M+p91lp8LG5+8dXYCQVg5U6ERFJl8i+0IUL5YiIiESClToREUmXyL6ljUmdiIikS2TT70zqREQkXazUiYiIRIKVOhERkTjIRJbUxTXvQEREJGGs1ImISLLEVqkzqRMRkXSJK6czqRMRkXSxUiciIhIJJnUiIiKREFtS5+p3IiIikWClTkREkiW2Sp1JnYiIpEtcOZ1JnYiIpIuVOhERkUgwqRMREYmE2JI6V78TERGJBCt1IiKSLLFV6kzqREQkXeLK6UzqREQkXazUiYiIRIJJnYiISCTEltS5+p2IiMjIioqKMH36dNSrVw/W1tZo0KABPv/8cwiCoOkjCAJmzJgBNzc3WFtbw9/fH9evX9drHCZ1IiKSLlk5Nj18+eWXWLVqFZYvX44rV67gyy+/xPz58/HVV19p+syfPx/R0dFYvXo1zp49CxsbGwQEBCAvL0/ncTj9TkREklVZ0++nT59Gv3790Lt3bwBA3bp1sWXLFpw7dw7A31X60qVL8dlnn6Ffv34AgO+++w4uLi7Ys2cP3n33XZ3GYaVORESSJZPJDN7UajWysrK0NrVaXeo4HTp0QExMDK5duwYASEpKwsmTJ9GzZ08AQGpqKtLT0+Hv7685RqlUol27doiLi9P5epjUiYhIssqT1KOioqBUKrW2qKioUsf59NNP8e6778Lb2xsWFhZo1aoVQkNDMWLECABAeno6AMDFxUXrOBcXF80+XXD6nYiIJKs80+8REREIDw/XalMoFKX23b59OzZt2oTNmzejadOmSExMRGhoKNzd3REUFGRwDM9jUiciIjKAQqEoM4k/75NPPtFU6wDQvHlz3Lp1C1FRUQgKCoKrqysAQKVSwc3NTXOcSqVCy5YtdY6J0+9ERCRdlbT6/enTp5DLtVOumZkZiouLAQD16tWDq6srYmJiNPuzsrJw9uxZ+Pr66jwOK3UiIpKsylr93qdPH8yZMwceHh5o2rQpLl68iMWLF2P06NGaOEJDQ/HFF1+gYcOGqFevHqZPnw53d3f0799f53GY1ImISLIqK6l/9dVXmD59OsaPH4/79+/D3d0d48aNw4wZMzR9pkyZgpycHHz44YfIyMhAp06dcPjwYVhZWek8jkz45+tsRMK61QRTh0BkdI/jl5s6BCKjszJy6VkneK/Bx95e0a8CI6kYvKdOREQkEpx+JyIi6RLX97kwqZPubKspMHP8O+jb7XU4O9oiKfkOJs//HgmX0wAAuRdLnw7+95LdWPJdTKn7iKqahPPx2LBuLa5c/g0PHjzAkugV6PbW/97ytWrFVzh86CDS09NhYWGB115rigmTwtCixesmjJoMJbZvaWNSJ52tmjEcr3m5Y/Rn3+Leg0wM6/UGDq4OQevAL3D3QSbq+kdo9e/esSlWzxyO3TGJpgmYyAC5uU/RuHFj9B8YiPBJJdfneHrWRcS0Gahduw7y1Hn473cb8NHY0dh/6CicnJxMEDGVB5M6SZKVwgL932qJwWHf4NSFFADAnK9/QK8uzTB2cGfMWnkAqr+eaB3T583miI2/jpt//mWKkIkM0qmzHzp19itzf693+mj9PHlKBHbv/B7XryWjXXvdnyemqkFsSZ0L5Ugn5mZymJubIS+/QKs9T12ADq0alOhf08kOPTo1w7d7dP8iAqJXTUF+Pnbu2AY7Ozs0atzY1OGQAcrz7veqyKSV+sOHD7Fu3TrExcVpXljv6uqKDh06YNSoUXB2djZlePQP2U/VOJP0ByLG9kRyqgqqv7IwpEcbtGtRDym3H5To/16fdnjyNA97fkqs/GCJjCz2+M+YOjkceXm5qOHsjNVr1sHRkVPvZHomq9Tj4+PRqFEjREdHQ6lUokuXLujSpQuUSiWio6Ph7e2N8+fPv/Q8pX31nVBcVAlXID2jP/sOMhnwx49zkHl2KYKH+WH74fMoLi75qoOR/dpj26HzUOcXmiBSIuNq+0Y7bN+5B99t2oqOnTrjk49D8ddfvM30Sqqk18RWFpNV6iEhIRg8eDBWr15dYhpDEAT83//9H0JCQl76PbJRUVGYNWuWVpuZS1tYuL1R4TFLXeqdh+j+wTJUs7KEva0V0h9mYeO895H650Otfh1bNUDjeq7416frTRQpkXFVq1YNHp6e8PD0RIvXW6JPz+7Ys+t7jBk7ztShkZ6q6jS6oUxWqSclJSEsLKzUD1QmkyEsLAyJiYkvPU9ERAQyMzO1NnMXHyNETM88zctH+sMsONhZw79DExw4fklrf1B/XyRcTsOla3+aKEKiylUsFCM/P9/UYZABeE+9gri6uuLcuXPw9vYudf+5c+dKfFl8aUr76juZ3KxCYiRt/r5NIJMB127eR4M6zpgb1h/XUlX4bt//ZlPsbKww8O1W+HTxbhNGSmS4pzk5SEtL0/z85507uHrlCpRKJZQODvjPN6vxZtduqOHsjIzHj7F1yybcV6nwdkAPE0ZNhqqiudlgJkvqkydPxocffoiEhAS89dZbmgSuUqkQExODNWvWYOHChaYKj0qhtLXC7JC+qOXigEeZT7E3JhEzV+xHYWGxps/gAB/IIMP2wy9fD0FUFf3++2/44P2Rmp8Xzo8CAPTtNwCfzZyF1NQ/sG/vbmQ8fgwHBwc0bdYc67/bBC+vhqYKmcqhqlbchjLpF7ps27YNS5YsQUJCAoqK/l7cZmZmBh8fH4SHh2PIkCEGnZdf6EJSwC90ISkw9he6NPzksMHHXl9Q9WZnTPpI29ChQzF06FAUFBTg4cO/F1vVqFEDFhYWpgyLiIgkQmSFetV4o5yFhQXc3NxMHQYREUmM2Kbfq0RSJyIiMgWR5XQmdSIiki65XFxZnUmdiIgkS2yVOr/QhYiISCRYqRMRkWRxoRwREZFIiCynM6kTEZF0sVInIiISCSZ1IiIikRBZTufqdyIiIrFgpU5ERJIltul3VupERCRZMpnhmz7q1q0LmUxWYgsODgYA5OXlITg4GNWrV4etrS0CAwOhUqn0vh4mdSIikqzSEq2umz7i4+Nx7949zXb06FEAwODBgwEAYWFh2L9/P3bs2IHY2FjcvXsXAwcO1Pt6OP1ORESSVVmz787Ozlo/z5s3Dw0aNICfnx8yMzOxdu1abN68Gd26dQMArF+/Hk2aNMGZM2fQvn17ncdhpU5ERJJVnkpdrVYjKytLa1Or1S8dMz8/H//9738xevRoyGQyJCQkoKCgAP7+/po+3t7e8PDwQFxcnF7Xw6RORERkgKioKCiVSq0tKirqpcft2bMHGRkZGDVqFAAgPT0dlpaWcHBw0Orn4uKC9PR0vWLi9DsREUlWeabfIyIiEB4ertWmUCheetzatWvRs2dPuLu7Gz54GZjUiYhIssrzSJtCodApif/TrVu3cOzYMezatUvT5urqivz8fGRkZGhV6yqVCq6urnqdn9PvREQkWZX1SNsz69evR82aNdG7d29Nm4+PDywsLBATE6NpS05ORlpaGnx9ffU6Pyt1IiKSrMp8+UxxcTHWr1+PoKAgmJv/L/0qlUqMGTMG4eHhcHJygr29PUJCQuDr66vXyneASZ2IiCSsMl8od+zYMaSlpWH06NEl9i1ZsgRyuRyBgYFQq9UICAjAypUr9R5DJgiCUBHBViXWrSaYOgQio3scv9zUIRAZnZWRS88O838x+NjTU7pUYCQVg5U6ERFJltje/c6kTkREkiWynM6kTkRE0sVKnYiISCSY1ImIiERCZDmdL58hIiISC1bqREQkWZx+JyIiEgmR5XQmdSIiki5W6kRERCIhspzOpE5ERNIlF1lW5+p3IiIikWClTkREkiWyQp1JnYiIpIsL5YiIiERCLq6czqRORETSJclKPTo6WucTTpw40eBgiIiIKpPIcrpuSX3JkiU6nUwmkzGpExERmYhOST01NdXYcRAREVU6GcRVqvOeOhERSRYXygG4c+cO9u3bh7S0NOTn52vtW7x4cYUERkREZGySXCj3TzExMejbty/q16+Pq1evolmzZrh58yYEQUDr1q2NESMREZFRiCyn6/+a2IiICEyePBmXLl2ClZUVdu7cidu3b8PPzw+DBw82RoxERERGIZfJDN6qIr2T+pUrVzBy5EgAgLm5OXJzc2Fra4vZs2fjyy+/rPAAiYiISDd6J3UbGxvNfXQ3NzekpKRo9j18+LDiIiMiIjIymczwrSrSO6m3b98eJ0+eBAD06tULH3/8MebMmYPRo0ejffv2FR4gERGRschkMoM3ff3555947733UL16dVhbW6N58+Y4f/68Zr8gCJgxYwbc3NxgbW0Nf39/XL9+Xa8x9F4ot3jxYmRnZwMAZs2ahezsbGzbtg0NGzbkynciInqlVFbF/fjxY3Ts2BFdu3bFoUOH4OzsjOvXr8PR0VHTZ/78+YiOjsa3336LevXqYfr06QgICMDly5dhZWWl0zgyQRAEY12EqVi3mmDqEIiM7nH8clOHQGR0VkZ+m8rQby8afOy2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\n"
          },
          "metadata": {}
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "## 10. Comparación final de modelos\n",
        "\n",
        "Una vez entrenados y evaluados los cuatro modelos de clasificación, conviene comparar sus resultados para identificar cuál ofrece el mejor comportamiento sobre el conjunto `test`.\n",
        "\n",
        "En esta práctica se compararán las siguientes métricas:\n",
        "\n",
        "- **accuracy**\n",
        "- **precision**\n",
        "- **recall**\n",
        "- **f1-score**\n",
        "\n",
        "La comparación permitirá analizar no solo qué modelo obtiene mejores resultados globales, sino también si existen diferencias importantes entre ellos en función de la métrica considerada."
      ],
      "metadata": {
        "id": "1pnIf3iH8sPn"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "results_df = pd.DataFrame({\n",
        "    \"Modelo\": [\"Logistic Regression\", \"Decision Tree\", \"Random Forest\", \"k-NN\"],\n",
        "    \"Accuracy\": [accuracy_logreg, accuracy_tree, accuracy_rf, accuracy_knn],\n",
        "    \"Precision\": [precision_logreg, precision_tree, precision_rf, precision_knn],\n",
        "    \"Recall\": [recall_logreg, recall_tree, recall_rf, recall_knn],\n",
        "    \"F1-score\": [f1_logreg, f1_tree, f1_rf, f1_knn]\n",
        "}).round(4)\n",
        "\n",
        "results_df"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 173
        },
        "id": "sYVtE4Wd8s_M",
        "outputId": "af7ca880-d8b2-4a30-c136-a8e72dbb4242"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "                Modelo  Accuracy  Precision  Recall  F1-score\n",
              "0  Logistic Regression    0.8324     0.8095  0.7391    0.7727\n",
              "1        Decision Tree    0.8268     0.7879  0.7536    0.7704\n",
              "2        Random Forest    0.8212     0.8136  0.6957    0.7500\n",
              "3                 k-NN    0.8268     0.7969  0.7391    0.7669"
            ],
            "text/html": [
              "\n",
              "  <div id=\"df-4808b0e5-09b2-45ea-a39b-a9fee933d5e1\" 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>Modelo</th>\n",
              "      <th>Accuracy</th>\n",
              "      <th>Precision</th>\n",
              "      <th>Recall</th>\n",
              "      <th>F1-score</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>0</th>\n",
              "      <td>Logistic Regression</td>\n",
              "      <td>0.8324</td>\n",
              "      <td>0.8095</td>\n",
              "      <td>0.7391</td>\n",
              "      <td>0.7727</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1</th>\n",
              "      <td>Decision Tree</td>\n",
              "      <td>0.8268</td>\n",
              "      <td>0.7879</td>\n",
              "      <td>0.7536</td>\n",
              "      <td>0.7704</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2</th>\n",
              "      <td>Random Forest</td>\n",
              "      <td>0.8212</td>\n",
              "      <td>0.8136</td>\n",
              "      <td>0.6957</td>\n",
              "      <td>0.7500</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>3</th>\n",
              "      <td>k-NN</td>\n",
              "      <td>0.8268</td>\n",
              "      <td>0.7969</td>\n",
              "      <td>0.7391</td>\n",
              "      <td>0.7669</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-4808b0e5-09b2-45ea-a39b-a9fee933d5e1')\"\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-4808b0e5-09b2-45ea-a39b-a9fee933d5e1 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-4808b0e5-09b2-45ea-a39b-a9fee933d5e1');\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=\"id_2562ec7d-bceb-4f58-865a-2d1ba3adaa0b\">\n",
              "    <style>\n",
              "      .colab-df-generate {\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-generate: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",
              "      [theme=dark] .colab-df-generate {\n",
              "        background-color: #3B4455;\n",
              "        fill: #D2E3FC;\n",
              "      }\n",
              "\n",
              "      [theme=dark] .colab-df-generate: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",
              "    <button class=\"colab-df-generate\" onclick=\"generateWithVariable('results_df')\"\n",
              "            title=\"Generate code using this dataframe.\"\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",
              "    <path d=\"M7,19H8.4L18.45,9,17,7.55,7,17.6ZM5,21V16.75L18.45,3.32a2,2,0,0,1,2.83,0l1.4,1.43a1.91,1.91,0,0,1,.58,1.4,1.91,1.91,0,0,1-.58,1.4L9.25,21ZM18.45,9,17,7.55Zm-12,3A5.31,5.31,0,0,0,4.9,8.1,5.31,5.31,0,0,0,1,6.5,5.31,5.31,0,0,0,4.9,4.9,5.31,5.31,0,0,0,6.5,1,5.31,5.31,0,0,0,8.1,4.9,5.31,5.31,0,0,0,12,6.5,5.46,5.46,0,0,0,6.5,12Z\"/>\n",
              "  </svg>\n",
              "    </button>\n",
              "    <script>\n",
              "      (() => {\n",
              "      const buttonEl =\n",
              "        document.querySelector('#id_2562ec7d-bceb-4f58-865a-2d1ba3adaa0b button.colab-df-generate');\n",
              "      buttonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "\n",
              "      buttonEl.onclick = () => {\n",
              "        google.colab.notebook.generateWithVariable('results_df');\n",
              "      }\n",
              "      })();\n",
              "    </script>\n",
              "  </div>\n",
              "\n",
              "    </div>\n",
              "  </div>\n"
            ],
            "application/vnd.google.colaboratory.intrinsic+json": {
              "type": "dataframe",
              "variable_name": "results_df",
              "summary": "{\n  \"name\": \"results_df\",\n  \"rows\": 4,\n  \"fields\": [\n    {\n      \"column\": \"Modelo\",\n      \"properties\": {\n        \"dtype\": \"string\",\n        \"num_unique_values\": 4,\n        \"samples\": [\n          \"Decision Tree\",\n          \"k-NN\",\n          \"Logistic Regression\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"Accuracy\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0.004572380853195261,\n        \"min\": 0.8212,\n        \"max\": 0.8324,\n        \"num_unique_values\": 3,\n        \"samples\": [\n          0.8324,\n          0.8268,\n          0.8212\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"Precision\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0.01177040780941762,\n        \"min\": 0.7879,\n        \"max\": 0.8136,\n        \"num_unique_values\": 4,\n        \"samples\": [\n          0.7879,\n          0.7969,\n          0.8095\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"Recall\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0.025066627881175682,\n        \"min\": 0.6957,\n        \"max\": 0.7536,\n        \"num_unique_values\": 3,\n        \"samples\": [\n          0.7391,\n          0.7536,\n          0.6957\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"F1-score\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0.010280402067364237,\n        \"min\": 0.75,\n        \"max\": 0.7727,\n        \"num_unique_values\": 4,\n        \"samples\": [\n          0.7704,\n          0.7669,\n          0.7727\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    }\n  ]\n}"
            }
          },
          "metadata": {},
          "execution_count": 114
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "results_df_melted = results_df.melt(id_vars=\"Modelo\", var_name=\"Métrica\", value_name=\"Valor\")\n",
        "\n",
        "plt.figure(figsize=(10, 6))\n",
        "sns.barplot(data=results_df_melted, x=\"Métrica\", y=\"Valor\", hue=\"Modelo\")\n",
        "plt.title(\"Comparación de métricas entre modelos\")\n",
        "plt.ylim(0, 1)\n",
        "plt.show()"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 565
        },
        "id": "GhMhDFyu8tFz",
        "outputId": "a8d05acf-69e1-4fac-ff5c-7a30ebfd51d5"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 1000x600 with 1 Axes>"
            ],
            "image/png": "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uu7LL7+sGTNmqEuXLurTp48OHTqkcePGafv27Vq/fr3y5s2r0aNHq3fv3nJ3d9c777wjSfL19bWpoWfPnipUqJAGDRqkpKSkTGudMWOGXnzxRVWoUEEDBw6Ut7e3tm/frmXLlum5556T9N+kHZcuXdIrr7yiggULatOmTfrss8/0119/ac6cOdaxnn32We3evVu9e/dWUFCQTp06pRUrVighIeGWx2337t2qW7euihQpYv35fP/992rdurXmzp2rp59+Ot3xzZ8/v6KionT48GGNHj1akZGRmj17tiTd8fGx58/eMAw99dRTWr16tbp27arKlStr+fLleuONN3Ts2DF9+umn1m1069ZNX3/9tZ577jnVqVNHq1atSvd+lqSTJ0/qf//7n/WDkUKFCumnn35S165ddeHCBfXt2zfT/Vi5cqWaNm2qEiVKaPDgwbp8+bI+++wz1a1bV9u2bbMeix49euiHH35QZGSkypcvr3/++Ufr1q1TXFwc9yoCuY0BADng/PnzhiSjVatWt9U/NjbWkGR069bNpv311183JBmrVq2ythUrVsyQZPz222/WtuXLlxuSDFdXV+PIkSPW9s8//9yQZKxevdraFhERYUgyevfubW1LS0szmjdvbjg5ORmnT5+2tl+6dMmmnuTkZKNixYpGo0aNbNolGQ4ODsbu3bvT7dvtjLF//37DwcHBePrpp43U1FSb/mlpadb/r1+/vlG/fn3r89GjRxuSjK+//tpm/Nq1axvu7u7GhQsXDMMwjEOHDhmSjIIFCxpnz5619l24cKEhyfjxxx/T1X2jvn37GpKMjRs3WttOnTpleHl5GZKMQ4cOGYZhGBcvXjS8vb2N7t2726x/4sQJw8vLK137zaZPn25IMsLCwmz2u3bt2obFYjF69OhhbUtJSTEeeeQRm+Px66+/GpKMb775xmbcZcuWpWuvUKGCzbo31/DYY48ZKSkpGS67vr/nzp0zPDw8jFq1ahmXL1+26Xtj/Te/BgzDMKKjow2LxWJ9vf7777+GJGPEiBGZHJ3MNW7c2AgODjauXLlis/06deoYpUuXTld/aGioTX39+vUzHB0djXPnzlnbsnp87P2zX7BggSHJ+OCDD2zGbdOmjWGxWIwDBw4YhvH/v2t69uxp0++5554zJBlRUVHWtq5duxr+/v7GmTNnbPp26NDB8PLysv5c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schisUjK+FK9H3/8UTVq1JCLi4t8fHz09NNP33I/LBaL/Pz85O/vrzp16qhr167atGmTLly4YO2zcOFCVa1aVS4uLipRooSGDBlis6979uzRY489JhcXF5UvX14rV66UxWKxnq07fPiwLBaLZs+erfr168vFxUXffPONJOmLL75QuXLl5OLiorJly2rChAnWcZOTkxUZGSl/f3+5uLioWLFiio6ONj1eNx9bSUpISFCrVq3k7u4uT09PtWvXTidPnrQuHzx4sCpXrqyvvvpKQUFB8vLyUocOHXTx4sVbHj8AuJ9xqR4AIEcdO3ZMzZo1U+fOnfXll19qz5496t69u1xcXDR48GBJUv/+/bV+/XotWrRIvr6+GjRokLZt26bKlStnOObcuXP16aef6rvvvlOFChV04sQJ7dixQ5I0b948hYSE6KWXXlL37t0zrWvJkiV6+umn9c477+jLL79UcnKyli5detv7derUKc2fP1+Ojo5ydHSUJP36668KDw/X2LFjVa9ePcXHx+ull16SJEVFRSk1NVWtW7dW0aJFtXHjRl28eFGvvfZahuO/9dZbGjlypKpUqWINT4MGDdK4ceNUpUoVbd++Xd27d5ebm5siIiI0duxYLVq0SN9//72KFi2qo0eP6ujRo6bH62ZpaWnW0LR27VqlpKSoV69eat++vdasWWPtFx8frwULFmjx4sX6999/1a5dO3300Uf68MMPb/sYAsD9hOAEAMhREyZMUGBgoMaNGyeLxaKyZcvq77//1oABAzRo0CAlJSVp5syZmjVrlho3bixJmj59ugICAjIdMyEhQX5+fgoNDVXevHlVtGhR1axZU5JUoEABOTo6ysPDQ35+fpmO8eGHH6pDhw4aMmSItS0kJOSW+3L+/Hm5u7vLMAxdunRJktSnTx/r/UFDhgzRW2+9pYiICElSiRIl9P777+vNN99UVFSUVqxYofj4eK1Zs8Za24cffqgnnngi3bb69u2rZ555xvo8KipKI0eOtLYVL15cf/75pz7//HNFREQoISFBpUuX1mOPPSaLxaJixYrd1vG6WUxMjHbu3KlDhw4pMDBQkvTll1+qQoUK2rx5s2rUqCHpv4A1Y8YMeXh4SJJeeOEFxcTEEJwAPLC4VA8AkKPi4uJUu3Zt6yVzklS3bl0lJibqr7/+0sGDB3Xt2jWbP+S9vLxUpkyZ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6y2lpKTY7G9kZKT69u0rHx8fhYWFSZJ27dqlpk2byt3dXb6+vnrhhRd05swZ63o//PCDgoODrfsXGhqqpKQkDR48WDNnztTChQtlsVhksVi0Zs0a030AAJgjOAEAst2uXbv022+/2Zw9uXLliqpVq6YlS5Zo165deumll/TCCy9o06ZNNuvOnDlTbm5u2rhxo4YPH66hQ4daw1FaWpqeeeYZOTk5aePGjZo0aZIGDBhgs35SUpLCwsKUP39+bd68WXPmzNHKlSsVGRlp02/VqlX6+++/9csvv2jUqFGKiopSixYtlD9/fm3cuFE9evTQyy+/rL/++uuOjsGxY8fUrFkz1ahRQzt27NDEiRM1depUffDBB+n218nJSevXr9ekSZN07tw5NWrUSFWqVNGWLVu0bNkynTx5Uu3atZMkHT9+XB07dtSLL76ouLg4rVmzRs8884wMw9Drr7+udu3aqUmTJjp+/LiOHz+uOnXq3FH9AABbXKr3AEsYGmzvEjJVdNBOe5eQqbWP17d3CZmq/8tae5cAZGrx4sVyd3dXSkqKrl69KgcHB40bN866vEiRInr99detz3v37q3ly5fr+++/V82aNa3tlSpVUlRUlCSpdOnSGjdunGJiYvTEE09o5cqV2rNnj5YvX66AgABJ0rBhw9S0aVPr+rNmzdKVK1f05Zdfys3NTZI0btw4tWzZUh9//LF8fX0lSQUKFNDYsWPl4OCgMmXKaPjw4bp06ZLefvttSdLAgQP10Ucfad26derQoYPpfl/XtGlTzZkzRxMmTFBgYKDGjRsni8WismXL6u+//9aAAQM0aNAgOTg4WPdx+PDh1vU/+OADValSRcOGDbO2TZs2TYGBgdq3b58SExOVkpKiZ555RsWKFZMkBQf//+97V1dXXb16VX5+frf+gQEAsoTgBADIFg0bNtTEiROVlJSkTz/9VHny5NGzzz5rXZ6amqphw4bp+++/17Fjx5ScnKyrV68qX758NuNUqlTJ5rm/v79OnTolSYqLi1NgYKA1NElS7dq1bfrHxcUpJCTEGpokqW7dukpLS9PevXutwalChQrW8CJJvr6+qlixovW5o6OjChYsaN222X5fd327cXFxql27tiwWi00diYmJ+uuvv1S0aFFJUrVq1WzG27Fjh1avXm0Txq6Lj4/Xk08+qcaNGys4OFhhYWF68skn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EwQnAAAAADBBcAIAAAAAEwQnAAAAADBBcAIAAAAAEwQnAAAAADBBcAIAAAAAEwQnAAAAADCRx94FAACAh1fdz+rau4QMDeNPJAA34YwTAAAAAJggOAEAAACACYITAAAAAJggOAEAAACACYITAAAAAJggOAEAAACACYITAAAAAJggOAEAAACACYITAAAAAJggOAEAAACACYITAAAAAJggOAEAAACACYITAAAAAJggOAEAAACACYITAAAAAJggOAEAAACACYITAAAAAJggOAEAAACACYITAAAAAJggOAEAAACACYITAAAAAJggOAEAAACACYITAAAAAJggOAEAAACACYITAAAAAJggOAEAAACACYITAAAAAJggOAEAAACACYITAAAAAJggOAEAAACACYITAAAAAJggOAEAAACACYITAAAAAJggOAEAAACACYITAAAAAJggOAEAAACACYITAAAAAJggOAEAAACACYITAAAAAJiwe3AaP368goKC5OLiolq1amnTpk237H/u3Dn16tVL/v7+cnZ21qOPPqqlS5feo2oBAAAAPIzy2HPjs2fPVv/+/TVp0iTVqlVLo0ePVlhYmPbu3avChQun65+cnKwnnnhChQsX1g8//KAiRYroyJEj8vb2vvfFAwAAAHho2DU4jRo1St27d1eXLl0kSZMmTdKSJUs0bdo0vfXWW+n6T5s2TWfPntVvv/2mvHnzSpKCgoLuZckAAAAAHkJ2u1QvOTlZW7duVWho6P8X4+Cg0NBQbdiwIcN1Fi1apNq1a6tXr17y9fVVxYoVNWzYMKWmpt6rsgEAAAA8hOx2xunMmTNKTU2Vr6+vTbuvr6/27NmT4ToHDx7UqlWr1KlTJy1dulQHDhxQz549de3aNUVFRWW4ztWrV3X16lXr8wsXLmTfTgAAAAB4KNh9coisSEtLU+HChTV58mRVq1ZN7du31zvvvKNJkyZluk50dLS8vLysj8DAwHtYMQAAAIAHgd2Ck4+PjxwdHXXy5Emb9pMnT8rPzy/Ddfz9/fXoo4/K0dHR2lauXDmdOHFCycnJGa4zcOBAnT9/3vo4evRo9u0EAAAAgIeC3YKTk5OTqlWrppiYGGtbWlqaYmJiVLt27QzXqVu3rg4cOKC0tDRr2759++Tv7y8nJ6cM13F2dpanp6fNAwAAAACywq6X6vXv319TpkzRzJkzFRcXp1deeUVJSUnWWfbCw8M1cOBAa/9XXnlFZ8+e1auvvqp9+/ZpyZIlGjZsmHr16mWvXQAAAADwELDrdOTt27fX6dOnNWjQIJ04cUKVK1fWsmXLrBNGJCQkyMHh/7NdYGCgli9frn79+qlSpUoqUqSIXn31VQ0YMMBeuwAAAADgIWDX4CRJkZGRioyMzHDZmjVr0rXVrl1bv//+ew5XBQAAAAD/776aVQ8AAAAA7IHgBAAAAAAmCE4AAAAAYILgBAAAAAAmCE4AAAAAYILgBAAAAAAmCE4AAAAAYILgBAAAAAAmCE4AAAAAYILgBAAAAAAmCE4AAAAAYILgBAAAAAAmCE4AAAAAYILgBAAAAAAmCE4AAAAAYILgBAAAAAAmCE4AAAAAYILgBAAAAAAmCE4AAAAAYILgBAAAAAAmCE4AAAAAYILgBAAAAAAmCE4AAAAAYCJLwckwDCUkJOjKlSs5VQ8AAAAA5DpZDk6lSpXS0aNHc6oeAAAAAMh1shScHBwcVLp0af3zzz85VQ8AAAAA5DpZvsfpo48+0htvvKFdu3blRD0AAAAAkOvkyeoK4eHhunTpkkJCQuTk5CRXV1eb5WfPns224gAAAAAgN8hycBo9enQOlAEAAAAAuVeWg1NERERO1AEAAAAAuVaWg5MkpaamasGCBYqLi5MkVahQQU899ZQcHR2ztTgAAAAAyA2yHJwOHDigZs2a6dixYypTpowkKTo6WoGBgVqyZIlKliyZ7UUCAAAAgD1leVa9Pn36qGTJkjp69Ki2bdumbdu2KSEhQcWLF1efPn1yokYAAAAAsKssn3Fau3atfv/9dxUoUMDaVrBgQX300UeqW7duthYHAAAAALlBls84OTs76+LFi+naExMT5eTklC1FAQAAAEBukuXg1KJFC7300kvauHGjDMOQYRj6/fff1aNHDz311FM5USMAAAAA2FWWg9PYsWNVsmRJ1a5dWy4uLnJxcVHdunVVqlQpjRkzJidqBAAAAAC7yvI9Tt7e3lq4cKH279+vPXv2SJLKlSunUqVKZXtxAAAAAJAb3NH3OElS6dKlVbp06eysBQAAAABypdsKTv3797/tAUeNGnXHxQAAAABAbnRbwWn79u23NZjFYrmrYgAAAAAgN7qt4LR69eqcrgMAAAAAcq0sz6oHAAAAAA+bO5ocYsuWLfr++++VkJCg5ORkm2Xz5s3LlsIAAAAAILfI8hmn7777TnXq1FFcXJzmz5+va9euaffu3Vq1apW8vLxyokYAAAAAsKssB6dhw4bp008/1Y8//ignJyeNGTNGe/bsUbt27VS0aNGcqBEAAAAA7CrLwSk+Pl7NmzeXJDk5OSkpKUkWi0X9+vXT5MmTs71AAAAAALC3LAen/Pnz6+LFi5KkIkWKaNeuXZKkc+fO6dKlS9lbHQAAAADkArcdnK4HpMcff1wrVqyQJLVt21avvvqqunfvro4dO6px48Y5UyUAAAAA2NFtz6pXqVIl1ahRQ61bt1bbtm0lSe+8847y5s2r3377Tc8++6zefffdHCsUAAAAAOzltoPT2rVrNX36dEVHR+vDDz/Us88+q27duumtt97KyfoAAAAAwO5u+1K9evXqadq0aTp+/Lg+++wzHT58WPXr19ejjz6qjz/+WCdOnMjJOgEAAADAbrI8OYSbm5u6dOmitWvXat++fWrbtq3Gjx+vokWL6qmnnsqJGgEAAADArrIcnG5UqlQpvf3223r33Xfl4eGhJUuWZFddAAAAAJBr3PY9Tjf75ZdfNG3aNM2dO1cODg5q166dunbtmp21AQAAAECukKXg9Pfff2vGjBmaMWOGDhw4oDp16mjs2LFq166d3NzccqpGAAAAALCr2w5OTZs21cqVK+Xj46Pw8HC9+OKLKlOmTE7WBgAAAAC5wm0Hp7x58+qHH35QixYt5OjomJM1AQAAAECuctvBadGiRTlZBwAAAADkWnc1qx4AAAAAPAwITgAAAABgguAEAAAAACYITgAAAABgguAEAAAAACYITgAAAABgguAEAAAAACYITgAAAABgguAEAAAAACYITgAAAABgguAEAAAAACYITgAAAABgguAEAAAAACYITgAAAABgguAEAAAAACYITgAAAABgguAEAAAAACYITgAAAABgguAEAAAAACYITgAAAABgguAEAAAAACYITgAAAABgguAEAAAAACZyRXAaP368goKC5OLiolq1amnTpk23td53330ni8Wi1q1b52yBAAAAAB5qdg9Os2fPVv/+/RUVFaVt27YpJCREYWFhOnXq1C3XO3z4sF5//XXVq1fvHlUKAAAA4GFl9+A0atQode/eXV26dFH58uU1adIk5cuXT9OmTct0ndTUVHXq1ElDhgxRiRIl7mG1AAAA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gIAAlSlTRpJ09OhRtWvXTt7e3ipQoIBatWqlw4cP24w5bdo0VahQQc7OzvL397f5vrobP6lMTk5WZGSk/P395eLiomLFiik6OjrDvpK0c+dONWrUSK6uripYsKBeeuklJSYmWpdfr/mTTz6Rv7+/ChYsqF69eunatWvZf+DwULr+fgkMDFTr1q0VGhqqFStWSJLS0tIUHR2t4sWLy9XVVSEhIfrhhx9s1t+9e7datGghT09PeXh4qF69etbf8Zs3b9YTTzwhHx8feXl5qX79+tq2bds930c83K6/xm98ODo6qmnTpvrggw9s/hYyYxiGBg8erKJFi8rZ2VkBAQHq06ePdfmt/paSpLVr16pmzZrWf0veeustmysiGjRooMjISPXt21c+Pj4KCwuTJO3atUtNmzaVu7u7fH199cILL+jMmTPZcHQeXgQn6Pvvv1fZsmVVpkwZPf/885o2bZquf73XkiVL9PTTT6tZs2bavn27YmJiVLNmTeu64eHh+vbbbzV27FjFxcXp888/l7u7e5a2f+DAAc2dO1fz5s2zXqOelJSk/v37a8uWLYqJiZGDg4Oefvppa+hJTExU/fr1dezYMS1atEg7duzQm2++qbS0NAUFBSk0NFTTp0+32c706dPVuXNnOTjwsoc5V1dX66d2MTEx2rt3r1asWKHFixfr2rVrCgsLk4eHh3799VetX79e7u7uatKkiXWdiRMnqlevXnrppZe0c+dOLVq0SKVKlcpwW2PHjtWiRYv0/fffa+/evfrmm28UFBSUYd+kpCSFhYUpf/782rx5s+bMmaOVK1em+xLx1atXKz4+XqtXr9bMmTM1Y8aMdB+KANlh165d+u233+Tk5CRJio6O1pdffqlJkyZp9+7d6tevn55//nmtXbtWknTs2DE9/vjjcnZ21qpVq7R161a9+OKL1j8EL168qIiICK1bt06///67SpcurWbNmunixYt220fgbsydO9d6Znb//v1asGCBgoODrctv9bfUsWPH1KxZM9WoUUM7duzQxIkTNXXqVH3wwQc225g5c6acnJy0fv16TZo0SefOnVOjRo1UpUoVbdmyRcuWLdPJkyfVrl27e7rvDxwDD706deoYo0ePNgzDMK5du2b4+PgYq1evNgzDMGrXrm106tQpw/X27t1rSDJWrFiR4fLp06cbXl5eNm3z5883bnzZ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O9pecnKyJMnPz88meAEAQHACAORaVatWVWBgoObNm2dtmzdvnooWLaoqVapY29LS0hQdHa3ixYvL1dVVISEh+uGHHyRJhw8fVsOGDSVJ+fPntzlT1aBBA0VGRqpv377y8fFRWFiYpPSX6v3111/q2LGjChQoIDc3N1WvXl0bN26UJMXHx6tVq1by9fWVu7u7atSooZUrV+bkYQEA2AHBCQCQq7344ouaPn269fm0adPUpUsXmz7R0dH68ssvNWnSJO3evVv9+vXT888/r7Vr1yowMFBz586VJO3du1fHjx/XmDFjrOvOnDlTTk5OWr9+vSZNmpRu+4mJiapfv76OHTumRYsWaceOHXrzzTeVlpZmXd6sWTPFxMRo+/btatKkiVq2bKmEhIScOBwAADvJY+8CAAC4leeff14DBw7UkSNHJP13H9N3332nNWvWSJKuXr2qYcOGaeXKlapdu7YkqUSJElq3bp0+//xz1a9fXwUKFJAkFS5cON1lfKVLl9bw4cMz3f6sWbN0+vRpbd682TpOqVKlrMtDQkIUEhJiff7+++9r/vz5WrRokSIjI+96/wEAuQPBCQCQqxUqVEjNmzfXjBkzZBiGmjdvLh8fH+vyAwcO6NKlS3riiSds1ktOTra5nC8z1apVu+Xy2NhYValSxRqabpaYmKjBgwdryZIlOn78uFJSUnT58mXOOAHAA4bgBADI9V588UXr2Zvx48fbLEtMTJQkLVmyREWKFLFZdjsTPLi5ud1yuaur6y2Xv/7661qxYoU++eQTlSpVSq6urmrTpo11ogkAwIOB4AQAyPWaNGmi5ORkWSwW6wQO15UvX17Ozs5KSEhQ/fr1M1zfyclJkpSamprlbVeqVElffPGFzp49m+FZp/Xr16tz5856+umnJf0X5A4fPpzl7QAAcjcmhwAA5HqOjo6Ki4vTn3/+KUdHR5tlHh4eev3119WvXz/NnDlT8fHx2rZtmz777DPNnDlTklSsWDFZLBYtXrxYp0+ftp6luh0dO3aUn5+fWrdurfXr1+vgwYOaO3euNmzYIOm/e6TmzZun2NhY7dixQ88995x14ggAwIOD4AQAuC94enrK09Mzw2Xvv/++3nvvPUVHR6tcuXJq0qSJlixZouLFi0uSihQpoiFDhuitt96Sr69vliZtcHJy0s8//6zChQurWbNmCg4O1kcffWQNcKNGjVL+/PlVp04dtWzZUmFhYapaterd7zAAIFexGIZh2LsIAAAAAMjNOOMEAAAAACYITgAAAABgguAEAAAAACYITgAAAABgguAEAAAAACYITgAAAABgguAEAAAAACYITgAAAABgguAEAAAAACYITgAAAABgguAEAAAAACYITgAAAABg4v8ADOAdUEvMfWwAAAAASUVORK5CYII=\n"
          },
          "metadata": {}
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "### Interpretación comparativa de los modelos\n",
        "\n",
        "Los cuatro modelos presentan un rendimiento bastante parecido en el conjunto de prueba. Todas las métricas se mueven en valores próximos, lo que indica que, para este problema y con este preprocesado, ninguno de los algoritmos ofrece una ventaja muy grande sobre los demás.\n",
        "\n",
        "#### Logistic Regression\n",
        "Es el modelo con mejores resultados globales en esta comparación:\n",
        "\n",
        "- **Accuracy = 0.8324**\n",
        "- **Precision = 0.8095**\n",
        "- **Recall = 0.7391**\n",
        "- **F1-score = 0.7727**\n",
        "\n",
        "Esto sugiere que la regresión logística ofrece el comportamiento más equilibrado entre precisión y recall, y además obtiene el mejor F1-score. Por tanto, puede considerarse una opción especialmente interesante si se busca un modelo sencillo, interpretable y con buen rendimiento general.\n",
        "\n",
        "#### Decision Tree\n",
        "El árbol de decisión ofrece resultados también competitivos:\n",
        "\n",
        "- **Accuracy = 0.8268**\n",
        "- **Precision = 0.7879**\n",
        "- **Recall = 0.7536**\n",
        "- **F1-score = 0.7704**\n",
        "\n",
        "Aunque sus métricas globales son ligeramente inferiores a las de la regresión logística, destaca por obtener el **mayor recall**, lo que significa que detecta algo mejor la clase positiva (`survived = 1`). A cambio, pierde algo de precisión.\n",
        "\n",
        "#### Random Forest\n",
        "El random forest no mejora al árbol de decisión en este caso:\n",
        "\n",
        "- **Accuracy = 0.8212**\n",
        "- **Precision = 0.8136**\n",
        "- **Recall = 0.6957**\n",
        "- **F1-score = 0.7500**\n",
        "\n",
        "Su **precision** es la más alta de los cuatro modelos, lo que significa que cuando predice supervivencia suele acertar con bastante frecuencia. Sin embargo, su **recall** es el más bajo, por lo que deja escapar más pasajeros supervivientes reales que los demás modelos. En conjunto, esto hace que su F1-score sea el menor de los cuatro.\n",
        "\n",
        "#### k-NN\n",
        "El modelo k-NN también presenta un rendimiento razonable:\n",
        "\n",
        "- **Accuracy = 0.8268**\n",
        "- **Precision = 0.7969**\n",
        "- **Recall = 0.7391**\n",
        "- **F1-score = 0.7669**\n",
        "\n",
        "Sus resultados quedan muy próximos a los de la regresión logística y el árbol de decisión, aunque ligeramente por debajo en F1-score.\n",
        "\n",
        "### Conclusión general\n",
        "\n",
        "Los resultados muestran que los modelos se comportan de forma bastante parecida. Aun así, pueden extraerse algunas conclusiones:\n",
        "\n",
        "- **Logistic Regression** parece la mejor opción global en esta práctica, ya que obtiene el mejor equilibrio entre métricas y además es un modelo fácil de interpretar.\n",
        "- **Decision Tree** puede ser interesante si se prioriza algo más el **recall**.\n",
        "- **Random Forest** ofrece la mejor **precision**, pero sacrifica recall.\n",
        "- **k-NN** se mantiene competitivo, aunque no supera claramente a la regresión logística.\n",
        "\n",
        "En conjunto, como las diferencias son pequeñas, la elección final también puede apoyarse en criterios como la **interpretabilidad**, la **simplicidad** del modelo o el tipo de error que interese más reducir."
      ],
      "metadata": {
        "id": "qxvBORzy9H_d"
      }
    }
  ]
}