Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 4.0 Internacional.
El objetivo de esta lab es que el alumno se familiarice con los conceptos básicos de python para la adquisición y el preprocesado de datos, etapa previa para luego poder aplicar los algoritmos de machine learning. Sirva también para un primer acercamiento al lenguaje de programación de Python para aquellos que no hayan tenido un contacto previo.
No obstante, este lab no tiene intención de servir de tutorial para aprendizaje del lenguaje propiamente dicho, remitimos al alumno interesado a las diversas fuentes que se pueden encontrar en internet Python tutorial.
En este lab aprovechamos para recordar la nomenclatura y la estructura de datos que se utilizará en las restantes prácticas. Asimismo, introduciremos algunos paquetes importantes, como Numpy o Pandas.
El primer paso en todo proyecto de machine learning, entendido que la adquisición de datos ya se ha realizado, es leer los datos. Uno de los formatos más comunes es en ficheros tiplo CSV (comma-separated values). O bien, en formatos fácilmente convertibles en CSV.
Pandas es un módulo de python para data analisys open-source, que proporciona estructuras de datos fáciles de utilizar, así como herramientas para análisis de datos para Python Pandas
La base de datos que vamos a utilizar para aprender a manejar Pandas será una base de datos sobre diabetes. En esta base de datos se disponen de 442 individuos con diabetes. Para cada individuo se tienen las siguientes características.
* Age: edad.
* Sex: sexo del individuo.
* BMI: body mass index, índice de masa corporal.
* BP: Average blood pressure, presión sanguínea promedio.
* S1-S6: Seis mediciones sobre el suero sanguíneo.
* y: varible respuesta, es una medida cuantitativa de la progresión de la enfermedad un año después de la medición de las características.
Se pueden consultar más detalles en la siguiente publicación Paper Efron
En este ejercicio el alumno deberá genera el código necesario para leer el fichero diabetes.csv y crear un objeto Pandas con nombre pd_diabetes
In [10]:
#Representar gráficas inline
%matplotlib inline
import matplotlib.pyplot as plt
#Importe el módulo de pandas
import pandas as pd
diabetes = pd.read_csv("diabetes.csv", delimiter=';')
print(diabetes)
#Lea el documento diabetes.csv. Recuerde que el fichero debe estar en el mismo directorio en el que esté creando el
#notebook o bien debe indicar el path completo.
El primer paso, siempre que se trabaja con datos, es hacernos una idea de la forma que tiene nuestros datos. Lo primero que vamos a hacer es representar la matrix de datos que contiene el data frame. Para ello simplemente tenemos que repetir.
Responda a la siguiente pregunta. ¿Cuál es el valor de la presión arterial y el de la variable respuesta para el paciente número 415?
In [1]:
#Muestre la matriz de datos y responda a la pregunta
A continuación, una buena práctica es intentar resumir toda la información posible de los datos. Habitualmente nos interesa saber la media y desviación estándar, posiblemente quartiles de cada una de las variables. Esto nos permitirá, por una lado, tener una idea de cómo son las ditribuciones de cada una de las variables y por otra, nos permitirá verificar si existen datos anómalos (outliers).
Existe en pandas una función que permite describir todos los datos de forma simultánea. Busque en la documentación la función y haga la llamada correspondiente.
Pregunta Identifique el valor media de la variable S5.
Pregunta Qué encuentra extraño en el resumen de la variable sex
In [11]:
#resumen de los datos
diabetes.describe()
Out[11]:
A pesar de que en el ejercicio anterior hemos visto un resumen de las características de los datos, conviene siempre hacer representaciones gráficas, que nos ofrecen, en general un mejor entendimiento de los datos. Para ello vamos a realizar en este ejercicio los histogramas de las variables: AGE, BMI, BP, S3, y Y
Pregunta: A la vista de las distribuciones, discuta la normalidad de cada una de ellas (media, skwennes, kurtosis)
In [12]:
#hist
diabetes['AGE'].plot.hist(x = 'Age',alpha=0.5)
Out[12]:
In [18]:
#hist 2
diabetes['BMI'].plot.hist(x = 'Age',alpha=0.5)
Out[18]:
In [19]:
#hist 3
diabetes['BP'].plot.hist(x = 'Age',alpha=0.5)
Out[19]:
In [20]:
#hist 4
diabetes['S3'].plot.hist(x = 'Age',alpha=0.5)
Out[20]:
In [17]:
#hist 5
diabetes['Y'].plot.hist(x = 'Age',alpha=0.5)
Out[17]:
Una vez que hemos analizado cada una de las variables por separado, el siguiente paso en un análisis exploratorio sería el entender las relaciones entre cada una de las variables y la variable respuesta. En un paso posterior analizaremos las relaciones entre cada una de las variables, pero dado que nuestro objetivo es modelar la variable respuesta con las variables explicativas, vamos en primer lugar a analizar estas relaciones.
Para ello vamos a representar un scatter plot con la variable respuesta como variable dependiente y cada una de las variables explicativas como variable independiente. En el caso de la variabel sex, dado que esta es una variable cualitativa binaria, vamos a utilizar un boxplot.
Haga las 10 representaciones y responda a las siguientes preguntas.
Pregunta: ¿Cómo definiría la relación existente entre la variables respuesta, progresión de la diabetes, con respecto a la edad del sujeto?
Pregunta: ¿Existe alguna variación significativa de la progresión de la enfermedad que se pueda atribuir sólo al sexo?
Pregunta ¿Cómo es la relación entre BMI y la progresión de la enfermedad? Si nuestro objetivo es analizar mediante regresión lineal la relación, se le ocurre algún tipo de transformación de la variable BMI para poder explotar la relación lineal.
Pregunta ¿Cómo define la relación entre BP y la progresión de la enfermedad?
Pregunta Una de las variables S presenta una relación opuesta a la de las otras variables, indique cuál de ellas es y explique en que consiste la relación con la variable respuesta.
Pregunta Una de las variables S presenta un pratón diferente que las demás, indique de qué variable estamos hablando y en qué consiste ese patrón diferente.
In [14]:
import numpy as np
#representa la variable respueta vs cada una de las variables explicativas
#Y vs AGE, scatter plot
diabetes.plot(kind = "scatter", x="AGE", y="Y")
#Y vs SEX, scatter plot
diabetes.boxplot(by = "SEX", column="Y")
#Y vs BMI, scatter plot
diabetes.plot(kind = "scatter", x="BMI", y="Y")
#Y vs BP, scatter plot
diabetes.plot(kind = "scatter", x="BP", y="Y")
#Y vs S1, scatter plot
diabetes.plot(kind = "scatter", x="S1", y="Y")
#Y vs S2, scatter plot
diabetes.plot(kind = "scatter", x="S2", y="Y")
#Y vs S3, scatter plot
diabetes.plot(kind = "scatter", x="S3", y="Y")
#Y vs S4, scatter plot
diabetes.plot(kind = "scatter", x="S4", y="Y")
#Y vs S5, scatter plot
diabetes.plot(kind = "scatter", x="S5", y="Y")
#Y vs S6, scatter plot
diabetes.plot(kind = "scatter", x="S6", y="Y")
Out[14]:
Una vez que hemos hecho todo los análisis exploratorios correspondiente, podemos pasar a evaluar las correlaciones entre las diferente variables del problema. Habitualmente, esto nos puede servir para identificar posible características que estén altamente correlacionadas. La correlación entre variables explicativas puede dar problemas en los algoritmos de aprendizaje máquina, por ejemplo como el caso de la regresión lineal, pues introduce problemas de singularidad en la matrix $X$, que nos darán estimaciones de los parámetros con un gran error. Podemos evaluar el coeficiente de correlación, $\rho$ entre las diferentes variables y descartar alguna de las que tengan un $\rho$ superior a un umbral que establezcamos. Los problemas de alta correlación se conocen con el nombre de colinealidad.
En el ejercicio el alumno debera representar lo que se conoce como scatter matrix
Pregunta Si tuviese que descartar un variable para evitar problemas de colinealidad, cuál eliminaría.
In [16]:
#representar la scatter matrix
from pandas.tools.plotting import scatter_matrix
scatter_matrix(diabetes, alpha=0.2, figsize = (12, 12), diagonal = 'kde')
diabetes.corr() #Correlacion con todas las variables, S4 es como discreta, S5 tiene una gran separacion y
# la correlacion S2-S1 tiene una correlacion como muy alta
Out[16]:
Uno de los probemas que se pueden presentar cuando se trabajar con bases de datos heterogéneas es cómo tratar las variables categorícas que tiene más de dos niveles.
A menudo, muchas características son categóricas: ["from Europe", "from US", "from Asia"], ["uses Firefox", "uses Chrome", "uses Safari", "uses Internet Explorer"].
EStas variables se pueden procesar utilizando un esquema de conversión llamado one-hot encoding. De esta forma, se pasará a tener tantas variables como diferentes niveles tuviese la variable categórica. Cada nueva variable (llamada dummy variable) será binaria, 1 o 0, indicando si para ese caso en particular se cumple o no la condición indicada por el nivel de la variable categórica.
Así, para el caso de una variable categórica que indicase el navegador utilizado se tendrían cuatro nuevas dummy variables.
Este tipo de codificación es la más recomendable para el caso de sklearn, que no trabaja con variables categóricas. Desde pandas se pueden crear este tipo de variables utilizando el método get_dummies, o bien desde sklearn utilizando OneHotEncoder
In [22]:
diabetes_dummy = pd.get_dummies(diabetes)
diabetes_dummy
Out[22]:
Existen muchas más herramientas para hacer análisis exploratorio de datos, por ejemplo, podríamos usar algún algoritmo no supervisado de clustering Hierarchical clustering, o bien de descomposción en componentes principales Principal Component Analysis, PCA. Estas herramientas son un poco más sofisticadas, pero nos permiten aumentar nuestro conocimiento sobre como es la estructura de datos. Suelen utilizarse también como paso previo a la utilización del algoritmo supervisado propiamente dicho, en el caso de PCA nos permite eliminar colinealidad, y en algún caso hacer una selección de características utilizando sólo las componentes que mejor expliquen la varianza de los datos.
Nosotros nos vamos a quedar en este punto, pues con las herramientas de análisis exploratorio que hemos visto hemos conseguido aumentar nuestro conocimiento de los datos lo suficiente como para utilizar las herramientas de aprendizaje máquina con la seguridad de entender los resultados que nos ofrezca, así como de poder identificar posibles inconsistencias en los resultados. Por ejemplo, en el ejercicio 5 hemos analizado la relación entre las variables AGE vs Y; Y vs S5, a la vista de los scatter plot, sería raro que el modelo de regresión lineal indicase cómo resultado que la relación entre AGE vs Y es más intensa que la que tiene con S5.
In [ ]: