RPIC Estudiantil 2005, Río Cuarto, 21 al 23 de septiembre de 2005 Librerías para el análisis exploratorio de datos con ENVI-IDL Adrian E. Muract†, Damian E. Nadales†, Asesores: Susana Ferrero‡ y Elsa Moschetti‡ †Dpto. de Computación, Fac. Cs. Exactas,U.N.R.C. adrian_muract@yahoo.com.ar dnadales@dc.exa.unrc.edu.ar ‡Dpto. de Matemática, Fac. Cs. Exactas,U.N.R.C. sferrero@exa.unrc.edu.ar emoschetti@exa.unrc.edu.ar Resumen— ENVI-IDL es un software que permite la manipulación digital de datos provenientes de imágenes satelitales, como así también su visualización. Sin embargo, no cuenta con todas las herramientas para realizar un análisis estadístico descriptivo completo de la matriz de datos que representan a las imágenes. En este trabajo se presenta la documentación referida a la implementación de una serie de programas destinados a cubrir estas falencias, los cuales fueron organizados en una librería. Palabras Clave— Librería- Estadística descriptivaENVI-IDL. I. INTRODUCCIÓN Las diferentes cubiertas de la superficie terrestre (campos cultivados, roca desnuda, agua) reflejan la radiación electromagnética (REM) que les llega desde el sol, con distintas intensidades o niveles digitales (ND) de acuerdo a la región del espectro (banda espectral). Los datos son adquiridos en soporte digital y en formato numérico (ND) para cada elemento de la superficie y para cada banda. Esto abre un gran campo para la aplicación de la estadística a las ciencias de la observación terrestre (Chuvieco, 2002). Desde el punto de vista matemático una imagen multiespectral es una matriz numérica, donde las columnas representan a las bandas espectrales (variables) y las filas el valor digital, ND, que representa las coordenadas geográficas. (Bustos et al. 1998). En la mayoría de las imágenes satelitales comercialmente disponibles a los valores de ND se les puede asignar colores o tonos de gris en función de una determinada paleta o tabla de colores. Estas representaciones forman imágenes cuando se las despliega, con un software adecuado, sobre una pantalla u otro dispositivo de salida. Teniendo presente el carácter matricial de cualquier imagen numérica, se pueden realizar análisis estadísticos para resumir la información contenida en ella. Para describir y resumir cualquier conjunto numérico en primer lugar es conveniente realizar un análisis exploratorio de datos construyendo tablas, gráficos y estadísticos (Moschetti et. al, 2000). El software ENVI-IDL es apropiado y muy utilizado por los usuarios, para la visualización y procesamiento de imágenes. Pero es un lenguaje que no cuenta con todas las herramientas de la estadística descriptiva necesarias para realizar el análisis completo de los datos. En adición ENVI-IDL no tiene procedimientos que permitan cargar en arreglos en memoria principal datos existentes en archivos almacenados en memoria secundaria. Estas carencias funcionales dieron lugar a la implementación de toda aquella funcionalidad necesaria que el software no brindaba. En las secciones siguientes se discute el desarrollo de algoritmos que fueron luego mapeados a programas IDL, de modo de tener las herramientas necesarias para el análisis de datos. II. DESARROLLO A. Carga de datos desde archivos en memoria secundaria Un paso previo al análisis descriptivo es la lectura de los datos. Éstos en la mayoría de los casos se hallan en archivos contenidos en memoria secundaria, organizados en filas y columnas, donde cada columna representa una variable y la fila el conjunto de valores observados para dicha variable. Por tal motivo es necesario cargar cada columna de estos archivos en un arreglo dentro de la memoria principal para luego ser analizado. Como dijimos anteriormente en IDL no existe un procedimiento implementado que permita hacer esto, por lo cual fue necesario resolver el siguiente problema: Dado un archivo conteniendo valores numéricos dispuestos en n columnas, desarrollar un programa en IDL tal que genere una estructura de datos que permita obtener un vector con todos los valores de cualquier columna. Observar que el número de columnas debe estar dado. Esta es una restricción impuesta por IDL, dado que no RPIC Estudiantil 2005, Río Cuarto, 21 al 23 de septiembre de 2005 cuenta con una función sobre punteros a archivos que permita determinar el final de una línea, lo que hubiera posibilitado en el programa dar cuenta del número de columnas. La estructura de datos elegida fue una secuencia de listas implementada con pares de arreglos. Así la función de abstracción abst (Bird, 1998) (Manber,1992) asociada a un par de arreglos, que tiene como dominio el producto cartesiano entre los arreglos de Reales y arreglos de Naturales y como rango, las listas de Reales; esta definida como abst ∈ (<R> r <N>)→[[R]] abst <> Ys = [] abst (Xs, y:Ys) = Xs[(0:y)] : abst (Ys[-(0:y)], Ys) donde y:Ys denota el arreglo (o lista) que tiene como primer elemento a y y como resto Ys ; Xs[(a:b)] es la lista formada por los elementos del arreglo Xs entre los índices a y b sin incluir este último, Xs [-(a:b)] es la lista que contiene todos los elementos del arreglo Xs en el mismo orden, excepto aquellos que se hallen entre los índices a y b sin incluir este último. La razón de elegir listas de listas en lugar de un arreglo bidimensional es porque resulta más adecuada en términos de eficiencia espacial e igualmente eficiente que una representación matricial en términos de eficiencia temporal. El único problema que se plantea en el desarrollo de un algoritmo para la carga de datos es que la lectura de un archivo en IDL es por filas y los datos se hallan agrupados por columnas. A continuación vemos una posible solución. Por simplicidad modelamos un puntero f a un archivo como una función con perfil f ∈ N → N → R, de modo que f i j, representa el elemento que en el archivo se encuentra en la fila i columna j. Luego especificamos un procedimiento vectors_loader, f, n_cols, vs, zs el cual cumple luego de su ejecución (∀ k • k ∈ {0..n_cols-1} ⇒f * k = abst(vs, zs).k) Sea mixed_up el vector resultante de concatenar sucesivamente las filas de f comenzando por la primera. Entonces establecemos la siguiente igualdad f c * = mixed_up [c * n_cols: (c+1) * n_cols - 1] (Ec1) donde f i * ( f * i ) es el vector que resulta de tomar la fila (columna respectivamente) ‘i’ de f . luego deseamos que vs sea un vector tal que preserve f * k = vs[k * n_rows:(k+1) * n_rows-1] donde n_rows es el número de filas del archivo. Así vamos a construir vs a partir de mixed_up. Consideremos (Ec2) fik ={[Ec1]; def []} mixed_up([i * n_cols: (i+1) * n_cols-1])[k] y por otro lado fik ={[Ec2], def []} vs([k * n_rows: (k+1) * n_rows-1])[i] Así queda establecida la siguiente propiedad mixed_up([i * n_cols: (i+1) * n_cols-1])[k] = vs([k * n_rows: (k+1) * n_rows-1])[i] (Ec3) Pero dado que por definición de ‘:’ sabemos que v([a:b])[i] = v [a+i] (Ec4) entonces mixed_up([i * n_cols: (i+1) * n_cols-1])[k] ={[Ec4]} mixed_up[i * n_cols+k] y además vs([k * n_rows: (k+1) * n_rows-1])[i] ={[Ec4]} vs[k * n_rows+i] con lo que finalmente se puede concluir que f i k = mixed_up[i * n_cols+k] = vs[k * n_rows+i] (Ec5) Así una vez que mixed_up haya sido creado tras una lectura secuencial del archivo, sólo restará construir a vs a partir del primero, lo cual puede lograrse recorriendo los índices n_rows * n_cols de f, utilizando la fórmula (Ec5). B. Construcción de Tablas de frecuencias Las Tablas de frecuencias son herramientas muy útiles para resumir la información contenida en un conjunto de datos (Moschetti et.al., 2000). La tabla descripta en este trabajo es la Tabla de Frecuencias Agrupadas, los elementos que la componen son: intervalos (formados por los valores de la variable), frecuencia absoluta (cantidad de valores de la variable que pertenecen a un intervalo determinado), frecuencia relativa (frecuencia absoluta dividida el tamaño de la muestra) y la frecuencia acumulada (suma de las frecuencias absolutas de los valores de variables menores o iguales a un determinado valor). Luego el problema principal es hallar un algoritmo para el cómputo de la función de frecuencia absoluta RPIC Estudiantil 2005, Río Cuarto, 21 al 23 de septiembre de 2005 para un conjunto de datos y una partición en intervalos del mismo. Una vez resuelto, las funciones de frecuencia relativa y frecuencia acumulada son fácilmente calculables a través del primero. Los intervalos construidos son de igual longitud, dada por la fórmula li = (máx(Ds)-mín(Ds))/k siendo k la cantidad de intervalos y Ds un arreglo de datos. De esta manera los primeros k-1 intervalos están determinados como [mín(Ds)+i * li, mín(Ds)+ (i+1) * li), con i ∈ {0..k-2} y el último como [mín(Ds)+ (k-1) * li, mín(Ds)+k * li] Una vez construidos los intervalos se debe resolver el siguiente problema: Determinar la función de frecuencia absoluta para un conjunto de datos Ds, para k intervalos de igual longitud. La función de frecuencia absoluta puede ser especificada como f Ds i = count Ds (λ x|x ∈ [mín(Ds)+(i-1) * li, mín(Ds)+i * li])∨ ( x = máx(Ds) ∧ i=k )) Para hallar un algoritmo tal que permita determinar f se puede utilizar inducción sobre #Xs, (∀Xs • Xs ⊆ Ds). Además vamos a necesitar una generalización de la función anterior: g Ds Xs i = count Xs (λ x|x ∈ [mín(Ds)+(i-1) * li, mín(Ds)+i * li])∨ ( x = máx(Ds) ∧ i=k )) notar que f Ds=g Ds Ds. Así se plantea la siguiente hipótesis inductiva [g, hi] ∀ Xs • Xs ⊆ Ds ∧ #Xs≤ k ⇒ se conoce la función gDs Xs. Caso base (#Xs=0) Es fácil ver que ∀ i ∈ {1..k} • f [] i = 0 ⇒ [g, hi] Etapa inductiva Se asume [g, hi] y se intenta extender la hipótesis de modo de poder determinar g Ds Xs++[x] esto por la manera en la que se definieron los intervalos para Ds y dado que x∈ Ds. (∃ t • t ∈ {1..k-1} ∧ x ∈ [mín(Ds)+(t-1) * li, mín(Ds)+t * li))∨ x = máx(Ds) Luego sólo basta encontrar el intervalo al cual pertenece el valor de variable x. Centremos el rango [mín(Ds), máx(Ds)] en cero para obtener el siguiente hecho (∃ q • q = (x-mín(Ds) div li) ≡{algoritmo de división entera} x-mín(Ds)=q * li+r ∧ 0≤ r < li ⇒{álgebra} q * li ≤ x-mín(Ds) ∧ x-mín(Ds)<(q+1) * li ≡{álgebra} mín(Ds)+q * li ≤ x< mín(Ds) +(q+1) * li ≡{def. [)} x ∈ [mín(Ds)+q * li, mín(Ds) +(q+1) * li) Luego g Ds Xs sólo diferirá de g Ds Xs++[x] en un punto p del rango el cual será • q+1 si x<máx(Ds) • k si x=máx(Ds) De este modo resulta (∀ i • i ∈ {1..n} ⇒ ( i ≠ p ⇒ g Ds Xs++[x] i = g Ds Xs i) ∧ (i = p ⇒ g Ds Xs++[x] i = (g Ds Xs i)+1) ) Con lo que se está en condiciones de dar un algoritmo lineal para el cálculo de la función de frecuencia absoluta, la cual se modeló usando un arreglo en el programa que genera las tablas de frecuencias, cuyo perfil es el siguiente tablas, v, n, show, fi, fa donde al final de la ejecución fi contendrá la función de frecuencia absoluta, fa la de frecuencia acumulada y si show=0 las tablas de frecuencias serán impresas por pantalla. C. Elaboración de Gráficos estadísticos Para poder elaborar los programas que permitieran realizar los gráficos estadísticos fue necesario hallar en IDL las operaciones primitivas del lenguaje para trabajar con éstos. De esta manera, en el desarrollo de los programas se usaron las siguientes primitivas gráficas (Learning IDL, 1997) : • window[,/free][,title=t][,xpos=xp][,ypos=yp] [,xsize=xs][,ysize=ys] el cual permite crear una nueva ventana con un canvas para comenzar el dibujo. El parámetro opcional title indica el título que ha de llevar la ventana; xpos e ypos determinan la posición en la que aparecerá la esquina inferior derecha de la ventana en la pantalla. Si /free no aparece se crea una nueva ventana en el caso de no tener una o se sobrescribe el canvas de la ya existente; si /free aparece se crea una nueva ventana sin importar si ya existe una. El tamaño en píxeles de la ventana se especifica con xsize e ysize. • plots, x, y [,/device][,/continue] RPIC Estudiantil 2005, Río Cuarto, 21 al 23 de septiembre de 2005 este procedimiento permite establecer la posición corriente del puntero virtual de dibujo en el punto (x,y) del canvas de la ventana donde se está dibujando. Si aparece /continue en el gráfico se dibuja una línea desde la posición previa del puntero hasta (x,y). /device indica que la posición (x,y) es relativa al sistema de coordenadas del canvas, el cual aparece dado en píxeles. El siguiente es un procedimiento que coloca en la posición (x,y) del canvas el texto dado por el string st. • xyouts, x, y, st [,/device][,textsize=ts][,orientation=or] El parámetro opcional /device tiene la misma semántica que especificamos antes; textsize indica el tamaño del texto; y orientation la rotación en grados de la línea base del texto en sentido contrario a las agujas del reloj. Estos procedimientos se utilizaron para elaborar programas que permiten generar los gráficos estadísticos “Histograma” “Polígono de Frecuencia Ordinaria” y ”Box Plot”. C.1 Hallando las coordenadas de un punto en un eje. En la realización de los programas que implementan los diferentes gráficos estadísticos se planteó el siguiente problema: Dado un eje cuyo valor mínimo es mn y su valor máximo es mx, tal que a mn le corresponda un punto lwr y a mx el punto upr, y dado un valor x tal que mn≤ x ≤ mx hallar el punto que le corresponde a x. Una fórmula que de solución a este problema surge de considerar los siguientes hechos mx-mn unidades abarcan upr-lwr puntos ⇒{regla de tres simple} 1 unidad abarca (upr-lwr)/(mx-mn) puntos (F1) y dado que la distancia abarcada por un punto entre mn y mx es x - mn unidades ⇒{(F1)} x-mn abarca (x-mn) * (upr-lwr)/(mx-mn) puntos Así x se ubicará en el punto que se halla en x-mn (xmn) * (upr-lwr)/(mx-mn) puntos contando desde lwr, con lo que el punto que le corresponde a x es lwr+ (x-mn) * (upr-lwr)/(mx-mn) C.2 Una escala para el eje Y Para poder dar una escala legible se trabajó con logaritmos utilizando el procedimiento get_log_scale, mn, mx, mv, u, nc donde mn representa el mínimo valor que el eje y deberá cubrir, mx el máximo y en las variable mv se dejará como resultado el mínimo valor del eje y, se asignará en u las unidades que representará cada corte y en nc el número de cortes. En el desarrollo de este procedimiento se buscó que, usando el procedimiento get_ideal_mín, mv cumpliese que mv = 1.25*10(b-1) ∨ 1 mv = 1.5*10(-1) ∨ mv = 2*10(b-1)∨ mv = 2.5*10(b-1) ∨ mv = 3*10(b-1)∨ mv = 4.5*10(b-1)∨ mv = 5*10(b-1) ∨ mv = 5.5*10(b-1) ∨ mv = 6.5*10(b-1) ∨ mv = 7.5*10(b-1)∨ mv = 8.5*10(b-1) siendo b = ceil(log10(mn)), si 0<mn b = ceil(log10(-mn)), si mn<0 La elección de un coeficiente ‘a’ que acompaña al x factor de la forma 10 , se hizo de modo que cumpliese si 0<mn (∀ x • x ∈ Ix ⇒ x*10 b-1 si mn<0 (∀ x • x ∈ Ix ⇒ -(x*10 ≤ a*10 b-1 b-1 ≤ mn) )≤ -(a*10 b-1 )≤ mn) donde Ix = {1.25, 1.5, 2, 2.5, 3, 4.5, 5, 5.5, 6.5, 7.5, 8.5} De este modo, una vez que el valor para mv es determinado, los valores mx y mn son centrados en cero obteniendo el número rmx definido como rmx=mx-mn Luego se eligió nc = 10, y obtenemos u de modo que pueda expresarse como u = 1.25*10(b-1) ∨ 1 u = 1.5*10(-1) ∨ u = 2*10(b-1) ∨ u = 2.5*10(b-1) ∨ u = 3*10(b-1) ∨ u = 4.5*10(b-1) ∨ u = 5*10(b-1) ∨ u = 5.5*10(b-1) ∨ u = 6.5*10(b-1) ∨ u = 7.5*10(b-1) ∨ u = 8.5*10(b-1) siendo b=log10(rmx), de forma tal que u cumpla: (∀ x • x ∈ Ix ⇒ u ≤ x*10(b-1)) ∧ rmx ≤ 10*u C.3 Histograma El histograma es el gráfico utilizado para representar la tabla de distribución de frecuencias agrupadas. El algoritmo para diseñar un histograma se desarrolló a partir de la resolución del siguiente problema: Dado un arreglo Ds, el cual representa un conjunto de datos, un número de intervalos k y una función f la cual representa la frecuencia absoluta de Ds dividido en k intervalos consecutivos de igual longitud, dibujar el histograma. Luego para generar un histograma los siguientes puntos deben ser identificados en la pantalla: al valor máximo representable en el eje y se le asocia el punto (lx, by), al valor mínimo mn (que para el caso del histograma será cero) el punto (lx, ly) en el plano. Mientras que el eje x está limitado en su extremo derecho por el punto (lx, by) y por barIni=lx+c. El valor ‘a’ denota la fórmula (i-1) * lpi+barIni, y ‘b’ es igual a i * lpi+barIni. La localización de estos puntos se muestra en la Fig. 1. El valor lpi es el ancho de cada barra del histograma, donde lpi = (bx-barIni)/n RPIC Estudiantil 2005, Río Cuarto, 21 al 23 de septiembre de 2005 Los valores lx, ly, bx, by, c son constantes, mientras que mx estará determinado de acuerdo a la escala que se elija para el eje y en particular en el programa desarrollado, la función get_log_scale determinará el número de cortes y las unidades que representa cada corte. get_midle_value que genera los cuartiles, y la función put_outliers que grafica los valores que caen fuera de un rango dado, de un conjunto de datos. Una vez obtenidos los valores de los cuartiles (Q1, Q2, Q3 ) y del rango intercuartílico (IQR) resulta sencilla la implementación del programa que realiza un Box Plot como el de la Fig.3 para n muestras cuyo perfil es box_plot, vars, count donde vars es un vector en el que cada muestra estadística se halla colocada al lado de la otra y count[i] representa la longitud de la muestra i-ésima. Figura 1: Localización de puntos para generar un histograma. Finalmente, el valor hfi se determina utilizando la fórmula dada en el parágrafo C.1 de la Sección II. Con los puntos determinados de esta manera es fácil construir el algoritmo propuesto, el cual es implementado mediante el procedimiento make_histogram, data_set, label el que generara un histograma ( como el que se muestra en la Fig 2 ) para el conjunto de datos representados por el vector data_set. La variable label representar’a el titulo del histograma. Figura 2: Ejemplo de un histograma C.4 Box Plot Los elementos necesarios para construir este gráfico (diagrama de cajas) según Mosteller y Tukey (1982), son: los cuartiles (estadísticos de posición), el valor máximo, el mínimo de la muestra, el rango intercuartílico y los outliers Para la implementación del programa que realiza este tipo de gráfico se desarrolló la función Figura 3 : Box Plot simultáneos. C.5 Stem & leaf Éste es un procedimiento semigráfico útil para presentar la información de variables cuantitativas, que permite observar la forma de la distribución como así también la presencia de valores extremos. (Mosteller and Tukey, 1982). De acuerdo al tamaño de la muestra y/o al valor de las frecuencias se puede subdividir el tallo. Para la implementación del algoritmo que realiza el Stem&leaf se realizaron tres funciones las que se detallan a continuación: • stem_1: toma como parámetro un arreglo e imprime el gráfico de tallo y hoja con un tallo sin subdivisión, o sea toma los valores enteros y los imprime, luego seguido a este valor se agregan los valores de hoja entre 0 y 9. • stem_2: toma como parámetro un arreglo e imprime el gráfico con el tallo subdividido en 2, a la primera subdivisión le corresponden valores de hojas entre 0 y 4; a la segunda valores entre 5 y 9. • stem_5: toma como parámetro un arreglo e imprime el gráfico de tallo y hoja con 5 subdivisiones para el tallo, correspondiéndole a cada uno dos valores de hoja (por ejemplo, para el primero, valores de hoja 0 y 1, para el segundo 2 y 3 y así sucesivamente). C.6 Polígono de frecuencias ordinarias Éste es un gráfico muy utilizado para visualizar a qué modelo probabilístico se ajustan los datos de una imagen (Bustos et al. 2000). El elemento principal para generar un polígono de frecuencias es la marca de clase RPIC Estudiantil 2005, Río Cuarto, 21 al 23 de septiembre de 2005 del intervalo (punto medio del intervalo) con su frecuencia correspondiente. Para obtener éste gráfico se modificó el algoritmo que genera un histograma. El cambio que se realizó en éste fue el siguiente: en vez de graficar una barra, se realizó una segmento que uniese la frecuencia correspondiente a la marca de clase del intervalo anterior con la del intervalo siguiente. En el caso del primer intervalo, se creó un intervalo antecesor a éste con frecuencia cero, pudiendo así empezar el polígono desde el eje de las abscisas. En el caso del último intervalo, se agregó un intervalo más con frecuencia cero, pudiendo así terminar el polígono sobre el eje de las abscisas. El procedimiento que implementa el algoritmo para el gráfico del polígono de frecuencia ordinaria (como el de Fig. 4), tiene el siguiente perfil Poligono, vect, n donde vect es el arreglo que contiene el conjunto de datos y n es la cantidad de intervalos. CV(Ds)=(S(Ds)/X(Ds))*100 III. CONCLUSIONES Este trabajo permitió elaborar una serie de librerías apropiadas para realizar un análisis exploratorio de datos completos utilizando ENVI/IDL. La ventaja es que con el mismo software se puede analizar y visualizar las imágenes. Al trabajar con el lenguaje de programación IDL se detectaron algunos problemas, entre ellos se destacan los siguientes: • Punto flotante: Una guarda booleana que involucre una igualdad entre dos variables de este tipo no está garantizada de evaluar a verdadero pese a que los valores que estas contengan sean iguales. (Bustos y Frery) • Orientación a objetos: El paradigma no se halla soportado, pese a lo que expresan lo creadores de ENVI/IDL. • No es escalable: La carencia de una estructura de bloques, y mecanismos adecuados de modularización y abstracción, hacen que este lenguaje no sea adecuado para sistemas de software de mediana complejidad. REFERENCIAS Figura 4: Polígono de Frecuencia Ordinaria D. Estadísticos Los estadísticos son valores de variable típicos que caracterizan a una muestra (Moschetti et al 2000). El software ENVI- IDL calcula algunos de ellos; se implementaron programas para completar el conjunto de estadísticos necesarios para la descripción de la muestra y construcción de algunos gráficos • Para la Mediana Mediana(Ds)=[sort(Ds).floor((#(Ds)-1)/2)+ sort(Ds).ceil((#(Ds)-1)/2)]/2 sort es la función que retorna la secuencia ordenada y Xs.i denota al (i+1)-ésimo elemento de una secuencia Xs. • Para la Moda: x moda Ds ≡ x ∈ Ds ∧ (∀ y ∈ Ds • (count Ds (λ z| z=y))≤(count Ds (λ z| z=y))) donde x moda Ds se lee “x es la moda de Ds”. • Para el Rango: Rango(Ds)=máx(Ds)-mín(Ds) • Para el Rango intercuartílico (IQR) IQR(Ds)=Q3-Q1 donde Q1 y Q3 representan los cuartiles primero y tercero respectivamente. • Para el Coeficiente de variación: (CV) Bird, Richard Introduction to functional programming using Haskell. Prentice Hall. (1998). Bustos O; Ferrero S, Palacio G. “Introducción a la adquisición e interpretación de imágenes de Percepción Remota”. Serie C: Trabajos de Matemática FAMAF. Córdoba 1-25 (1998). Bustos, Oscar H.; Frery, Alejandro C. ; -Moschetti, Elsa E.y-Picco, Mery L. “Modelado y Análisis de imágenes de radar de apertura sintética – una aplicación a datos reales”. Congreso Latinoamericano de Sociedades Estadística. (CLATSE V) 1-10.Buenos Aires (2000). Bustos, Oscar H.; Frery, Alejandro C. “Statistical functions and procedures in IDL 5.6 and 6.0”, Computational Statistics and Data Analysis. (in press) Chuvieco, Emilio Teledetección Ambiental. Editorial Ariel S.A. España.(2002),. ENVI- IDL. The enviroment for vizualizing images "Research System. Inc. USA, http/www.rsinc.com/envi. Learning IDL. IDL Student Versión 5.0. Research System (1997).. Manber, Uddi Introduction to Algorithms. Adisson Wesley. (1992). Moschetti E. , Ferrero S., Palacio G. , Ruiz M. Introducción a la Estadística para la Ciencia de la Vida" Editorial Fundación de la Universidad Nacional de Río Cuarto.(2000). Mosteller F. and Tukey J.Understanding robust and exploratory data analysis.John Wiley & SONS INC. (1982).