{ "nbformat": 4, "nbformat_minor": 0, "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.5.2" }, "colab": { "provenance": [], "toc_visible": true } }, "cells": [ { "cell_type": "markdown", "metadata": { "id": "b_wDj1a7VZqY" }, "source": [ "# Clase 3\n", "Aplicaremos métodos de clustering para tratar de analizar un conjunto de respuestas a una encuesta política, que consiste en 26 afirmaciones en que el encuestado responde con un puntaje de 1 a 5, donde 1 expresa desacuerdo con la afirmacion y 5 muy de acuerdo. Los datos fueron recabados en 2019 por parte de [a quien voto](https://github.com/johnblanco/predictor_electoral).\n", "\n", "-------\n", "La siguiente celda descarga el dataset desde EVA y lo descomprime.\n", "\n", "**Nota: solo corre en linux, si estan en otro sistema ooperativo, descarguen el archivo a mano y ponganlo en la carpeta donde tienen el notebook**." ] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "Nfeb15c3WHmS", "outputId": "e3807d54-142f-4d15-d6f5-8227fbdb8072" }, "source": [ "! wget -O data-a-quien-voto.zip https://eva.fing.edu.uy/pluginfile.php/255716/mod_folder/content/0/data-a-quien-voto.zip?forcedownload=1\n", "! unzip data-a-quien-voto.zip" ], "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "--2023-08-30 05:10:39-- https://eva.fing.edu.uy/pluginfile.php/255716/mod_folder/content/0/data-a-quien-voto.zip?forcedownload=1\n", "Resolving eva.fing.edu.uy (eva.fing.edu.uy)... 164.73.32.9\n", "Connecting to eva.fing.edu.uy (eva.fing.edu.uy)|164.73.32.9|:443... connected.\n", "HTTP request sent, awaiting response... 200 OK\n", "Length: 787823 (769K) [application/zip]\n", "Saving to: ‘data-a-quien-voto.zip’\n", "\n", "data-a-quien-voto.z 30%[=====> ] 231.98K 416KB/s ^C\n", "Archive: data-a-quien-voto.zip\n", " End-of-central-directory signature not found. Either this file is not\n", " a zipfile, or it constitutes one disk of a multi-part archive. In the\n", " latter case the central directory and zipfile comment will be found on\n", " the last disk(s) of this archive.\n", "unzip: cannot find zipfile directory in one of data-a-quien-voto.zip or\n", " data-a-quien-voto.zip.zip, and cannot find data-a-quien-voto.zip.ZIP, period.\n" ] } ] }, { "cell_type": "code", "metadata": { "id": "EuddhbT5VZqa" }, "source": [ "import os\n", "import pandas as pd\n", "import numpy as np\n", "import matplotlib.pyplot as plt" ], "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "IQVSTkxgVZqb" }, "source": [ "# Carga de datos\n", "Los datos vienen en un archivo CSV. Ya incluimos la carga del archivo y otros datos de referencia." ] }, { "cell_type": "code", "metadata": { "id": "Ujd01i5MVZqc" }, "source": [ "msj = \"\"\"No se encontró data.csv, asegurate haberlo descargado\n", "\"y descomprimirlo en la carpeta correcta\"\"\"\n", "assert os.path.isfile('data.csv'), msj\n", "\n", "# Importamos los datos utilizando pandas\n", "datos = pd.read_csv(\"data.csv\")\n", "\n", "# Creo la tabla de candidatos a mano\n", "candidatos = pd.DataFrame(\n", " [\n", " [1,'Oscar Andrade', 'Frente Amplio'],\n", " [2,'Mario Bergara', 'Frente Amplio'],\n", " [3,'Carolina Cosse', 'Frente Amplio'],\n", " [4,'Daniel Martínez', 'Frente Amplio'],\n", " [5,'Verónica Alonso', 'Partido Nacional'],\n", " [6,'Enrique Antía', 'Partido Nacional'],\n", " [8,'Carlos Iafigliola', 'Partido Nacional'],\n", " [9,'Luis Lacalle Pou', 'Partido Nacional'],\n", " [10,'Jorge Larrañaga', 'Partido Nacional'],\n", " [11,'Juan Sartori', 'Partido Nacional'],\n", " [12,'José Amorín', 'Partido Colorado'],\n", " [13,'Pedro Etchegaray', 'Partido Colorado'],\n", " [14,'Edgardo Martínez', 'Partido Colorado'],\n", " [15,'Héctor Rovira', 'Partido Colorado'],\n", " [16,'Julio María Sanguinetti', 'Partido Colorado'],\n", " [17,'Ernesto Talvi', 'Partido Colorado'],\n", " [18,'Pablo Mieres', 'La Alternativa'],\n", " [19,'Gonzalo Abella', 'Unidad Popular'],\n", " [20,'Edgardo Novick', 'Partido de la Gente'],\n", " [21,'César Vega', 'PERI'],\n", " [22,'Rafael Fernández', 'Partido de los Trabajadores'],\n", " [23,'Justin Graside', 'Partido Digital'],\n", " [24,'Gustavo Salle', 'Partido Verde'],\n", " [25,'Carlos Techera', 'Partido de Todos']\n", " ],\n", " columns=['candidatoId','name','party'],\n", ")\n", "\n", "datos=datos.merge(candidatos,on=['candidatoId'])\n", "\n", "# Sólo por si necesita, cargamos un diccionario con el texto de cada pregunta\n", "preguntas={\n", " '1': 'Controlar la inflación es más importante que controlar el desempleo. ',\n", " '2': 'Hay que reducir la cantidad de funcionarios públicos',\n", " '3': 'Deberia aumentar la carga de impuestos para los ricos.',\n", " '4': 'El gobierno no debe proteger la industria nacional, si las fábricas no son competitivas esta bien que desaparezcan.',\n", " '5': 'La ley de inclusión financiera es positiva para la sociedad. ',\n", " '6': 'Algunos sindicatos tienen demasiado poder. ',\n", " '7': 'Cuanto más libre es el mercado, más libre es la gente. ',\n", " '8': 'El campo es y debe ser el motor productivo de Uruguay. ',\n", " '9': 'La inversión extranjera es vital para que Uruguay alcance el desarrollo. ',\n", " '10': 'Los supermercados abusan del pueblo con sus precios excesivos. ',\n", " '11': 'Con la vigilancia gubernamental (escuchas telefonicas, e-mails y camaras de seguridad) el que no tiene nada que esconder, no tiene de que preocuparse. ',\n", " '12': 'La pena de muerte debería ser una opción para los crímenes mas serios. ',\n", " '13': 'Uruguay debería aprobar más leyes anti corrupción y ser más duro con los culpables. ',\n", " '14': 'Las FF.AA. deberían tener un rol activo en la seguridad pública. ',\n", " '15': 'Las carceles deberían ser administradas por organizaciones privadas. ',\n", " '16': 'Hay que aumentar el salario de los policias significativamente. ',\n", " '17': 'Para los delitos más graves hay que bajar la edad de imputabilidad a 16 años. ',\n", " '18': 'Uruguay no necesita un ejército. ',\n", " '19': 'Uruguay es demasiado generoso con los inmigrantes. ',\n", " '20': 'La ley trans fue un error. ',\n", " '21': 'El feminismo moderno no busca la igualdad sino el poder. ',\n", " '22': 'Para la ley no deberia diferenciarse homicidio de femicidio. ',\n", " '23': 'La separación de estado y religión me parece importante. ',\n", " '24': 'La legalización de la marihuana fue un error. ',\n", " '25': 'La legalización del aborto fue un error. ',\n", " '26': 'El foco del próximo gobierno debe ser mejorar la educación pública. '\n", "}\n", "\n", "# Ordeno los datos por partido y luego por candidato\n", "\n", "datos = datos.sort_values(by=['party','name'])" ], "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "t5pzhU19VZqc" }, "source": [ "Cada fila es la respuesta de una persona, contiene un id único, el candidato que eligió, las repuestas a las 26 preguntas y la fecha. Además le agregamos el nombre del candidato y el partido al que pertenece.\n", "\n", "Imprimimos algunos datos de prueba para asegurarnos de que quedaron bien cargados." ] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 322 }, "id": "nXtMLUWVVZqd", "outputId": "beafa3c9-ed9d-4ae1-dfaf-ec4f699757e7" }, "source": [ "datos.head()" ], "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ " id candidatoId 1 2 3 4 5 6 7 8 ... 20 21 22 23 24 25 \\\n", "21387 38 3 4 4 3 4 5 5 3 2 ... 1 1 1 5 1 1 \n", "21388 39 3 3 4 5 2 4 4 2 2 ... 1 1 2 5 1 1 \n", "21389 41 3 2 3 4 2 4 4 2 2 ... 1 2 2 5 1 1 \n", "21390 42 3 4 4 3 4 4 4 3 3 ... 3 3 2 5 2 2 \n", "21391 44 3 4 5 3 3 4 5 5 4 ... 2 4 4 5 2 1 \n", "\n", " 26 fecha name party \n", "21387 5 2019-02-06T16:52:06.318997 Carolina Cosse Frente Amplio \n", "21388 3 2019-02-06T17:00:09.220160 Carolina Cosse Frente Amplio \n", "21389 4 2019-02-06T17:14:33.621159 Carolina Cosse Frente Amplio \n", "21390 4 2019-02-06T17:44:43.482259 Carolina Cosse Frente Amplio \n", "21391 5 2019-02-06T18:30:28.400279 Carolina Cosse Frente Amplio \n", "\n", "[5 rows x 31 columns]" ], "text/html": [ "\n", "
\n", " | id | \n", "candidatoId | \n", "1 | \n", "2 | \n", "3 | \n", "4 | \n", "5 | \n", "6 | \n", "7 | \n", "8 | \n", "... | \n", "20 | \n", "21 | \n", "22 | \n", "23 | \n", "24 | \n", "25 | \n", "26 | \n", "fecha | \n", "name | \n", "party | \n", "
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
21387 | \n", "38 | \n", "3 | \n", "4 | \n", "4 | \n", "3 | \n", "4 | \n", "5 | \n", "5 | \n", "3 | \n", "2 | \n", "... | \n", "1 | \n", "1 | \n", "1 | \n", "5 | \n", "1 | \n", "1 | \n", "5 | \n", "2019-02-06T16:52:06.318997 | \n", "Carolina Cosse | \n", "Frente Amplio | \n", "
21388 | \n", "39 | \n", "3 | \n", "3 | \n", "4 | \n", "5 | \n", "2 | \n", "4 | \n", "4 | \n", "2 | \n", "2 | \n", "... | \n", "1 | \n", "1 | \n", "2 | \n", "5 | \n", "1 | \n", "1 | \n", "3 | \n", "2019-02-06T17:00:09.220160 | \n", "Carolina Cosse | \n", "Frente Amplio | \n", "
21389 | \n", "41 | \n", "3 | \n", "2 | \n", "3 | \n", "4 | \n", "2 | \n", "4 | \n", "4 | \n", "2 | \n", "2 | \n", "... | \n", "1 | \n", "2 | \n", "2 | \n", "5 | \n", "1 | \n", "1 | \n", "4 | \n", "2019-02-06T17:14:33.621159 | \n", "Carolina Cosse | \n", "Frente Amplio | \n", "
21390 | \n", "42 | \n", "3 | \n", "4 | \n", "4 | \n", "3 | \n", "4 | \n", "4 | \n", "4 | \n", "3 | \n", "3 | \n", "... | \n", "3 | \n", "3 | \n", "2 | \n", "5 | \n", "2 | \n", "2 | \n", "4 | \n", "2019-02-06T17:44:43.482259 | \n", "Carolina Cosse | \n", "Frente Amplio | \n", "
21391 | \n", "44 | \n", "3 | \n", "4 | \n", "5 | \n", "3 | \n", "3 | \n", "4 | \n", "5 | \n", "5 | \n", "4 | \n", "... | \n", "2 | \n", "4 | \n", "4 | \n", "5 | \n", "2 | \n", "1 | \n", "5 | \n", "2019-02-06T18:30:28.400279 | \n", "Carolina Cosse | \n", "Frente Amplio | \n", "
5 rows × 31 columns
\n", "