Python – S3lab http://s3lab.deusto.es S3lab Security Blog Wed, 06 May 2020 12:51:35 +0000 es hourly 1 https://wordpress.org/?v=5.1.5 Comenzando como científico de datos http://s3lab.deusto.es/comenzando-como-cientifico-datos/ Tue, 13 Jan 2015 11:37:58 +0000 http://s3lab.deusto.es/?p=3040 Si hay algo por lo que ha caracterizado los últimos años es por el volumen de información. Gigas, Terabytes de datos por todos lados, almacenados en los más diversos lugares, al alcance de todos pero, ¿de qué sirve tanto dato

The post Comenzando como científico de datos appeared first on S3lab.

]]>
Data ScientistSi hay algo por lo que ha caracterizado los últimos años es por el volumen de información. Gigas, Terabytes de datos por todos lados, almacenados en los más diversos lugares, al alcance de todos pero, ¿de qué sirve tanto dato si luego no hacemos nada con ellos?

Hay gente a la que nos encanta jugar con los datos. Ver que nos pueden ofrecer, que podemos obtener con ellos, si podemos adivinar el futuro gracias a ellos, … es realmente una ciencia apasionante. En los últimos años ha crecido el interes por gente que tenga la habilidad de manejar estos datos y poder sacar conclusiones de ellos. Esto se ha vuelto cada vez más necesario, pues hay grandes cantidades de empresas que almacenan datos pero no son capaces de sacar provecho de ellos. Así, ha nacido la figura del «científico de datos» o «data scientist», que no es más que alguién con amplios conocimientos en el campo de las matemáticas y que es capaz de interpretar datos para sacar conclusiones, predicciones o visualizaciones de ellos.

Hoy vamos a jugar un poco con los datos, y con una serie de herramientas que facilitan este manejo. Para empezar, necesitamos dos cosas. En primer lugar, los datos. En esta ocasión tenemos un conjunto de datos del hundimiento más célebre de la historia de la nautica: el Titanic (que además viene con concurso). Los datos nos los podemos bajar de aquí. Por otro lado, necesitamos un objetivo. Vamos a desarrollar una heurística para adivinar si un pasajero sobrevivió o no al hundimiento. En concreto, necesitamos una heurística que tenga una tasa de acierto superior al 80%. Ya tenemos todo lo necesario para empezar.

Para realizar el análisis, podemos usar cualquier herramienta. Nosotros vamos a utilizar Pandas, una biblioteca para el análisis de datos sobre Python. Esta biblioteca permite hacer operaciones sobre los datos y facilita mucho el manejo de ellos.

Antes de empezar a desarrollar una heurística, es importante familirizarse con el problema y con los datos. Pero en este caso, ¿va a ser sencillo, no? Todos sabemos la historia del Titanic, el hundimiento, y hemos visto en el cine o en libros cómo fueron aquellos angustiosos momentos. Veamos entonces el conjunto de datos que tenemos. En concreto, vamos a ver algunas de las variables del conjunto de datos.

  • survival: indica si la persona sobrevivió al incidente o no.
  • pcclass: indica la clase en la que viajaba el pasajero.
  • sex: indica el sexo del pasajero, male para los hombres y female para las mujeres.
  • age: edad del pasajero.

El conjunto de datos posee otros dastos, pero este puede ser un buen comienzo. Si hacemos caso al dicho clásico del mar («las mujeres y los niños primero»), con estas variables podemos hacer una buena predicción.

Es el momento de empezar a prepara un pequeño script que nos permita verificar si nuestra heurística es buena. Podemos empezar con este.

import pandas

    def obtener_prediccion(path_csv):
        """Metodo que implementa la heuristica"""
        return None

    if __name__ == '__main__':
        dataset = 'dataset/titanic_data.csv'
        # Obtenemos las predicciones y leemos el conjunto de datos.
        resultado_heuristica = obtener_prediccion(dataset)
        dataset = pandas.read_csv(dataset)

        # Aplicamos magia de Python, para crear un diccionario con el id del
        #  pasajero y si comprobar si ha sobrevivido o no
        sd = dict(zip(dataset.PassengerId, dataset.Survived))
        # Calculamos el porcentaje de supervivientes de nuestra heuristica
        correcto = 0

        for key in set(resultado_heuristica):
            if(resultado_heuristica[key] == sd[key]):
                correcto += 1
        print (100) * (correcto / float(len(resultado_heuristica))), "%"

Y ya tenemos listo nuestro banco de pruebas para probar. Ahora es el momento de probar heurísticas. Dado el conocimiento previo que tenemos, sabemos que si el pasajero es mujer tiene más probabilidades de sobrevivir que si es hombre, luego vamos a probar una heurística muy sencilla:

 def obtener_prediccion(path_csv):
        """Metodo que implementa la heuristica"""

        # Diccionario donde guardamos la predicción
        prediccion = {}

        # Leemos el fichero del csv
        df = pandas.read_csv(path_csv)

        # Por cado uno de ellos, calculamos los valores de la predicción
        for pasajero_index, pasajero in df.iterrows():
            #Agregamos la prediccion
            pasajero_id = pasajero['PassengerId']

            # Si el pasajero es muher, entonces predecimos que ha sobrevivido
            if (pasajero['Sex'] == "female"):
                prediccion[pasajero_id] = 1
            else:
                prediccion[pasajero_id] = 0
        return prediccion

Y con ello obtenemos el siguiente resultado:

78.6756453423 %

¡Ya estamos muy cerca, y sólo en el primer intento! Pero ¿cómo podemos mejorar el resultado? Con nuestro conocimiento de la materia. Por ejemplo, sabemos que no sólo las mujeres tenían preferencia en los botes salvavidas, sino que también los niños. Añadimos la condición a nuestra heurística.

 if (pasajero['Sex'] == "female" or pasajero['Age'] < 12) and (pasajero['Pclass'] == 1 or pasajero['Pclass'] == 2):
     prediccion[pasajero_id] = 1
 else:
     prediccion[pasajero_id] = 0

Y el resultado es:

80.0224466891 %

¡LO CONSEGUIMOS! Hemos desarrollado una heurística que es capaz de predecir si una persona fue superviviente del Titanic sólo sabiendo el sexo, la edad y la clase en la que viajaba.

Este es, de forma resumida, el trabajo de un científico de datos. Primero, es vital conocer el dominio sobre el que estamos trabajando. Posteriormente, es necesario recopilar los datos y adecuarlos para poder trabajar mejor con ellos. También es vital fijarse un objetivo (¿qué queremos saber?) y posteriormente generar los modelos para extraer esa información. Un último paso es utilizar esa información, bien sea a través de la visualización de los datos, a través de informes o dentro de una aplicación para mejorar su rendimiento.

Este trabajo ofrece muchas posibilidades y permite ver los hechos desde una perspectiva distinta. Es un trabajo cada vez más útil, dado el volumen de datos que manejamos. Al final, los datos no son más que el reflejo objetivo de la realidad, pero debemos tener cuidado. Únicamente muestran un parte de la realidad, y a los seres humanos nuestra imaginación y nuestros sesgos a menudo nos juegan malas pasadas.

Y tú, ¿cómo mejorarías la heurística?

PD: Este ejercicio forma parte de un curso de Udacity. Si te interesa adentrarte en este mundo, igual es un buen punto de partida.

The post Comenzando como científico de datos appeared first on S3lab.

]]>
Años binarios capicúa, esos grandes olvidados http://s3lab.deusto.es/binarios-capicua/ Tue, 16 Dec 2014 10:55:55 +0000 http://s3lab.deusto.es/?p=2971 Me parece que se me había pasado comentaros pero… 2015 es un año binario capicúa. Si os  preguntáis a que me refiero exactamente, muy sencillo, si pasamos el año de decimal a binario nos encontramos que dicho número es capicúa

The post Años binarios capicúa, esos grandes olvidados appeared first on S3lab.

]]>
Binary TimeMe parece que se me había pasado comentaros pero…

2015 es un año binario capicúa. Si os  preguntáis a que me refiero exactamente, muy sencillo, si pasamos el año de decimal a binario nos encontramos que dicho número es capicúa (11111011111). Aunque seguramente no resulte un gran hito en vuestra vida, resulta un hecho bastante interesante, que tras percatarme de ello decidí analizar un poco más.

La última vez que se dio este caso fue en 1967 y no volverá a producirse hasta 2047. Si nos centramos en calcular cuantas veces podemos celebrar el nuevo año con unos y ceros, veremos que ocurre una media de 15 veces cada 1.000 años, o lo que es lo mismo, sucede en el 1,5% de los años. Si comparamos este hecho con la posibilidad de ver el cometa Halley desde la tierra, los resultados obtenidos son bastante similares, ya que este hecho tiene lugar una media de 13 veces cada 1.000 años.

Si queréis comprobar algún rango de años concreto, simplemente tendréis que utilizar el siguiente script en Python (7 líneas escritas en menos de 1 minuto). Nos creará un archivo con los años binarios capicúa de ese rango (aparecerá tanto el valor en binario como en decimal). Cada comprobación se irá almacenando en ese mismo archivo, de forma que si queremos examinar varios rangos no perderemos las comprobaciones previas.

import csv
csv_out = open('BinaryPalindromeYears.csv','ab')
out_writer = csv.writer(csv_out)
for i in range(2016,2116):
	if(bin(i)[2:]==bin(i)[2:][::-1]):
		out_writer.writerow([i,bin(i)[2:]])
csv_out.close()

En los próximos 100 años tan solo pasará 2 veces más. Asique ya sabéis, si queréis celebrar el año con un buen,

“¡01000110011001010110110001101001011110100010000000110010001100000011000100110101!”

Aprovechad que no todos los años son binarios capicúa.

El que avisa no es traidor.

The post Años binarios capicúa, esos grandes olvidados appeared first on S3lab.

]]>