Algoritmos de Machine Learning en R project

“The best thing about R is  that it was developed by statisticians. The worst thing about R is that….it was developed by statisticians.”  Bo Cowgill, Google, Inc.

Todas las entradas de esta categoría muestran algoritmos y técnicas clasificadas como algoritmos de Machine Learning o Aprendizaje Estadístico. En cada entrada comparto el código  y algunos repositorios donde pueden bajar datos y notas sobre los temas.

Las ventajas de usar R project para dar estos ejemplos son las siguientes:

1.-R project es software libre u open source, por lo cual cualquier persona pude descargarlo.

2.-El código que comparto solo debe de ser copiado y pegado en un Script o en la consola  de R project para reproducir los resultados.

Otra ventaja de aprender estas técnicas con ejemplos en R, es que muchos de los algoritmos son acompañados de alguna técnica gráfica para visualizar el resultado. R project por default cuenta con una gran cantidad de herramientas gráficas o se puede hacer uso de librerías como ggplot2, lattice, ggvis para hacer gráficas aún más elaboradas y visualmente más agradables.

El entendimiento de la técnica después de realizar un ejemplo desde mi perspectiva genera interés por saber como aplicarla a otros datos y nos invita a conocer más sobre el algoritmo desde un punto de vista no solo práctico, sino también teórico.

Evité en la medida de lo posible hacer uso de ecuaciones y en cada ocasión que se menciona algún concepto de matemáticas trato de explicarlo de un modo sencillo. Si este concepto requiere a mi parecer una mejor lectura, agregue algunas ligas para consultar en la red.

La única meta que me propuse fue explicar las cosas de modo tal que cualquier persona con un poco de curiosidad pueda entender algo de cada entrada.

Teniendo en mente lo anterior, espero que  el objetivo de trasmitir el conocimiento desde un ejemplo concreto haya sido logrado. En caso de que no sea así, sería grato saber qué parte no es clara y como mejorar este material.

Resumen de las entradas.

El orden siguiente es el que considero apropiado para revisar cada entrada.

1.-¿Qué se necesita conocer de R project para aprender algunas técnicas de Machine Learning?

Es una breve explicación sobre R project y sobre algunas de las funciones con las que cuenta por default. También menciono las librería que se requieren para replicar los ejemplos, aunque en cada entrada menciono algo breve sobre la librerías requeridas.

2.-Análisis Confirmatorio vs Exploratorio

Explico la diferencia entre los dos tipos de análisis y cómo están relacionados. Clasifico el tipo de medidas que uno puede analizar en los datos y pongo algunos ejemplos del tipo de gráficas que pueden ayudarnos a visualizar las medidas al momento de explorar la información.

3.-Regresión Lineal, un ejemplo sencillo.

Esta técnica es muy sencilla de implementar y los datos que nos regresa el comando en R debe ser entendidos para poder evaluar la calidad del resultado obtenido. Omito detalles formales del tema y comparto algunos ejemplos de regresiones simples y múltiples. Es un tema con muchos detalles importantes, por ejemplo la revisión de las posibles fallas al construir un modelo lineal o multilineal. No toco mucho  esos temas, pero en las referencias pueden encontrar observaciones y técnicas para conocer más al respecto.

4.-Regresión no lineal, Cross-Validation y Regularization. 

Los tres temas pueden haber requerido una entrada para cada uno, pero funciona bien mostrar como se relacionan. El objetivo es mostrar la implementación de la regresión no lineal y validar que el modelo elegido es el adecuado, para evitar la sobre estimación de los datos. En esto último las cross-validation y la regularización ayudan a tener un método para hacer una elección del modelo. Se dan algunos ejemplos del uso de los tres conceptos y técnicas.

5.-Clasificación binaria….Naive Bayes. 

Es uno de los algoritmos más usados por sencillo y por que puede ser modificado para tener una clasificación rápida en varias categorías. Doy el ejemplo clásico sobre detección de Spam y trato de complementarlo con el uso de una librería en la cual se cuenta con una función para estimar el modelo. Agregué una pequeña explicación sobre la probabilidad condicional y sobre el uso de la librería tm para analizar textos en R project. Espero ser claro y que permita comprenderse el ejemplo.

6.-Análisis de Cluster, un ejemplo sencillo. 

Se explica de modo breve como funciona la detección de Clusters. Como el tema requiere hacer uso de la noción de distancia o métrica, trato de explicar el concepto. Omití mucho material, sobre todo en el uso de distintas métricas para distintos tipos de variables.

7.-Un ejemplo sencillo sobre Análisis de Componentes Principales (PCA, Principal Component Analysis).

La técnica es muy usada y conocida para hacer reducción de dimensiones, explico qué es reducir dimensiones y como interpretar los resultado de la técnica. Como ejemplo principal hago una reducción de 25 indicadores para formar uno que resuma la información del resto. Replico un ejemplo de análisis de la digitalización de los números escritos a mano, este es un ejemplo clásico y la base de datos fue objeto de estudio para comparar técnicas de clasificación.

8.-Sobre sistemas de recomendación, ejemplo sencillo. 

Hago un breve ejemplos de un sistema de recomendación usando la técnica de k-vecinos cercanos (K-nn), esta técnica es no-paramétrica. Para ejemplificar como funciona pongo un ejemplo inicial y trato de explicar qué realiza el algoritmo y aplicarlo a un caso concreto. Los sistemas de recomendación prácticamente dan la libertad de elegir la técnica de clasificación que uno considere adecuada para el tipo de datos o servicio, por lo cual existen libertad de replicar este ejemplo haciendo uso de otro técnicas de clasificación.

9.-Optimización.

Esta entrada creo que es extensa y puede ser un poco amplia,ya que traté de explicar desde aspectos básicos de mínimo y máximos hasta algoritmo estocásticos y genéticos. Puse un ejemplo de como usar el código y en los casos más sofisticados, la parte estocástica, comparto un ejemplo que permitiera comparar los resultado obtenidos con diversos tipos de algoritmos, no puse los tiempos que tardan en dar la solución pero en caso de replicarlos será notorio el costo del procesamiento.

10.-Máquina de soporte Vectorial (SVM-Sopport Vector Machine).

La técnica sumamente usada y funciona bien para datos no-lineales, se dan varios ejemplos de como usar dos librerías que permiten calcular SVM con distintos kernels. En uno de los ejemplos de hace la comparación de varios modelos para determinar por medio de MSE cual es el mejor. Son ejemplos muy sencillos y trato de agregar explicaciones a cada ejemplo.

Lo que no está aún en estas entradas, pero que estará en inicio de Marzo 2016.

Dejé fuera por el momento varios temas fuera de las entradas, ejemplo Redes neuronales , Arboles de decisión, Random Forests, AdaBoost. Espero posteriormente agregar entradas sobre esos algoritmos.

En general todos las entradas tratan de simplificar y resumir lo que se puede encontrar en el texto  “Machine Learning for Hackers“, libro escrito por Jhon M. White y Drew Conway. Si bien, el libro en si es sencillo y requiere un bajo nivel de matemáticas para estudiarse, traté de hacer más sencillas las explicaciones y de complementarlo con otros ejemplos.

La recomendación es complementar las explicaciones de las entradas con la lectura del texto.  Jhon M White compartió su código  y datos usados en los ejemplos en el repositorio Github y pueden descargar el código presionando estas letras en rojo.

Algunos de los códigos deben de revisarse ya que las librerías que usaron en el año de la edición del texto ya fueron actualizadas, por lo cual es generan algunos errores.

Dos temas que vienen en el texto y decidí omitir son generación de un rango y análisis de redes sociales o de grafos. En otro momento comparto ejemplos respecto al tema.

El segundo es sumamente interesante; análisis de redes sociales, pero el código con el que cuenta el texto ya no es funcional. Así que se requiere rehacer buena parte del código y diseñar nuevos ejemplos, para eso se necesita cierto tiempo. Más aún debido al boom de las redes sociales existen otro tipo de herramientas sobre las cuales se puede escribir.

Para tener una idea de lo nuevo e interesante se pueden consultar las siguientes ligas para echar un vistazo:

Deseo que el material que se encuentra en esta categoría les sea útil y sobre todo les deje con ganas de aprender más al respecto y no solo desde el lado aplicado, sino también desde el lado teórico.

En la siguiente cita aplique “instrumento= algoritmo”.

“Tienes que aprender a tocar tu instrumento. Después debes practicar, practicar y practicar. Y después, cuando finalmente estás en el escenario, olvídalo todo y ulula.” Charlie Parker

 Nota: Todas las críticas y comentarios respecto a las entradas son bienvenidos.
Anuncios

Análisis Confirmatorio vs Exploratorio

Análisis Exploración….¿qué es eso? 

La idea de la exploración de datos es tal cual lo que su nombre indica, es buscar cosas entre los datos.

Inicialmente uno entra a esa selva de datos y paso a paso va siguiendo algún camino o haciendo uno nuevo, cada pequeño avance nos va dando pistas del lugar en el que estamos, y poco a poco nosotros como exploradores vamos entendiendo como es esa selva. La idea creo que es parecida a jugar a descubrir cosas desde los datos. Lo que se intenta es tomar la información y tratar de encontrar algún indicio de algo que puede “servirnos”. Pero, ¿qué es “servirnos”?,¿qué buscamos?,¿para qué queremos entender esa selva?

Puede parecer absurdo, pero un paso clave antes de explorar la información es conocer un poco sobre su origen, el tipo de datos, la cantidad de ellos y cómo se generan. Hacer este tipo de indagación antes de procesarla y explorarla nos puede ayudar a no caer en falsos “descubrimientos”.

Ejemplo; si uno tiene información de las votaciones por casillas y una casilla muestra un comportamiento “anómalo” con respecto al resto, uno puede tratar de explorar la información en busca de una “explicación” solo desde los datos. En ese caso si uno “contextualiza” o revisar el lugar dónde se encontraba la casilla cuando se realizaba la votación, quizás esto puede explicar su anomalía. Ejemplo, si estaba localizada en la sede de uno de los candidatos es probable que explique porque contenía solo votos de él o si se sabe que la localidad es corrupta uno puedo sospechar que todos estaban de acuerdo en votar por un candidato.

Puede parecer que la exploración de datos es algo poco sofisticado, hacer una gráfica no parece ser lo más difícil cuando uno tiene datos de asistencia de los alumnos de una clase de matemáticas en una preparatoria , o el valor de una moneda contra el dolar durante 100 días, o el registro de lo que compran en el supermercado 50 personas el mismo día. Eso no parece un gran problema. Pero cuando uno  tienen “mucha información”, como todas las publicaciones de los Mexicanos en facebook en dos años, o las transacciones de todos los clientes de un banco, o de todas las consultas que se hacen en Google por año (que son actualmente 1.2 trillones de búsquedas); esa cantidad de información ya no resulta tan fácil de pensar en cómo graficarla o cómo empezar a explorarla.

Revisando un poco de historia, Jhon Tukey en el año 1977 publica su libro sobre “Exploración de datos”, mucho años antes de que tuviéramos computadoras personales con la potencia de gráficos que ahora tenemos. En su libro resaltaba que era fundamental el diseñar herramientas simples para realizar una exploración de los datos antes de proceder a construir un modelo o aplicar alguna técnica inferencial. Hace una distinción entre el análisis confirmatorio y el análisis exploratorio, de manera general uno pude pensar que el confirmatorio es un modo deductivo de estudiar los datos y el exploratorio un modo inductivo. Es decir, en el confirmatorio se platea validar una hipótesis, probar una “ley” o algo que explica de manera general el comportamiento de todos los datos analizados. En el exploratorio se busca ir de lo particular a lo general, de unas cuantas variables, de calcular algunas cosas o  hacer ejercicios gráficos  de donde se puede ir concluyendo el comportamiento global de los datos.

En el exploratorio, uno debe tener duda de lo que su mente deduce desde algún gráfico o técnica de visualización, no se debe de concluir inmediatamente solo confiando en los que “vemos”, en lugar de eso uno debe de plantear algunas preguntas, ir mejorando la calidad de la exploración y posteriormente poner a prueba nuestras hipótesis por medio del análisis confirmatorio.

Pero antes de compartir algunos ejemplos de exploraciones, es bueno tener claro a qué me referimos cuando digo “datos”. Ahora que la palabra Big Data o Data Sciences está en boca de todos, se tienen ideas intuitivas de que siempre estamos generando “datos”, ejemplo; cuando publicamos algo en nuestro muro de facebook, cuando subimos algún vídeo, cuando mandamos algún e-mail, cuando enviamos un mensaje a través de una app, cuando hacemos alguna llamada, cuando elegimos alguna película por medio de una plataforma en internet, cuando realizamos alguna búsqueda en google, bing o yahoo. No es falso, efectivamente en cada uno de los casos anteriores  generan datos.

Lo que me parece que imaginamos como “datos” en general es un puñado de números o cifras. Pero no piensa que también lo son los vídeos, mensajes de texto, cadenas alfanuméricas o imágenes.

Lo fundamental es que desde cualquier tipo de dato se pueda obtener información cuantitativa, aunque solo nos parezca que nuestra información es cualitativa, que a primera vista nos parece poco natural como analizar los mensajes de texto, email o fotos.

Con esta explicación trato de decir que siempre se tiene una noción clara de como calcular la media de una colección de números, pero no es claro como asignar algún valor a un texto. Sin embargo, para muchos tipos de datos existen herramientas o métodos de procesamientos por medio de los cuales se pueden explorar y analizar, pero siempre es posible diseñar un nuevo método o indicador.

Ejemplo, en un texto se puede pensar en analizar la frecuencia de las palabras, la longitud de las oraciones, la hora de emisión de texto, compararlo contra otro y poco a poco establecer un modo para clasificar.

Otro problema común es el saber cómo asignar un tipo de distribución a una colección de datos, en ocasiones se asigna alguna conocida debido a que se creé “entender” cual es el proceso que genera esos datos. En algunos casos funciona  bien ese método, ejemplo la distribución de Poisson para modelar las llegadas a la fila del banco o la atención de llamadas telefónicas a un call center. Pero en la mayoría de los casos no es claro qué distribución tiene la información, así que parte importante de la exploración es tener técnicas para encontrar algunas posibles y después ir validando las candidatas con los datos que se  tienen.

Ahora si, Machine Learning y Análisis Exploratorio

Buena parte de las técnicas de Machine Learning (ML) son exploratorias o tienen algo de ello. Entre la clasificaciones de técnicas de ML a las que se refieren como aprendizaje no supervisado, prácticamente puede ser pensado como análisis exploratorio.

Un concepto clave de lo que son los “datos”  para R project, es lo que se llama “matriz” o arreglo bidimensional. En general es como se ordena la información. Entonces se tienen columnas que serán las variables asignadas a cada uno de los elementos de estudio, que están nombrados y ordenados en las filas de la matriz. Ejemplo, en la columna se puede tener las variables: peso, altura, edad, ancho de espalda, ancho de cintura, etc. En las filas, se tienen ordenado como: persona 1, persona 2, persona 3, etc.

Lo anterior, es en la práctica lo deseable. Pero es común que la información no este bien ordenada ni limpia. Por lo cual es importante revisarla, tenerla ordenada antes de iniciar la exploración, eso permite ir conociendo el tipo de datos, el origen y las variables.

Para replicar el primer ejemplo se deben de trasladar por medio de R ( o R Studio) al directorio donde se encuentran los datos o desde la consola de R pasar al directorio correspondiente. Para replicar el ejemplo, supongo que se descargaron los datos del texto Machine Learning for Hackers que se encuentran en GitHub.

#Abrimos los datos
data.file<-file.path("data","01_heights_weights_genders.csv")
heights.weights<-read.csv(data.file)

Esto se puede hacer de otro modo, si solo se cambia uno de directorio. Todo lo hago pensando en que se usa la consola de R project, ya que creo que es base conocerla y después de eso usar R Studio no genera mayor problema.

#Cargamos los datos
heights.weights<-read.csv(01_heights_weights_genders.csv)
head(heights.weghts)

Hago ahora uso de un simple comando para conocer aspectos de los datos, summary, por el cual se obtiene un resumen de la información de las columnas. En el ejemplo se tiene:

  Gender         Height          Weight     
 Female:5000   Min.   :54.26   Min.   : 64.7  
 Male  :5000   1st Qu.:63.51   1st Qu.:135.8  
               Median :66.32   Median :161.2  
               Mean   :66.37   Mean   :161.4  
               3rd Qu.:69.17   3rd Qu.:187.2  
               Max.   :79.00   Max.   :270.0  

En caso de que se tengan bastantes columnas y solo se tiene interés en algunas de ellas, se puede extraer la información con la función with del siguiente modo:

#Elegimos la columna Height
heights<-with(heights.weights),Height)
summary(heights)

En caso de no conocer el nombre de la columna, se puede usar la función head, para ver los nombres antes de extraer la información.

Con summary, se obtendrá el valor de la media, del máximo, del mínimo y la media. Pero se puede calcular directamente el valor del  máximo, el mínimo y le media, con las funciones mean,max,min, aplicadas a la columna de datos “heights”.

Para tener claro que tipo de cosa se busca revisar y con qué funciones, se puede clasificar la exploración en:

  1. Medidas de Localización
  2. Medidas de Dispersión
  3. Medidas de Forma

Medidas de Localización

Entre estas medidas se consideran el calculo de la media, del mínimo, del máximo, la moda, los cuantiles.

Medidas de Dispersión

Entre estas se consideran el rango de intercuantiles, el rango de los datos, la varianza y la desviación estándar.

Medidas de forma

Estas medidas son la asimetría y la kurtosis.

Para cada una de estas medidas se tienen un comando o función en R.

#Medidas de localización para Height
mean(heights)
# Vale la pena revisar los parámetros que se pueden manipular para la siguiente función, así podemos definir los rangos que deseamos ver de los cuantiles
quantile(heights)
#El comando summary presenta un resumen 
summary(heights)

Para las medidas de dispersión se cuenta con:

#Medidas de disperción para Height
range(heights)
IQR(heights)
var(heights)
sd(heights)

Para las medidas de forma uso la librería “e1071“, para lo cual se debe de instalar ya que no está por default en R.

#Medidas de forma para Height
library(e1071)
#También se puede usar la librería moments
skewness(heights)
kurtosis(heights)

Los anteriores conceptos, sobre todo las funciones en R, pueden resultar poco alentadoras para dar idea de como se comportan los datos y si es primera vez con estas cosas, resultan poco claro lo que se hace. La ventaja de R es que cuenta con una gran cantidad de gráficas que permiten entender mejor los conceptos anteriores.

Algunas gráficas en R project para explorar datos

Entre los gráficos más usados para explorar una variable se encuentra el  histograma, la función hist permite obtener el gráfico y cuenta con varios parámetros los cuales pueden ser consultados en el menú de R.

#Construcción del histograma
hist(heights,nclass=20, main="Histograma de las Alturas", xlab="alturas",ylab="Frecuencias", col="red")

Histograma

Se puede conocer un aproximado de la densidad de nuestros datos, en R se puede calcular con la función density.

#Construcción de una gráfica de densidad
plot(density(heights), main="Densidad", xlab="alturas",ylab="Densidad estimada", col="red",type="p")

Densidad
Para mayor conocimiento de las funciones density y plot  recomiendo consultar el menú de R y probar como se pueden modificar detalles como los títulos o agregar otra gráfica. Se puede hacer otro ejemplo con la función plot , para ver la relación entre dos variables de datos hago el ejemplo con pesos(weights) y alturas(heights).

#Construcción de un gráfico con las dos variables
plot(heights,weights, main="Gráfica entre las dos variables", xlab="Alturas",ylab="Pesos", col="green",type="p")

Plot_de_pesos_y_alturas

Un gráfico que me parece importante para explorar las variables y poder estimar distribución de los datos, se construye usando la función ecdf. Esto permite ajustar mediante alguna curva los valores estimados de la distribución y principalmente cuando las colas de las distribuciones presentan cierto comportamiento, les llaman distribuciones de colas pesadas.

#Exploración de la cola de la distribución
f<-ecdf(heights)
range(heights)
[1] 54.26313 78.99874
ttx}) estimada", xlab="Valores de Height", col="6",log="y",type="p")

Colas_de_las_dist

En particular la paquetería de R para gráficos es bastante buena, usando la función layout uno puede construir gráficos más elaborados. Un ejemplo es el siguiente, del cual no explico detalles del código pero pueden consultarse en el manual de R.

#Construcción de gráfico con histogramas marginales
x <- pmin(3, pmax(-3, rnorm(200)))
y <- pmin(3, pmax(-3, rnorm(200)))
xhist <- hist(x, breaks=seq(-3,3,0.5), plot=FALSE)
yhist <- hist(y, breaks=seq(-3,3,0.5),plot=FALSE)
top <- max(c(xhist$counts, yhist$counts))
xrange <- c(-3,3)
yrange <- c(-3,3)
b<-matrix(c(2,0,1,3),2,2,byrow=TRUE)
nf <- layout(b, widths=c(3,1), heights=c(1,3), respect=TRUE)
par(mar=c(4,4,1,1))
plot(x, y, xlim=xrange, ylim=yrange, xlab="x", ylab="y",type="p")
par(mar=c(0,4,1,1))
barplot(xhist$counts,axes=FALSE, ylim=c(0, top), space=0,col="2")
title(main='Scatterplot con histogramas marginales',font=2)
par(mar=c(4,0,1,1))
barplot(yhist$counts, axes=FALSE, xlim=c(0, top),space=0, horiz=TRUE,col="3")

Gráfico_con_layout

Pese a que los gráficos que se tienen por default son buenos, también existen librerías que tratan de mejorar la presentación y manipulación de datos. En breve habla de ggplot, la cual es una librería que no solo está para R project, también existe para Python y es muy recomendable aprender a manipularla, ya que tiene ventajas por que permite ahorrar el proceso de manipular los datos y los gráficos son bastante agradables. En general la librería es bastante madura y cuenta ya con buenas referencias para su aprendizaje.

#Construcción de un histograma con ggplot
ggplot(heights.weights, aes(x = Height)) + geom_histogram(col="2")

ggplot_hist

Al inicio al escribir una gráfica en ggplot parece demasiado enredado comparado con poner solo un comando. Pero con la práctica se empieza hacer notar que además de que la calidad de los gráficos es mejor, se puede diseñar gráficos mucho mas agradables y se tienen mucha libertad para poderlos modificar.

Ejemplo, para revisar las densidades de las alturas con respecto a los géneros resulta mucho más sencillo hacerlo mediante la siguiente indicación.

#Construcción de gráfico de las densidades por género
ggplot(heights.weights, aes(x = Height, fill = Gender)) + geom_density() + facet_grid(Gender ~ .)
ggplot(heights.weights, aes(x = Height, fill = Gender)) + geom_density()

ggplot_densidad_de_h

ggplot_Heights_for_g

Para hacer una gráfica de las alturas vs los pesos, se requiere solo la siguiente línea y además se agrega la tendencia.

#Construcción de gráfica scatterplot
ggplot(heights.weights, aes(x = Height, y = Weight)) + geom_point() + geom_smooth()

ggplot_scatterplot_HW_tendencia

Como muchas técnicas de Machine Learning son para clasificar, un ejemplo sencillo que se pueden hacer es el distinguir las poblaciones por género y buscar la “mejor”  línea que límite esos datos.

#Transformamos los datos para analizar como se comporta y graficamos la recta que divide a entre géneros

#Primero transformamos los datos
heights.weights <- transform(heights.weights,Male = ifelse(Gender == 'Male', 1, 0))
#Ahora claculamos una regresión lineal general
logit.model <- glm(Male ~ Weight + Height,data = heights.weights,family = binomial(link = 'logit'))
#Por último contruimos el gráfico
ggplot(heights.weights, aes(x = Height, y = Weight)) +
  geom_point(aes(color = Gender, alpha = 0.25)) +
  scale_alpha(guide = "none") + 
  scale_color_manual(values = c("Male" = "black", "Female" = "blue")) +
  theme_bw() +
  stat_abline(intercept = -coef(logit.model)[1] / coef(logit.model)[2],
              slope = - coef(logit.model)[3] / coef(logit.model)[2],
              geom = 'abline',
              color = 'red')



ggplot_HW_plano_separador

 Una observación que es crucial en la exploración de datos, es que en ocasiones se requiere que se “transformen”. Con eso quiero decir que si se tiene una gráfica como la anterior, pero donde el rango de los datos en el eje X es muy grande, es posible que sustituyendo los datos originales por su logaritmo se pueden estudiar de modo más “cómodo”. Pero cuando se transforman los datos o se usa alguna transformación, es recomendable considerar que dicha función respete el orden en el cual tienen los datos,  que sea continua y hasta cierto punto “suave”, que tenga sus derivadas. Esto es quizás técnico, pero es importante tenerlo en cuenta.

Espero la entrada sirva para tener una idea general de lo que es la exploración, en buena medida muchas de las técnicas más avanzadas, que van desde generalizaciones de Análisis de Componentes Principales hasta la Homología Persistente  y variedades de aprendizaje son técnicas exploratorias, requieren cierto conocimiento de lo que se hace para que sea fácil la  interpretación de sus resultados y conocer en qué situación es recomendable usar cada técnica.

Referencias:

1.-http://www.amazon.es/Exploratory-Analysis-Edition-Chapman-Computer/dp/1439812209

2.-http://www.amazon.com/ggplot2-Elegant-Graphics-Data-Analysis-ebook/dp/B0041KLFRW

3.-http://www.amazon.com.mx/Introductory-Beginners-Visualisation-Statistical-Programming-ebook/dp/B00BU34QTM

4.-http://www.amazon.es/Graphics-Second-Edition-Chapman-Series/dp/1439831769

5.-http://www.r-bloggers.com/