{ "nbformat": 4, "nbformat_minor": 0, "metadata": { "colab": { "name": "Mentiras.ipynb", "provenance": [] }, "kernelspec": { "name": "python3", "display_name": "Python 3" } }, "cells": [ { "cell_type": "markdown", "metadata": { "id": "--UzAeSoNrN5", "colab_type": "text" }, "source": [ "##Mentiras, malditas mentiras, y encuestas (*)\n" ] }, { "cell_type": "markdown", "metadata": { "id": "RQLDumHPNrN8", "colab_type": "text" }, "source": [ "####Guillermo Moncecchi (@gmonce)" ] }, { "cell_type": "markdown", "metadata": { "id": "eOKT9z8lNrOA", "colab_type": "text" }, "source": [ "Época de elecciones, época de encuestas. Y época de análisis de encuestas. Hace tiempo (mucho tiempo) que tengo la misma impresión: me parece que la mayoría de las afirmaciones que hacen los politólogos (y, mucho más, los medios) son, directamente erróneas, o al menos no se desprenden de los datos. Van dos encuestas en las que baja un punto y entonces: \"El Frente Amplio consolida su caída\". Pero, claro, mi afirmación es tan imprecisa como las originales. \n", "\n", "Aunque trabajo habitualmente con probabilidades, no soy ni de lejos un experto (siquiera un conocedor profundo) de los métodos estadísticos. Así que leí un poco, busqué otro poco... y finalmente encontré exactamente lo que quería: este artículo sobre cómo analizar resultados de encuestas, y cómo tener en cuenta el \"margen de error\" reportado. Si les interesa leerlo, se llama \"The 'Margin of Error' for Differences in Polls\", de Charles Franklin, y está disponible en https://abcnews.go.com/images/PollingUnit/MOEFranklin.pdf. \n", "\n", "Algunos comentarios, antes de empezar: \n", "\n", "- Una encuesta es una consulta a un grupo de gente, esperando que sea representativa del total de la población (en este caso, los votantes). \n", "- El número que se publica es la proporción de votantes que eligió a cada partido (por ejemplo: 0.32 para el Partido Nacional quiere decir que 32 de cada 100 encuestados tomó esa opción). \n", "- Aademás, se publica un \"margen de error\" (del tipo +/- x%) y un \"nivel de confianza\" (típicamente del 95%), que dice lo siguiente (leer atentamente, porque es larguito): si hacemos 100 encuestas como éstas, en 95 de ellas, el número va a estar entre el valor de la proporción más/menos el valor del margen de error. A esto se le llama usualmente _intervalo de confianza_. Por ejemplo, si el margen de error es +/- 3,2%, y el nivel de confianza es el 95%, el 0.32 se transforma en un rango entre 0.288 y 0.352 (expresado usualmente como [0.288,0.352]). \n", "- Si leemos nuevamente lo anterior, vemos que quiere decir, nada más ni nada menos, que una de cada 20 veces que haga esta encuesta me voy a equivocar y el número va a salirse del rango. _No quiere decir_ que haya un 95% de certeza (y por eso el término \"confianza\" no es muy adecuado) sobre los resultados.\n", "- Cuando un valor cae dentro del intervalo de confianza, decimos que es _estadísticamente significativo_, lo cual quiere decir que no es probable que haya sido por azar.\n", "\n", "O sea, a las encuestas hay que tomarlas con pinzas. No voy a repetirlo, pero cada vez que demos un valor o un intervalo, recuerden que 1 de cada 20 veces es normal errarle. Normal. \n", "\n", "Vamos a los datos para ver ejemplos: consideramos la encuesta Factum en el 2009 en diversas ediciones (elijo la misma encuesta para que las comparaciones sean válidas, porque uno supone que el método es el mismo):" ] }, { "cell_type": "code", "metadata": { "id": "7H8Q26H4NrOE", "colab_type": "code", "colab": {} }, "source": [ "# Datos\n", "# Consideramos los votos a setiembre de diferentes años, para ver cómo van cambiando\n", "votaciones_factum_2014={'votoFA':0.42,'votoPN':0.32,'votoPC':0.15,'votoPI':0.03,'votoIndefinidos':0.04,'votoOtros':0.02}\n", "votaciones_factum_julio_2014={'votoFA':0.42,'votoPN':0.30,'votoPC':0.14,'votoPI':0.03,'votoIndefinidos':0.04,'votoOtros':0.02}\n", "votaciones_factum_2013={'votoFA':0.43,'votoPN':0.23,'votoPC':0.16,'votoPI':0.02,'votoIndefinidos':0.08,'votoOtros':0.08}\n", "votaciones_factum_2010={'votoFA':0.49,'votoPN':0.22,'votoPC':0.13,'votoPI':0.00,'votoIndefinidos':0.00,'votoOtros':0.00}\n", "votaciones_factum_2009={'votoFA':0.46,'votoPN':0.34,'votoPC':0.10,'votoPI':0.02,'votoIndefinidos':0.06,'votoOtros':0.02}\n" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "gZ-qGNY_NrOP", "colab_type": "text" }, "source": [ "La biblioteca franklin.py (en Python) tiene la definición de las funciones que vamos a utilizar. Para los que les interese el código para jugar con sus propios números, están disponibles [aquí](https://github.com/gmonce/datascience/blob/master/src/franklin.py), pero quieren ser exactamente las fórmulas mencionadas en el paper. *Desafío para programadores con más habilidades (y tiempo) que yo: hacer una página web que haga estas cuentas para cualquier par de valores en las encuestas*" ] }, { "cell_type": "code", "metadata": { "id": "PU7z34sTNrOR", "colab_type": "code", "colab": {} }, "source": [ "#!wget franklin.py https://raw.githubusercontent.com/gmonce/datascience/master/src/franklin.py\n", "from franklin import *" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "Aq4T-hgHNrOa", "colab_type": "text" }, "source": [ "Empecemos por ver los diferentes intervalos de confianza para cada partido, según la última encuesta (Setiembre de 2014):" ] }, { "cell_type": "code", "metadata": { "id": "06W6CbR_NrOc", "colab_type": "code", "outputId": "e1b06b63-8c90-44a4-d8b4-baf09249029a", "colab": { "base_uri": "https://localhost:8080/", "height": 121 } }, "source": [ "# Veamos los intervalos de confianza para los votos al día de hoy\n", "for (key,value) in votaciones_factum_2014.items():\n", " print (key,votaciones_factum_2014[key],ci(votaciones_factum_2014[key]))" ], "execution_count": 60, "outputs": [ { "output_type": "stream", "text": [ "votoFA 0.42 (0.389, 0.451)\n", "votoPN 0.32 (0.291, 0.349)\n", "votoPC 0.15 (0.128, 0.172)\n", "votoPI 0.03 (0.019, 0.041)\n", "votoIndefinidos 0.04 (0.028, 0.052)\n", "votoOtros 0.02 (0.011, 0.029)\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "pd4tQfVCNrOj", "colab_type": "text" }, "source": [ "Por ejemplo, el Frente Amplio está entre 0.389 y 0.451. El Partido Colorado está entre 0.128 y 0.17. Pero hay que tener en cuenta que estos rangos aplican a la proporción calculada, es decir al valor obtenido por cada partido en particular. No puede usarse ese rango para comparar valores (por cuestiones de varianza, errores estándar y esas cosas de estadísticos). Para eso, hay que hacer algunas cuentas (que están descritas en el paper, y programadas más arriba). Veamos algunos ejemplos: " ] }, { "cell_type": "markdown", "metadata": { "id": "MmEfknYHNrOk", "colab_type": "text" }, "source": [ "*Pregunta 1: ¿Es estadísticamente significativa la diferencia entre el FA y el PN?* Esta pregunta puede traducirse como \"¿podemos afirmar con confianza que el FA tiene más votos que el PN? (siempre dentro del 95% mencionado, que dije que no iba a mencionar de nuevo, pero no puedo evitarlo...). Calculemos el intervalo para la diferencia entre ambos votos. Si el rango no incluye al 0, entonces la diferencia es significativa:" ] }, { "cell_type": "code", "metadata": { "id": "uKTB7GGKNrOm", "colab_type": "code", "outputId": "29cafd14-fea9-40e7-c67e-caf0ff800e64", "colab": { "base_uri": "https://localhost:8080/", "height": 69 } }, "source": [ "cidif=ci_dif(votaciones_factum_2014['votoFA'],votaciones_factum_2014['votoPN'])" ], "execution_count": 61, "outputs": [ { "output_type": "stream", "text": [ "0.42 0.32 Diferencia: 0.09999999999999998\n", "Intervalo: (0.046, 0.154)\n", "La diferencia es significativa\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "Ctp41Gj0NrOt", "colab_type": "text" }, "source": [ "Es. Estamos bastante seguros de que (según las encuestas), va ganando el FA. _Pregunta 2: ¿Es significativa la diferencia entre el FA y los partidos tradicionales sumados?_" ] }, { "cell_type": "code", "metadata": { "id": "VpNUPaLuNrOu", "colab_type": "code", "outputId": "1399ed9f-2504-4e68-f501-bac697aa8f70", "colab": { "base_uri": "https://localhost:8080/", "height": 69 } }, "source": [ "cidif=ci_dif(votaciones_factum_2014['votoFA'],votaciones_factum_2014['votoPN']+votaciones_factum_2014['votoPC'])" ], "execution_count": 62, "outputs": [ { "output_type": "stream", "text": [ "0.42 0.47 Diferencia: -0.04999999999999999\n", "Intervalo: (-0.109, 0.009)\n", "La diferencia no es significativa\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "WWJI6KyNNrO2", "colab_type": "text" }, "source": [ "Primera observación: si blancos y colorados suman sus votos, _no sabemos qué pasa_. Atención cuando digo que no sabemos qué pasa, no estoy hablando de indecisos. Estoy diciendo que con la cantidad de gente que encuestamos, los modelos estadísticos en las que nos basamos nos dicen que no alcanza para hacer la afirmación, al menos para no errarle en más de 1 en 20 veces.\n", "\n", "También podemos comparar resultados entre diferentes encuestas, para ver si hubo cambios. Con _otra_ fórmula. _Pregunta 3:¿Mejoró el Partido Nacional del 2010 hasta ahora?_ " ] }, { "cell_type": "code", "metadata": { "id": "GGriVsM1NrO5", "colab_type": "code", "outputId": "295ca93d-21b4-45af-8785-ee7a1be7bbce", "colab": { "base_uri": "https://localhost:8080/", "height": 69 } }, "source": [ "cidif=ci_dif_between(votaciones_factum_2010['votoPN'],votaciones_factum_2014['votoPN'])" ], "execution_count": 63, "outputs": [ { "output_type": "stream", "text": [ "0.22 0.32 Diferencia -0.1\n", "Intervalo: (0.061, 0.139)\n", "La diferencia es significativa\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "yKbt7869NrO_", "colab_type": "text" }, "source": [ "Sí, mejoró. ¿Y el Partido Colorado?" ] }, { "cell_type": "code", "metadata": { "id": "7mgGjD8zNrPB", "colab_type": "code", "outputId": "1e426d75-71a0-401d-c1ea-4d8d5a9d9d05", "colab": { "base_uri": "https://localhost:8080/", "height": 69 } }, "source": [ "cidif=ci_dif_between(votaciones_factum_2010['votoPC'],votaciones_factum_2014['votoPC'])\n" ], "execution_count": 64, "outputs": [ { "output_type": "stream", "text": [ "0.13 0.15 Diferencia -0.01999999999999999\n", "Intervalo: (-0.011, 0.051)\n", "La diferencia no es significativa\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "4ZPawqLJNrPG", "colab_type": "text" }, "source": [ "No, ¿y el FA?" ] }, { "cell_type": "code", "metadata": { "id": "i0QUen0JNrPI", "colab_type": "code", "outputId": "4a7d13d7-68da-468c-c4a0-1071b8dff6da", "colab": { "base_uri": "https://localhost:8080/", "height": 69 } }, "source": [ "cidif=ci_dif_between(votaciones_factum_2010['votoFA'],votaciones_factum_2014['votoFA'])" ], "execution_count": 65, "outputs": [ { "output_type": "stream", "text": [ "0.49 0.42 Diferencia 0.07\n", "Intervalo: (-0.114, -0.026)\n", "La diferencia es significativa\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "8q_j71tyNrPP", "colab_type": "text" }, "source": [ "El FA está hoy peor que luego de ganar las elecciones. Pero tal vez sería mejor comparar con el 2009 (es decir, _antes_ de las elecciones, en la misma época en la que estamos ahora). De hecho, podemos comparar a todos los partidos. " ] }, { "cell_type": "code", "metadata": { "id": "iRK7rbSINrPR", "colab_type": "code", "outputId": "45ea2694-7fd3-4c71-afc3-55747e716997", "colab": { "base_uri": "https://localhost:8080/", "height": 295 } }, "source": [ "for partido in ['votoFA','votoPN','votoPC','votoPI']:\n", " print (partido)\n", " cidif=ci_dif_between(votaciones_factum_2009[partido],votaciones_factum_2014[partido])\n" ], "execution_count": 66, "outputs": [ { "output_type": "stream", "text": [ "votoFA\n", "0.46 0.42 Diferencia 0.040000000000000036\n", "Intervalo: (-0.084, 0.004)\n", "La diferencia no es significativa\n", "votoPN\n", "0.34 0.32 Diferencia 0.020000000000000018\n", "Intervalo: (-0.062, 0.022)\n", "La diferencia no es significativa\n", "votoPC\n", "0.1 0.15 Diferencia -0.04999999999999999\n", "Intervalo: (0.021, 0.079)\n", "La diferencia es significativa\n", "votoPI\n", "0.02 0.03 Diferencia -0.009999999999999998\n", "Intervalo: (-0.004, 0.024)\n", "La diferencia no es significativa\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "7WRZrFokNrPX", "colab_type": "text" }, "source": [ "Lo único que podríamos afirmar con \"certeza estadística\" es que el Partido Colorado está mejor que en las elecciones pasadas. Después, todo más o menos igual" ] }, { "cell_type": "markdown", "metadata": { "id": "reh_1HCNNrPZ", "colab_type": "text" }, "source": [ "En los diarios uruguayos se hacen afirmaciones sobre las encuestas que parecen omitir el margen de error. Si un partido bajó un punto, \"su imagen se ha deteriorado\". Si sube dos, \"muestra un repunte\". La mayoría de esas afirmaciones son estadísticamente _muy_ arriesgadas. Veamos un ejemplo: " ] }, { "cell_type": "markdown", "metadata": { "id": "-Tv18OmFNrPZ", "colab_type": "text" }, "source": [ "_Blancos y Colorados sumados siguen aventajando al Frente Amplio_ El País 8/9/2014. http://www.elpais.com.uy/informacion/encuesta-factum-intencion-voto-septiembre.html" ] }, { "cell_type": "code", "metadata": { "id": "dUBk_ebkNrPc", "colab_type": "code", "outputId": "c51d946b-43c2-478d-c24b-278d2604779b", "colab": { "base_uri": "https://localhost:8080/", "height": 69 } }, "source": [ "cidif=ci_dif(votaciones_factum_2014['votoFA'],votaciones_factum_2014['votoPN']+votaciones_factum_2014['votoPC'])" ], "execution_count": 67, "outputs": [ { "output_type": "stream", "text": [ "0.42 0.47 Diferencia: -0.04999999999999999\n", "Intervalo: (-0.109, 0.009)\n", "La diferencia no es significativa\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "mhUil_j-NrPg", "colab_type": "text" }, "source": [ "Como dijimos antes, los números son demasiado parecidos como para afirmar que este valor no es casualidad. En la misma nota: _\"el Frente Amplio detuvo la caída\"_" ] }, { "cell_type": "code", "metadata": { "id": "Q1WESAVeNrPh", "colab_type": "code", "outputId": "ad70caa4-6e37-4f06-bc0d-afdf95e7303a", "colab": { "base_uri": "https://localhost:8080/", "height": 69 } }, "source": [ "cidif=ci_dif_between(votaciones_factum_julio_2014['votoFA'],votaciones_factum_2014['votoFA'])" ], "execution_count": 68, "outputs": [ { "output_type": "stream", "text": [ "0.42 0.42 Diferencia 0.0\n", "Intervalo: (-0.044, 0.044)\n", "La diferencia no es significativa\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "LOgDE9X3NrPn", "colab_type": "text" }, "source": [ "No sabemos. De hecho no sabemos si efectivamente venía cayendo, porque la diferencia entre los números es siempre muy pequeña. En la misma nota: _\"El partido Nacional sigue creciendo\"_" ] }, { "cell_type": "code", "metadata": { "id": "FS32zhDnNrPp", "colab_type": "code", "outputId": "fa86debd-bbca-468b-eb59-4008adb8f129", "colab": { "base_uri": "https://localhost:8080/", "height": 69 } }, "source": [ "cidif=ci_dif_between(votaciones_factum_julio_2014['votoPN'],votaciones_factum_2014['votoPN'])" ], "execution_count": 69, "outputs": [ { "output_type": "stream", "text": [ "0.3 0.32 Diferencia -0.020000000000000018\n", "Intervalo: (-0.021, 0.061)\n", "La diferencia no es significativa\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "ImLs4-5fNrPv", "colab_type": "text" }, "source": [ "Tampoco.\n", "\n", "Estimado lector: la próxima vez que veas afirmaciones (especialmente sobre diferencias), desconfía. Lo más probable es que, salvo que la diferencia sea muy grande, el margen de error producido por encuestar a 900 personas sea tan grande que haga que las afirmaciones no sean estadísticamente adecuadas. Muchas veces, terminan explicando el ruido estadístico. Y eso es malo, porque disfraza de ciencia lo que son especulaciones (es válido especular; lo que no es valido es disfrazarlo de ciencia). \n", "\n" ] }, { "cell_type": "markdown", "metadata": { "id": "_V98Rx_9NrPx", "colab_type": "text" }, "source": [ "_El código presentado en este notebook es tomado del artículo mencionado, si detectan algún error por favor me avisan a @gmonce en Twitter._" ] }, { "cell_type": "markdown", "metadata": { "id": "rpBHCaFXNrPy", "colab_type": "text" }, "source": [ "(*) Esto no es un juicio de valor, solamente un juego de palabras. http://en.wikipedia.org/wiki/Lies,_damned_lies,_and_statistics" ] } ] }