IAAR Capacitación

IAAR

Sitio de Capacitaciones de IAAR

Introducción a R para Ciencia de Datos

R para Ciencia de Datos

¿Qué es R?

R es un lenguaje de programación interpretado diseñado específicamente para el análisis estadístico y la manipulación de datos. Esta inspirado, y es en su mayor medida compatible, por el lenguaje de programación S desarrollado por AT&T. Es ampliamente utilizado en todos los campos donde se deben manipular datos, como ser: los negocios, la industria, el gobierno, la medicina, el ámbito académico, y demás.

¿Por qué utilizar R?

R cuenta con varias virtudes, como ser:

  • Es una implementación de dominio público del lenguaje estadístico S; y la plataforma R/S se ha convertido en el defecto dentro del círculo de los profesionales de la estadística.

  • Es comparable, y a menudo superior en funcionalidad a productos comerciales; ya sea en gráficas, variedad de operaciones, y algoritmos implementados.

  • Es multiplataforma, se encuentra disponible para los sistemas operativos Windows, Mac y Linux.

  • Además de proporcionar operaciones estadísticas, R es un lenguaje de programación de propósito general; es decir, que puede ser utilizado para automatizar análisis y crear nuevas funciones que amplíen las funcionalidades existentes.

  • Incorpora características encontradas en la programación orientados a objetos y funcional.

  • El sistema guarda los conjuntos de datos entre sesiones, por lo que no es necesario volver a cargar los datos cada vez que ingresamos. También guarda nuestro historial de comandos, lo que nos ahorra bastante tiempo y mejora la productividad.

  • Debido a que R es un software de código abierto, es fácil obtener ayuda de la comunidad de usuarios. Además, muchas nuevas funciones son aportadas por los usuarios, los cuales son prominentes estadísticos.

Si bien existe una pequeña curva de aprendizaje, ésta es bastante mínima en comparación con otros lenguajes y programas. Asimismo existe una enorme red de colaboradores que constantemente están creando nuevos paquetes que hacen que sea mucho más fácil aplicar todo tipo de técnicas y funciones para manipular y analizar nuestros datos con la ayuda de R.

¿Cómo obtengo R?

Para descargar R, deben dirigirse a CRAN, la red de archivos de R. CRAN se compone de un conjunto de servidores distribuidos en todo el mundo y se utiliza para distribuir R junto con sus paquetes.

RStudio

RStudio es un entorno de desarrollo integrado, o IDE, diseñado específicamente para la programación con R. RStudio hace que R sea más fácil de usar. Incluye un editor de código, herramientas de depuración y visualización. Si estas dando tus primeros pasos con R, RStudio hace la experiencia mucho más amigable.

Breve introducción a la programación con R

Ahora que ya tenemos una idea más clara de qué es R y su ecosistema, llegó el momento de adentrarnos en su interfaz y ver como podemos realizar algunas operaciones básicas de programación en este lenguaje.

Vectores

El tipo de dato más fundamental que vamos a encontrar en R son los vectores.

In [1]:
# creando un vector x
x <- c(1, 5, 7, 12, 13)
x
  1. 1
  2. 5
  3. 7
  4. 12
  5. 13
In [2]:
# los vectores son similares a las listas, podemos seleccionar solo
# algunos elementos. Los índices comienzan en 1 en lugar de 0.
x[2:4] # selecciona elementos 2 a 4
  1. 5
  2. 7
  3. 12
In [3]:
# El tamaño de un vector queda definido en su creación. Para agregar o
# eliminar elementos hay que reasignar el vector.
x <- c(x[1:3],99,x[4:5]) # inserta 99 entre el 7 y el 12
x
  1. 1
  2. 5
  3. 7
  4. 99
  5. 12
  6. 13
In [4]:
# Saber el tamaño del vector con length
length(x)
6
In [5]:
# Filtrar valores del vector menores a 13
x[x < 13]
  1. 1
  2. 5
  3. 7
  4. 12
In [6]:
# Podemos ver el tipo de datos del vector con mode
y <- c(1, 2, 'Pi')
mode(y)
'character'
In [7]:
mode(x)
'numeric'

Matrices

Una Matriz es un vector con dos atributos adicionales: el número de filas y el número de columnas.

In [8]:
# Creando la Matriz A utilizando matrix
A <- matrix(c(1,2,3,4),nrow=2,ncol=2)
A
13
24
In [9]:
# Seleccionando la fila 1
A[1,]
  1. 1
  2. 3
In [10]:
# Seleccionando la columna 2
A[,2]
  1. 3
  2. 4
In [11]:
# Matriz con datos ordenados por fila en lugar del comportamiento por defecto
# en columnas. Utilizamos byrow True
B <- matrix(c(1,2,3,4,5,6),nrow=2,byrow=T)
B
123
456
In [12]:
# Multiplicación de matrices.
A %*% B
131721
182430
In [13]:
# Multiplicación por escalar
B * 2
2 4 6
8 1012
In [14]:
# Seleccionando múltiples columnas
B[,1:2]
12
45

Listas

Las Listas a diferencia de los vectores, en los que todos los elementos deben ser del mismo tipo; pueden combinar objetos de distintos tipos. Son similares a los diccionarios de Python.

In [15]:
# Creando una lista
r <- list(nombre="Raul", edad=35, soltero=T)
In [16]:
# Accediendo a los elementos de la lista
r$nombre
'Raul'
In [17]:
r$edad
35
In [18]:
r$soltero
TRUE
In [19]:
# Agregando un elemento
r$ciudad <- "Buenos Aires"
r
$nombre
'Raul'
$edad
35
$soltero
TRUE
$ciudad
'Buenos Aires'
In [20]:
# Accediendo a los indices con names
names(r)
  1. 'nombre'
  2. 'edad'
  3. 'soltero'
  4. 'ciudad'

Factores

Los Factores constituyen la base de muchas de las potentes operaciones que podemos realizar con R, incluyendo las realizadas sobre datos tabulares. La motivación para los factores proviene de la noción de variables nominales o categóricas en las estadísticas. Se caracteriza por dividir los datos en niveles o clases.

In [21]:
# Ejemplo de factores con 4 niveles
x <- c(4, 5, 12, 12, 5, 12, 4, 7)
y <- factor(x)
str(y)
 Factor w/ 4 levels "4","5","7","12": 1 2 4 4 2 4 1 3

Data Frame

El DataFrame es similar a una matriz, tiene una estructura bidimensional de filas y columnas. Sin embargo, difiere de una matriz en que cada columna puede tener un tipo de datos diferente. Por ejemplo, una columna puede consistir en números y otra columna puede tener una cadena de caracteres. En este sentido, así como las listas son los análogos heterogéneos de vectores en una dimensión, los DataFrame son los análogos heterogéneos de matrices para datos bidimensionales.

In [22]:
# Creando un DataFrame
nombres <- c("Raul","Ezequiel")
edades <- c(13,18)
d <- data.frame(nombres, edades)
d
nombresedades
Raul 13
Ezequiel18
In [23]:
str(d)
'data.frame':	2 obs. of  2 variables:
 $ nombres: Factor w/ 2 levels "Ezequiel","Raul": 2 1
 $ edades : num  13 18
In [24]:
# Accediendo las columnas
d$edades
  1. 13
  2. 18
In [25]:
# Accediendo filas
d[1,]
nombresedades
Raul13

Paquetes

Una de las mayores ventajas de R es que podemos encontrar miles de paquetes escritos por usuarios en CRAN. Un paquete de R es una colección de funciones, datos y documentación que amplía las capacidades de la base o core de R. El uso de paquetes es clave para utilizar exitosamente R.

In [26]:
# Para controlar los paquetes que se encuentran cargados
path.package()
  1. '/usr/lib/R/library/stats'
  2. '/usr/lib/R/library/graphics'
  3. '/usr/lib/R/library/grDevices'
  4. '/usr/lib/R/library/utils'
  5. '/usr/lib/R/library/datasets'
  6. '/usr/lib/R/library/methods'
  7. '/usr/lib/R/library/base'
In [27]:
# Para instalar paquetes
install.packages(c("outliers", "forecast"))
Installing packages into ‘/home/raul/R/x86_64-pc-linux-gnu-library/3.3’
(as ‘lib’ is unspecified)
In [28]:
# Para cargar el paquete
library(forecast)

Librerías para Ciencia de datos

Bien, luego de este paseo por las principales estructuras de datos que podemos encontrar en R, llegó el momento de adentrarnos en el fascinante mundo de la ciencia de datos. Algunas de las librerías que se han vuelto sumamente útiles para analizar y manipular datos con R, son las siguientes:

Tidyverse

Una de las tareas más importantes en cualquier proceso de análisis de datos consiste en ordenarlos y darles una estructura. En general recibimos datos en crudo y debemos procesarlos para poder luego utilizarlos en nuestros modelos. Si de explorar, ordenar y analizar datos se trata el paquete tidiverse es fundamental. Este paquete incluye las librerías ggplot2, tibble, tidyr, readr, purrr, y dplyr; las cuales comparten una filosofía propia y están diseñados para trabajar naturalmente entre ellos. Veamos algunos ejemplos:

In [29]:
# importando librerías
library(tidyverse)
Loading tidyverse: ggplot2
Loading tidyverse: tibble
Loading tidyverse: tidyr
Loading tidyverse: readr
Loading tidyverse: purrr
Loading tidyverse: dplyr
Conflicts with tidy packages ---------------------------------------------------
filter(): dplyr, stats
lag():    dplyr, stats

Aquí podemos ver los paquetes incluidos en el tidiverse: ggplot2, la popular librería de visualizaciones; tibble, que mejora los data.frames; tidyr, que nos permite redimensionar y agregar nuestros datos; readr, que nos proporcionar un método rápido y amigable para leer datos tabulares; purrr, que brinda las herramientas para un estilo de programación más funcional; y dplyr, para manipular los datos en memoria.

Comencemos con ggplot2, cuya gramática se puede resumir de la siguiente forma:

ggplot(data = <DATA>) + 
  <GEOM_FUNCTION>(
     mapping = aes(<MAPPINGS>),
     stat = <STAT>, 
     position = <POSITION>
  ) +
  <COORDINATE_FUNCTION> +
  <FACET_FUNCTION>
In [30]:
# Ejemplo tidyverse
# utiizando el dataset mpg incluido en ggplot2
head(mpg)
manufacturermodeldisplyearcyltransdrvctyhwyflclass
audi a4 1.8 1999 4 auto(l5) f 18 29 p compact
audi a4 1.8 1999 4 manual(m5)f 21 29 p compact
audi a4 2.0 2008 4 manual(m6)f 20 31 p compact
audi a4 2.0 2008 4 auto(av) f 21 30 p compact
audi a4 2.8 1999 6 auto(l5) f 16 26 p compact
audi a4 2.8 1999 6 manual(m5)f 18 26 p compact
In [31]:
# Graficando los datos con ggplot
ggplot(data = mpg, mapping = aes(x = displ, y = hwy)) + 
  geom_point(mapping = aes(color = class)) + 
  geom_smooth()
`geom_smooth()` using method = 'loess'
In [32]:
# creando un diagrama de cajas
ggplot(data = mpg, mapping = aes(x = class, y = hwy)) + 
  geom_boxplot()

Ahora veamos como podemos manipular los datos con dplyr

In [33]:
# Ejemplo dplyr
# usando filter para encontrar los modelos de chevrolet de 8 cilindros.
(chev <- filter(mpg, cyl == 8, manufacturer == 'chevrolet'))
manufacturermodeldisplyearcyltransdrvctyhwyflclass
chevrolet c1500 suburban 2wd5.3 2008 8 auto(l4) r 14 20 r suv
chevrolet c1500 suburban 2wd5.3 2008 8 auto(l4) r 11 15 e suv
chevrolet c1500 suburban 2wd5.3 2008 8 auto(l4) r 14 20 r suv
chevrolet c1500 suburban 2wd5.7 1999 8 auto(l4) r 13 17 r suv
chevrolet c1500 suburban 2wd6.0 2008 8 auto(l4) r 12 17 r suv
chevrolet corvette 5.7 1999 8 manual(m6) r 16 26 p 2seater
chevrolet corvette 5.7 1999 8 auto(l4) r 15 23 p 2seater
chevrolet corvette 6.2 2008 8 manual(m6) r 16 26 p 2seater
chevrolet corvette 6.2 2008 8 auto(s6) r 15 25 p 2seater
chevrolet corvette 7.0 2008 8 manual(m6) r 15 24 p 2seater
chevrolet k1500 tahoe 4wd 5.3 2008 8 auto(l4) 4 14 19 r suv
chevrolet k1500 tahoe 4wd 5.3 2008 8 auto(l4) 4 11 14 e suv
chevrolet k1500 tahoe 4wd 5.7 1999 8 auto(l4) 4 11 15 r suv
chevrolet k1500 tahoe 4wd 6.5 1999 8 auto(l4) 4 14 17 d suv
In [34]:
# filtrado más avanzado
filter(mpg, cyl %in% c(4, 6) & manufacturer == 'audi')
manufacturermodeldisplyearcyltransdrvctyhwyflclass
audi a4 1.8 1999 4 auto(l5) f 18 29 p compact
audi a4 1.8 1999 4 manual(m5)f 21 29 p compact
audi a4 2.0 2008 4 manual(m6)f 20 31 p compact
audi a4 2.0 2008 4 auto(av) f 21 30 p compact
audi a4 2.8 1999 6 auto(l5) f 16 26 p compact
audi a4 2.8 1999 6 manual(m5)f 18 26 p compact
audi a4 3.1 2008 6 auto(av) f 18 27 p compact
audi a4 quattro1.8 1999 4 manual(m5)4 18 26 p compact
audi a4 quattro1.8 1999 4 auto(l5) 4 16 25 p compact
audi a4 quattro2.0 2008 4 manual(m6)4 20 28 p compact
audi a4 quattro2.0 2008 4 auto(s6) 4 19 27 p compact
audi a4 quattro2.8 1999 6 auto(l5) 4 15 25 p compact
audi a4 quattro2.8 1999 6 manual(m5)4 17 25 p compact
audi a4 quattro3.1 2008 6 auto(s6) 4 17 25 p compact
audi a4 quattro3.1 2008 6 manual(m6)4 15 25 p compact
audi a6 quattro2.8 1999 6 auto(l5) 4 15 24 p midsize
audi a6 quattro3.1 2008 6 auto(s6) 4 17 25 p midsize
In [35]:
# Ordenar por year, class y manufacturer
head(arrange(mpg, year, class, manufacturer))
manufacturermodeldisplyearcyltransdrvctyhwyflclass
chevrolet corvette 5.7 1999 8 manual(m6)r 16 26 p 2seater
chevrolet corvette 5.7 1999 8 auto(l4) r 15 23 p 2seater
audi a4 1.8 1999 4 auto(l5) f 18 29 p compact
audi a4 1.8 1999 4 manual(m5)f 21 29 p compact
audi a4 2.8 1999 6 auto(l5) f 16 26 p compact
audi a4 2.8 1999 6 manual(m5)f 18 26 p compact
In [36]:
# Seleccinando columnas por nombre
head(select(mpg, year, class, manufacturer))
yearclassmanufacturer
1999 compactaudi
1999 compactaudi
2008 compactaudi
2008 compactaudi
1999 compactaudi
1999 compactaudi
In [37]:
# sumariazando
summarise(mpg, displ_mean = mean(displ, na.rm = TRUE))
displ_mean
3.471795
In [38]:
# Combinando con pipe para obtener la cuenta de modelos por año.
(chev <- group_by(mpg, manufacturer,year, model) %>% 
 select(manufacturer, model, year) %>% 
    summarise(count= n()) %>% 
     filter(manufacturer == 'chevrolet'))
manufactureryearmodelcount
chevrolet 1999 c1500 suburban 2wd1
chevrolet 1999 corvette 2
chevrolet 1999 k1500 tahoe 4wd 2
chevrolet 1999 malibu 2
chevrolet 2008 c1500 suburban 2wd4
chevrolet 2008 corvette 3
chevrolet 2008 k1500 tahoe 4wd 2
chevrolet 2008 malibu 3

Caret

A la hora de simplificar el proceso de Machine Learning, el paquete Caret puede sernos de gran ayuda. Este paquete nos ofrece una serie de herramientas para la construcción de modelos de Machine Learning en R. Caret nos proporciona herramientas esenciales para: la etapa de preparación de los datos, para dividir el conjunto de datos, seleccionar los principales atributos, y para evaluar los modelos. Veamos un pequeño ejemplo:

In [39]:
# Ejemplo de Caret para modelado
# utiizando el dataset mtcars incluido en ggplot2
head(mtcars)
mpgcyldisphpdratwtqsecvsamgearcarb
Mazda RX421.0 6 160 110 3.90 2.62016.460 1 4 4
Mazda RX4 Wag21.0 6 160 110 3.90 2.87517.020 1 4 4
Datsun 71022.8 4 108 93 3.85 2.32018.611 1 4 1
Hornet 4 Drive21.4 6 258 110 3.08 3.21519.441 0 3 1
Hornet Sportabout18.7 8 360 175 3.15 3.44017.020 0 3 2
Valiant18.1 6 225 105 2.76 3.46020.221 0 3 1
In [40]:
# Diagrama de dispersión para ver la relación entre atributos mpg y wt
ggplot(data = mtcars, aes(x = wt, y = mpg)) +
  geom_point()
In [42]:
# Parece existir una relación.
# construyendo el modelo con train
require(caret)

modelo.mtcars_lm <- train(mpg ~ wt
                        ,mtcars
                        ,method = "lm"
                        )
In [44]:
# Obteniendo los coeficientes de  
#  - pendiente
#  - intercepcion
coef.itercep <- coef(modelo.mtcars_lm$finalModel)[1]
coef.pendiente <- coef(modelo.mtcars_lm$finalModel)[2]
coef.itercep
(Intercept): 37.285126167342
In [45]:
coef.pendiente
wt: -5.34447157272267
In [46]:
# Dibujando el modelo de regresión
ggplot(data = mtcars, aes(x = wt, y = mpg)) +
  geom_point() +
  geom_abline(slope = coef.pendiente, intercept = coef.itercep, color = "red")

Data.table

Si de organizar grandes volúmenes de datos de una manera intuitiva se trata, data.table es el paquete indicado. Esta librería nos extiende la estructura de datos del dataFrame para poder trabajar con archivos realmente extensos, y poder realizar operaciones de agregado, agrupado y uniones de una forma más sencilla. Veamos como trabajar con ella:

In [48]:
# Ejemplo data.table
library(data.table)
 
dt <- data.table(mtcars)
class(dt)
  1. 'data.table'
  2. 'data.frame'
In [49]:
# calculando la media
dt[,mean(mpg)]
20.090625
In [50]:
# media por am
dt[,mean(mpg),by=am]
amV1
1 24.39231
0 17.14737
In [51]:
# con renombre de columna
dt[,.(avg=mean(mpg)),by=.(am,cyl)]
amcylavg
1 6 20.56667
1 4 28.07500
0 6 19.12500
0 8 15.05000
0 4 22.90000
1 8 15.40000
In [52]:
# Contando el número de autos por cilindrada
dt[, .N, by=cyl]
cylN
6 7
4 11
8 14
In [53]:
# Los mejore 5 autos con la mejor MPG 
head(dt[order(-mpg)],5)
mpgcyldisphpdratwtqsecvsamgearcarb
33.9 4 71.1 65 4.22 1.83519.901 1 4 1
32.4 4 78.7 66 4.08 2.20019.471 1 4 1
30.4 4 75.7 52 4.93 1.61518.521 1 4 2
30.4 4 95.1 113 3.77 1.51316.901 1 5 2
27.3 4 79.0 66 4.08 1.93518.901 1 4 1

Otras librerías que deberíamos conocer

E1071

Si lo que buscamos es trabajar con Máquinas de vectores de soporte, SVM; o con cualquiera de las principales funciones que podemos encontrar en las clases de probabilidad y estadística; entonces el paquete E1071 es exactamente lo que necesitamos.

randomForest

Para trabajar específicamente con modelos de Random Forest el paquete randomForest puede ser una buena opción; este paquete nos permite crear este tipo de modelos en forma muy sencilla.

rpart

El paquete rpart es una buena alternativa para trabajar con árboles de clasificaciones. Implementa los principales algoritmos para trabajar con este tipo de modelos.

nnet

Las redes neuronales han recibido mucha atención últimamente por sus habilidades para aprender las relaciones entre las variables. Representan una técnica innovadora para la adaptación de los modelo que no se basa en los supuestos convencionales necesarios por el modelado estándar; y que además pueden manejar muy eficazmente los datos multivariantes. Un gran paquete para trabajar con redes neuronales en forma muy sencilla es nnet.

igraph

Si lo que necesitamos es analizar y visualizar redes y grafos, el paquete igraph es la mejor opción. Este paquete nos proporciona una serie de rutinas altamente eficientes para visualizar y analizar las conexiones de las redes.

Outliers

Si lo que necesitamos es encontrar valores atípicos, entonces outliers es el paquete que debemos utilizar. Esta librería nos ofrece varias funciones y tests para poder identificar los valores atípicos.

Survival

Survival es un paquete que nos facilita la tarea de realizar análisis de supervivencia.

Forecast

Forecast proporciona métodos y herramientas para mostrar y analizar predicciones univariadas de series de tiempo, incluyendo el suavizado exponencial a través de modelos de espacios de estados y el modelado ARIMA automático.

Aquí concluye este artículo; obviamente el objetivo del mismo es solo presentar R y sus principales librerías para la ciencia de datos, dista mucho de ser un tutorial exhaustivo de como utilizar el lenguaje y existen muchas más librerías muy útiles que no fueron presentadas.

Los que quieran profundizar en el lenguaje pueden realizar los siguientes cursos: Programación Estadística con R o Data analysis with R. Asimismo, si les gusto este artículo, no duden en visitar mi blog relopezbriega.github.io!

Opiniones y comentarios son bienvenidos.

Saludos!

Raúl e. López Briega

Este post fue escrito utilizando IPython notebook. Pueden descargar este notebook o ver su version estática en nbviewer.

Comments