Machine Learning y Estadisticas para proyectos #1

Explorando los datos

Lo primero que tenemos que hacer, es saber con que datos vamos a trabajar. Vamos a utilizar un archivo csv donde tenemos los proyectos de una empresa realizados en el año 2019.

Tenemos fechas de inicio y fin de cada fase del proyecto, días de duración, tipo de proyecto, personas asignadas, precio, etc…

Revisaremos la calidad de esos datos, y realizaremos las transformaciones que sean necesarias para poder trabajar con ellos.

Lo primero que debemos hacer es importar las librerías que vamos a utilizar:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

sns.set()

Cargamos el DataSet (archivos csv) en la variable df:

path = 'PROYECTOS_2019-2020_v2.csv'
df = pd.read_csv(path)

Para empezar a analizar nuestros datos, un primer paso podría ser, por ejemplo, ver las primeras filas o las ultimas para tener una visión general. Esto podemos conseguirlo con las instrucciones df.head(n) y`df.tail(n), donde n es el numero de filas que queremos visualizar (si no indicamos ningún número, por defecto nos mostrara 5 filas):

df.head()
df.tail()

Lo primero que me llama la atención, es que, por ejemplo, en la columna FECHA_APR_CANCELACIO nos encontramos con unos valores «extraños» (NaN).

Los NaN (“Not a Number“) son valores vacíos no computables que debemos tratar en nuestros conjuntos de datos antes de trabajar con ellos.

Cuando trabajamos con un DataFrame, especialmente si es extenso, podemos tener problemas con lo valores NaN.

Con este código podremos validar si hay algún valor NaN en nuestro DataFrame.

df.isnull().values.any()

ESto ya lo validamos con la instrucción anterior, pero es posible que los valores NaN no se encuentren en el rango de filas que hemos visualizado, pero si que tengamos algún valor NaN en nuestro DataFrame.

Este código nos dirá en qué columnas se encuentran nuestros valores NaN:

df.isnull().any()

Para valorar la cantidad de NaN que tenemos, esta instrucción nos muestra cuántos NaN hay en cada columna:

df.isnull().sum()

Si queremos saber el numero total de valores NaN de nuestro DataFrame, debemos escribir:

df.isnull().sum().sum()

Después de analizar estos resultados, vemos que, al menos de momento, la columna que mas nos «molesta» que contenga NaNs es PRECIO, así que procedemos a eliminar la fila que contiene ese NaN:

df=df.dropna(subset=['PRECIO']) 

Al eliminar esas filas, también nos quitamos de encima muchos valores Nan de otras columnas. Se entiende que si la columna PRECIO esta en blanco, seguramente es por que el proyecto aun no ha finalizado, o se ha cancelado, con lo que ese proyecto en concreto, no nos interesa para nuestro análisis, al menos de momento. De esta manera, nos aseguramos que solamente trabajaremos con los datos de los proyectos cerrados.

Ahora validamos que ya no tengamos ningún NaN en la columna PRECIO Las columnas FECHA_APR_CANCELACIONFECHA_ENV_CANCELACION, no son relevantes, así que las dejaremos de momento igual.

df.isnull().sum()

También es importante ver los tipos de datos de los DataFrame que vamos a trabajar justamente al principio del análisis, así que vamos a utilizar el método dtypes, que nos devuelve el tipo de datos de cada columna.

df.dtypes

Si nos fijamos en los resultados, vemos que la columna PRECIOtiene asignado un typo object, cuando al menos debería ser numérico para poder realizar operaciones con el, así que vamos a convertirlo:

df["PRECIO"]= pd.to_numeric(df["PRECIO"], errors='coerce')
df.dtypes

Con los tipos de datos corregidos, ahora podemos verificar los análisis estadísticos del dataframe. Esta información nos puede decir si hay problemas matemáticos, como extremos atípicos y grandes desviaciones. Para conocer esto solamente utilizamos el método describe()

df.describe()

La información que nos arroja es la siguiente:

count: se refiere al número de términos en la columna,

mean: se refiere al valor promedio de la columna,

std: es la desviación estándar de la columna.

También se muestra los valores máximo y mínimo, así como el límite de cada uno de los cuartiles.

Si vemos con detalles la información mostrada podemos observar que no se encuentran todas las columnas de nuestro dataframe, esto se debe a que la función describe() omite filas y columnas que no contienen números, pero esta función también puede analizar datos tipo objetos, para ellos solamente se debe incluir include = “all a la función, dentro del paréntesis, para que muestra el análisis de todas las columnas y filas del dataframe.

Observemos que para las columnas de tipo objeto, se evalúa un conjunto diferente de estadísticas, veamos de que se trata cada uno de ellos:

unique: esto se refiere al número de objetos distintos en la columna,

top: es el dato más frecuente que se produce,

freq: es la cantidad de veces que aparece el objeto “top” en la columna.

Algunos valores en la tabla se muestran como NaN, que significa “no es un número”, esto se debe a que esta métrica estadística particular no se puede calcular para ese específico tipo de datos de columna.

Y ahora, Vamos a gratificar los datos:

x1 = df['DIAS_PROYECTO']
y = df["PRECIO"]
plt.scatter(x1,y)
plt.xlabel('DIAS PROYECTO',fontsize=12)
plt.ylabel('PRECIO PROYECTO',fontsize=12)
plt.show()

Con esto, hemos conseguido analizar, y limpiar los datos que tenemos en el DataFrame, para poder trabajar con ellos en el próximo post.

¿Te ha gustado? ¡¡Compártelo con el mundo!!