Archivo de la etiqueta: data mining

11 comandos para data scientists que quieran aprender a usar la consola

Algunas veces manipular datos puede resultar costoso. A menudo los data scientists tenemos que manipular grandes cantidades de datos por lo que es bueno conocer algunos tranquillos para optimizar el proceso. Aquí os dejo unos cuantos comandos con algunas opciones para trabajar más eficientemente.

head

head archivo.txt

Este comando imprime las 10 primeras lineas del archivo. Si queremos un numero distinto de lineas podemos usar la opción -n.

head -n 20 archivo.txt

Este último comando nos imprimirá las 20 primeras lineas del archivo. Al imprimir las primeras lineas de un fichero en pantalla nos ayuda a obtener la estructura global del archivo y algunos valores para hacernos una idea general del contenido del archivo.

tr

Este comando es perfecto para pre-procesar archivos. Por ejemplo podemos cambiar el archivo de tsv a csv.

cat tab_delimited.txt | tr "\\t" "," comma_delimited.csv

Algo muy interesante de “tr” son las clases. Las clases son funciones de elementos algo más “abstractos”. Aquí una lista de algunos:

[:alnum:] todas las letras y dígitos
[:alpha:] todas las letras
[:blank:] todos los espacios
[:digit:] todos los dígitos
[:lower:] todas las letras minúsculas
[:upper:] todas las letras mayúsculas
[:punct:] todos los caracteres de puntuación

y si los concatenas puedes hacer un script bastante interesante. También puedes usar las expresiones regulares. Aquí ejemplo para pasar de mayúsculas a minúsculas

cat filename.csv | tr '[A-Z]' '[a-z]'

wc

Este es un contador de palabras (word count). Basado en mi experiencia uso la opción -l a menudo. Esta opción cuenta el número de lineas en vez de palabras. Otras opciones

  • wc -m imprimer el recuento de caracteres
  • wc -L imprime la longitud de la linea más larga
  • wc -w cuenta el numero de palabras
  • wc – l cuenta lineas

split

Nos permite trocear archivos fácilmente para reducir su tamaño. El problema es que no añade la extensión del fichero a los nuevos documentos. Podemos trocear un fichero cada 500 lineas con el siguiente comando.

split -l 500 fichero.csv nuevo_fichero_

Si queremos poner una extensión a los nuevos ficheros tendremos que usar el siguiente comando en el directorio del output

find . -type f -exec mv '{}' '{}'.csv \;

Si queremos numerar los archivos partidos tendremos que usar el flag -d para indicar que el sufijo sea numérico.

uniq

Uniq solo opera con lineas contiguas idénticas. Motivo por el cual es interesante añadir el sort antes. El sort nos pone lineas idénticas contiguamente.

sort

# Ordenando la segunda columna alfabéticamente
sort -t, -k2 filename.csv
# Numericamente 
sort -t, -k2n filename.csv
# Orden inverso 
sort -t, -k2nr filename.csv
  • sort -f ignora el caso
  • sort -r ordena inversamente
  • sort -k especifica el identificador
  • sort -t usa la coma como separador
  • sort -R mezcla el orden
  • uniq -c cuenta el numero de apariciones
  • uniq -d solo imprime las lineas duplicadas

cut

Sirve para eliminar ciertas columnas en el archivo. Por ejemplo si nos queremos quedar con la primera y tercera columna

cut -d, -f 1,3 filename.csv

Pero si queremos todas las columnas menos la primera

cut -d, -f 2- filename.csv

puede servir perfectamente con otros comandos.

paste

este comando puede ser interesante ya que pone juntamente dos archivos. No pone uno al final del siguiente sino cada fila de lado.

Si tenemos dos ficheros

# names.txt 
adam 
john 
zach

y

# jobs.txt 
lawyer 
youtuber 
developer

Los podemos juntar usando el comando

# Join the two into a CSV 
paste -d ',' names.txt jobs.txt > person_data.txt

Consiguiendo el resultado

# Output 
adam,lawyer 
john,youtuber 
zach,developer

grep

Este es uno de los comandos mas famosillos en el mundillo y extremadamente poderoso. Grep busca expresiones regulares y las imprime. Es usado a menudo juntamente con otros comandos.

# Buscar recursivamente nombres de ficheros que contengan la palabra "word"
grep -lr 'word' .

Algunas opciones interesantes

  • alias grep=”grep –color=auto” hace grep más colorido
  • grep -E usa la versión extendida de las expresiones regulares
  • grep -w busca un mach completo de la palabra
  • grep -l imprme el nombre de los ficheros conteniendo la palabra
  • grep -v invierte el match

sed

Este comando también es uno de los más potentes. Trabaja linea a linea. La función más básica es s/old/new/g . Podemos eliminar las comas de los miles en un fichero csv

sed -i '' 's/\([0-9]\),\([0-9]\)/\1\2/g' data.txt 
# balance,name 
# 1000,john 
# 2000,jack

o eliminar una linea especifica

sed -i '' '/jack/d' data.txt 
# balance,name 
# 1000,john

awk

Este también es un comando de los más usados y el último de hoy. Tiene bastantes de las funcionalidades de grep en su ultima versión.

awk '/word/' filename.csv

En el siguiente ejemplo awk imprime la 3a y 4a columna de las filas que contengan la palabra word.

awk -F, '/word/ { print $3 "\t" $4 }' filename.csv

Es capaz de usar múltiples expresiones numéricas

# Print line number and columns where column three greater 
# than 2005 and column five less than one thousand
awk -F, ' $3 >= 2005 && $5 <= 1000 { print NR, $0 } ' filename.csv

puede hacer un sumatorio de las columnas para las filas que cumplan cierta condición

awk -F, '$1 == "something" { x+=$3 } END { print x }' filename.csv

Puede imprimir filas duplicadas

awk -F, '++seen[$0] == 2' filename.csv

O borrar duplicados

# lineas consecutivas
awk 'a !~ $0; {a=$0}']
# Lineas no consecutivas
awk '! a[$0]++' filename.csv
# Más eficiente
awk '!($0 in a) {a[$0];print}

Substituir valores usando gsub

awk '{gsub(/scarlet|ruby|puce/, "red"); print}'

Fuente: https://www.kdnuggets.com/2018/06/command-line-tricks-data-scientists.html

Resumen del paper: Análisis de datos topológicos

Recientemente me encontré un par de papers relevantes para la minería de datos (data mining). Incluso hay una empresa que basa su business model en este concepto (Ayasdi). El concepto como habéis podido leer en el titulo es análisis de datos topológicos. ¿Que significa esto? La ida principal, tal y como se expone en la Figura 1 (sacada del paper [1]), se basa en que los datos tienen forma y la forma es consistente. Por ejemplo, la letra “A” seguirá siendo la misma letra a pesar de que le apliquemos distintas transformaciones ya que la información obtenida es calculada en base a las distancias relativas. Podemos rotar los datos, hacia un lado u otro. Podemos cambiar la tipografía o la forma (aplastarla o extenderla) que seguirá siendo la misma letra. Al final la letra “A” esta formada por millones de puntos que no vemos. Quizás perdemos algo de detalle especifico pero se gana en visión global.

descripción gráfica de la letra A
Figura 1: Transformaciones aplicadas a la letra A siguen formando la misma letra. Extraído de [1]
El primer paso consiste en agrupar en sub-poblaciones en bins (contenedores). En el segundo paso estas divisiones son analizadas. Cada uno de los contenedores contiene puntos que son similares el uno al otro. Como los bins han sido divididos de tal forma que solapan entre ellos por lo que cada punto de nuestros datos pueden estar en más de un grupo. Finalmente para construir la red (network) dibujamos un link entre los distintos clusters de la network final.

Para empezar a construir la red tenemos que escoger la métrica y la lente. La métrica la usaremos para medir la similitud (o distancia) entre dos puntos mientras que la lente es una función matemática para observar los datos. Cualquier métrica que sirva para producir un numero de un punto puede ser una lente. Una lente puede ser la media, max, min, el centro, PCA-score, distancia SVM, entre otros. Se pueden agrupar los resultados de distintas lentes multiplicando el resultado de los outputs.

El vector unitario producido por a lente es dividido en subgrupos que se solapan. Todos los puntos que tienen valores de lentes en el mismo subgrupo se agrupan juntos en un contenedor. De esta forma distintas particiones son obtenidas para todos los puntos gracias al resultado de la lente. Como las lentes producen sets que solapan es posible que un punto este en múltiples contenedores. Todos los puntos en un contenedor son agrupados ya que todos los puntos son altamente similares entre si y este grupo representa un simple nodo de nuestra red. El color que le asignaremos es la media del color de la lente de este grupo. El nodo en su representación gráfica tiene un tamaño proporcional al numero de puntos que tenga el cluster.

Habiendo hecho lo pasos anteriores tendremos distintos nodos en nuestra red, con diferentes tamaños y colores. Los nodos se conectaran entre si cuando tengan puntos en común. Estos links generaran la red topológica final.

Tenemos que tener en cuenta que esta implementación tiene dos parámetros. Uno es la resolución que indica el numero de contenedores en los cuales vamos a partir los datos. Una baja resolución genera unos pocos nodos gruesos sintetizando la información generada por el algoritmo. Contrariamente si la incrementamos genera muchísimos nodos pero de un tamaño mas pequeño perdiendo similitud entre nodos incluso generando clusters aislados. El segundo parámetro se llama ganancia y controla las regiones que se solapan entre contenedores. Como mas grande sea la ganancia mas aristas (conexiones entre nodos) vas a obtener el tu red. Este parámetro resalta las relaciones entre los elementos de tus datos.

No hay unos valores óptimos para la resolución y la ganancia. Cada red es singular y sus parámetros tienen que ser escogidos acordemente. También depende de lo que se quiera observar en la red. Por lo que cada análisis requerire una afinación (tuning). Tened en cuenta que una resolución alta no siempre es lo mejor, ya que al final lo que puede producir un resultado muy similar al observar los datos directamente

Ya hemos explicado todas las ventajas ahora toca exponer algunas de sus desventajas. No es ninguna “magic bullet” puede funcionar para muchos casos pero hay otros en los que este algoritmo no sea el mejor para nuestros datos. No hay una sola solución que sea buena para todos los casos. Parte del problema es que es una ciencia con un alto componente matemático. Como los principios del deep learning, hasta que no haya implementaciones eficientes y fáciles de usar, la “gente normal” se va a abstener de usarlo. Finalmente, el coste computacional. Calcular todos los pasos es extremadamente costoso ya que se tienen que hacer distintos barridos sobre los datos e incluso calcular las distancias entre pares.

Para los que os vaya la marcha os dejo un vídeo de youtube. Se trata de un seminario en Standford donde se explica extremadamente bien el concepto (en ingles). Luego os dejo una presentación en slideshare donde se explica el concepto detalladamente. Y para terminar os dejo tres referencias que he usado para escribir este post y que si entendéis inglés las recomiendo encarecidamente que les echéis un vistazo.

 

 

Archivos multimedia para profundizar en el TDA

 

Referencias:

 

  1. Offroy, M., & Duponchel, L. (2016). Topological data analysis: A promising big data exploration tool in biology, analytical chemistry and physical chemistry. Analytica chimica acta910, 1-11.
  2. Nielson, J. L., Paquette, J., Liu, A. W., Guandique, C. F., Tovar, C. A., Inoue, T., … & Lum, P. Y. (2015). Topological data analysis for discovery in preclinical spinal cord injury and traumatic brain injury. Nature communications6, 8581.
  3. Chazal, F., & Michel, B. (2017). An introduction to Topological Data Analysis: fundamental and practical aspects for data scientists. arXiv preprint arXiv:1710.04019.

He intentado hacer como Moneyball para predecir el resultado de los partidos de fútbol y he fracasado

Hace ya algún tiempo leí un post interesante sobre como un data scientist usó el concepto presentado en el libro Moneyball para escoger mejor los jugadores del FIFA 2016 cuando jugaba con “Career Mode”. El concepto de Moneyball es básicamente hacer data mining para conseguir el mejor equipo de béisbol con el menor precio. El argumento principal del libro es que al fichar los jugadores de béisbol las personas usan sus propios inclinaciones que normalmente no coinciden con la realidad o que están ancladas al pasado. Como ejemplo en el libro pone que a menudo el resultado de una táctica ofensiva de un jugador se puede medir mejor usando la frecuencia con que el bateador llega a la base en vez de la velocidad con la que batea. La velocidad de bateo ha sido la métrica que se ha usado des del principio pero después de un análisis detallado los analistas descubrieron que otras métricas son más relevantes.

A partir de este concepto creé mi propio experimento. La idea era que normalmente los analistas usan datos reales de los partidos para definir la habilidad del jugador. El problema que tiene esto es que lo que se luce el jugador depende del nivel del contrincante. Por eso mi idea era usar una valoración más o menos neutra y absoluta para predecir la calidad de cada jugador. Estas métricas las usaría para predecir la calidad del once inicial y así poder determinar el resultado final del partido.

Lo primero que hice fue recopilar tanta información como pude de todos los jugadores que pude. Para determinar la calidad del jugador usé la que usan en el videojuego FIFA 2015. El valor de las apuestas que se habían hecho en distintos sitios web de apuestas lo saqué de football-data. La alineación inicial y el resultado final del partido lo saqué de 11v11.

Todo el scrapping que hice puede sonar muy divertido y rápido pero no fue así. Durante el proceso pasé por alto varias cosas importantes. Lo primero es que en la liga española tenemos muchos jugadores españoles y con nombres españoles. El problema de los nombres españoles es que usan caracteres especiales como acentos o la ñ causando problemas con el encoding. El segundo problema es que el scrapping es divertido si la página web es consistente y está bien ordenada. Resultó no ser el caso. Por algún motivo que desconozco algunas de las páginas de la web no tenían un formato consistente con el resto de la web y tuve que programar excepciones. El tercer y último punto es que las webs de dónde extraje la información tenían herramientas para evitar el scrapping. Por suerte no eran muy estrictos con el número de peticiones que un mismo ordenador podía hacer y conseguí toda la información que buscaba en relativamente poco tiempo.

El resultado final fue que no funcionó. Me pareció una idea innovadora pero quizás no muy realista. El fútbol se ha caracterizado por las sorpresas. Usando sólo la información de las apuestas puedo predecir en un 50% cual será el resultado final del partido. Curiosamente con regresión lineal y toda la información de los jugadores se puede predecir también con un 50% quién será el ganador del partido. Si quitamos el empate de la ecuación todos los algoritmos que probé siguen funcionando igual de “bien”. Básicamente podría tirar una moneda en el aire y decir que cara gana el equipo local y cruz el visitante y acertaría el mismo número de veces que todos los algoritmos probados. Una pena que no funcionara pero me alegra haberlo probado.