Especial San Valentin: ¿Podemos predecir la infidelidad con Inteligencia Artificial?

Thursday, February 14, 2019

Especial San Valentin: ¿Podemos predecir la infidelidad con Inteligencia Artificial?

Hoy en "honor a San Valentín", una broma. Porque no vamos a hablar de amor, sino más bien de lo contrario. Aunque los amores "no oficiales" también pueden serlo de verdad ¿no?. Pero dejémonos de disquisiciones filosóficas, que lo que queremos es ver, con un sencillo ejemplo en Python, y el dataset "affairs", un viejo conocido para los científicos de datos noveles, si podemos construir un predictor de infidelidad. ¿te animas a probarlo con nosotros?





El año pasado también celebramos San Valentín con un poco de humor, en este caso, estadístico: ¿Por qué nunca tendré novia?. Este año vamos a "trabajar" un poco más y vamos a construir un "predictor de infidelidad" en Python. Para que no se haga demasiado largo, vamos a dividir en experimento en tres partes:
  1. Introducción del experimento, carga, exploración y visualización de los datos (¡este post!)
  2. Explicación del modelo que vamos a utilizar: algoritmo de regresión logística
  3. Aplicación y evaluación del modelo. Conclusiones.

En particular, en este primer post aprenderemos:
  • Qué es Statsmodels y cómo cargar una de sus librerías. Desde Kaggle, por ejemplo, se puede cargar una versión reducida del dataset, pero nosotros trabajaremos con la completa
  • Cómo averiguar las características del dataset (descripción, fuente, dimensiones etc)
  • Cómo detectar si faltan datos
  • Cómo analizar la correlación entre variables
  • Cómo visualizar los datos para hacer una exploración previa


1. Introducción del experimento, carga, exploración y visualización de los datos


Nos gusta probar distintas formas de hacer las cosas, ya que es una estupenda forma de aprender y poder elegir después el entorno en el que nos sentimos más cómodos. Podemos trabajar con los notebooks de Azure Machine Learning Studio, como hicimos en nuestro experimento: "Titanic: Tu primer experimento en Azure Machine Learning Studio". Otra opción es usar Jupyter Notebooks en local. Si te animaste a seguir nuestra serie "Atrévete con Python: un experimento para todos los públicos", ya tendrás instalado Anaconda con todo lo que necesitas para empezar a trabajar. Incluso puedes trabajar con la versión online de Jupyter, o, con los notebooks de Microsoft Azure que usamos en el experimento "Machine Learning for kids: construye con tus hijos un bot experto en su animal favorito". Como veis, opciones, no faltan.

Nosotros vamos a elegir trabajar con Jupiter Notebooks en local. (si no sabes cómo instalarlos/utilizarlos, te recomendamos que sigas la serie "Atrévete con Python", donde lo explicamos de forma clara y sencilla).


(Explicaremos paso a paso con imágenes cómo hacerlo, y al final del proceso, incorporamos la versión final editable de la que podéis copiar directamente el código para pegarlo en vuestro notebook )


Empezamos creando un nuevo notebook Python 3 .Lo primero que vamos a hacer es importar los módulos y librerías que vamos a necesitar. En particular, trabajaremos con algunos de los módulos de Python más importantes para trabajar con probabilidad y estadística que si recordamos son:
  • numpy: El popular paquete matemático de Python, Ofrece funciones estadísticas que podemos aplicar fácilmente sobre los arrays de Numpy.
  • pandas: Esta es la librería más popular para análisis de datos y finanzas. Ofrece funciones muy útiles de estadística descriptiva  y facilita mucho el trabajo con series de tiempo. series de tiempo.
  • Scikit Learn: Construida sobre NumPy, SciPy y matplotlib, esta librería contiene un gran número de herramientas para machine learning y modelado estadístico. En nuestro ejemplo, usaremos su algoritmos de regresión logística, la herramienta de split que divide el dataset en una parte para entrenamiento y otra para test, y las  métricas. 
  • scipy.stats: Es un submodulo del paquete científico Scipy que se complementa con Numpy. Las funciones estadísticas que no están en uno, se pueden encontrar en el otro. 
  • matplotlib: Es la librería más popular en Python para visualizaciones y gráficos. 
  • statsmodels: Esta librería nos brinda un gran número de herramientas para explorar datos, estimar modelos estadísticos, realizar pruebas estadísticas y muchas cosas más.
  • Seaborn: basada en matplotlib, se usa para hacer más atractivos los gráficos e información estadística en Python. En nuestro ejemplo lo usaremos para hacer mapas de calor.

Figura 1: Carga de módulos y librerías.
Figura 1: Carga de módulos y librerías.


1.1 Carga de datos


A continuación, cargamos los datos, y pedimos que muestre los 10 primeros registros. El dataset “affairs” se puede cargar desde la librería Statsmodel.

(Para ver paso a paso cómo cargar datasets en Python desde statsmodels, scikit-learn, y seaborn, puedes leer este post de Sergiy Kolesnikov ).


 Carga de datos.
Figura 4: Carga de datos.




 Echamos un vistazo a los datos.
Figura 3: Echamos un vistazo a los datos.




Si no tienes statsmodels instalado, puedes hacerlo usando pip:
pip install -U statsmodels
También se puede instalar mediante el instalador de Anaconda. Puedes instalar la última versión usando:
conda install -c conda-forge statsmodels

Statsmodels es una de las librerías científicas de Python principalmente orientada al análisis de datos, ciencia de datos y estadística. Trabaja sobre las librerías numéricas NumPy y SciPi, y se integra con Pandas para el manejo de datos. Las funciones gráficas se basan en la librería Matplotlib. Statsmodels también ofrece conjuntos de datos (y metadatos) para su uso en ejemplos, tutoriales etc.


Conjuntos de datos que se pueden cargar desde Staatsmodels.
Figura 4: Conjuntos de datos que se pueden cargar desde Staatsmodels.

Cada uno de los datasets tiene unos atributos DESCRLONG, SOURCE y NOTE que describen detalladamente su contenido. Pedimos que los muestre con las siguientes sentencias:

Mostramos la descripción, características y origen de los datos.
Figura 5: Mostramos la descripción, características y origen de los datos.

Descripción, características y fuente.
Figura 6: Descripción, características y fuente.







El dataset “affairs” no es tan conocido como el de "iris", pero también es un clásico del aprendizaje en Data Science. Se basa en una encuesta realizada por la revista Redbook en 1974, en la que se preguntaba a mujeres casadas por sus aventuras extramaritales. Para más información, se puede consultar el trabajo original publicado en 1978 por el Journal of Political Economy. 

Como vemos, el dataset contiene 6366 observaciones con 9 variables. El objetivo es crear un modelo que permita predecir si un individuo (en este caso, mujer) va a ser “fiel” o “infiel”, basándose en el valor de esas 9 variables para el nuevo caso y en lo que el modelo haya "aprendido" a partir de los datos de entrenamiento (los datos de la encuesta).

La descripción de las variables es la siguiente:
  • rate_marriage:  valoración de la encuestada sobre su matrimonio (1 = muy mala, 5 = muy buena)
  • age: edad de la mujer
  • yrs_married: años de matrimonio
  • children: número de hijos
  • religious: valoración de la encuestada sobre su religiosidad (1 = nada religiosa, 4 = muy religiosa)
  • educ: nivel educativo (9 = primaria, 12 = secundaria, 14 = titulación universitaria media, 16 = titulación universitaria superior, 17 = master, 20 = doctorado)
  • occupation: ocupación (1 = estudiante, 2 = agricultura / semicualificado / no cualificado, 3 = "oficinista", 4 = profesora / enfermera / escritora / técnica / cualificada), 5 = gestión/ negocios, 6 = profesional de alta especialización)
  • occupation_husb: ocupación del marido (con la misma codificación)
  • affairs: tiempo dedicado a aventuras extramaritales

1.2 Exploración de los datos


Vamos a echarle un vistazo a los datos para ver si hay algo que nos llame la atención, o nos de una pista de posibles correlaciones entre las variables que analizaríamos con mayor detalle después.

1.2.1 ¿Faltan valores?

Podemos comprobar si hay campos vacíos con la función isnull(). Esta función es booleana y devuelve dos resultados posibles: "true", cuando falta el dato o  "false", cuando no falta. Como el resultado es "false", sabemos que no es necesaria ninguna operación de eliminación de registros, o sustitución por valores medios etc. Hemos puesto “.head(10)” para que sólo saque los 10 primeros registros, porque sabemos que en este caso no faltan datos y no queremos que imprima todo el dataset, pero habría que revisarlos todos.


Esta comprobación también se suele hacer de forma más visual usando mapas de calor de seaborn, pero, como hemos mencionado antes, este dataset no tiene campos vacíos. Así que, por esta parte, no hay problemas.

Comprobamos que no falten valores.
Figura 7: Comprobamos que no falten valores.

1.2.2 ¿Se observa algún tipo de correlación?

Para ver si existe correlación entre las variables lo más práctico es calcular la matriz de correlación.  Es un paso importante porque puede afectar negativamente al rendimiento del algoritmo. Las variables que presentan un índice de correlación muy alto ( >0,9)  deben excluirse del análisis (por ejemplo, la función “drop”). Como podemos ver, en este caso no es necesario eliminar ninguna.

Calculamos la matriz de correlación.
Figura 8: Calculamos la matriz de correlación.

Figura 9: Matriz de correlación.
Figura 9: Matriz de correlación.

El signo del índice de correlación también nos da información.  Si el índice de correlación entre dos variables es positivo, significa que, si una de ellas aumenta, la otra también lo hace. Por el contrario,  cuando el signo es negativo, si una variable aumenta, la otra, disminuye.  Por ejemplo, para affairs y rate_marriage es negativo. Esto indica que las personas que valoran más su matrimonio (rate_marriage creciente), tienen menos aventuras extramaritales (affairs decreciente).


1.3 Visualización de los datos


El histograma sobre la influencia del nivel educativo también arroja resultados interesantes. El menor número de infidelidades se produce en los niveles extremos: mujeres con nivel básico de educación o profesionales con una muy alta cualificación-

Mostramos histograma Influencia del nivel educativo.
Figura 10: Mostramos histograma Influencia del nivel educativo.

Histograma Nivel Educativo.
Figura 11: Histograma Nivel Educativo.


También podemos observar la influencia de los años de matrimonio:

Mostrar histrograma Influencia años de matrimonio.
Figura 12:Mostrar histrograma Influencia años de matrimonio.

Curiosamente, en promedio, es en los primeros años de matrimonio cuando se aprecia un mayor número de infidelidades.

Histograma Años de matrimonio.
Figura 13: Histograma Años de matrimonio.

Debe quedar algo así (ahora ya puedes copiar directamente el código en tu notebook):

En el siguiente post abordaremos la elección del algoritmo en que se va a basar nuestro predictor de infidelidad. Pero os damos una pista por si queréis investigarlo un poco. Usaremos uno de los algoritmo más sencillos y prácticos para los problemas de clasificación: la regresión logística.

No pierdas el hilo, y construye con nosotros tu "predictor"


Post de esta miniserie:

  1. Especial San Valentin: ¿Podemos predecir la infidelidad con IA? (este post)
  2. Predictor de infidelidad (II): ¿Qué es la regresión logística? (se publicará el 20 de Febrero)
  3. Predictor de infidelidad (III): Un ejemplo de regresión logística sobre el dataset "Affairs" (se publicará el 27 de Febrero)


No comments:

Post a Comment