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/

Anuncios

2 comentarios sobre “Análisis Confirmatorio vs Exploratorio

Responder

Por favor, inicia sesión con uno de estos métodos para publicar tu comentario:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s