No, la CUP no amañó la votación

La CUP votó ayer si investían a Mas como presidente o no. Votaron 3030 personas, de las cuales, 1515 votaron a favor y 1515 en contra. Vaya, hay que repetir la votación tendrá que decidir el Consejo Político de la formación… Fin de la historia. ¿O no? Pues resultó que no. Alguien (un matemático, para más señas), publicó lo siguiente en Twitter:

Y la gente comenzó a hacer cábalas y a hablar de conspiraciones judeomasónicas. También hubo quien intentó, con más acierto*, poner orden y decir que no, que la probabilidad no es esa, que debe calcularse como resultado de una distribución binomial y, por tanto, la probabilidad 50/50 es la más alta de todos los resultados posibles. Y esta misma mañana, ya estaba la prensa a la carga con su equidistancia de los cojones. «Pero tampoco en matemáticas hay nada exacto […] Sea cuál sea la solución correcta […]» (sic), decían. A la mierda, La Vanguardia, a la mierda.

Pero en último término, a la mierda todos. Esto no es cuestión de probabilidad: la gente no vota a lo loco (aunque en ocasiones lo parezca), no vota lanzando una moneda al aire. Por tanto, recurrir a la probabilidad del hecho es una gilipollez per se. Punto. Igual que utilizar la probabilidad como prueba en un juicio (que se ha hecho): falaz e inútil. «Me ha caído una teja en la cabeza: ¡qué probabilidad había? Eso es que me la han tirado». Eso es mierda, argumentación estúpida: ya ha sucedido; me es indiferente cuál fuese la probabilidad.

Por no hablar de que estaríamos hablando del amaño más absurdo de la historia: amañar una votación para empatar y posponer la decisión. Con dos cojones.

*De nuevo, con más acierto si tomamos la premisa implícita en el tweet original de que la probabilidad de votar a favor o en contra es 50/50 para cada votante, una premisa que no se sostiene por ningún lado. Si hubiese salido 3020 a favor y 10 en contra, ¿lo consideraríamos un resultado improbable? Es absurdo. Es absurdo todo.

El agujero de la construcción (2)

He ampliado el dataset de la entrada anterior para identificar personas físicas y jurídicas y recoger códigos de actividad (CNAE) y objeto social de las empresas. El análisis se puede seguir aquí. El principal resultado es el histograma por código CNAE o, dicho de otra forma, cómo se distribuyen las empresas deudoras por actividad económica:

hist

¿Qué representa ese pico entre 4000 y 4500? Bien, no hay sorpresas aquí: resulta que ese rango de códigos está destinado al sectorde la construcción. A partir de ahí, he refinado el primer análisis con 144 empresas más reconocidas gracias a dicho código. Como resultado, ahora el número de empresas de la construcción supera el 50 % y la deuda que acumulan prácticamente llega al 60 %.

bars

boxplot

El agujero de la construcción

He abierto un repositorio de GitHub con un análisis muy tonto con R sobre la lista de grandes morosos recientemente publicada por la Agencia Tributaria. Si alguien quiere colaborar, está más que invitado. El análisis puede leerse aquí de momento, hasta que haga algo más potable con todo esto (¿github.io?, ¿más ideas?, ¿algo que sea embebible aquí?) definitivamente, y si todo va bien, debería poder leerse aquí debajo:

La regularidad del caos

(Esta anotación se publica simultáneamente en Naukas)

Supongamos que queremos diseñar un experimento para medir la aceleración de la gravedad. Disponemos de unas herramientas matemáticas —las ecuaciones del movimiento— que describen cómo se mueve un cuerpo en función de diversos parámetros, entre ellos, la aceleración a la que está sometido. Disponemos también de unas herramientas experimentales para diseñar el dispositivo de experimentación y medida, cuyo propósito será tomar datos con los que alimentar nuestras ecuaciones y obtener la incógnita buscada.

Muy probablemente, dicho experimento consistirá en dejar caer uno o varios objetos desde diversas alturas tabuladas y medir los tiempos de caída. Estaremos de acuerdo en que, dada una altura, un objeto tardará en caer cierto tiempo, siempre el mismo. No obstante, creo que nadie se sorprenderá a estas alturas si digo que generalmente no hay dos medidas que salgan iguales. La razón es que en la vida real tenemos que lidiar con el error. En la realidad, nada dura cinco segundos, sino cinco más/menos algo que hay que cuantificar. La realidad es caótica y el control de las condiciones experimentales para reducir y al mismo tiempo cuantificar ese algo, ese error, es una de las tareas más arduas que existen. Cualquiera que haya pisado un laboratorio lo entenderá, máxime si trabaja con cosas muy pequeñas o cosas vivas.

Pero volvamos a nuestro experimento. Tenemos que tener claro desde el principio que toda medida que realicemos va a tener un error asociado que categorizamos en dos tipos: error sistemático y error aleatorio. El error sistemático determina lo que denominamos exactitud, ya que afecta a todas las medidas de la misma forma. En nuestro ejemplo, podría haber diversas fuentes de error sistemático como, por ejemplo, errores de calibración en los instrumentos de medida que hicieran que midamos siempre alturas más cortas o más largas, o tiempos más cortos o más largos. Idealmente, un análisis pormenorizado dará con todas las fuentes de error sistemático y las eliminará, pero, en último término, tiene la ventaja de que se puede identificar y medir a posteriori para eliminarlo de un plumazo de todos los datos ya recogidos. Por ejemplo, nos damos cuenta de que el cronómetro estaba tardando un segundo en pararse desde que le dábamos al botón; entonces, basta con restar un segundo a todas las medidas.

El error aleatorio, por su parte, afecta a la precisión y, en principio, parece mucho más escurridizo. Tiene que ver con desviaciones aleatorias que se producen alrededor de cierto valor que es el que queremos determinar, ese tiempo ideal que nuestra teoría muestra que tarda cualquier objeto en caer desde tantos metros de altura. Por ejemplo, más o menos se ve que el objeto cae en cinco segundos desde cierta altura, pero a veces medimos cinco y un poquito y otras, cinco menos un poquito. La solución que se suele adoptar es realizar muchas medidas en una misma configuración (misma altura, mismo objeto) y hacer la media de todas. Pero ¿por qué la media? ¿Es esto correcto?

Bien. A primera vista, nada nos garantiza que la distribución de las desviaciones alrededor de ese valor real sea simétrica. Nada impide que cierta fuente de error aleatorio tenga esta pinta:

gamma

La línea vertical representa el valor real que queremos obtener. La montaña representa la distribución de las desviaciones debidas a ese hipotética fuente de error. Abajo, hay 20 puntos grises correspondientes a 20 medidas diferentes en una misma configuración experimental. En rojo, la media de esas medidas con su error asociado. ¡Vaya! ¡Fallamos! ¿Qué estamos haciendo mal?

En la realidad, suceden dos cosas que nos vienen muy bien. Por un lado, no es común encontrar una fuente de error aleatorio que se comporte de forma asimétrica —aunque haberlas, las habrá—. Por otro lado, nunca hay una única fuente de error aleatorio, y esto es importante: el error aleatorio estará compuesto por múltiples fuentes (y de muchas no seremos ni conscientes). Y ahora, nos da igual cómo sea cada fuente de error; incluso nos da igual que haya fuentes asimétricas… Las matemáticas vienen a socorrernos en forma de lo que se denomina Teorema Central del Límite (TCL). Dicho teorema demuestra que, dadas las condiciones que estamos describiendo (múltiples fuentes de error independientes), la distribución del error aleatorio total sigue una distribución normal —una campana de Gauss de toda la vida—. ¿Y cuál es el parámetro por excelencia de dicha distribución? Exacto: la media. Veamos:

gaussiana

Otras 20 medidas bajo este nuevo supuesto y nuestra media lo clava (dentro del error, coletilla imprescindible).

Existe una frase célebre de Gabriel Lippman en una discusión con J. H. Poincaré acerca del TCL que reza así, no sin falta de sorna:

Los experimentalistas piensan que es una verdad matemática mientras los matemáticos creen que es un hecho experimental.

Ahora sabemos que es la combinación de ambos: se trata de una verdad matemática construida sobre unas condiciones que se dan de hecho en la experimentación. Sir Francis Galton, ya en 1889, le dedicó las siguientes palabras:

Conozco pocas cosas tan propensas a golpear la imaginación como esta maravillosa forma de orden cósmico expresada por [el Teorema Central del Límite]. Esta ley habría sido personificada por los griegos y deificada si la hubieran conocido. Reina con serenidad y completa humildad en medio de la más salvaje confusión. Cuanto más grande es el desorden, la aparente anarquía, más perfecto es su influjo. Es la ley suprema de la Sinrazón. Cada vez que una gran muestra de elementos caóticos es examinada y alineada en su orden de magnitud, una insospechada y bellísima forma de regularidad demuestra haber estado siempre ahí, latente.

simmer: un simulador de eventos discretos para R

R es un maravilloso lenguaje de programación principalmente enfocado a la estadística y la representación de datos que utilizo en mi día a día, tanto en mis labores de investigación como de docencia, aunque no me prodigo mucho al respecto por aquí. Al mismo tiempo, la simulación por eventos discretos, una de las técnicas por excelencia en mi campo (y otros, y a la cual dedico mis horas de docencia), no tenía hasta ahora representación en el universo R. Y digo hasta ahora porque, gracias al esfuerzo de Bart Smeets y el mío propio, el CRAN (Comprehensive R Archive Network, el repositorio oficial de paquetes de R) ya cuenta con simmer, un simulador de eventos discretos para R.

El paquete simmer es un proyecto creado originalmente por Bart al que yo me he unido como colaborador y ahora también mantenedor del paquete. Si alguien está interesado, lo puede instalar directamente desde CRAN con el instalador de paquetes de R o aquí tiene el repositorio de GitHub con las últimas novedades. Sugerencias y reportes de bugs, también en GitHub.

Aquí un pequeño ejemplo de funcionamiento (una introducción de uso más extensa puede encontrarse aquí):

[code language=»r»]
library(simmer)

coffees <- list(
espresso =function() runif(1, min=5, max=10),
macchiato=function() runif(1, min=6, max=12),
americano=function() runif(1, min=3, max=8)
)
coffee_prep_duration <- function()
sample(coffees, 1)[[1]]()

coffee_trajectory <- create_trajectory("I want coffee!") %>%
seize("barista", 1) %>%
timeout(coffee_prep_duration) %>%
release("barista", 1)

env <- simmer("coffee shop") %>%
add_resource("barista", 2) %>%
add_generator("caffeine addict",
coffee_trajectory,
function() abs(rnorm(1, 5, 2))) %>%
run(until=480)

plot_evolution_arrival_times(env, type = "flow_time")
[/code]

simmer