Archivo de la etiqueta: Big Data

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

Optimizadores de tensor flow

Continuando el anterior post dónde introducí tensor flow hoy vengo con los optimizadores de funciones. Tensor flow ofrece optimizadores que cambian las variables para minimizar la funcion de perdida (loss function). El más simple es el de gradiente descendiente. Computan las derivadas simbólicas (symbolic derivatives) simplemente usando el modelo y la función tf.gradients. Por ejemplo:

[code language=”python”]
optimizer = tf.train.GradientDescentOptimizer(0.01)
train = optimizer.minimize(loss)
sess.run(init) # reset values to incorrect defaults.
for i in range(1000):
sess.run(train, {x:[1,2,3,4], y:[0,-1,-2,-3]})
print(sess.run([W, b]))
los resultados finales
[array([-0.9999969], dtype=float32), array([ 0.99999082],
dtype=float32)]
[/code]

El modelo completo para la regresión linal es:

[code language=”python”]
import numpy as np
import tensorflow as tf
# Model parameters
W = tf.Variable([.3], tf.float32)
b = tf.Variable([-.3], tf.float32)
# Model input and output
x = tf.placeholder(tf.float32)
linear_model = W * x + b
y = tf.placeholder(tf.float32)
# loss
loss = tf.reduce_sum(tf.square(linear_model – y)) # suma de los cuadrados
# optimizer
optimizer = tf.train.GradientDescentOptimizer(0.01)
train = optimizer.minimize(loss)
# training data
x_train = [1,2,3,4]
y_train = [0,-1,-2,-3]
# training loop
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init) # reset values to wrong
for i in range(1000):
sess.run(train, {x:x_train, y:y_train})
# evaluate training accuracy
curr_W, curr_b, curr_loss  = sess.run([W, b, loss], {x:x_train, y:y_train})
print("W: %s b: %s loss: %s"%(curr_W, curr_b, curr_loss))
# When run, it produces
#W: [-0.9999969] b: [ 0.99999082] loss: 5.69997e-11
[/code]
tf.contrib.learn te simplifica la vida con las funciones: ejecución, entrenamiento, iteraciones, evaluaciones entre otros

[code language=”python”]
import tensorflow as tf
import numpy as np
features = [tf.contrib.layers.real_valued_column("x", dimension=1)]
estimator = tf.contrib.learn.LinearRegressor(feature_columns=features)
x = np.array([1., 2., 3., 4.])
y = np.array([0., -1., -2., -3.])
input_fn = tf.contrib.learn.io.numpy_input_fn({"x":x}, y, batch_size=4,
num_epochs=1000)
estimator.fit(input_fn=input_fn, steps=1000)
print(estimator.evaluate(input_fn=input_fn))
# Result: {‘global_step’: 1000, ‘loss’: 1.9650059e-11}
[/code]

Las mejores 8 herramientas para visualizar datos

Siguiendo ya un poco con algunos posts de visualización de datos del big data, he escrito otro más. Esta vez quizás conozcáis algunas herramientas pero os puedo asegurar que os sorprenderán algunos de sus usos para mostrar datos.

1 Excel

Excel te permite cambiar el color de las casillas según los parámetros anteriormente indicados. De este modo podremos visualizar a primera vista los valores. No da mucho juego pero sirve para representarlo de una forma rápida.

2 Google Chart

Es un conjunto de herramientas que te permite mostrar los datos de distintas maneras. Es el único sitio que ofrece la posibilidad de mostrar imágenes dinámicas. El problema de esto es que se procesa en el lado del cliente, por lo que si el navegador no tiene JavaScript se quedará con las ganas.

3 Flot

Es una librería para generar gráficas lineales o de barras. También se ejecuta desde la banda del cliente y se puede visualizar desde cualquer navegador que soporte VML. Ofrece muchas funciones, por lo que es más fácil personalizar las gráficas.

Algo parecido puede ser Rapaël y D3 cuya librería está más orientada a cosas más complejas.

4 Visual.ly

Es una herramienta de desarrollo de infográficos, ahora que se han puesto tanto de moda puede se una buena opción. Aunque sinceramente es algo limitado, si no sabes y no tienes ningún diseñador cerca te puede servir.

Puedes encontrar más herramientas para otras cosas en [eng] seomoz.

5 Modest Maps

Esta librería es algo (muy) sencilla pero de solo 10KB por lo que para todos los obsesos del tiempo de carga es estupendo. Para los que os mováis más en móvil os recomiendo leafet y para los que os vaya lo duro aquí tenéis OpenLayers, más complejo y con poca documentación.

6 Processing

Es un lenguaje de programación de fuente abierta que nos permite imágenes, interacciones y animaciones. Puede devolverte el fichero java, pero puedes evitar el uso de applets ya que también existe una versión JavaScript. Ahora incluso puedes llevarlo a iOS.

7 R

Es un paquete bajo licencia GNU muy interesante y muy profesional, ampliamente usado por estadistas. Es una herramienta algo compleja pero merece la pena dominarla.
(Aclarar que el programa se llama R,  no es una errata)

Gephi

Es una herramienta que nos permite relacionar distintos nodos haciendo esas imágenes que todos hemos visto alguna vez de redes en 3 dimensiones. No solamente permite visualizar grandes cantidades de datos también permite quitar algunos datos de la muestra.

Esto ha sido todo por hoy! 😀 Sé que hubiera estado mejor con fotos de cada herramienta así que si queréis visitad la [eng] fuente, en la encontraréis la mayoría de herramientas mencionadas más alguna otra que no me ha parecido importante citar.

Posibles problemas del Big Data

No todo es maravilloso en el Big Data, también tiene algunos inconvenientes que es necesario saber para no caer en errores.

Correlación: Que algo suceda no quiere decir que tenga una correlación que nos afecte. Por ejemplo que la gente que viene a trabajar los lunes esté más cansada y que los lunes tengamos más trabajadores que vienen en bus no quiere decir que al venir en bus se cansen más. Puede ser que su fin de semana fuera agotador.

Ahora ya no se pueden trazar estadísticas desde el despacho de la oficina, se tiene que hacer experimentos en el mundo real y comprobar que las hipótesis con sus conclusiones son ciertas.

No todas las organizaciones (incluida la administración) son capaces o tienen ganas de adaptarse.

Comprender los resultados: Prácticamente cualquier ordenador ahora te puede calcular grandes cantidades de datos, pero detrás de los resultados tiene que haber una conclusión. Los números por si solos son estériles, tiene que haber una parte humana para interpretar los resultados correctamente y sacar las conclusiones acertadas.

Problemas de base: Todos los datos están en un mismo sitio? Los poseedores de estos son las mismas personas? Puede pasar que en una empresa los datos estén repartidos entre los diferentes departamentos y almacenados de distintas formas. Esto requeriría una colaboración distinta entre los distintos departamentos de la misma empresa.

Pero no sólo esto, sino que también puede pasar que la empresa no sea la propietaria de los datos y consecuentemente no los puedas usar en según que circunstancias o necesites permisos.

Problemas de identificación: Esta es la incapacidad de identificación de los datos. Pongo un ejemplo más aclarador. Si lo que transmite datos es una tarjeta SIM como sabemos si es hombre o mujer, su edad… Los datos son de más utilidad si están ligados con las personas.

Problemas de privacidad: cada vez más los clientes quieren tener más control sobre sus datos y en que forma se usan, por lo que normalmente tienen que autorizar un permiso expreso para que sus datos se usen. A parte de esto la ley de cada país dictamina como se tienen que tratar estos datos, y en ocasiones como España, esta ley es muy dura. Todo esto puede terminar como 1984 de George Orwell.

Información desactualizada: Algunas veces nos entestamos en guardar datos. Esto es bueno para hacer predicciones, pero no por eso tenemos que dejar de adquirir nueva información. Basar decisiones en datos desactualizados no es muy sabio. Siempre es mejor tener información actualizada, forzando un poco más la situación podemos encontrar el ejemplo de que un cliente se ha mudado y la residencia que tenemos ya no es válida.

Incapacidad de tratamiento de la información en tiempo real: Algunas veces no vamos a necesitar los datos de inmediato, pero otras veces si que necesitamos saber los resultados progresivos para actuar al respeto. Por ejemplo, de que sirve tener los niveles de existencias si sólo se calculan una vez por semana? Si los tienes actualizados posiblemente no tengas problemas de aprovisionamiento. Sé que es un ejemplo infrecuente raro pero sirve.

 No todos los datos son información: hay infinidad de motivos por los cuales el 100% de nuestros datos no aportan información. Como por ejemplo duplicidad de datos P.ej. Retweets manuales (o la misma info en diferentes redes sociales), backups, etc.

Problemas de relevancia: No toda la información tiene la misma importancia. Hay ruido en Internet, pero además para lo que algunos puede ser ruido para otros puede ser música. Seguro que los diarios Chinos son importantes para los Chinos, pero para mi no me aportarían demasiado a menos que viviera allí.

Como veis no todo son ventajas, aunque a mi parecer vale la pena intentarlo. El futuro está en la optimización de los recursos y en esto se basa el Big Data.

Técnicas de análisis de Big Data

Evidentemente cuanta más data tengamos más exhaustivo va a ser nuestro análisis, algunas de estas técnicas pueden ser aplicadas a grupos pequeños, pero todas pueden ser aplicadas al Big Data. Aquí van los grupos:

  • A/B Testing: Esto es una de las técnicas que se puede usar con grupos de data pequeños. Se trata de mostrar dos versiones distintas de la web (o de lo que sea) para determinar que variación se adapta mejor a nuestros objetivos.

  • Aprendizaje de asociaciones: Se trata de encontrar relaciones entre datos que nos puedan ser útiles. En el caso de Facebook sería que personas tenemos mas posibilidades de empezar a seguir, pero en caso de Amazon es que producto posiblemente compraremos si hemos realizado un seguido de acciones (por ejemplo que dos productos se suelen comprar a la vez). Sabiendo esto lo pueden poner más fácil a los clientes.

  • Clasificación: Se trata de que la computadora determine a que grupo de data pertenece un nuevo set de data basándose en clasificaciones pasadas y los ejemplos “entrados a mano”. Un ejemplo sería determinar el idioma de un texto basado en ejemplos dados por humanos que si sepan que lengua es. Evidentemente cuanto mayor sea el dato a comparar menos probabilidades de error tendrá.

  • Análisis del cluser: Se trata de reducir el cluster a grupos más pequeños y de ordenarlos de otra forma encontrando similaridades que antes se nos habían pasado por alto. Por ejemplo, que tienen en común una chica de 20 años de Madrid y un hombre sevillano de 40 años? Pues que a los dos les gusta hacer puzzles en su tiempo libre.

  • Crowdsourcing: Es una técnica de recolección de data enviada por un largo grupo de usuarios (de aquí “crowd”). Preguntas a la comunidad y esta te responde. Un ejemplo de esto sería Starbucks que pregunta a los usuarios en que podría mejorar y que nuevos productos debería sacar al mercado.

  • Fusión e integración de la data: A veces hay datos que por si solos no aportan mucho pero combinados con otros ya es otro tema. El GPS de tu móvil sólo dice dónde estás, pero combinado con Twitter puedes encontrar gente nueva, o combinado con un mapa de la zona te ayuda a ubicarte.

  • Data mining: Es un conjunto de técnicas para extraer información útil de grandes cantidades de data y presentarlo de forma que los humanos lo podamos comprender y poder sacar provecho de ello. La data si no se sabe usar por si sola no sirve de nada.

  • Aprendizaje predictivo: Con el uso de modelos predictivos (basados en estadística y machine learning) podemos determinar o intentar predecir el futuro de determinados modelos.

  • Algoritmos genéticos: También conocidos como algoritmos de la evolución sirven para mejorar problemas no lineales. Como dice la teoría de la evolución, “sobrevive el mejor adaptado”, pues este caso vendría a ser el cambio que desarrolla un mejor desempeño.

  • Machine learning: Una parte de este es la inteligencia artificial y se basa en evolucionar su comportamiento basado en datos empíricos.

  • Circuitos neuronales: Recibe este nombre porque se parecen bastante a las conexiones de nuestras neuronas. Esta técnica nos ayuda a buscar patrones no lineales y optimizarlos.

  • Análisis de redes: Es un conjunto de técnicas que permiten encontrar los nodos de más influencia, la dirección de los datos. Esto permite conocer a los influencers (para estrategias de marketing) o para identificar los cuellos de botella.

  • Optimización: Los algoritmos genéticos son una de estas técnicas, sirven para mejorar el proceso en función el coste, velocidad…

  • Reconocimiento de patrones: Es una de las partes de clasificación. Dada una entrada, da una salida siguiendo el mismo algoritmo.

  • Predecir modelos: Se trata de crear un modelo matemático con la mayor probabilidad de predecir la salida. Calculan la probabilidad de que pase una determinada cosa.

  • Regresión: Es una de las técnicas para predecir modelos, se trata de que dadas algunas constantes, calcular que pasa cuando se modifican las variables.

  • Simulación: Dadas las probabilidades de todas las variables calcula que pasa en cada escenario para unos datos concretos. Haciendo así ver como puede reaccionar nuestro (p.ej.) material, a determinadas condiciones.

Uf, este ha sido un post muy intenso. Me ha costado lo suyo pero creo que ha salido bastante completo. Espero que os haya gustado, para cualquier cosa ya sabéis, comentario! 😉

Que tecnologías nos ayudan a almacenar el BigData?

Hablando del big data ahora toca hablar un poco de las tecnologías que nos ayudan a hacer esto posible. Es una lista de sistemas específicos, como más generales.

  • Big Table: Inspiración para Hbase, sistema construido para Google File System.

  • Business intelligence (BI): Es un tipo de software que trata los datos y los presenta de forma entendible.

  • Cassandra: Es un sistema de software distribuido que soporta grandes cantidades de data originalmente desarrollado por Facebook pero actualmente mantenido por Apache Software Fundation.

  • Cloud computing: Se trata de un paradigma altamente escalable, normalmente de sistema distribuido ofrecido a través de la red.

  • Data warehouse: Base de datos optimizada para hacer reportes. Normalmente usada para grandes cantidades de datos estructurados. Usa ETL (extract, transform, load)

  • Sistema distribuido: Diversos ordenadores conectados en red para solventar problemas. El problema es solucionado por partes en cada procesador trabajando en paralelo.

  • Dynamo: Sistema de almacenamiento de datos desenvolupado por Amazon.

  • Handoop: Es un framework open source para procesar sets de datos de tipos determinados para problemas concretos en sistemas distribuidos. Originalmente propiedad de Yahoo pero ahora forma parte de Apache Software Fundation.

  • Hbase: Es una herramienta distribuida, no relacional, para modelado para Google Big Table. Este también forma parte de Handoop de Apache Software Fundation.

  • MapReduce: Es un framework introducido por Google para procesar grandes cantidades de datos en sistemas distribuidos. También implementado en Handoop.

  • Mashup: Es una aplicación que combina presentación de los datos o funcionalidades de dos o más fuentes para crear nuevos servicios.

  • R: Es una potente herramienta open source propiedad del proyecto GNU. Es ampliamente usada por estadistas. (Yo la usé cuando hacía estadística en la universidad y la verdad es que aunque era difícil de usar, porque usaba comandos, era muy potente).

No sé si se me ha pasado algo por alto, pero si es así deja un comentario y te lo agradeceré 🙂

Como visualizar el big data

Ya que estamos hablando del tema debemos hablar de la forma de representar los datos.
Los seres humanos hemos sido “diseñados” para identificar las cosas que se salgan de lo normal. Y para identificar patrones en un número determinado y finito de datos, por lo tanto todo lo que se salga de este estándar nos va a costar gran cantidad de trabajo encontrar lo que busquemos o tratar estos datos (Big Data).

 

  • Nube de etiquetas: Es quizás la forma más conocida de representar grandes cantidades de palabras. Lo que hace es mostrar todas las palabras y hacer más grandes aquellas que más veces se repitan.
  • Clustergram: Es una técnica de visualización usada para análisis de cluster para mostrar los datos individuales de un determinado dataset. El número de cluster es un dato importante ya que ayuda a entender la escalabilidad de los sistemas.
  • History flow: Sirve para ver la evolución de un documento. En el eje horizontal se pone el tiempo y en el vertical los colaboradores. A partir de aquí se puede jugar haciendo que como más grande sea el punto en el tiempo más cantidad de texto ha modificado. Es usado por Wikipedia.
  • Flujo de información: Esto es usado a veces para indicar entre que puntos se hacen las conexiones en el globo terráqueo.

Luego ya están los clásicos como histogramas, diagrama de barras, gráficos de sectores (quesitos)…
Con un poco de imaginación seguro que podemos adaptar estos modelos a otros similares.
Se que no he aportado mucho pero de momento no se me ocurren más, así que si encontráis más se agradecen aportaciones en los comentarios 😉