Gráficos

La variación y sus negacionistas

Las entradas de esta semana han girado alrededor de un tema: la comparación bajo incertidumbre. La remato recomendando un artículo de Stephen Few, Variation and Its Discontents, que tiene un subtítulo de lo más oportuno: Funnel Plots for Fair Comparisons.

Nota: Los lectores más fieles de estas páginas recordarán entradas viejas, como esta, que también sugerían el uso de gráficos de embudo (o trompeta).

Extraido de un libro de educación primaria

Del capítulo de estadística de un libro de matemática para críos capturé el otro día

tartas_libro

¿A qué os imagináis lo que se me pasó por la mente? Pues no lo digo por si algún día llego a concejal.

Cartogramas vs huertogramas

Esto es un huertograma:

huertograma_es

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:

huertograma_uk

Y esta es la misma información (resultados de las elecciones de 2015 en el RU) sobre un fabuloso cartograma:

cartograma_uk

¿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?

Taller de mapas con R el 14 de abril en Madrid

Mi entrada de hoy es para anunciar un taller de mapas con R que tendrá lugar el día 14 de abril de 18 a 21 horas en Martina Cocina (cómo llegar).

Lo impartirá Beatriz Martínez, socióloga dedicada a la investigación social y de mercados, que ha trabajado en numerosos proyectos: desde investigación digital al desarrollo rural o programas de inclusión social. Está especializada en la la visualización de datos. Algunos de sus trabajos pueden verse en visualizados.com.

Compresión con SVD

svd_greco

lo he creado con

library(png)

tmp.file <- tempfile()
download.file("http://datanalytics.com/uploads/greco.png", tmp.file)
m <- readPNG(tmp.file)

svd.m <- svd(m)

filtra.svd <- function(svd, k){
  tmp <- svd
  tmp$d[(k+1):length(tmp$d)] <- 0
  res <- tmp$u %*% diag(tmp$d) %*% t(tmp$v)

  res[res > 1] <- 1
  res[res < 0] <- 0

  plot(1:2, type='n', xlab = "",
        ylab = "", xaxt = "n", yaxt = "n",
        main = paste(k, "primeras componentes", sep = " "))
  rasterImage(res, 1, 1, 2, 2)
}

layout(matrix(1:9, 3, 3, byrow = T))

sapply(c(1,2,3,5,10,15,20,30,50),
        function(k) filtra.svd(svd.m, k))

Recurrencia recurrente

Pregunta Antonio Sánchez Chinchón cómo mejorar la parte menos vistosa e imaginativa de esto, es decir, el código. Él, y muchos diríamos que correctamente, autocritica el uso de eval + parse para plagar el namespace de funciones.

La respuesta está en la recurrencia. He aquí mi versión del código:

library(ggplot2)
library(gridExtra)

nrows <- 6
coefs.a <- runif(min=1, max=50, nrows)
coefs.b <- runif(min=1, max=50, nrows)

foo.a <- sample(c(sin, cos), nrows, replace = TRUE)
foo.b <- sample(c(sin, cos), nrows, replace = TRUE)

foo <- function(x, a, b){
  if(a == 1 || b == 1)
    return(foo.a[[a]](coefs.a[a] * x))

  if(b == a)
    return(foo.b[[a]](coefs.b[a] * x))

  foo(x, a-1, b) + foo(x, a-1, b-1)
}

vplayout = function(x, y) viewport(layout.pos.row = x, layout.pos.col = y)

opts=theme(legend.position="none",
      panel.background = element_rect(fill="gray95"),
      plot.background = element_rect(fill="gray95", colour="gray95"),
      panel.grid = element_blank(),
      axis.ticks=element_blank(),
      axis.title=element_blank(),
      axis.text =element_blank())

grid.newpage()

jpeg(file="AddingWaves.jpeg", width = 1800, height = 1000,
      bg = "gray95", quality = 100)

pushViewport(viewport(layout = grid.layout(nrows, 2*nrows-1)))

for (i in 1:nrows) {
  for (j in 1:i) {
    print(ggplot(data.frame(x = c(0, 20)), aes(x)) +
            stat_function(fun = function(x) foo(x, i, j),
                  colour = "black", alpha=.75)+opts,
          vp = vplayout(i, nrows+(2*j-(i+1))))
  }
}

dev.off()

El resultado es

Hackatón de datos abiertos, 21 de febrero en Madrid

El día 21 de febrero (de 2015) tendrá lugar en Medialab-Prado (¿cómo llegar?) un hackatón de datos abiertos patrocinado por Medialab-Prado y Open Knowledge Spain. El resto de la información puede consultarse aquí.

Dicho lo cual, ¿deberías ir?

Pues si tienes 45 años, eres profesor de la Autónoma, etc. lo sabes tú mejor que yo.

Pero si tienes veintitantos, estudias, has comenzado a trabajar recientemente o estás en el paro, si tienes inquietudes (y las tienes si lees esto), si quieres conocer técnicas nuevas, problemas nuevos, contactar con gente interesante, etc., el día 21 coge tu portátil y acude.

Gráficos e interactividad: una ocasión desaprovechada

Cuando los gráficos son estáticos, los compromisos mandan. ¿Mostramos las diferencias relativas? ¿O las magnitudes absolutas? Ocurre casi indefectiblemente que cuando uno opta por una opción siempre alguien en la audiencia levanta el dedo y sugiere la alternativa. ¿Mostramos ambas a la vez? Entonces abusamos de la usualmente limitada superficie construible de nuestro informe y, además, violentamos ese principio de que lo bué, si bré, dos ve bué.

La interactividad en los gráficos permite superponer vistas diversas de unos datos en un recinto acotado. Pagamos un peaje: tenemos que descubrir nosotros mismos la que más nos interesa y navegar hasta ella. Pero, por lo general, compensa.

Dime, ¿qué quieres comparar con qué?

A veces alguien me pregunta cómo representar gráficamente ciertos datos. Yo respondo casi siempre igual, casi siempre con la misma pregunta: ¿qué quieres comparar con qué? Luego se trata solo de disponer las magnitudes que se desea comparar próximas, paralelas y con un mismo eje de referencia.

Si se puede, claro.

Con el gráfico

evolucion_deuda

que acompaña al artículo La deuda atenaza la recuperación el pobre ilustrador no lo tenía fácil. Por un lado tenía que comparar la evolución de una magnitud en dos momentos distintos y lo que más claro deja es que ni ha leído Displaying Change Between Two Points in Time ni le suena lo que reza. Y haré como que no he visto esos circulillos grises al pie.

¿Dónde he estado (según Google)?

Leí esto el otro día. Lo voy a replicar con mis datos.

Contexto

Google guarda datos de tus ubicaciones: tu tableta, tu ordenador, tu teléfono Android son espías a su servicio. Los datos los guarda en aquí (creo que necesitarás que en tu navegador haya una sesión abierta con tus credenciales del universo Google). Pulsando en administrar archivos y luego en crear archivos puedes seleccionar el tipo de información sobre ti que posee Google y que quieres descargarte. Para este ejemplo, será el Historial de Ubicaciones.

Missing

Dos motivos me han tenido missing estas últimas semanas. Uno es una estancia en la Universidad de Santa Catalina del Burgo de Osma. Oportunamente ubicada en las estribaciones de la muy generosa en caldos de calidad Ribera del Duero, ha sido reconvertida a la sazón en un hotel propicio para la evasión y la agrafía.

vim_package

El segundo es que en horas intempestivas he estado purgando de missings unas matrices enormes y de la, se conoce, mayor trascendencia. Es un asunto delicado, jamás bien resuelto, para el que el paquete [VIM](http://cran.r-project.org/web/packages/VIM/index.html) puede proporcionar ayuda. Sobre todo en los aspectos gráficos.

Factorización de enteros con grid

Vi esto y me dije: yo también quiero. Así que dicho y hecho:

100

Por si acaso, cada diagrama representa la descomposición en números primos de un número del 1 al 100.

El código (que no he adecentado lo que suelo) es un pequeño ejercicio con el paquete grid y unos elementos de recursividad (como en Grid, Scala y arbolitos fractales):

library(grid)
library(gmp)

plot.factors <- function(n, new.plot = TRUE){

  if(new.plot)
    grid.newpage()

  divisors <- sort(as.integer(factorize(n)), decreasing = T)

  foo <- function(divs){
    if(length(divs) == 0){
      grid.circle(x = 0.5, y = 0.5, r = 0.5,
                  gp=gpar(fill="black"))
      return()
    }

    n <- divs[1]

    x <- (Re(exp( 2 * pi *(1:n) * 1i /n))) / 4 + 0.5
    y <- (Im(exp( 2 * pi *(1:n) * 1i /n))) / 4 + 0.5

    for(i in 1:n){
      tmp <- viewport(x = x[i], y = y[i],
                      w = 2/(3 + n), h = 2/(3 + n))
      pushViewport(tmp)
      #grid.rect(gp = gpar(col = "grey"))
      foo(divs[-1])
      popViewport()
    }
  }

  foo(divisors)
}

plot.factors(25)


grid.newpage()

nrow <- 10
ncol <- 10

for(y in 1:nrow){
  for(x in 1:ncol){
    tmp <- viewport(x = x / (1 + ncol), y = 1 - y / (1 + nrow),
                    w = 1/(1 + ncol), h = 1/(1+ncol))
    pushViewport(tmp)
    #grid.rect(gp = gpar(col = "grey"))
    plot.factors(x + y * ncol - ncol, new.plot = FALSE)
    popViewport()
  }
}