Latex

domingo, 29 de mayo de 2011

Análisis de Exploratorio de Datos (EDA) - 2

Exploración de información bivariada

La examinación de patrones y relaciones es tema central para la estadística. El diagrama de dispersión (scatterplot) es una herramienta simple de examinación de datos apareados que hasta nuestros días no ha perdido su importancia.

El siguiente ejemplo lo extraje de la librería R DAAG (para instalarla, ejecutar install.packages("DAAG") y luego library(DAAG). Más información de esta librería aquí).
2 tipos de leche fueron catadas por 17 personas. Un tipo de leche tiene agregado una medida de edulcorante y la otra cuatro medidas. Los catadores deben hallar la medida de edulcorante.

Los 17 resultados son:

-> milk

  four one
1  7.2 5.8
2  7.4 6.9
3  7.0 6.0
4  7.2 6.0
5  4.6 5.4
6  6.0 5.7
7  5.0 6.1
8  4.2 3.7
9  3.8 3.8
10 6.1 4.3
11 3.7 3.4
12 3.9 1.4
13 2.5 1.7
14 4.4 5.4
15 4.2 3.2
16 4.6 2.2
17 5.6 3.6
 
La relación entre pares  puede apreciarse con un gráfico de dispersión
 
xyrange <- range(milk) #rango de valores

plot(four ~ one,data=milk,xlim=xyrange,ylim=xyrange,pch=16)
 
Las siguientes instrucciones agregan puntos de referencia de los puntos muestrales junto a los ejes cartesianos y una recta de 45 grados.
 
rug(milk$one ,side=1) #regla de valores en el eje x

rug(milk$four,side=2) #regla de valores en el eje y
abline(0,1) #recta de 45 grados

Ajuste de una curva

La puntuación dada por los catadores está claramente influenciada por su paladar, y parace que no hallan diferencias entre ambas (no al menos de ser un alecha 4 veces más dulce que la otra).
Para formalizar un poco más la relción hallada, se recurre a trazar una curva o recta de regresión entre los puntos datos. Existen para ellos varios algoritmos, entre ellos el más conocido es la recta de regresión lineal por mínimos cuadrados. En el siguiente gráfico presentamos este método (rojo) y otro más sofisticado (Regresión polinómica local) (verde) para apreciar diferentes resultados, aunque, para este ejemplo, iguales conclusiones.

Código R:
xyrange <- range(milk)

plot(four~one,data=milk,xlim=xyrange,ylim=xyrange,pch=16)
rug(milk$one ,side=1) #regla de valores en el eje x

rug(milk$four,side=2) #regla de valores en el eje y
fit <- lm(milk$four~milk$one)                   
abline(0,1) #recta de 45 grados
lines(fit$fitted.values ~ milk$one,lwd=2, col=2) #regresión mínimos cuadrados
lines(lowess(milk$one,milk$four),lwd=2,col=3)  #regresión polinòmica local

sábado, 28 de mayo de 2011

Análisis de Exploratorio de Datos (EDA)

El análisis exploratorio de datos consiste en un conjunto de técnicas que describen provisionalmente los datos recogidos. Se intenta de esta forma hacerlos hablar por sí mismos antes de comenzar un análisis formal. El término "Exploratory Data Analysis" (EDA), pertenece a John Tukey, con su libro de 1977 "Análisis exploratorio de datos".

Un análisis efectivo de EDA presenta los datos de tal manera que permite al cerebro humano detectar patrones. EDA permitiría:
  • Ayudar al razonamiento inductivo para sugerir ideas.
  • Desarrollar y comprender aspectos teóricos
  • Facilitar la validación de supuestos
  • Hallar conclusiones adicionales al objetivo primario
El conjunto de herramientas disponibles es muy variado, e incluso creciente con los continuos avances en técnicas de presentación de datos que ofrece la informática. Los principales gráficos son:
  • histogramas y funciones de densidad
  • gráficos de árbol (steam and leaf)
  • diagramas de cajas (boxes)
  • diagramas de dispersión
  • mapas de calor
  • diagramas de nodos (trellis diagram)
Vistas de una variable simple
Histograma
Permite observar la cantidad de observaciones en diferentes intervalos de la variable. Se presenta en forma de gráfico de barras.

El histograma permite responder las siguientes preguntas:

  1. ¿Qué tipo de distribución tienen los datos?
  2. ¿Dentro de que rango se localizan la mayoría de los datos?
  3. ¿Qué tan dispersos se encuentran los datos?
  4. ¿Existe asimetría?
  5. ¿Existen Outliers?

Por ejemplo,el siguiente gráfico muestra el nivel en metros de las crecidas del río Nilo durante el período 1871-1970:

Código R:
hist(Nile,breaks=400 + (0:20)*50,col=terrain.colors(2), main="corrientes del Nilo (1871-1970)",xlab="Crecidas en mts", ylab="Frecuencia")


Para obtener los números de clases (columnas), existen varios criterios sugestivos, como tomar la raiz cuadrada del número de observaciones o tomar la regla de Sturgess (c = 1 + log2N). Sin embargo ninguno de ellos es exacto ni de necesaria aplicación. Tampoco las clases deben ser de igual longitud.

Todo depende de lo que se quiera ver. A mi entender, el histograma debe construirse de tal manera que no oculte rasgos esenciales de la muestra.

Así por ejemplo se da en la construcción de histogramas para monto de siniestros: suele existir una gran cantidad de siniestros de valor $ 0. En dicho caso es conveniente graficar la primer columna con este único valor ($0) y luego elegir un esquema de distribución según la magnitud de los siniestros. Inclusive, si el 5-10% de los siniestros más grandes serían muy dispares del resto, convendría agruparlos todos en le último escalón del histograma y enumerarlos debajo para advertir al lector sobre su ubicación y valor.


Funciones de densidad


Al intentar parametrizar un fenómeno, suele estarse interesado en hallar su función de densidad. Para ello se grafica inicialmente el histograma.

Lo primero en que se puede pensar es que la función de densidad es la normalización del histograma por el tamaño de la muestra N. La división de las clases por N nos mostrará un set de probabilidades discretas, aún así se tienen inconvenientes con la forma de la distribución si es que las clases no son equidistantes y de base = 1.

Una primera forma de solucionarlo es tomando en cuenta la longitud de cada clase, de manera tal que el área del histograma sea igual a 1.

Aunque también es válido obtener una función de densidad empírica a través del suavizamiento del histograma. Los métodos de suavizamiento son variados, desde una media móvil de N muestras hasta procedimientos más avanzados. El uso de diferentes ventanas Kernel podría darnos el siguiente resultado:
 
Código R: 
hist(Nile,breaks=400 + (0:20)*50,col=terrain.colors(2), main="corrientes del Nilo (1871-1970)",xlab="Crecidas en mts", ylab="Frecuencia", probability = TRUE)

densRct <- density(Nile, kernel="rectangular")
lines(densRct,col="red",lwd=2)
densGauss <- density(Nile, kernel="gaussian")
lines(densGauss,col="blue",lwd=2)
densRctx2 <- density(Nile, kernel="rectangular", adjust=2)
lines(densRctx2,col="red",lwd=4)
densGaussx0.5 <- density(Nile, kernel="gaussian", adjust=0.5)
lines(densGaussx0.5,col="blue",lwd=1)


Se graficaron 4 suavizamientos. En rojo tenemos el uso de una ventan rectangular, siendo la línea gruesa una ventana más ancha (por eso sale más suavizada y chata).
En azul se grafican dos líneas que utilizan una ventana gaussiana (asume que cada punto muestral se distribuye normalmente). Estas últimas tienen la ventaja de "mezclar" mejor la contribución de cada observación a las observaciones adyacentes.
Podemos apreciar que según el método de suavizamiento se utilice, los resultados pueden variar. Esta es la principal desventaja del suavizamiento. Aunque es de mencionar que similares deformaciones se producen al elegir el ancho de las columnas del histograma.

Diagramas de árbol (Steam and Leaf)

Estos diagramas son una forma también rápida de visualizar una muestra. Posee las mismas características que un histaograma, aunque se concentra más en el contenido de las columnas que en su forma.
Se trata de un ordenamiento de una variable numérica que tine como tamaño de grupo al cociente entre el tamaño de la muestra y la cantidad de "ramas" (Steam) que se quiere utilizar. Como "hojas" del árbol (Leafs), se tiene el residuo de cada observaciòn al realizarse la división entera entre tamaño de muestra y ramas.

Por ejemplo, continuando el ejemplo de las inundaciones producidas por el Nilo, tenemos el siguiente diagrama de árbol de 13 ramas (ancho = 100):

> stem(Nile)
 
The decimal point is 2 digit(s) to the right of the |
   4 | 6
   5 |
   6 | 5899
   7 | 000123444455667778
   8 | 000011222233344555556667779
   9 | 0011222244466678899
  10 | 0122234455
  11 | 00012244566678
  12 | 112356
  13 | 7


La primera observación es 400 + 60 = 460. En el séptimo grupo, puede apreciarse una concentración de valores a izquierda: contiene 10 valores (1 de valor 1000 + 0 =1000, 1 de valor 1000 + 10 =1010, 3 de valor 1000 + 20 =1020, 1 de valor 1000 + 30 =1030, 2 de valor 1000 + 40 =1040, 2 de valor 1000 + 50 =1050), en el rango 1000-1050, peor ninguno en su extremo derecho 1050-1100.

Si se hubiera reducido la cantidad de ramas  a 5, obtendríamos:

stem(Nile,scale=5/10)
 
The decimal point is 2 digit(s) to the right of the |
   4 | 6
   6 | 5899000123444455667778
   8 | 0000112222333445555566677790011222244466678899
  10 | 012223445500012244566678
  12 | 1123567



Diagramas de cajas

Los diagramas de cajas permiten visualizar aspectos importantes de la muestra con una cantidad reducida de datos.
La "caja" contendrá la mitad de los datos centrales (datos entre percentiles 25 y 75); una línea (mediana o percentil 50) la dividirá. Dos líneas saldrán  a los costados de las cajas (denominados habitualmente "whiskers" o bigotes); estas mostrarán el rango de la muestra. Al realizarse el diseño, los programas ya dejan afuera los casos que consideran extraños por estar alejados del resto de las observaciones (habitualmente se toman tres rangos intercuatílicos (percentil 75 - percentil 25) * 3 ).

Por ejemplo, el diagrama de cajas que nos toca con el ejemplo dado es el siguiente:

Código R:
boxplot(Nile, col = "orange", horizontal = TRUE, main="Corrientes del Nilo (1871-1970)", xlab="crecidas en mts")
Con el diagrama de cajas puede apreciarse una distribución bastante simétrica, que está en línea con lo observado en el histograma.