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))

Mileuristas... anuales

Publicaba el otro día El País una nómina de Franco de noviembre de 1935 con un líquido a percibir de 2.429,98 pesetas. Según el articulista,

[s]i comparamos aquella cantidad con el coste de la vida actual, la equivalencia se elevaría a 5.261,80 euros. Así lo ha calculado para EL PAÍS Ernesto Poveda, del Grupo Icsa, dedicado, entre otras cosas a asuntos de observatorio salarial. El trabajo está hecho con arreglo a la tabla de actualización de precios al consumo que establece Jordi Maluquer de Motes, catedrático de la Universidad Autónoma de Bellaterra (Barcelona). “Se trata de la referencia utilizada por los historiadores económicos avalada por el Banco de España”, explica Poveda.

Campaña de alfabetización numérica... para diputados

¿Sabe de números tu próximo representante?

Al preguntar a los diputados actuales acerca de la probabilidad de obtener dos caras consecutivas al lanzar una moneda, solo el 40% de ellos obtuvieron la respuesta correcta. ¿Lo harán mejor lo siguientes?

[…]

Así, pero en inglés, comienza esta nota de la Royal Statistical Society que sugiere a los votantes (del RU, desgraciadamente) invitar a sus candidatos a formarse en los rudimentos de la estadística y el análisis y comprensión de datos.

¿Un curso de redes sociales con R?

Se me ha propuesto organizar un curso, taller o similar de redes sociales y su análisis con R. De nuevo, presencial.

topologia_correos

Mi propuesta —dado que soy lego en el asunto— es organizar un taller basado en este. Ahí va mi propuesta: en una serie de sesiones en MartinaCocina plantamos un proyector y una pizarra y entre todos vamos avanzando en el tutorial y resolviendo las dudas colaborativamente.

Por supuesto, el asunto no estaría planteado como clase unidireccional en el que alguien habla y explica y los demás asienten. Más bien, como un taller de pares que aprenden y que a la voz de ya estamos todos pasamos al siguiente asunto.

Datos en formato largo y melt

R

En ocasiones uno recibe datos no muy distintos de

aragon <- read.table("http://datanalytics.com/uploads/pob_aragon",
                        header = T, sep = "\t")
aragon

# Provincias Periodo Hombres Mujeres
# 1     Huesca    2014  113840  111069
# 2     Huesca    2004  107961  104940
# 3     Teruel    2014   71449   68916
# 4     Teruel    2004   71073   68260
# 5   Zaragoza    2014  471675  488436
# 6   Zaragoza    2004  441840  455510

Los mismos datos en formato largo son:

library(reshape2)

aragon.largo <- melt(aragon, id.vars = c("Provincias", "Periodo"))
aragon.largo
# Provincias Periodo variable  value
# 1      Huesca    2014  Hombres 113840
# 2      Huesca    2004  Hombres 107961
# 3      Teruel    2014  Hombres  71449
# 4      Teruel    2004  Hombres  71073
# 5    Zaragoza    2014  Hombres 471675
# 6    Zaragoza    2004  Hombres 441840
# 7      Huesca    2014  Mujeres 111069
# 8      Huesca    2004  Mujeres 104940
# 9      Teruel    2014  Mujeres  68916
# 10     Teruel    2004  Mujeres  68260
# 11   Zaragoza    2014  Mujeres 488436
# 12   Zaragoza    2004  Mujeres 455510

Si eso de datos largos (o en formato largo) no te suena, pierde un momento en:

format( "www.R-project.org", year = 2015)

R

Tal fue el asunto del correo en el que Martin Maechler anunció el lavado de cara de la página de R acontecido hace unos pocos días. Es muy revelador el argumento year = 2015: los usuarios de hoy en día ya no toleramos caóticas yuxtaposiciones de cualquier cosa que algunos llaman páginas de internet.

Los usuarios de hoy en día no tenemos tiempo de buscar y rebuscar. Nos molestan los tropezones. Nos molesta la complejidad innecesaria.

Licencias urbanísticas: datos y votos

Una de mis aficiones recientes es la de echarle un vistazo a las licencias de apertura de los locales de Madrid. Son un cartelito que suelen tener colgado en la puerta (con una H verde y grande en hostelería) donde se indica, entre otras cosas, el aforo y la fecha de concesión.

(Lo del aforo no es asunto baladí: sin un aforo oficial, no existe exceso de aforo,… ¿y si luego pasa algo?).

Unas preguntas incómodas

Que la mujer promedio gana menos que el hombre promedio es un hecho conocido. A los usuarios de R que estén al tanto de mi paquete MicroDatosEs no hace falta siquiera que se lo cuenten: pueden bajar los datos de la Encuesta de Estructura Salarial del INE y hacer el cálculo por sí mismos.

Que las mujeres ganen menos en promedio aun teniendo en cuenta las variables recogidas en dicha encuesta (nivel de formación, antigüedad en el puesto de trabajo, etc.) es también un hecho. Los usuarios de R también pueden crear un modelo descriptivo: el fenómeno se manifiesta claramente. O pueden (sepan o no R) leer cualquiera de los informes publicados al respecto para llegar a la misma conclusión.

¿Cuál es la "mejor" manera de ordenar un dataframe?

R

El título de esta entrada es una pregunta honesta. Yo siempre he utilizado order así:

    iris[order(iris$Petal.Length),]

Y para ordenar por dos (o más columnas), así:

    iris[order(iris$Petal.Length, iris$Petal.Width),]

Es a lo que estoy acostumbrado. Sin embargo, la construcción anterior desconcierta a quienes dan sus primeros pasos en R. dplyr dispone de la función arrange con una sintaxis un tanto más natural:

    library(dplyr)
    arrange(iris, Petal.Length, Petal.Width)

pero, de nuevo, puede resultar desconcertante tener que recurrir a paquetes avanzados: ¿es conveniente introducir a los principiantes en el proceloso mundo de los paquetes para la simple y muy natural operación de ordenar un dataframe?