Fin

Hace tiempo que dejé de escribir en este blog. Cuando lo inicie estaba en un Grupo de investigación de Sociología de la Música en la Universidad Complutense de Madrid y quería plasmar lo que aprendía sobre análisis de texto en R aplicado a las letras de canciones. A la vez, o casi, comencé Chuletitas de pingüino como blog de notas donde apuntar mi aprendizaje en GNU/Linux. Como si fuera una batalla de curiosidad, poco a poco se impuso el pingüino que llevo dentro y tras un puñado de post dejé de lado enclaveder.

Tras un tiempo he decidido importar estos post a Chuletitas de pingüino y seguir escribiendo allí sobre R.

This is the end!

Vuelve Rock en Cine

A partir de este miercoles 21 de octubre vuelvo participar en Rock en Cine, una suerte de CineForúm de documentales y peliculas con el Rock como tema central. Todos los miércoles del primer cuatrimestre en la “Sala de Cine” (antigua B04) de la Facultad de Ciencias Políticas y Sociología de la Universidad Complutense de Madrid. Hay reconocimiento de créditos de libre elección, aunque puede asistir cualquier persona. Cuantos más mejor!

Os dejo con el calendario de sesiones por si alguien esta interesado en asistir:

21 octubre: The Blues: Feels like Going Home
28 octubre: Lemmy
4 noviembre: A hard day’s night
11 noviembre: Quiero tener una ferreteria en Andalucía!
18 noviembre: The Making of The Dark Side of The Moon
25 noviembre: Punk Attitude!
2 diciembre: Janis. The way she was.
9 diciembre: Until the light take us!
19 diciembre: Searching for Sugarman
13 enero: Europe in 8bits

Más información en la página de Facebook del grupo MUSYCA.

rock!

Pequeña introducción al Text Mining con Joy Division

ian curtis

En diciembre doy una pequeña charla sobre la película Control (2007) en el Seminario Rock en Cine de la Universidad Complutense de Madrid (UCM). Así que he decidido realizar mi primer script con las letras de Joy Division, grupo protagonista de la película y pionero del sonido Madchester. Aún no sé utilizar la API de LyricWiki, así que descargué a la vieja usanza las letras de sus dos álbumes, Unknown Pleasures (1979) y Closer (1980).

Guardamos los albumes en una carpeta, cada uno en su archivo de texto UTF-8. Primero seleccionamos con setwd () el directorio donde vamos a trabajar y luego cargamos todos los documentos que se encuentran en la carpeta “/discos“.

> setwd("/home/rubent/documents/PlantillasR/MusycaR/Joy Division/")
> cname <- file.path(".","discos")

Comprobamos que tenemos una variable de longitud dos compuesta por los archivos:

> dir(cname)
[1] "Closer.txt"            "Unknown Pleasures.txt"

El siguiente paso es crear el corpus, así que cargamos la libreria tm (sino está previamente instalada puedes incluir el comando install.packages(“tm”)). Ahí tenemos un corpus con dos documentos de texto.

#install.packages("tm")
> corpus <- Corpus(DirSource(cname))
> corpus
<<VCorpus (documents: 2, metadata (corpus/indexed): 0/0)>>
> summary(corpus)
                      Length Class             Mode
Closer.txt            2      PlainTextDocument list
Unknown Pleasures.txt 2      PlainTextDocument list

Le echamos un vistazo al primero de los documentos:

> inspect(corpus[1])
<<VCorpus (documents: 1, metadata (corpus/indexed): 0/0)>>

[[1]]
<<PlainTextDocument (metadata: 7)>>
Closer (1980)

1 Atrocity exhibition

Asylums with doors open wide
Where people had paid to see inside
For entertainment they watch his body twist
Behind his eyes he says, "I still exist"
...

Ahora vamos con lo interesante del paquete tm. Primero convertimos las letras de los textos en minúsculas, luego quitamos los números y las signos de puntuación. Luego eliminamos varias palabras comunes del ingles (“stopwords”). Al final de estos procesos eliminamos los espacios en blanco que se han generado con “stripWhitespace”.

##Transformaciones
# Convertimos todo en minúsculas
corpus <- tm_map(corpus, tolower)
# Quitamos los números
corpus <- tm_map(corpus, removeNumbers)
# Quitamos los signos de puntuación
corpus <- tm_map(corpus, removePunctuation)
# Se eliminan varias palabras comunes del inglés
corpus <- tm_map(corpus, removeWords, stopwords("english"))
# Quitamos los espacios que han salido con tanto retoque
corpus <- tm_map(corpus, stripWhitespace)
# Nos aseguramos que el corpus es texto plano
corpus <- tm_map(corpus, PlainTextDocument)

Vamos ahora a cargar el paquete “SnowballC” para hacer Stemming. Básicamente, el paquete de Stemming borra los sufijos de las palabras para dejarlas en su “raíz”, por ejemplo “run”,“runs” y “running” se convertirán en “run”. Hay que ir con cuidado porque a veces deja unas palabras un tanto “raras”, pero se entienden. Después volvemos a eliminar los espacios.

library(SnowballC)
corpus <- tm_map(corpus, stemDocument)
# Quitamos los espacios que han salido con tanto retoque
corpus <- tm_map(corpus, stripWhitespace)

Así queda el documento después de lo anterior:

> inspect(corpus[1])
<<VCorpus (documents: 1, metadata (corpus/indexed): 0/0)>>

[[1]]
<<PlainTextDocument (metadata: 7)>>
closer 

 atrocity exhibition

asylums doors open wide
 people paid see inside
 entertainment watch body twist
behind eyes says still exist

 way step inside
 way step inside
 way step inside
 way step inside

Tras la batería de transformaciones vamos a crear la Matriz de términos del documento (Document Term Matrix), para realizar el resto de análisis. Nuestra matriz tiene 667 palabras de las cúales el 38% están dispersas. Más adelante nos encargaremos de ellas.

> # Matriz de términos
> dtm <- DocumentTermMatrix(corpus)
> dtm
<<DocumentTermMatrix (documents: 2, terms: 667)>>
Non-/sparse entries: 822/512
Sparsity           : 38%
Maximal term length: 13
Weighting          : term frequency (tf)

Exploramos un poco nuestra matriz: Los términos menos frecuentes, salen una vez en las canciones, son “abyss”, “accept”,…; y los más frecuentes “ive” (la forma contraída del “I have”), “control”, “time”o “lost”. Muy sugerentes para un análisis.

> ### Exploramos nuestra Matriz de terminos
> freq <- colSums(as.matrix(dtm))
> length(freq)
[1] 667
> ord <- order(freq)
> # Lista terminos menos frecuentes
> freq[head(ord)]
 abyss accept action    add  admir    all 
     1      1      1      1      1      1 
> # Lista terminos más frecuentes
> freq[tail(ord)]
    ive control    time    lost    will     way 
     20      21      21      24      31      32 

Continuando con el análisis de frecuencias, tenemos 414 palabras que aparecen una sola vez en el texto, mientras que hay una palabra que se repite 32 veces.

> ## Distribución de las frecuencias
> # Frequency of frequencies.
> head(table(freq), 15)
freq
  1   2   3   4   5   6   7   8   9  10  11  12  13  14  15 
414  95  45  25  21  16  10   6   5   6   4   1   4   4   1 
> tail(table(freq), 15)
freq
 8  9 10 11 12 13 14 15 17 19 20 21 24 31 32 
 6  5  6  4  1  4  4  1  2  2  1  2  1  1  1 

Como dije antes, vamos a quitar los términos con poca frecuencia.

> ## Eliminar términos infrecuentes
> dim(dtm)
[1]   2 667
> dtms <- removeSparseTerms(dtm, .1)
> dim(dtms)
[1]   2 155
> inspect(dtms)
<<DocumentTermMatrix (documents: 2, terms: 155)>>
Non-/sparse entries: 310/0
Sparsity           : 0%
Maximal term length: 10
Weighting          : term frequency (tf)

Han quedado 155 palabras, un buen número para el siguiente paso. LLegamos a la nube de palabras o wordcloud, tan en boga. Primero cargamos el paquete wordcloud y luego generamos una paleta de colores con RColorBrewer. Yo he usado una paleta gris de acuerdo a las letras de Joy Division (y porque me gusta), para hay varias paletas muy coloridas para gente alegre. Luego generamos la wordcloud con palabras de 15 repeticiones.

##Nube de palabras o Wordcloud
library(wordcloud)
palette <- brewer.pal(9,"Greys")[-(1:5)]
wordcloud(names(freq), freq, min.freq=5, rot.per=0.2, scale=c(3, .1), colors=palette)

wordcloud

Vuelvo a sacar los términos más frecuentes, primero con frecuencia de más de 25 y luego más de 20.

## Identificar terminos más frecuentes y sus relaciones
freq <- colSums(as.matrix(dtms))
> findFreqTerms(dtm, lowfreq=25)
[1] "way"  "will"
> findFreqTerms(dtm, lowfreq=20)
[1] "control" "ive"     "lost"    "time"    "way"     "will

Ahora, buscamos las relaciones de las palabras más frecuentes. En mis textos han salido unos resultados algo extraños, todas palabras tenían una relación de 1; supongo que debido a los estribillos.

# encontrar relaciones de palabras especificas
findAssocs(dtm, "will", corlimit=0.7)
findAssocs(dtm, "lost", corlimit=0.7)

Dibujamos las relaciones de las palabras con una frecuencia mayor a 20.

##Dibujamos las relaciones
plot(dtm, terms=findFreqTerms(dtm, lowfreq=20)[1:6], corThreshold=0.2)

Rplot01

Y por último vamos a crear una tabla frecuencias.

##Dibujamos las frecuencias
freq <- sort(colSums(as.matrix(dtm)), decreasing=TRUE)
head(freq, 14)
wf <- data.frame(word=names(freq), freq=freq)
head(wf)
#Dibujamos las palabras con más de 15 frecuencia
library(ggplot2)
p <- ggplot(subset(wf, freq>15), aes(word, freq))
p <- p + geom_bar(stat="identity")
p <- p + theme(axis.text.x=element_text(angle=45, hjust=1))
p

Rplot02

Bibliografía
  1. Graham Williams. Text Mining. Data Science with R
  2. Zhao R. Text Mining with R — an Analysis of Twitter Data

Recursos para aprender R

La curva para aprender R es bastante pronunciada, al menos, eso me parece a mi. Por suerte para los que nos acercamos por primera vez a este maravilloso programa, hay bastantes recursos disponibles en internet para hacer memos abrupto el camino. En la página oficial de R encontramos manuales y ejemplos en varios idiomas (están un poco escondidos) y The R Journal contiene noticias sobre el programa. Luego existen multitud de blogs con tutoriales y scripts como Quick R, R Graphical Manual,Teachpress o Inside R patrocinado por la empresa Revolution Analytics. Además, el Institute for digital research and education (IDRE) de la Universidad de California(UCLA), tiene muchos tutoriales y scripts.

Existe una gran comunidad de blogeros de R, conectados alrededor de R Bloggers donde se publican noticias de R y multitud de tutoriales. En España, existe la Comunidad R-Hispano. similar a la anterior, que contiene ayudas y posts diarios. La comunidad está dividida en Grupos de interés temático y Grupos de interés local. No conozco la actividad de los demás grupos, pero parece que el de Barcelona y Madrid son bastante activos, celebrando actividades y reuniones mensuales. Además, existe una lista de correo, R help-es, muy activa.

Por último, existe la web RPubs que permite publicar tus scripts en la red de forma pública. Es un buen recurso para mirar lo que hacen los demás y aprender fácilmente.

Libros
Hay bastantes libros gratuitos disponibles en la red, desde los más introductorios como Estadística básica con R y R-Commander o Fundamentos estadísticos para la investigación. Introducción a R. hasta un nivel mayor, Advance R. Podeis encontrar una buena cantidad de ellos en la página de R-CRAN (en la sección Manuals/Contributed Documentation) y en Github.

Cursos MOOC
Por si todo lo anterior fuera poco, existen cursos online gratuitos para aprender R. El 6 de octubre comenzaron en Coursera dos cursos MOOC relacionados con R, R Programming de la Universidad Johns Hopkins y Social Network Analysis de la Universidad de Michigan. Seguramente no haya tiempo de terminarlos pero si podeís hechar un vistazo al temario y así haceros una idea. Si quereis algo más sencillo y disponible en cualquier momento DataCamp y OpenIntro tienen cursos introductorios gratuitos de estadística y análisis de datos en R.

RStudio

Como hablé en la entrada anterior, R utiliza la terminal como interface, lo que dificulta un “poco” su aprendizaje. Da un poco de miedo “abrir” R por primera vez y encontrarte en la inmensidad de una pantalla en negro, sin nada que te indique que hacer. Por suerte, existen varias GUI gráficas para hacernos la vida un poquito más fácil. Puedes consultar una lista de alguna de ellas en la Wikipedia. De entre toda la variedad, sólo he probado RKWard, RCommander y RStudio, con el que me siento más cómodo y la que utilizo actualmente.
RStudio
RStudio se puede instalar en varios sistemas operativos: Windows, Mac y GNU/Linux (Debian/Ubuntu, Fedora y SUSE). Como es lógico para utilizar RStudio necesitas tener instalado R. Instalarlo en Debian es bastante sencillo, basta con descargar la última versión y utilizar el Instalador de paquetes Gebi para instalarlo.

Los tres GUI que he comentado tienen sus puntos buenos y malos, y seguramente cada uno tiene su favorito. Yo me he acostumbrado a RStudio, con sus cuatro espacios de trabajo diferenciado hacen que trabajar en él sea agradable. Además, reconoce el lenguaje markdown para publicar facilmente tus scripts en la web. Podeís ver todas sus caracteristicas en su web.

R CRAN

R es un lenguaje y entorno de programación para el análisis estadístico y gráfico, desarrollado inicialmente por Robert Gentleman y Ross Ihaka del Departamento de Estadística de la Universidad de Auckland en 1993. Es un proyecto de software libre, resultado de la implementación de lenguaje S, utilizado en la investigación biomédica o en el campo de la estadística, data mining o la bioinformática. En los últimos años R se esta convirtiendo en uno de los lenguajes de programación más utilizados, tal vez por la posibilidad de añadir diferentes paquetes con finalidades específicas.

R usa la terminal aunque hay bastantes interfaces gráficas para hacer que su uso sea más amigable. Mi favorita es RStudio, de la que hablaré en otro post.

R se distribuye bajo la licencia GNU GPL y está disponible para Windows, Mac y GNU/Linux. Instalarlo en Windows y Mac es bastante fácil, basta con descargarse un archivo desde su página web. Se puede consultar aquí.

Para GNU/Linux, se encuentra en los repositorios de Debian, Ubuntu, Suse y Redhat y puedes encontrar como instalarlo en la web.

Para instalarlo en Debian Wheezy, primero hay que añadir el repositorio

deb http://*favorite-cran-mirror*/bin/linux/debian wheezy-cran3/

en el archivo /etc/apt/sources.list de tu pc y se sustituye favorite-cran-mirror por una de las URLs listadas aquí. Como ejemplo, explicaré mi caso. Abrimos la terminal y tecleamos:

sudo geany /etc/apt/sources.list (donde geany es tu editor de texto: leafpad, gedit,…)

Abierto el archivo, añadimos en la última línea

## R-CRAN
deb http://ftp.cixug.es/CRAN/bin/linux/debian wheezy-cran3/

Guardamos y cerramos el editor. Después de añadir el repositorio, es necesario verificar la clave. Para ello tecleamos en la terminal:

sudo apt-key adv --keyserver keys.gnupg.net --recv-key 381BA480

Para instalar R, debemos ejecutar en la terminal:

sudo apt-get update
sudo apt-get install r-base r-base-dev

Ya está instalado. Para entrar a R solo hay que teclear en la terminal el comando R.