Rango Finito

fotoscódigoobservatorioshermanocerdo temas plots

R

Un clasificador de Bayes falso

Lo que sigue es un pequeño complemento a Tres Modelos que estuve conversando con Santiago hoy: una forma de usar Bayes (asignar la clasificación de acuerdo a qué color tiene la mayor probabilidad en cada punto) aunque no se cuente con la distribución de densidad de las poblaciones que se estudian es asumir alguna distribución de densidad a priori basada en datos empíricos y proceder desde ahí. Hay una discusión filosófica al fondo de eso pero no importa la posición que se tenga el método sigue teniendo sentido. Sobre esto me gustaría escribir algo detallado. Probablemente le dedique otro texto largo pues es un criterio de selección de procedimientos clave en teoría de decisión estadística.

Lo que quiero hacer ahora es un poco distinto y probablemente bastante sucio: con los datos de entrenamiento a mano (¡y solo con ellos!) hay métodos que permiten calcular una función de densidad falsa que se conoce como kernel density estimate (KDE). Para calcular el KDE, además de los datos $x_1, x_2,\ldots,x_m\in\mathbb{R}^n$ se necesita un $h>0$ y una función $$K:\mathbb{R}^n\to \mathbb{R}$$ simétrica con respecto al origen pero no necesariamente positiva con la condición de que $$\int_{\mathbb{R}^n} K = 1.$$ El $K$ estándar es una multinormal centrada en cero y con la matriz identidad como covarianza.

Dados estos ingredientes, a el KDE es una función $f_{K,h}$ definida como sigue: $$f_{K,h}(x)=\frac{1}{mh}\sum_{i=1}^m K\left(\frac{x-x_i}{h}\right).$$

O sea una suerte de promedio local ponderado de las distancias del punto a los datos disponibles.

En el código que sigue tomo la muestra de entrenamiento y para cada color calculo un KDE con $K$ normal bivariada y $h$ elegido con un método estándar para estos menesteres que está descrito acá. Después grafico los KDE en tres dimensiones para ver las dos montañas:


# Primero extraigo las poblaciones de cada color:
blues <- training_sample[training_sample$color == "blue", 1:2]
oranges <- training_sample[training_sample$color == "orange", 1:2]

# Después calculo los KDE en 2D:
dblues <- kde2d(blues[,1], blues[,2], n=200, lims = c(-3, 3, -3, 3))
doranges <- kde2d(oranges[,1], oranges[,2], n=200, lims = c(-3, 3, -3, 3))

# Y finalmente lo grafico:
persp3D(x=doranges$x, y=doranges$y, z= doranges$z, shade=.5, col="orange", 
    alpha= .5, phi=20, box=F, contour=T, theta=-30)
persp3D(x=dblues$x, y=dblues$y, z= dblues$z, shade=.5, col="dodgerblue2", 
    alpha= .5, add=T, phi=20, contour=T,  theta=-30)

Densidades Falsas

Para comparar, aquí las densidades reales de las poblaciones:

Densidad Real

Ahora lo que se puede hacer, por jugar, es proponer una clasificación basada en estas densidades falsas y mirar cómo se diferencia de la clasificación de Bayes. Grafiquemos ambas fronteras, Bayes (rojo) y Bayes Falsa (verde), sobre la muestra de evaluación:


# Primero organizo los KDE en un dataframe:
density.df <- expand.grid(dblues$x, dblues$y)
density.df$blues <- as.vector(dblues$z)
density.df$oranges <- as.vector(doranges$z)

# Ahora defino el Bayes falso (1 es naranja y 0 es azul):
density.df$fake.bayes <- as.numeric(density.df$blues < density.df$oranges)

# Finalmente lo grafico:
grid$color <- apply(grid[,1:2], 1, bayes_classifier)
ggplot(grid, aes(X1, X2, z=color)) +  
    geom_point(aes(X1, X2, fill=as.factor(color)), 
        size=1, col="white", shape=21, alpha=0.5) + 
    geom_point(data=test_sample, aes(x=X1, y=X2, col=color)) +
    stat_contour(bins=1, color="red", size=2) +
    stat_contour(data=density.df, aes(x=Var1, y=Var2, z=fake.bayes), 
        color="forestgreen", bins=1, size=2) +
    scale_color_manual(guide="none", values=c("dodgerblue2", "orange")) +
    scale_fill_manual(guide="none", values=c("dodgerblue2", "orange")) +
    theme_bw() + xlab("x") + ylab("y")

bayes.vs.fake.bayes

Obviamente el Bayes falso es muchísimo más débil que Bayes: se deja manipular demasiado por la muestra de entrenamiento.

Ejercicio: calcular el error de este modelo de Bayes falso en la muestra de evaluación.

17

diferencias.resultados.participacion

Un problema de las denuncias de Uribe usando conteo de votos como un indicador de fraude es que no toma en cuenta que el total de participación también aumentó. Para hacer un análisis mínimamente serio sería importante considerar la diferencia de resultados como porcentajes del total de participación en cada vuelta. Esto daría una medida más justa del ascenso de los candidatos en los diferentes municipios. En esta gráfica calculo este valor para ambos candidatos y lo comparo con el cambio en la participación (como porcentaje del potencial electoral). Ambas nubes son relativamente similares salvo por ligeras diferencias regionales como un repunte de Santos en la costa caribe y el suroccidente y un repunte de Zuluaga en el nororiente. Otro punto clave es que Zuluaga perdió fuerza (diferencia de resultados negativa) en muchos más municipios que Santos). En todo caso, muy probablemente es posible encontrar ejemplos de saltos notables de votación para Zuluaga en Santander similares a los que Uribe denuncia para Santos en la costa como prueba de fraude (aunque en ese caso me imagino que la interpretación de Uribe será que el sentir popular motivó a los votantes independientes (“de opinión”) para apoyar al señor Zuluaga). En el gráfico de cajas a continuación presento las distribuciones de cambios de resultado para ambos candidatos para cada región. La pelea fue pareja pero entre Bogotá, sobre todo Bogotá, y la costa le dieron a Santos la victoria:

cajas.regiones.dif.resutados

En Foco Económico, Nicolás Idrobo y Pablo Querubín publicaron este análisis sobre los resultados de las elecciones utilizando algunos de los datos que recopilé. Vayan y lean.

14

Por estos días escribo en Mundo Pelota, un blog colectivo que Óscar organizó y montó para echar carreta sobre el mundial. Continuando con la tónica cuantitativa que llevo desde hace unos meses, he bajado datos de jugadores de WhoScored.com y pienso ir armando pequeños gráficos estáticos (y tal vez alguno interactivo) a medida que se acumula información con cada serie de partidos. Por lo pronto he escrito algo sobre el índice de masa corporal de los jugadores y algo sobre duelos aéreos y estatura. En el blog la categoría de estos ejercicios será Cuentas Alegres. Más adelante subiré los datos y código a este repositorio de GitHub.

7

Porque Alejo lo pidió: la diferencia con el líder etapa a etapa para el top 10 de la clasificación general del Giro d’Italia:

top10-cuadrado

28

En el anterior gráfico me dio la impresión de que la diferencia de abstenciones confundía más de lo que ayudaba así que aquí va uno en el que uso en su lugar la abstención para las presidenciales (en porcentaje sobre el potencial electoral a nivel municipal). Describen fenómenos ligeramente distintos pero relacionados. El efecto es similar:

Diferencia en resultados y abstención

Clic para agrandar. Agregué colores y tamaños a los municipios de acuerdo a su potencial electoral.

28

Otra gráfica sobre cómo la abstención afectó a Santos pero no a Zuluaga:

diferencias

La diferencia de abstenciones es la substracción de las abstenciones sobre el potencial electoral (a nivel municipal) para legislativas y presidenciales. La diferencia de resultados es la substracción de los resultados sobre el total de votos depositados (a nivel municipal) para legislativas y presidenciales. En las legislativas, usé los votos de La U y Cambio Radical sumados como votos de Santos y apenas los de Centro Democrático como votos de Zuluaga.

Es decir, en los lugares donde votó menos gente en comparación con las legislativas a Santos le mejoró la proporción de votos, pero en los lugares donde votó más o menos la misma o más gente Santos salió perjudicado. En cambio con Zuluaga parecería que la diferencia de abstención está desconectada de la diferencia de resultados entre las legislativas y las presidenciales. Una pregunta es qué pasa si en esos lugares donde a Santos le fue bien (por escasez de votantes) se reduce la abstención: hacia qué lado apuntarán esos votos.

Otra cosa notable es la cantidad de municipios donde Santos redujo su votación comparados con uno solo (Providencia) donde Zuluaga sacó menos votos (en porcentaje sobre el total de votos depositados) de los que acumuló Centro Democrático en las legislativas.

21

Hoy vi a Pascual Gaviria recopilando los resultados de las elecciones al Senado en ciudades colombianas para comparar cómo le había ido al partido de Uribe (Centro Democrático) en relación al partido de Santos (Partido de la U).

Dado un municipio, una forma de comparar las fuerzas relativas entre los dos partidos es calcular un índice del estilo $$ \frac{CD – LU}{CD + LU} $$ donde CD son los votos en el municipio para Centro Democrático y LU los votos para el Partido de la U. El rango de este índice va de -1 a 1. Cuando es -1 quiere decir que La U recibió votos y Centro Democrático no recibió ni uno. Cuando es 1 quiere decir que Centro Democrático recibió votos y La U no recibió ninguno. Cuando el índice es cero quiere decir que sacaron el mismo número de votos. Puntos intermedios representan diferentes proporciones a favor de uno u otro (negativos para La U y positivos para Centro Democrático).

Ad portas de la elección presidencial no viene mal revisar estos índices pues aunque la estructura de la elección es distinta las contiendas a nivel local son similares. Por ejemplo: un municipio donde los votos de Santos son más que el doble de los de Uribe (i.e., indice ≤-0.33) es uno donde es muy complicado que Uribe (o sea su títere, Zuluaga) se imponga. Al contrario, lo mas probable (al menos ingenuamente) es que Santos se fortalezca (por ejemplo sumando los votos que recibió Cambio Radical, el partido de su fórmula vicepresidencial (o los conservadores que se han declarado santistas)). Mejor dicho, este tipo de análisis podría servir para saber cuáles son los votos que realmente están en juego y cuales están más asegurados.

En este primer gráfico represento el número de municipios dado el índice. La barra dice: en este rango de índices hay tanto por ciento de municipios y en estos municipios ganaron tales partidos en esta proporción.

lu.vs.cd

Un problema obvio de este gráfico es que los municipios tienen diferente fuerza electoral dependiendo de su tamaño y al final lo que importa es cuántos votos se suman (no cuántos municipios se ganan). Así, tal vez el gráfico correcto debería representar en las barras el número de votos (en municipios con tal índice) y cómo esos votos se distribuían entre los distintos partidos. Ese es el que viene a continuación:

cd.v.lu.votos

Hay 5.601.216 votos a la derecha del cero y 5.324.366 a la izquierda. El aporte partido conservador parece decisivo. Santos debería estar preocupado.

La gran duda es cómo se moverán esos colores entre las barras el próximo domingo.

13

Está buena esta gráfica de Miguel Olaya comparando a los candidatos presidenciales de acuerdo a sus respuestas al cuestionario de Congreso Visible.

Una opción alternativa es considerar las respuestas de los candidatos como un vector numérico y medir distancias entre ellos. Remplacé los “SÍ” con 1 y los “NO” con 0. Para llenar las respuestas vacías de algunos candidatos puse 0.5 (porque pareciera que la falta de respuesta fue usada como punto medio entre las dos opciones – “ni SÍ ni NO”). Calculé la distancia euclídea tradicional. Aquí está el código en R. Este es el resultado (entre el número es más alto, más diferentes los vectores de respuestas):

Si ese número de verdad significa algo (altamente discutible), los candidatos más “distantes” son Zuluaga y Peñalosa y los más “cercanos” son Santos y Zuluaga. Por otro lado, eso también se ve en los gráficos de Olaya, que tienen un significado más claro.

Detalle curioso: de acuerdo a las distancias, Peñalosa y López son tan “cercanos” (o tan “distantes”) como Ramírez y Santos o Zuluaga y Ramírez. Peñalosa es el candidato más cercano a López (y viceversa). Zuluaga y Santos empatan en la competencia por ser los más cercanos a Ramírez (pero son todavía más cercanos entre ellos).

No sé cómo habrán diseñado el programa de apareamiento los de Congreso Visible. Probablemente lo hicieron también usando coincidencias en respuestas. Quién sabe cómo habrán tomado en cuenta la opción de declarar la importancia de cada pregunta. Es chévere la idea aunque tal vez habría valido la pena un cuestionario más extenso y amplio y menos coyuntural.

5

recommenderlab es un paquete de R con funciones pensadas para facilitar el diseño y evaluación de sistemas de recomendación. No he jugado mucho con él pero se siente flexible, útil y (relativamente) amplio. De pronto lo use en un proyecto en el que vengo trabajando desde enero. Aquí una introducción bastante buena no sólo al paquete sino a la teoría básica de esas herramientas. También he estado ojeando este libro durante la última semana.

1

Desplazamiento en Antioquia 2000-2006

Un intento de dibujar el desplazamiento forzado dentro del departamento de Antioquia desde 2000 hasta 2006 (clic para verlo más grande). En el diagrama de desplazamiento entre departamentos se ve claro que Antioquia produce un alto número de desplazados en ese período (13% del total nacional) pero al mismo tiempo acoge a la gran mayoría de ellos. En este grafo están todos los municipios de Antioquia. El tamaño del nombre del municipio es (más o menos) proporcional al total de flujo (entradas más salidas) del municipio. Entre más intenso el vínculo entre dos municipios, más flujo. Aunque hay flechas y las curvé un poco para sugerir dirección son difíciles de ver entre la maraña, así que como apoyo coloreé los nombres de los municipios: los de color naranja producen más desplazados de los que acogen; los de color azul acogen más de los que producen. Supongo que también podría hacerlo con un diagrama de cuerdas pero quería probar la visualización de migraciones con este tipo de grafos.

Los municipios que no registraron desplazados durante esos años son Entrerrios, Gómez Plata, Hispania, Olaya. Los que registran la razón entre salidas y llegadas más alto son Envigado (67 salidas por cada llegada), Itagüí (46), La Estrella (37), Rionegro (35), Medellín (8) y Bello (7.6).

En este repositorio dejé los datos de desplazamiento con los que he estado trabajando así como los scripts de R que he escrito para pasear por ellos.

11

Ayer había raspado de la página de la registraduría las votaciones para cada candidato al senado por departamento. Aquí están en una tabla de Google Docs. Quedé con la espinita y hoy por la tarde después de volver de la cafetería, mientras Laia hacía su siesta, raspé los datos y armé la tabla de votaciones para cada candidato al senado por municipio. Son 752 candidatos y 1185 municipios y Google Docs no permite subir tablas con más de doscientas y algo de columnas, así que dejo el CSV en este repositorio para quien quiera usarlo.

Para la raspada usé la librería XML de R. Una vez se superan las molestias estéticas con la sintaxis, R es una herramienta muy práctica y hasta agradable, especialmente cuando se trata de lidiar con datos sucios, descargarlos, limpiarlos y organizarlos. Para ciertas tareas más serias sigo prefiriendo Python (especialmente si conviene usar estructuras de datos), pero cuando necesito mirar una tabla y hacer tres cálculos y una gráfica rápida con ella R es mi arma de preferencia.

2

Laia en nieve

Inicialmente quería mirar si se podían detectar, dentro de la nube de políticos tuiteros colombianos, los cúmulos de clientes de empresas de compra de seguidores robot. Con paciencia me bajé el jueves las listas de seguidores de los ciento cuarenta y nueve candidatos al senado con cuenta en Twitter de acuerdo a la base de datos de La Silla Vacía. La idea ingenua era hacer un análisis de componentes principales con la matriz resultante pero las dimensiones de la matriz (149 x 700.000) eran demasiado grandes para poder hacerlo en un tiempo razonable con un computador casero. Por un rato me resigné a hacer sólo la representación del grafo de seguidos y seguidores, pero después recordé que hay reductores de dimensionalidad no-lineales que parten de calcular las distancias entre los puntos (una matriz pequeñita). Una vez procesados los puntos y apropiadamente bidimensionalizados en R armé el gráfico de puntos con D3 (estoy enamorado de D3) y le agregué los vértices del grafo al hacer clic sobre un candidato. El resultado es esto.

Sospecho que lo que el gráfico muestra más que nada (y muy superficialmente) las diferencias en estrategia de comunicaciones digital de los diferentes partidos y candidatos. Los que le meten plata a ser presencia en línea y los que no. Los que quieren ser atendidos y los que atienden. Los conservadores mucho más aglomerados que los liberales. Los verdes totalmente disgregados. El sancocho de “centro democrático”. Benedetti y José Obdulio Gaviria apareados por (conjetura) contratos con la misma empresa de seguidores robot. Igual Serpa y Galán. Tres bloques más o menos bien diferenciados de cuentas: arriba a la izquierda los “líderes de opinión”, abajo los políticos en ascenso y arriba a la derecha los que no le paran muchas bolas a internet pero alguien les dijo que había que estar ahí por si las moscas.

Es un juguete medio inútil pero me gusta cómo se ve. De pronto después intento más serio en esta misma línea. Sigo con ganas de hacer algo a fondo sobre seguidores robots en política colombiana. A ver cuándo puedo.

12

Los más educados es un pequeño documento interactivo en desarrollo, una herramienta, si se quiere, para pensar los resultados de las pruebas Saber 11 a nivel regional. Todavía no está terminado pero ya hay suficiente para jugar.

El viernes Jorge me escribió con la idea, era realmente sencilla: aparentemente no hay un documento oficial donde el Icfes discuta los resultados de los exámenes a nivel municipal. Y menos centrándose en los colegios públicos. Son dos restricciones fáciles de implementar. Después bastaba hacer algo de estadística descriptiva elemental para mirar los datos e intentar sacar preguntas de ahí. El propósito es que sea algo fácil de leer y usar. Más para la gente que para académicos. Ojalá que promueva una discusión pública del estado de la educación estatal que supere la fase de los “cien mejores colegios” y haga que los gobernantes y funcionarios regionales sean responsabilizados de los resultados de los colegios en su jurisdicción.

A veces pareciera que los colegios públicos no le importan a nadie. Como son públicos entonces pocos los consideran propios. La gente que decide cosas en Colombia por lo general estudió en colegios privados (para ilustrar, aquí hay una gráfica del número de estudiantes de último grado en colegios públicos y privados por “estrato” en 2011). En los círculos sociales de mis amigos nadie tiene hijos estudiando en colegios públicos. Es considerado medio impensable. Es crucial encontrar estrategias que superen las buenas intenciones para revalorar los colegios públicos y que recuperen el prestigio que alguna vez tuvieron (aquí hay una iniciativa seria y bien argumentada en esa dirección). El descuido social y gubernamental en el que se encuentra el sistema de colegios públicos lo ha convertido en un generador de exclusión social financiado con impuestos en lugar de ser el promotor de movilidad social que le corresponde. Un primer paso para devolverles su importancia es seguir atentamente su desempeño.

Es obvio que los resultados de los exámenes de estado no son un indicador contundente de lo que quiera que sea la “calidad de la educación”, pero pueden ser usados como un primer criterio a la mano para medir el impacto de políticas públicas. Lo ideal sería repetir este ejercicio regularmente y difundirlo tanto como se pueda.

El código en R para calcular los gráficos y tablas está disponible en este repositorio. Está desordenadísimo pero supongo que puede ayudar a alguien que quiera hacer gráficas similares. Si tengo tiempo intentaré pulirlo durante las próximas semanas, a medida que añado más información al documento.

28

[País] es...
Lo que sugiere Google cuando busco desde acá “[Nombre de País] es”. Es una copia de algo que vi hoy rondando en Twitter en inglés. Clic en el mapa para verlo grande. Código y datos para generar la vaina en este repositorio.

Adenda:

Europa

27

antioquia, cundinamarca y valle
Incidencia de pobreza (de acuerdo al índice de pobreza multidimensional (cálculos de 2005)) en Antioquia, Cundinamarca y Valle del Cauca. Código y datos para generar los mapas en este repositorio.