Cómo introducir datos en una matriz para su posterior análisis.

Una cosa es escribir un diario en una libreta y otra cosa es recopilar datos que sirvan para un posterior análisis. Esos datos se pueden recoger de muchas maneras y las que normalmente son buenas para el campo (fichas para cada salida de campo u objeto de estudio) o quedan bonitas en un documento (con celdas unidas, por ejemplo) no son buenas para el posterior análisis de los datos. Aquí voy a exponer las nociones básicas de cómo deberían “meterse los datos en el ordenador”.

Si ya están metidos en el ordenador, en el formato que sea: csv, excel, …, la mejor manera es como están. Nunca (o casi nunca) es buena idea retocar los  datos originales ya que este proceso puede (y suele) producir errores que no son subsanables posteriormente.

Es decir, si los datos ya están en algún formato digital, lo mejor es que las modificaciones se hagan ya directamente en el script de importación de datos, de forma que esas modificaciones entren dentro de lo que se llama “Ciencia reproducible” (Rodríguez-Sánchez et al. 2016).

Pero si todavía no has pasado los datos, por favor, lee el resto del post para entender porqué solo hay una forma buena de introducir los datos y cuando no se hace así luego lleva mucho trabajo y tiempo posteriormente (mucho más del que te podrías ahorrar pasando los datos de cualquier manera) para construir la matriz de datos.

La matriz de datos

La matriz de datos ideal debe ser:

  • Única (no siempre es posible, pero debe intentarse).
  • Consistente
  • Rectangular (todas las casillas deberían estar llenas)
  • Las columnas son Variables.
  • Las filas son Observaciones.
  • No debe tener variables obtenidas a partir de cálculos con otras variables de la matriz. Si no puedes evitar la tentación, haz los cálculos en otra hoja de cálculo diferente. Recuerda poner cuales y cómo las has calculado en la leyenda de los datos.
  • No debe tener fórmulas, ni cálculos, ni pre-análisis, en la matriz de datos.
  • No debe haber información en los formatos. Los colores o negritas de las filas o columnas no se exportan.
  • Formato csv, o en su defecto xlsx u ods.

Una cosa importante, NUNCA juntes celdas, ni de la misma fila, ni de la misma columna, en una tabla de datos.

Copias de seguridad

Aunque existen sistemas más o menos automáticos que funcionan bien. Aconsejo guardar todas las versiones de las matrices de datos (no ocupan mucho, sobre todo en csv), cambiando el nombre cada vez que se añade o quita algo. Una forma cómoda de que las diferentes versiones estén ordenadas es utilizando la fecha YYMMDD antes del nombre de los datos.

Por ejemplo, la matriz de datos de árboles,  si ha hubiese hecho el 2 de enero de 2018 se llamaría “180102_arboles.csv”. Si tres días después modifico algo, la guardaría como “180105_arboles.csv”. Así el archivo más actual siempre estará el último (si están ordenados alfabéticamente).

Además conviene tener varias copias en diferentes sitios. Para ello es muy útil utilizar Dropbox, GoogleDrive o Mega. Si necesitas confidencialidad en tus datos asegúrate de cifrarlos antes de subirlos a la nube (que no es más que el ordenador de otra persona, en otro sitio).

Consejo: No tires nunca los datos originales (la libreta) ya que si aparecen cosas extrañas en el análisis, puede ser buena idea revisar si el error está en la transcripción de los datos del papel al ordenador o si había alguna observación extra que no se metió en la tabla.

Matriz de datos única o varias matrices de datos

La única razón (que se me ocurre) por la que la matriz de datos podría no ser única es cuando tenemos diferentes niveles de observación. Por ejemplo, si en un proyecto se hacen observaciones a escala de parcela, de árbol y de fruto, podría ser necesario hacer tres matrices:

  • matriz de parcelas, en la que cada fila es una parcela y cada columna una variable con los datos de cada parcela. Una variable será “id_parcela” con un código diferente para cada parcela.
  • matriz de árboles, en la que cada fila es un árbol y cada columna una variable con los datos de cada árbol, incluyendo una variable con la identidad de la parcela en la que se encuentra el árbol, con el MISMO CÓDIGO, que en la matriz anterior. También tendrá una variable “id_arbol” (sin acento) con el código de identificación de cada árbol.
  • matriz de frutos, con los datos de cada fruto, incluyendo la identidad del árbol y de la parcela con EL MISMO CÓDIGO que en las matrices anteriores.

No es necesario (y por tanto puede ser contraproducente) poner la misma información en más de un sitio (por ejemplo las coordenadas de la parcela en la matriz de parcela y en la matriz de árboles). Imagina que se detecta un error de transcripción: es muy probable que se cambie el dato solo en un sitio y no en el otro, obteniendo matrices con datos contradictorios.

Si se utiliza este sistema el primer script del análisis será para re-construir las matrices de datos, incluyendo todas las variables relevantes para los análisis de cada matriz que se encuentran en otra matriz. Por ejemplo, se puede incluir la orientación de la ladera (variable de parcela) en la matriz de árboles y/o de frutos. O utilizar el tamaño medio de frutos de cada árbol. Lo mismo si se quieren hacer variables complejas, como sumas de variables o porcentajes.

Hay que ser consistentes

Al hacer matrices de datos, al hacer ciencia y en otras muchas facetas de la vida, hay que intentar ser lo más consistentes posibles. Cuando los datos tienen que ser leídos por personas y por ordenadores, es muy importante ser consistentes:

  • Con los códigos de las variables categóricas (ver en variables)
  • Con la forma de representar los valores vacíos (ver en observaciones)
  • Con los nombres de las variables
  • Con la identificación de las observaciones
  • Con la estructura de archivos en las carpetas del proyecto
  • Con los nombres de los archivos
  • Con el formato de las fechas
  • Con el formato de las coordenadas
  • Con las frases en las observaciones

El formato de la matriz de datos

El único formato aceptable para una matriz de datos que se vaya a guardar mucho tiempo es en “texto plano”, es decir, .txt o .csv. Es el único formato en el que podrás leer actualmente un archivo escrito en un ordenador de hace 30 años y se podrá leer en un ordenador dentro de 100 años (suponiendo que en ese año haya ordenadores). Cualquier otro formato depende de un programa concreto para leerlo.

Aún así, para archivos de trabajo, puede ser útil utilizar formatos de hojas de cálculo estándar, como .xlsx (Microsoft) u .ods (Open Document). Esto permite tener varias matrices de datos en un único archivo, junto con la leyenda de los datos. Si se utiliza este formato es conveniente exportar las tablas en formato de “texto plano” por si en un futuro lejano queremos volver a leer nuestros datos (se puede hacer desde el script). Eso sí, en este caso hay que tener cuidado con los desastres que puede crear el formato automático al cambiar números en fechas o viceversa o el formato de números grandes.

Al guardar la matriz en texto plano hay que tener en cuenta que si se utiliza la coma como separador de decimales no se puede utilizar para separar datos (CSV significa “comma separated values”) por lo que se debe utilizar punto y coma o tabulador. Importante hacerlo siempre de la misma manera y poner cómo se ha hecho en la leyenda de los datos.

La leyenda de los datos

Todas las matrices de datos deberían llevar siempre anexa una leyenda. Si la matriz está en formato .csv debe ser un archivo de texto plano “Leyenda.txt” o “Leeme.txt”(recuerda, sin acento) en la misma carpeta que los datos. Si está en formato xlsx u ods debe ser la última hoja, con un nombre parecido.

En la leyenda de los datos debe ir:

  • La descripción de los datos e idealmente el objetivo de los mismos
  • El nombre del archivo de datos (si es diferente).
  • El nombre de cada variable y su descripción. Aquí es el sitio donde hay que poner las unidades de medida.

Consejo: Los nombres de los archivos (y carpetas) deben ser informativos de lo que contienen y sobre todo NUNCA contener acentos, eñes o signos de puntuación otros que – _ o el punto que separa la extensión.

  • MAL: “datos.csv”, “d1.csv”, “datos_años.csv”, “datos_árboles.csv”
  • BIEN: “datosarboles.csv”, “DatosArboles.csv”, “datos-arboles.csv”, “datos_arboles.csv”

Recuerda que es bueno ser consistente. Si utilizas guión bajo o alto o las mayúsculas para separar palabras, hazlo siempre de la misma manera.

Errores frecuentes a evitar en las matrices de datos:

  • Una matriz por año o por especie. En vez de eso, pon todo en una única matriz y añade variables con el año o con la especie.
  • Incluir variables calculadas a partir de otros datos en vez de los datos originales (medias, porcentajes, sumas, etc.).
  • Incluir medias u otros estadísticos en la última fila de la matriz.
  • Añadir información en colores. Por ejemplo, “las filas en amarillo son las de 2018 y las verdes de 2017”, “Las filas en negrita son datos tomados por Pepito”.
  • No hacer copia de seguridad.

Las variables

Por lo visto anteriormente, una matriz de datos es siempre un conjunto de variables con el mismo número y orden de observaciones. En la definición de las variables hay que tener en cuenta que cada una es una unidad de información diferente y no se deben juntar cosas. Cada variable puede ser o numérica o categórica. Es importante que:

  • Las variables numéricas contengan números, Y SÓLO NÚMEROS.
  • Las variables categóricas tengan letras. Pueden contener números, pero dan más problemas.
  • En las variables categóricas, cada categoría se escriba SIEMPRE de la misma manera. Para esto es muy útil utilizar formularios, las ayudas de autocompletado de las hojas de cálculo. Así, ” Azul”, “Azul”, “azul?” y “azul” son cuatro categorías diferentes.
  • El nombre de cada variable sea informativo, su primer carácter sea una letra y que sea legible por una máquina (sin caracteres extraños como eñes, porcentajes, etc.)
  • Todos los datos en una misma variable deben estar en las mismas unidades. Las unidades se ponen en la leyenda mejor que en el nombre de la variable.

Variables de coordenadas

Cuando en una matriz de datos queremos añadir las coordenadas de cada observación (ej. del centro de cada parcela o de cada árbol), tenemos que elegir entre infinidad de formatos de coordenadas diferentes. La mejor opción es siempre la más internacional y la más sencilla. Si seguimos el ejemplo de Google, la mejor opción es ponerlas en dos variables (columnas) una para la latitud y otra para la longitud. En cada columna se pone el valor en grados con decimales (DD,DDDDDD). En el caso de la latitud  positivo para el Norte y Negativo para el Sur. En la longitud positivo hacial el Este y negativo hacia el Oeste del Meridiano de Greenwhich. Es decir, el mismo formato en que te las da Google Maps cuando pinchas con el botón derecho en “¿qué hay aquí?”.

Si necesitas ponerlas en grados, minutos y segundos o poner Norte o Sur en Letras, cada uno de estos valores debería ser una columna diferente. Es decir, 4 variables para la latitud y otras cuatro para la longitud.

Utilizar otros formatos tipo UTM o formatos locales de cada país, requiere pensar en cada caso, con la lógica anterior (no mezclar letras y números y no poner símbolos, como º ó ”).

Variables de fecha (o fecha y hora)

Las fechas son un tipo de dato que puede dar lugar a muchos errores. Por ejemplo “01-02-88” puede interpretarse como el 1 de febrero de 1988, como el dos de enero de 1988, o incluso como cualquiera de las anteriores de 2088.

Lo mejor es ponerla en un formato estándar, como el establecido en la ISO 8601. Es decir, con el año completo y delante, luego el mes y luego el día, separados con guiones: “1988-01-02” es el dos de enero de 1988 sin posible confusión.

Otra buena opción es utilizar tres variables: “Ano” (recuerda, sin eñes), “Mes” y “dia” (recuerda, sin acento). De  esta forma el dato siempre será reproducible y no da lugar a error.

Utilizar el formato de fechas de Excel u otras hoja de cálculo es jugar con fuego, ya que cada una utiliza una referencia diferente. Incluso entre versiones antiguas y modernas de Excel se cambiaría la fecha. Lo que hace este programa es contar los días desde una fecha de referencia, que en Windows es 1900-1-1 y en Macs es 1904-1-1. Es decir, la misma tabla de datos da una fecha cuatro años posterior en Macs que en Windows.

Errores frecuentes con las variables:

  • Poner en una misma variable numérica, las unidades: “100 €”, “5 cm”. Esto la convierte en texto y los números desaparecen para la máquina.
  • Poner caracteres de texto en una variable numérica, cuando no sabemos el valor: “?”, “*”, etc.
  • En variables categóricas, poner de formas diferentes la misma categoría (¡Cuidado con los espacios!).
  • Nombres de variables no informativos o con caracteres especiales como acentos, eñes, porcentaje o interrogaciones
  • Poner en una misma variable más de un dato. Suele pasar con las variables de fechas o coordenadas.

Las observaciones

Cada fila de la matriz de datos corresponde a una observación (una parcela, un árbol o un fruto en las tres matrices del ejemplo inicial). En la mayor parte de los análisis las observaciones que contienen espacios vacíos serán eliminadas, por lo que es muy importante rellenar todas las observaciones siempre que sea posible. Solo se deben dejar vacías las casillas para las que por alguna razón es imposible conocer su valor. Es importante poner ceros en los casos en los que el valor es cero (ejemplo: Si una hoja no tiene peciolo, en la variable “Longitud del peciolo” debe poner “0”, no dejarla vacía, que significaría que no se puede conocer dicha longitud).

  • Solo una cosa por celda. Las observaciones y unidades van en otro sitio.
  • Poner ceros cuando el valor es cero y vacío (o NA) cuando no tenemos el valor.
  • Utilizar sistemas de validación cuando sea posible.
  • Evitar siempre los espacios:
    • Si se puede no poner más de una palabra por celda y/o poner _ en vez de espacios.
    • Tener cuidado de no poner espacios ni delante ni detrás del valor de la celda, sobre todo en variables categóricas (Error muy frecuente al copiar y pegar de texto).
    • Evitar dejar celdas son solo un espacio. Aunque no se vea es un carácter y por tanto será una clase categórica más y puede convertir en texto toda una variable numérica.

Es buena costumbre, y necesario si se va a utilizar más de una matriz de datos a diferentes escalas, que exista una variable de identificación en la que cada observación tenga un código único que la identifique.

Errores frecuentes al introducir los datos:

  • Dejar vacías observaciones que deberían tener un cero. Esto hará que se trate como si no se conociese el valor, no como cero.
  • Poner espacios en algunas celdas. Evita siempre los espacios una celda con un espacio es tratada diferente que una celda vacía.

Más información

 

Tabla de frecuencias en Calc o Excel utilizando “CONTAR.SI”

Aunque la mejor forma de trabajo es utilizar calc o excel sólo para guardar los datos y utilizar programas externos para analizarlos de forma reproducible, en ocasiones es más fácil y rápido (aunque menos seguro) realizar algunos cálculos directamente en la propia hoja de cálculo.

Si se realizan cálculos en la propia hoja de cálculo, lo ideal es hacerlo en una hoja diferente a la que contiene los datos y los datos originales no tocarlos nunca (o lo menos posible, en cuyo caso es mejor copiar la hoja, para no  tocar el original).

En este post yo voy a utilizar LibreOffice Calc, pero el mismo procedimiento debería funcionar en Microsoft Excel.

Dicho esto, el objetivo de este post es crear una tabla de contingencia a partir de una tabla de datos con observaciones (filas) x variables (columnas). Para el ejemplo utilizaré una tabla de datos de aves recopilada por mis alumnos.

Primeras lineas de la hoja “Aves” de los datos recogidos por mis alumnos. Observar que la notación de cada celda es una letra y un número. Por ejemplo la zona del Ave_001 está en la celda E2.

Tabla de contingencia simple

El primer ejemplo será una tabla de contingencia simple en la que vamos a contar el número de aves en “Campus de la UPV”, “Viveros”, “Blasco Ibañez”, “El río” y “Otros”. Para ello lo primero que hacemos es crear una hoja nueva (Hoja>Insertar hoja>poner nombre>aceptar) y en ella poner los nombres de las zonas que queremos utilizar.

Aunque podríamos utilizar la función “FRECUENCIA” como proponen aquí y aquí, vamos a utilizar mejor la función CONTAR.SI, que es mucho más versátil y nos servirá para luego complicar la selección: Insertar>Función>CONTAR.SI.

Asistente de funciones. Seleccionar la función CONTAR.SI

En esta función nos pide dos cosas, el intervalo y los criterios.

El Intervalo va a ser la columna donde están los datos de “zona”:  Aves.E$1:Aves.E$1000    Importante que el último número sea mayor que el número de observaciones (líneas de la tabla de datos).

El Criterio va a ser: A2, Es decir, que coincida con el valor de A2 en la tabla de contingencia, que es “Campus de la UPV”. También se podría escribir el texto directamente aquí.

por lo que la celda B2 quedará así: =CONTAR.SI(Aves.E$2:Aves.E$1000;A2)

Los $ sirven para que no se muevan los valores al arrastrar.

Al dar a aceptar, ya tenemos el primer valor:

Arrastrando la fórmula podemos tener ya hechas hasta “El río”, pero como no hay categoría “Otros”, para esta no nos vale:

Para calcular los otros, primero vamos a calcular la suma con la función CONTARA, que sólo nos pide el intervalo:

Y ya los “Otros serán el valor de la suma (B7) menos la suma de los valores anteriores (B2:B5):

Tabla de contingencia algo más complicada

Si queremos hacer una tabla más complicada, como por ejemplo la tabla de contingencia con los diferentes nichos de las aves de, “Campus de la UPV”, sólo tenemos que utilizar la función CONTAR.SI.CONJUNTO, para poner varios intervalos y criterios. También pueden ser útiles dos funciones muy interesantes:

  • Y()
  • O()

La primera de ellas da un valor verdadero si se cumple todo lo que hay dentro, mientras que la segunda da un valor verdadero si se cumple alguno de los criterios que hay dentro.

Así por ejemplo la fórmula para las aves del “Campus de la UPV”, que se encuentran “Sobre el cesped a la sombra”, será:

                                   =CONTAR.SI.CONJUNTO($Aves.E2:E1000; “Campus de la UPV”; $Aves.H2:H1000; “Sobre el cesped a la sombra” )

Espero que os sea útil. Si es así o encontráis algún error, por favor, comentar.

Crear capa vectorial de pendientes personalizada a partir de raster poligonizando máscaras

En este post voy a explicar cómo se puede crear una capa vectorial personalizada, con los rangos que se quiera, a partir de una capa raster. En este ejemplo el objetivo es crear una capa vectorial con tres rangos de pendientes: menor de 10%, entre 10 y 20% y más de 20%. Para ello utilizaré la capa raster de pendientes del municipio de marines, obtenida de Terrasit [ver como] y la capa poligonal del municipio obtenida de la web de Arcgis [ver como]. Los pasos a seguir serán:

  1. Recortar la capa raster con el polígono del municipio
  2. Crear máscaras con los valores seleccionados utilizando la calculadora raster
  3. Poligonizar las máscaras
  4. Unir las máscaras poligonales
  5. Crear la variable de texto con los rangos de la pendiente utilizando la calculadora vectorial

    1. Recortar la capa raster con el polígono del municipio

Cuando intentamos recortar la capa raster utilizando la función Clipper [Raster>Extracción>Clipper..], empezamos con los problemas. Resulta que al abrir la capa raster de pendientes sale un aviso de que el SRC no está definido, por lo que habrá que definir el correcto, para que se ponga en el lugar adecuado.crop  Preproyectar2srcara definir el SRC se pincha con el botón derecho en la capa {sta, en el ejemplo}, y se cambia el SRC con el adecuado (Lo normal es que esté en metadatos o en la web de donde se baja). En nuestro caso es el EPSG:32630, que corresponde con el WGS84/UTM zone 30N. Para comprobar que es el correcto lo ideal es comparar con otras capas o con algún mapa de fondo utilizando Quickmapservices u Openlayer plugins [explicado aquí].

Una vez definido, resulta que hay que cambiarlo (reproyectarlo) en el sistema de coordenadas del resto de capas del proyecto, que resulta que no es la misma, ya que todas las capas vectoriales de Terrasit utilizan EPSG:3042 (ETRS89/ETRS-TM30). Para cambiarlo utilizamos la función combar (reproyectar) [Raster>Proyecciones>Combar (reproyectar]. Observar que a la nueva capa reproyectada la hemos llamado {staPend}reproyectarclip3Unaclip2 vez que tenemos las dos capas en el mismo sistema de coordenadas, ya podemos hacer el clip sin problemas [Raster>Extracción>Clipper]. Como en cada operación cambiamos el nombre de la capa a {Pend_Marines}.

2. Crear máscaras con los valores seleccionados utilizando la calculadora raster

Si la calculadora raster de Qgis funcionara como es debido, se podría hacer todo con una sola ecuación, como está explicado en este post. En mi caso la calculadora no hace las sumas (será la versión de Qgis), por lo que sólo puedo multiplicar (lo que al menos me permite crear las máscaras).

Voy a crear tres máscaras a las que voy a llamar Pm10, PM10m20 y PM20, que contendrán respectivamente los puntos con pendiente menor o igual a 10, mayor de 10 y menor o igual que 20 y mayor que 20. Para ello en la calculadora pondré las ecuaciones:calcr

  • Pm10: Pend_Marines@1 <= 10
  • PM10m20: Pend_Marines@1 > 10 AND Pend_Marines@1 <=20
  • PM20: Pend_Marines@1 > 20

Con lo cual ahora tenemos tres capas raster con valores 0 (si aparece nan, cambiar el mínimo a 0) y máximo 1 en las zonas que cumplen la condición.

pm10

3. Poligonizar las máscaras

El siguiente paso es poligonizar las máscaras [Raster>Conversión>Poligonizar]. Es interesante poner diferentes nombres de campo en cada una de las capas, de forma que cuando las unamos sepamos qué columna corresponde a cada clase de pendiente.

pendientes1020

4. Unir las máscaras poligonales

Una vez que tenemos las capas tenemos que unirlas. Se podría utilizar la función unión [Vectorial>Geoproceso>Unión], pero sólo permite hacerlo de dos en dos, por lo que prefiero utilizar la función merge de MMQGIS plugin [MMQGIS>Combine>Merge layers].

Obtenemos una capa con tres columnas en la tabla de atributos, con ceros y unos según estén en cada una de las clases de pendientes.

5. Crear la variable de texto con los rangos de pendiente utilizando la calculadora vectorial

Para crear la variable de pendientes lo que haremos será utilizar la calculadora vectorial de la forma que está explicada en este post.

Supongamos que los nombres de las tres variables son Pm10, PM10m20 y PM20.

Ejemplos 1:

Si lo que queremos es una columna numérica con 10, 20, 40  por ejemplo como valor de la pendiente, la ecuación sería:

"Pm10" * 10 + "PM10m20" * 20 + "PM20" * 40

Ejemplo 2:

Si lo que queremos es un valor de texto más explicativo, la ecuación sería:

CASE
  WHEN "Pm10" = 1 THEN 'Pendiente <= 10'
  WHEN "PM10m20" = 1 THEN 'Pendiente entre 10 y 20'
  WHEN "Pm10" = 1 THEN 'Pendiente menor de 20'
END

O lo que se quiera poner, lógicamente.

Si te es útil este post, comenta.