Una de las cosas que me irritan de R

R (y su comunidad) es en ocasiones irritante. Os cuento por qué. El otro día quise pintar un grafo sobre un mapa. No quería usar ninguno de los layouts al uso porque cada nodo estaba georeferenciado. Me interesaba, además, pintar el grafo sobre una capa (de Google Maps u OSM) para contextualizarlo (¿conterrenizarlo?) mejor. No es demasiado complicado escribir una función que haga lo anterior. Pero es razonable pensar que alguien pudiera haberlo hecho antes. Et voilá. Después de mucho buscar, di con las funciones geom_edgeset y geom_nodeset del paquete popgraph que resolvían el problema. ...

8 de junio de 2015 · Carlos J. Gil Bellosta

Herramientas (y consejos) para avanzar en tu carrera

Escribo hoy para invitar a leer esto, una entrada en otra bitácora que recoge y resume ideas que ya han aparecido en la mía, como por ejemplo: Usa herramientas para las que no tengas que pedir permiso (típicamente, abiertas) Considera el tiempo que pases trabajando en una empresa grande aprendizaje subsidiado Especialízate un conjunto de cosas que sepas hacer mejor que la mayoría Aprende a plantear preguntas Aprende (cuando menos) un lenguaje de programación Y algunas otras.

5 de junio de 2015 · Carlos J. Gil Bellosta

El lenguaje de los gráficos en las Jornadas de Periodismo de Datos

Este sábado (2015-06-06), dentro de las Jornadas de Periodismo de Datos, hablaré sobre el lenguaje de los gráficos (véase el programa). Para variar, nada de R y, aunque parezca lo contrario, nada de ggplot2. Ni tan siquiera respuestas a nada: solo preguntas que cada cual tendrá, si le place, que contestar. Y si se me hace caso, a la luz de la literatura relevante. ¿Por qué una cuestión tan abstracta? Porque sobran herramientas y recetarios sobre cómo hacer esto y aquello. Pero falta teoría. No seré yo quien pretenda enseñarla: ni siquiera la domino. Solo que soy consciente de que existe y mucha otra gente no. ...

4 de junio de 2015 · Carlos J. Gil Bellosta

Charla de José A. Guerrero

El 9 de julio de 2015, José A. Guerrero dará una charla con título “Machine learning como nuevo deporte intelectual” y programa: Origen y situación actual de las competiciones de Análisis de Datos Análisis predictivo de datos de Alta Competición vs Proyectos en el Mundo Real: Objetivos Estrategias Herramientas Tips and tricks: ¿Qué haría en una competición de datos que nunca haría en un proyecto real? ¿Qué haría en un proyecto real que nunca haría en una competición de datos? De hecho, el contenido de la última sección es un tema del que he hablado ya sobradamente pero sobre el que me gustaría conocer la opinión del ponente. ...

28 de mayo de 2015 · Carlos J. Gil Bellosta

Grafos por vecindad en mapas

Dando vueltas (infructuosas) al asunto de los cartogramas he dado con un subproducto con el que, por hoy, me conformo: crear un grafo a partir de relaciones de vecindad entre polígonos. La magia, obra de [spdep::poly2nb](http://www.inside-r.org/packages/cran/spdep/docs/poly2nb); el código, library(maptools) library(spdep) library(igraph) # fichero descargado del INE aragon <- readShapePoly("ccaa00c02.shp") plot(aragon) aragon.nb <- poly2nb(aragon) # vértices vertices <- aragon@data vertices$id <- 1:nrow(aragon@data) vertices <- vertices[, c("id", setdiff(colnames(vertices), "id"))] # coordenadas aproximadas de los vértices my.layout.orig <- do.call(rbind, lapply(vertices$id, function(i) aragon@polygons[[i]]@Polygons[[1]]@labpt)) # aristas aristas <- do.call(rbind, lapply(1:length(aragon.nb), function(x) data.frame(from = x, to = aragon.nb[[x]]))) aristas <- aristas[aristas$from < aristas$to,] aristas <- aristas[aristas$from %in% vertices$id,] aristas <- aristas[aristas$to %in% vertices$id,] # grafo g <- graph.data.frame(aristas, directed = FALSE, vertices) plot(g, layout = my.layout.orig, vertex.label = NA, vertex.size = 0.1)

27 de mayo de 2015 · Carlos J. Gil Bellosta

Ejercicio imperdonable de amateurismo

Lo siento, pero esto es un ejercicio imperdonable de amateurismo. ¿Da igual lo que se escriba con tal de escribir algo?

26 de mayo de 2015 · Carlos J. Gil Bellosta

Ya que estamos de resaca electoral, ¡Hacking elections!

Un pelo del perro que te mordió, decían, curaba la rabia. Un vaso de vino, la resaca de lo mismo. Si te has levantado hoy con dolor de cabeza de resaca electoral, estás de enhorabuena: tienes a mano participar en Hacking Elections. Los detalles, mucho mejor contados que podría hacerlo yo, en el enlace anterior. Nota: no podré asistir por compromisos laborales y personales; pero no me lo habría perdido. Tengo un par de ideas sobre cómo podría montar un cartograma combinando los paquetes sp e igraph de R y pocos sitios como Hacking Elections para tratar de ponerlas en negro sobre blanco.

25 de mayo de 2015 · Carlos J. Gil Bellosta

Cartogramas vs huertogramas

Esto es un huertograma: Tiene la propiedad de que casi todos los pixels están encima de un huerto (o un erial, o en un cerro,…). Este es otro huertograma: Y esta es la misma información (resultados de las elecciones de 2015 en el RU) sobre un fabuloso cartograma: ¿Os habéis fijado cómo esa casi indistinguible mancha roja en la zona de Londres del huertograma adquiere su debida relevancia en el cartograma? ...

22 de mayo de 2015 · Carlos J. Gil Bellosta

Sumar 18: un problema fácil y otro que lo es menos

En una página que no mencionaré (solo porque creo que en los comentarios hay soluciones) se propuso el siguiente problema: combinar los números 2, 3, 4 y 5 con las operaciones aritméticas (+, -, *, /) para obtener 18 como resultado. Tal es el problema fácil. El menos fácil: encontrar todas (¡ya sabemos que la suma conmuta!) las soluciones.

21 de mayo de 2015 · Carlos J. Gil Bellosta

Banzhaf y las elecciones que se nos vienen

Es pertinente rescatar una entrada de hace tres años sobre D’Hondt y Banzhaf. En el enlace, los detalles. Me limitaré a actualizar el código de la función para que muestre las alianzas (algunas enteramente esperpénticas) posibles, que queda de la forma banzhaf <- function(x){ x <- -sort(-x) x <- x/sum(x) foo <- function(a,b,p){ if(p>1/2) return(list(a)) if (length(b)==0) return(NULL) b.prima <- b[-1] delta <- b[1] p.delta <- x[delta] return(c(foo(c(a,delta), b.prima, p+p.delta), foo(a,b.prima,p))) } res <- foo( NULL, names(x), 0) print(res) sort( table(unlist(res)) / length(res) ) } y a aplicarlo sobre algunos casos de la más rabiosa actualidad que Leda Duelo ha tenido la gentileza de preparar para mí y, a través de esta página, para ti también. Son los que siguen. ...

20 de mayo de 2015 · Carlos J. Gil Bellosta